struts2 인터셉터(initerceptor) –
servletConfig
오라클자바커뮤니티에서 설립한 오엔제이프로그래밍
실무교육센터
struts2는 Servlet API를 사용하지 않으므로 특별히 ServletContext, HttpServletRequest, HttpServletResponse등의 서블릿 객체에 접근을 하기 위해서 또는 Parameter Map(요청파라미터의 이름, 값을 저장한 맵), Request Map(HttpServletRequest의 attribute의 이름, 값을 저장한 맵), Session Map(HttpSession Attribute의 이름, 값을 저장한 맵), Application Map(ServletContext의 Attribute의 이름, 값 저장) 등이 필요한 경우 servletConfig Interceptor를 이용하면 된다.
이러한 Map에 접근을 하기 위해서는 적절한 Map을 가져다 쓰면 되는데…
예를들어 세션에 있는 attribute에 접근을 원한다고 HttpSession 객체를 만들어 attribute에 접근할 필요 없이 직접 Session Map에 접근해서 원하는 속성을 가져다 쓰면 된다는 뜻이다.
Action이 servletConfig 인터셉터로부터 서블릿 객체나 Map을 주입받기 위해서는 각각의 Aware인터페이스를 구현해야 한다.
- ServletContextAware : ServletContext 객체를 받을 수 있다.
- ServletRequestAware : HttpServeltRequest 객체를 받을 수 있다.
- ServletResponseAware : HttpServeltResponse 객체를 받을 수 있다.
- ParameterAware : Parameter Map을 받을 수 있다.
- RequestAware : Request Map을 받을 수 있다.
- SessionAware : Session Map을 받을 수 있다.
- ApplicationAware : Application Map을 받을 수 있다.
-
이전에 작성한 “간단한 로그인 예제(Dependency Injection 이용)” 예제를 servletConfig 인터셉터를 적용하여 다시 작성해 보자.
추가된 기능은… 로그인 후 userInfo 객체를 session Map에 추가 했으며 request Map을 이용하여 요청 파라미터를 출력했고 ServletRequest를 이용해 HttpServletRequest 객체를 얻어 RequestURI 값을 log로 출력했다. Session Map, request Map, ServletRequest 객체를 얻기 위해 SessionAware, RequestAware, ServletRequestAware 인터페이스를 구현해서 3개의 setter 메소드를 작성 했다.
1. Action CLASS
[LoginAction.java]
package servletConfig.action;
import java.util.Map;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.SessionAware;
import servletConfig.dao.LoginDAO;
import servletConfig.interceptor.LoginDAOAware;
import servletConfig.model.UserInfo;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Preparable;
import com.opensymphony.xwork2.interceptor.NoParameters;
public class LoginAction implements Action, Preparable, ModelDriven, LoginDAOAware
, SessionAware, ServletRequestAware, RequestAware {
//도메인 오브젝트
UserInfo userInfo;
LoginDAO dao;
Map sessionMap;
Map requestMap;
HttpServletRequest request;
Log log = LogFactory.getLog(LoginAction.class);
public String execute() throws Exception {
//LoginDAO dao = new LoginDAO();
if (dao.loginChk(userInfo)) {
sessionMap.put("userInfo", userInfo);
log.info(">>>>>> requestURI : " + request.getRequestURI());
log.info(">>>>>> request ID : " + requestMap.get("id").toString());
log.info(">>>>>> request PWD : " + requestMap.get("pwd").toString());
return SUCCESS;
}
else {
return LOGIN;
}
}
//Preparable인터페이스의 prepare 구현
public void prepare() throws Exception {
userInfo = new UserInfo();
}
//ModelDriven 인터페이스의 getModel 구현
public Object getModel() {
return userInfo;
}
//LoginDAUInterceptor에서 LoginDAO를 주입한다.
public void setLoginDAO(LoginDAO loginDAO) {
this.dao = loginDAO;
}
//SessionAware의 setSession 구현
public void setSession(Map session) {
this.sessionMap = session;
}
//RequestAware의 setRequest 구현
public void setRequest(Map requestMap) {
this.requestMap = requestMap;
}
//ServletRequestAware의 serServletRequest 구현
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
}
2. LoginDAO.java
package servletConfig.dao;
import servletConfig.model.UserInfo;
public class LoginDAO {
public boolean loginChk(UserInfo userInfo) {
//DB연결 후 넘어오는 사용자 정보를 가지고 로그인 체크
//본 예제에서는 id가 test이면 로그인 성공
//UserInfo의 name에 "홍길동"으로 세팅 후 true를 리턴
if ("test".equals(userInfo.getId())) {
userInfo.setName("홍길동");
return true;
}
else {
return false;
}
}
}
3. LoginDAOAware.java
package servletConfig.interceptor;
import servletConfig.dao.LoginDAO;
public interface LoginDAOAware {
public void setLoginDAO(LoginDAO loginDAO);
}
4. LoginDAOInterceptor.java
package servletConfig.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
import servletConfig.dao.LoginDAO;
public class LoginDAOInterceptor implements Interceptor {
LoginDAO loginDAO;
public void init() {
loginDAO = new LoginDAO();
}
public void destroy() {
loginDAO = null;
}
public String intercept(ActionInvocation invocation) throws Exception {
Object action = invocation.getAction();
if (action instanceof LoginDAOAware) {
LoginDAOAware loginDAOAware = (LoginDAOAware)action;
loginDAOAware.setLoginDAO(loginDAO);
}
return invocation.invoke();
}
}
5. Model 역할을 하는 UserInfo.java
package servletConfig.model;
public class UserInfo {
private String id;
private String pwd;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
6. struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="struts2" extends="struts-default">
<interceptors>
<interceptor name="loginDao" class="servletConfig.interceptor.LoginDAOInterceptor"/>
</interceptors>
<action name="login" class="servletConfig.action.LoginAction">
<interceptor-ref name="prepare"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="params"/>
<interceptor-ref name="loginDao"/>
<interceptor-ref name="servletConfig"/>
<result>/servletConfig/login_ok.jsp</result>
<result name="login">/servletConfig/login.jsp</result>
</action>
</package>
</struts>
7. web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Struts2</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
8. JSP 파일들…(interceptor/servletConfig 폴더에 작성)
[login.jsp]
<%@ page pageEncoding="euc-kr" %>
<html>
<body>
<form action="login.action" method="post">
아이디 : <input type="text" name="id"/><br>
비밀번호 : <input type="text" name="pwd"/>
<input type="submit"/>
</form>
</body>
</html>
[login_ok.jsp]
<%@ page pageEncoding="euc-kr" %>
${name}님 환영합니다.
9. http://localhost:8080/interceptor/servletConfig/login.jsp 를 실행해서 결과를 확인하자. (id가 ‘test’인 경우 로그인 성공하도록 되어있다.)
(신입사원채용무료교육, 오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷)
struts2는 Servlet API를 사용하지 않으므로 특별히 ServletContext, HttpServletRequest, HttpServletResponse등의 서블릿 객체에 접근을 하기 위해서 또는 Parameter Map(요청파라미터의 이름, 값을 저장한 맵), Request Map(HttpServletRequest의 attribute의 이름, 값을 저장한 맵), Session Map(HttpSession Attribute의 이름, 값을 저장한 맵), Application Map(ServletContext의 Attribute의 이름, 값 저장) 등이 필요한 경우 servletConfig Interceptor를 이용하면 된다.
이러한 Map에 접근을 하기 위해서는 적절한 Map을 가져다 쓰면 되는데…
예를들어 세션에 있는 attribute에 접근을 원한다고 HttpSession 객체를 만들어 attribute에 접근할 필요 없이 직접 Session Map에 접근해서 원하는 속성을 가져다 쓰면 된다는 뜻이다.
Action이 servletConfig 인터셉터로부터 서블릿 객체나 Map을 주입받기 위해서는 각각의 Aware인터페이스를 구현해야 한다.
- ServletContextAware : ServletContext 객체를 받을 수 있다.
- ServletRequestAware : HttpServeltRequest 객체를 받을 수 있다.
- ServletResponseAware : HttpServeltResponse 객체를 받을 수 있다.
- ParameterAware : Parameter Map을 받을 수 있다.
- RequestAware : Request Map을 받을 수 있다.
- SessionAware : Session Map을 받을 수 있다.
- ApplicationAware : Application Map을 받을 수 있다.
-
이전에 작성한 “간단한 로그인 예제(Dependency Injection 이용)” 예제를 servletConfig 인터셉터를 적용하여 다시 작성해 보자.
추가된 기능은… 로그인 후 userInfo 객체를 session Map에 추가 했으며 request Map을 이용하여 요청 파라미터를 출력했고 ServletRequest를 이용해 HttpServletRequest 객체를 얻어 RequestURI 값을 log로 출력했다. Session Map, request Map, ServletRequest 객체를 얻기 위해 SessionAware, RequestAware, ServletRequestAware 인터페이스를 구현해서 3개의 setter 메소드를 작성 했다.
1. Action CLASS
[LoginAction.java]
package servletConfig.action;
import java.util.Map;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.SessionAware;
import servletConfig.dao.LoginDAO;
import servletConfig.interceptor.LoginDAOAware;
import servletConfig.model.UserInfo;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Preparable;
import com.opensymphony.xwork2.interceptor.NoParameters;
public class LoginAction implements Action, Preparable, ModelDriven, LoginDAOAware
, SessionAware, ServletRequestAware, RequestAware {
//도메인 오브젝트
UserInfo userInfo;
LoginDAO dao;
Map sessionMap;
Map requestMap;
HttpServletRequest request;
Log log = LogFactory.getLog(LoginAction.class);
public String execute() throws Exception {
//LoginDAO dao = new LoginDAO();
if (dao.loginChk(userInfo)) {
sessionMap.put("userInfo", userInfo);
log.info(">>>>>> requestURI : " + request.getRequestURI());
log.info(">>>>>> request ID : " + requestMap.get("id").toString());
log.info(">>>>>> request PWD : " + requestMap.get("pwd").toString());
return SUCCESS;
}
else {
return LOGIN;
}
}
//Preparable인터페이스의 prepare 구현
public void prepare() throws Exception {
userInfo = new UserInfo();
}
//ModelDriven 인터페이스의 getModel 구현
public Object getModel() {
return userInfo;
}
//LoginDAUInterceptor에서 LoginDAO를 주입한다.
public void setLoginDAO(LoginDAO loginDAO) {
this.dao = loginDAO;
}
//SessionAware의 setSession 구현
public void setSession(Map session) {
this.sessionMap = session;
}
//RequestAware의 setRequest 구현
public void setRequest(Map requestMap) {
this.requestMap = requestMap;
}
//ServletRequestAware의 serServletRequest 구현
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
}
2. LoginDAO.java
package servletConfig.dao;
import servletConfig.model.UserInfo;
public class LoginDAO {
public boolean loginChk(UserInfo userInfo) {
//DB연결 후 넘어오는 사용자 정보를 가지고 로그인 체크
//본 예제에서는 id가 test이면 로그인 성공
//UserInfo의 name에 "홍길동"으로 세팅 후 true를 리턴
if ("test".equals(userInfo.getId())) {
userInfo.setName("홍길동");
return true;
}
else {
return false;
}
}
}
3. LoginDAOAware.java
package servletConfig.interceptor;
import servletConfig.dao.LoginDAO;
public interface LoginDAOAware {
public void setLoginDAO(LoginDAO loginDAO);
}
4. LoginDAOInterceptor.java
package servletConfig.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
import servletConfig.dao.LoginDAO;
public class LoginDAOInterceptor implements Interceptor {
LoginDAO loginDAO;
public void init() {
loginDAO = new LoginDAO();
}
public void destroy() {
loginDAO = null;
}
public String intercept(ActionInvocation invocation) throws Exception {
Object action = invocation.getAction();
if (action instanceof LoginDAOAware) {
LoginDAOAware loginDAOAware = (LoginDAOAware)action;
loginDAOAware.setLoginDAO(loginDAO);
}
return invocation.invoke();
}
}
5. Model 역할을 하는 UserInfo.java
package servletConfig.model;
public class UserInfo {
private String id;
private String pwd;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
6. struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="struts2" extends="struts-default">
<interceptors>
<interceptor name="loginDao" class="servletConfig.interceptor.LoginDAOInterceptor"/>
</interceptors>
<action name="login" class="servletConfig.action.LoginAction">
<interceptor-ref name="prepare"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="params"/>
<interceptor-ref name="loginDao"/>
<interceptor-ref name="servletConfig"/>
<result>/servletConfig/login_ok.jsp</result>
<result name="login">/servletConfig/login.jsp</result>
</action>
</package>
</struts>
7. web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Struts2</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
8. JSP 파일들…(interceptor/servletConfig 폴더에 작성)
[login.jsp]
<%@ page pageEncoding="euc-kr" %>
<html>
<body>
<form action="login.action" method="post">
아이디 : <input type="text" name="id"/><br>
비밀번호 : <input type="text" name="pwd"/>
<input type="submit"/>
</form>
</body>
</html>
[login_ok.jsp]
<%@ page pageEncoding="euc-kr" %>
${name}님 환영합니다.
9. http://localhost:8080/interceptor/servletConfig/login.jsp 를 실행해서 결과를 확인하자. (id가 ‘test’인 경우 로그인 성공하도록 되어있다.)
댓글 없음:
댓글 쓰기