2013년 8월 12일 월요일

[오라클자바커뮤니티 StrutsSpring Framework강좌]Struts2 인터셉터(initerceptor) – 간단한 로그인 예제(Dependency Injection이용)

Struts2 인터셉터(initerceptor) – 간단한 로그인 예제(Dependency Injection이용)

 
오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  
 


Spring IoC 프레임워크 처럼 Interceptor를 통해 빈을 주입할 수 있는데 인터셉터는 인스턴스가 하나만 생성되고 항상 떠 있으므로 빈을 생성해서 가지고 있다가 액션이 새로 생기면 이를 주입하는 일이 가능하다.

 

Interceptor를 통해 Action 클래스에 빈을 주입하기 위해서는 Action이 빈을 받을 수 있는지 여부를 알 필요가 있는데 Aware 인터페이스를 사용하면 된다. 예제에서 LoginDAOInterceptor는 LoginDAO 인스턴스를 가지고 있다가 Action에 빈을 주입하기 전에 LoginAction이 LoginDAOAware 인터페이스를 구현했는 지로 주입 가능 여부를 판단한다.

 

이전 로그인 예제를 보면 LoginDAO를 LoginAction에서 new LoginDAO() 를 실행하여 객체를 생성하였는데 본 예제에서는 생략되고 이를 인터셉터(LoginDAOInterceptor)를 통해 LoginDAO를 LoginAction에 주입해 보기로 하자.

 

[개요]

 

-  logini.jsp에서 id, pwd를 입력하고 서브밋 한다. (id가 ‘test’라면 로그인 성공)

- LoginAction이 요청을 받아 처리하기 전 prepare(UserInfo 라는 Model빈을 초기화, 인스턴스 생성), modelDriven(초기화된 모델 빈을 ValueStack의 상단에 로딩), params(ValueStack의 상단에 있는 빈에 사용자의 요청 파라미터를 세팅), loginDao 사용자 작성 인터셉터 실행하여 LoginDAO를 액션에 주입한 후  LoginAction이 수행된다.

- 로그인 성공일 경우 login_ok.jsp 실패일 경우 다시 login.jsp로 제어를 넘긴다.

 

Struts2 개발환경 관련 사항은 “struts2로 HelloWorld 작성하기” 강좌를 보면 나와 있으니 생략한다.

 

1. 이클립스에서 interceptor라는 Tomcat Project를 생성한다.

 

2. 액션 클래스 작성(LoginAction.java)

 

package login2.action;

 

import login2.dao.LoginDAO;

import login2.interceptor.LoginDAOAware;

import login2.model.UserInfo;

import interceptor1.model.NumberForAdd;

 

import com.opensymphony.xwork2.Action;

import com.opensymphony.xwork2.ModelDriven;

import com.opensymphony.xwork2.Preparable;

 

public class LoginAction implements Action, Preparable, ModelDriven, LoginDAOAware {

    //도메인 오브젝트

          UserInfo userInfo;

          LoginDAO dao;

         

          public String execute() throws Exception {

                    //LoginDAO dao = new LoginDAO();                                       

                    if (dao.loginChk(userInfo)) {

                                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;

          }

}

 

 

4. 실제 비즈니스 로직처리를 위한 LoginDAO.java

 

package login2.dao;

 

import login2.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;

                    }

          }

}

 

5. model 역할을 하는 UserInfo.java

 

package login2.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. LoginDAOAware 인터페이스 작성 (LoginAction에 LoginDAO를 주입할 수 있는지 판단하기 위한 인터페이스)

 

package login2.interceptor;

 

import login2.dao.LoginDAO;

 

public interface LoginDAOAware {

    public void setLoginDAO(LoginDAO loginDAO);

}

 

 

7. LoginDAOInterceptor 작성 (LoginDAO를 LoginAction에 주입)

 

package login2.interceptor;

 

import com.opensymphony.xwork2.ActionInvocation;

import com.opensymphony.xwork2.interceptor.Interceptor;

 

import login2.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();

          }

         

         

}

 

8. JSP 파일을 interceptor/login2 디렉토리에 작성하자.

 

[login.jsp]

<%@ page pageEncoding="euc-kr" %>

<html>

    <body>

    <form action="login.action">

            아이디 : <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}님 환영합니다.

 

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. 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="login2.interceptor.LoginDAOInterceptor"/>

        </interceptors> 

     

      <action name="login" class="login2.action.LoginAction">

        <interceptor-ref name="prepare"/>

        <interceptor-ref name="modelDriven"/>

        <interceptor-ref name="params"/>

        <interceptor-ref name="loginDao"/>

        <result>/login2/login_ok.jsp</result>

        <result name="login">/login2/login.jsp</result>

      </action>

     

    </package>

</struts>

 

9. http://localhost:8080/interceptor/login2/login.jsp 를 실행하여 결과를 확인하자.

댓글 없음:

댓글 쓰기