Struts 2 를 사용할 때, Action 클래스에서 HttpServletRequest에 직접 접근하려면 반드시 ServletRequestAware 인터페이스를 구현해야 한다. 다음은 HttpServletRequest객체에 DTO객체를 담아 View에 전달하는 예이다.
struts.xml
<?xml version="1.0" encoding="EUC-KR" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<package name="struts2test" namespace="/test" extends="struts-default">
<action name="login" class="struts2test.Login">
<!--액션의 execute()메소드가 SUCCESS를 리턴하면 loginOK.jsp로 Forward 된다-->
<result>/pages/loginOK.jsp</result>
<!--액션의 execute()메소드가 ERROR를 리턴하면 등록된 error 액션으로 Redirect 된다-->
<result name="error" type="redirect-action">error</result>
<!--Redirect하면서 파라미터를 전달하면, request.getParameter()를 이용해 받을 수 있다-->
<result name="input" type="redirect-action">
<param name="actionName">loginForm</param>
<param name="namespace">/test</param>
<param name="msg">ID, PASSWORD required !</param>
</result>
<result name="hello">/pages/hello.jsp</result>
</action>
<action name="error">
<result>/pages/loginFail.jsp</result>
</action>
<action name="loginForm">
<result>/pages/loginForm.jsp</result>
</action>
</package>
<!-- Add packages here -->
<include file="example.xml"/>
</struts>
loginForm.jsp
<%@page contentType="text/html;charset=KSC5601"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Struts 2 Test Application!</title>
</head>
<body>
<s:form action="/test/login.action" method="post">
<s:textfield name="id" label="ID" size="20"/>
<s:password name="pwd" label="Password" size="20"/>
<s:submit value="Login"/>
</s:form>
</body>
</html>
Login.java
package struts2test;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor .ServletRequestAware;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
public class Login extends ActionSupport implements ServletRequestAware {
private String id, pwd;
private HttpServletRequest request;
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
public String execute() throws Exception {
if( id !=null && pwd != null && !id.equals("") && !pwd.equals("")) {
request.setAttribute("dto", new DTO(id, pwd));
return SUCCESS;
}else if(id==null && pwd==null) {
return INPUT;
}else if(id.equals("") && pwd.equals("")) {
return "hello";
}else return ERROR;
}
public void setId(String id){
this.id = id;
}
public void setPwd(String pwd){
this.pwd = pwd;
}
public String getId() {
return id;
}
public String getPwd() {
return pwd;
}
}
DTO.java
package struts2test;
public class DTO {
private String id;
private String pwd;
public DTO(){}
public DTO(String id, String pwd) {
this.id = id;
this.pwd = pwd;
}
public void setId(String id){
this.id = id;
}
public void setPwd(String pwd){
this.pwd = pwd;
}
public String getId(){
return id;
}
public String getPwd(){
return pwd;
}
}
loginOK.jsp
<%@page contentType="text/html;charset=KSC5601"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@page import="struts2test.*"%>
<html>
<head>
<title>Struts 2 Test Application!</title>
</head>
<body>
성공적으로 로그인했습니다.<p>
ID : <%=((DTO)request.getAttribute("dto")).getId()%> <br>
PWD : <%=((DTO)request.getAttribute("dto")).getPwd()%> <br>
<p>
....................................................................................................................................................................................
<p>
OGNL(Object Graph Navigation Language)를 이용한 JSP 내장객체(request)에 접근한 경우<p>
ID : <s:property value="#request.dto.id"/> <br>
PWD : <s:property value="#request.dto.pwd"/> <br>
<p>
ID : <s:property value="%{#request.dto.id}"/> <br>
PWD : <s:property value="%{#request.dto.pwd}"/> <br>
....................................................................................................................................................................................
</body>
</html>
.............................................................................................................................................................................................................................
OGNL 에서 Map (Hashtable)을 사용하는 예
OGNL을 이용하여 뷰에서 Map(Hashtable)에 저장되어 있는 속성을 출력하는 예이다. 예를 들어 ht 라는 Hashtable 객체의 레퍼런스가 있고 그 안에 'id' 라는 키가 있다면, ht['id'] 과 같은 형식을 사용하여 값을 출력할 수 있다.
Login.java
package struts2test;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor .ServletRequestAware;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
public class Login extends ActionSupport implements ServletRequestAware {
private String id, pwd;
private HttpServletRequest request;
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
public String execute() throws Exception {
if( id !=null && pwd != null && !id.equals("") && !pwd.equals("")) {
Hashtable<String,String>ht = new Hashtable<String,String>();
ht.put("id", id);
ht.put("pwd", pwd);
request.setAttribute("ht", ht);
return SUCCESS;
}else if(id==null && pwd==null) {
return INPUT;
}else if(id.equals("") && pwd.equals("")) {
return "hello";
}else return ERROR;
}
public void setId(String id){
this.id = id;
}
public void setPwd(String pwd){
this.pwd = pwd;
}
public String getId() {
return id;
}
public String getPwd() {
return pwd;
}
}
loginOK.jsp
<%@page contentType="text/html;charset=KSC5601"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@page import="java.util.*"%>
<html>
<head>
<title>Struts 2 Test Application!</title>
</head>
<body>
성공적으로 로그인했습니다.<p>
ID : <%=((Hashtable<String,String>)request.getAttribute("ht")).get("id")%> <br>
PWD : <%=((Hashtable<String,String>)request.getAttribute("ht")).get("pwd")%> <br>
<p>
....................................................................................................................................................................................
<p>
OGNL(Object Graph Navigation Language)를 이용한 JSP 내장객체(request)에 접근한 경우<p>
ID : <s:property value="#request.ht['id']"/> <br>
PWD : <s:property value="#request.ht['pwd']"/> <br>
<p>
ID : <s:property value="%{#request.ht['id']}"/> <br>
PWD : <s:property value="%{#request.ht['pwd']}"/> <br>
....................................................................................................................................................................................
</body>
</html>