..열심히 공부하세../MVC

[13] Struts1 기본문법

댄스댄스 2012. 7. 3. 12:16

 

----------------------------------------------------[스트럿츠 기본]


1. 스트럿츠
- JSP모델2 MVC구조로 개발할 수 있는 기반을 제공하는 프레임 워크이다
- XML기반의 Controller역할을 담당한다

 

2. 스트럿츠로 구현하는 MVC

1) Model : 상태정보를 가지고 있는 자바빈즈(DTO)와
               상태에 변화를 줄 수 있는 로직을 담고 있는 자바빈즈(DAO)가 수행한다

2) View : 뷰 역할은 JSP를 사용한다.
             스트럿츠에서는 스트럿츠의 다른 컴포넌트들과 쉽고 편리하게 결합될 수 있는
             태그라이브러리를 제공하는데 이를 이용하면 JSP코드가 가독성이 높아지고 소스가 간단해 진다

3) Controller : 컨트롤러 역할은 ActionServlet과 Action클래스에서 호출하는 클래스가 이에 해당한다
                     요청 컨트롤러 서블릿을 따로 만들 필요가 없고 ActionServlet이 그 역할을 해주고 있으며
                     ActionServlet에서 실제 로직을 수행하는 액션 클래스를 실행한다
                     컨트롤러의 역할 가운데 하나인 리소스(주로 jsp)포워드는 어떻게 하느냐?
                     스트럿츠 설정파일 struts-config.xml파일에서 지정한 액션 매핑을 이용한다.

 

3. 스트럿츠의 단점
- 기능이 너무 다양해서 설정파일의 복잡도가 높다


-----------------------------------------------------스트럿츠 다운
http://struts.apache.org/downloads.html
Struts 1.3.10 -> struts-1.3.10-all.zip 다운 및 압축풀기

 

이클립스에서 struts1 라이브러리 추가 순서
프로젝트 미리 생성하지 말고 war파일 설치함과 동시에 프로젝트 생성할 것
(.war 대부분 샘플용으로 압축해서 배포됨)

New -> import -> Web -> WAR ->
D:\jsp2_week\setup\struts-1.3.10-all\struts-1.3.10\apps\struts-blank-1.3.10.war
프로젝트명 : struts1Test

 

-----------------------------------------------/WEB-INF/web.xml
<web-app>
  <display-name>Struts Blank Application</display-name>
 
  <!-- Standard Action Servlet Configuration -->
  <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
 </servlet>


  <!-- Standard Action Servlet Mapping -->
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

</web-app>

-----------------------------------------------/WEB-INF/struts-config.xml
    <action-mappings>
        <action
            path="/HelloAction"
            type="test.HelloAction"
            forward="/hello.jsp">
            <forward name="tohello" path="/hello.jsp"/>
    </action-mappings>

 

action은 *.do로 시작하므로 *에 들어가는 값이 path의 HelloAction일때
즉 웹에서 HelloAction.do를 요청하면 struts-config.xml의 action-mapping의 path가

HelloAction인 action이 실행된다

-------------------------------------------------------
struts-config.xml은 항상 다음의 순서로만 작성되어야 한다
<struts-config>
   <data-sources/>
   <form-beans/>
   <global-exceptions/>
   <global-forwards/>
   <action-mappings>
   <controller/>
   <message-resources/>
   <plug-in/>
</struts-config>

--------------------------------------------------------결과확인

http://localhost:9090/struts1Board/LoginForm.do

 

--------------------------------------------------------스트럿츠 클래스의 활용

1. action을 사용한 로그인

 

1) 구현할 파일
    struts-config.xml (controller)
    LoginAction.java (command)
    LoginDTO.java (dto)
    LoginDAO.java(connection pool)
    LoginForm.jsp
    Logon.jsp
    Fail.jsp

 

2) struts-config.xml

        <action
            path="/LoginForm"
            forward="/login/LoginForm.jsp"/>

        <action
            path="/Login"
            type="login.LoginAction"
            validate="false"
            scope="request">
            <forward name="logon" path="/login/Logon.jsp"/>
            <forward name="fail" path="/login/Fail.jsp"/>
         </action>

 

path : *.do의 .do를 제외한 '*'
forward : 해당 위치로 이동
Type : 자바클래스를 실행한다
validate : true일 경우 유효성 검사를 하는데 이때 ActionForm클래스 안에 있는
               validate메소드가 실행된다(직접코딩)
reset : ActionForm클래스 안의 파라미터를 모두 리셋시킨다
scope : 모델에서 넘어오는 값을 리턴 받아 request, session, application등의 형태를
            scope에 저장하여 view페이지를 지정한 뒤 리턴한다.

첫번째 action은 기본 action으로 path에 따라 forward되며
두번째 action은 path에 따라 자바클래스를 돌고 forward된다

-------------------------------------------------[Struts의 주요 클래스]

1. ActionServlet
   - servlet.
   - 모든 클라이언트의 요청을 제일 먼저 맞이한다.
   - 톰캣 구동시 같이 메모리에 로딩
   - init() 메소드를 통해 /WEB-INF/struts-config.xml
     파일에 있는 내용들을 ServletContext 객체에 저장

2. Action
   - 실제적인 비즈니스 로직 처리를 담당한다

   - Controller로서 Model 영역과 접점을 가지는 객체.

   - 사용자의 HTTP 요청에 반응하는 객체로서, struts-config.xml에 저장된

     action element에 따라 객체가 생성됨. 이때 객체는 매번 생성되는 것이

     아니라 단 한번 생성되어 재 사용된다.

   - 보통 직접 Action 클래스를 사용하지 않고 Action 클래스를 상속받는 클래스를

     제작하게 되고 Action 클래스가 가지고 있는 execute() 메소드를 오버라이딩하게 한다.

   - 실제 개발자는 Model과의 작업을 위해 execute() 메소드에서

     Model쪽 Manager 객체를 생성하고 관련 비즈니스 메소드를 호출하는 작업을 한다.

3. RequestProcessor
   - 요청 파라미터 값을 자동으로 ActionForm에 저장한다
   - ActionServlet의 분석 결과에 따라 Action을 선택한다
   - ActionServlet을 대신하여 Action의 execute() 메소드를 호출하는 역할.
   - execute() 메소드 호출 결과인 ActionForward에 따라 View를 연결한다.
   예) /login.do를 사용작 요청하면 struts-config에서 /login으로 지정된 action을 찾아 수행한다

4. ActionForward

   - Controller의 execute() 호출 결과로서, 페이지 이동에 대한 정보를 객체화 한 것.

   - 객체를 통해 forward할 것인지, redirect할 것인지 정해진다.

5. ActionForm

   - HTTP 요청에 따라 파라미터를 처리하기 위한 클래스.

   - 테이터를 저장하고 전달하는 DTO(Data Transfer Object) 객체.

   - ActionForm을 상속받는 형태로 작성.

   - ActionForm 객체의 필드는 자동으로 세팅된다.

   - reset() 메소드로 필드 초기화

   - validate() 메소드로 유효성 검증
   - 유효성 여부에 따라 Action 수행 여부가 결정된다

   - 보통의 Bean 클래스처럼 필드에 접근처리할 수 있는 setter, getter를 작성하면 된다.

6. ActionMapping

   - 사용자 HTTP 접근에 따라 어떠한 Action 객체가 사용되어야 하는지, 그 Action 처리 후

     어느 페이지로 이동해야 하는지에 대한 정보가 struts-config.xml에 있다.

     이 ActionMapping은 그 중에서 이동할 페이지에 대한 맵핑을 가진 객체이다.

     지정된 이름의 forward를 찾아서 ActionForward 객체를 돌려주게 된다.

7. ActionMessages

   - 각종 메시지를 처리하는 클래스. (에러 포함)

8. ActionMessage

   - 한 개의 메시지 처리.

9. ActionErrors

   - 각종 에러 메시지를 처리하는 클래스

   - ActionMessages를 상속받고 있음.

10. ActionError

   - 한 개의 에러 메시지 처리.

 

>>>>>>>>>>>>>>>>>> 1. ActionForm을 사용한 로그인 >>>>>>>>>>>


>>>>>>>>>>>>>>>>>>>>>>>> 작성순서 >>>>>>>>>>>>>>>>>>>>>>>>>

 

------------------------------------------------------------결과확인
http://localhost:9090/struts1Test/LoginForm.do


--------------------------------------/WebContent/login/LoginForm.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<TITLE>LoginForm.jsp</TITLE>
</HEAD>

<BODY>
<form name="frm" method="post" action="Login.do">
      아이디 : <input type="text" name="id" /><br/>
      비번 :    <input type="password" name="passwd" /><br/>
                  <input type="submit" value="확인" />
</form>

</BODY>
</HTML>
--------------------------------------/WebContent/login/Logon.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>logon.jsp</title>
</head>
<body>
      로그인 성공<br/>
      <%=request.getParameter("id") %><br/>
      <%=request.getParameter("passwd") %><br/>
</body>
</html>
--------------------------------------/WebContent/login/Fail.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Fail.jsp</title>
</head>
<body>
      로그인 실패
</body>
</html>
---------------------------------------LoginDAO.java
package login;

import java.sql.Connection;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class LoginDAO {
   
    private Connection getConnection() throws Exception{
        Context initCtx=new InitialContext();
        DataSource ds  =(DataSource)initCtx.lookup("java:comp/env/jdbc/oracle");
        return ds.getConnection();
    }
   
    public boolean isLogin(LoginDTO dto){
        String id=dto.getId();
        String passwd=dto.getPasswd();

        if(id.equals("user")&&passwd.equals("1234")){
            return true;           
        }
        else{
            return false;
        }
    }
}
---------------------------------------LoginDTO.java
package login;

public class LoginDTO {
   
    private String id;
    private String passwd;
   
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getPasswd() {
        return passwd;
    }
    public void setPasswd(String passwd) {
        this.passwd = passwd;
    }
    @Override
    public String toString() {
        return "LoginBean [id=" + id + ", passwd=" + passwd + "]";
    }
   
}
---------------------------------------LoginAction.java
package login;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class LoginAction extends Action {
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
       
        System.out.println("LoginAction");
       
        LoginDTO dto=new LoginDTO();
        dto.setId(request.getParameter("id"));
        dto.setPasswd(request.getParameter("passwd"));

        LoginDAO dao=new LoginDAO();
        boolean result=dao.isLogin(dto);
       
        if(result){
            return mapping.findForward("logon");
        }
        else{
            return mapping.findForward("fail");
        }
    }
}


>>>>>>>>>>>>>>>>>> 2. ActionForm을 사용한 로그인 >>>>>>>>>>>

 

- 장점 : DAO에서 request.getParameter()를 쓰지 않고, ActionForm을 쓴다

- LoginActionForm.java 추가

 

>>>>>>>>>>>>>>>>>>>>>>>>작성순서>>>>>>>>>>>>>>>>>>>>>

---------------------------------/WebContent/actionform/LoginForm.jsp

---------------------------------/WebContent/actionform/Logon.jsp

---------------------------------/WebContent/actionform/Fail.jsp

파일 3개는 위의 내용과 동일

 

--------------------------------------------------LoginActionForm.java
package actionform;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

public class LoginActionForm extends ActionForm {
    private String id;
    private String passwd;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getPasswd() {
        return passwd;
    }
    public void setPasswd(String passwd) {
        this.passwd = passwd;
    }
   
    //유효성검사, id와 passwd에 값이 들어있지 않을때 에러발생
    @Override
    public ActionErrors validate(ActionMapping mapping,
            HttpServletRequest request) {
        System.out.println("validate호출");
        if(id==null || id.length()==0){
            System.out.println("아이디 입력바람!!");
        }
        if(passwd==null || passwd.length()==0){
            System.out.println("비번 입력바람!!");
        }
        return null;
    }
   
    //세션에 저장되어 있는 LoginActionForm을 초기화 한다
    @Override
    public void reset(ActionMapping mapping, HttpServletRequest request) {
        this.id=null;
        this.passwd=null;
    }
}

--------------------------------------------------LoginAction.java
package actionform;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import login.LoginDAO;
import login.LoginDTO;

public class LoginAction extends Action {
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        //request.getParameter("id")가 없어지고
        //ActionForm이 파라미터 값을 받아 유효성 검사를 한 후에 넘겨준다
        //validate가 true일때
       
        LoginActionForm laf=(LoginActionForm)form;
        String id=laf.getId();
        String passwd=laf.getPasswd();
       
        LoginDTO dto=new LoginDTO();
        dto.setId(id);
        dto.setPasswd(passwd);
       
        LoginDAO dao=new LoginDAO();
        boolean result=dao.isLogin(dto);
       
        if(result){
            return mapping.findForward("logon");
        }
        else{
            return mapping.findForward("fail");
        }                      
    }
}
---------------------------------------------/WEB-INF/struts-config.xml

ActionForm을 쓸때는 form-bean의 name과 action의 name이 같아야 한다

<struts-config>
    <form-beans>
        <form-bean
            name="ActionForm"
            type="actionform.LoginActionForm"/>
    </form-beans>


   <action-mappings>
          
        <action
            path="/LoginActionForm"
            forward="/actionform/LoginForm.jsp"/>

        <action
            name="ActionForm"
            path="/ActionForm"
            type="actionform.LoginAction"
            validate="true"
            scope="request">
            <forward name="logon" path="/actionform/Logon.jsp"/>
            <forward name="fail" path="/actionform/Fail.jsp"/>
         </action>

    </action-mappings>
</struts-config>
----------------------------------------------------------------결과확인
http://localhost:9090/struts1Test/LoginActionForm.do