struts.xml

<!-- 2.POJO 형태의 ACTION -->
	<package name="pojo" extends="struts-default">
		<action name="helloWorld02" class="tutorial.HelloWorld02">
			<result name="success">/helloWorld02.jsp</result>
		</action>
	</package>

HelloWorld02.java

package tutorial;

public class HelloWorld02 {
	private String message;
	
	//getMessage()역할은 request.setAttribute("message",message);
	public String getMessage(){
		return message;
	}
	
	public String execute() throws Exception{
		message = "POJO 형태의 액션 만들기";
		
		return "success";
	}
}

helloWorld02.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>POJO 형태의 액션 연습</title>
</head>
<body>
${message}
</body>
</html>

implements Action이 없으면

강요되는 부분이 없어서 에러날 확률이 있다

그냥 작동된다는것만 확인 하자




Struts2 : JSP보다 어렵지만 능률적


처음요청을받는 필터 FilterDispatcher
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>


struts.xml : 어플리케이션의 모든 제어에 대한 설정, 클래스 패스의 루트에 위치, 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="default" extends="struts-default">

     <!-- 기본연결 start -->

              <!-- helloWorld: 요청 url,  호출되는 class:dr.struts2.ch01.action.HelloWorld-->

       <action name="helloWorld" class="dr.struts2.ch01.action.HelloWorld">

               <!-- 출력되는 /hello.jsp -->

        <result name="success">/hello.jsp</result>

       </action>

   </package>

<!-- 기본연결 end -->

</struts>


P53

액션 클래스 작성 방법

1. POJO 형태로 작성 : 평범한 옛 자바 오브젝트 : 복잡해진 상속,구현 관계를 깨버리고  편의성 생산성을 회복하기위한 방법
2. Action 인터페이스로 구현하여 작성 : struts.xml에서 액션과 class를 맵핑 success같은 반환타입에따라 jsp선택이동 
3. ActionSupport 클래스를 확장하여 작성 :      

-ActionSupport 클래스는 Validateable 인터페이스의 validate() 메서드와, ValidationAware인터페이스의 addFieldError()메소드와 함께 사용하여 유효성을 검사하는 기능을 제공한다 . 

-액션을 Actionsupport클래스을 확장하여 유효성 검사







include 요소 설정 파일 관리하기 P70

여러개의 설정파일을 만들어서 나눠사용 가능

struts.xml
    <include file="struts-ch4.xml" />
    <include file="struts-ch5.xml" />

패키지(package)

패키지는 result-types, interceptors, action 등을 논리적인 단위로 그룹핑하는데 사용한다.

1) 패키지에 들어가는 엘리먼트 순서

result-types
interceptors
default-interceptor-ref
default-action-ref
global-results
global-exception-mappings
action

2) 패키지 속성
속성필수설명
name
(식별요소)
필수필수 속성. 패키지를 구분하는 키. 패키지의 name은 유일해야 함. 다른 패키지가 이 패키지를 상속할 때 이 이름을 사용한다.
extends
(다른패키지
상속할때)
선택다른 패키지를 상속하고자 할 때 다른 패키지의 name을 지정한다. 다른 패키지를 상속하면 그 패키지 내의 설정들을 그대로 이어 받는다. 상위 패키지의 설정을 다시 정의하면 그 설정을 오버라이드 하게 된다.
namespace

선택네임스페이스. 패키지 내의 액션들을 URL에 매핑할 때 이 네임스페이스가 URL의 중간 경로가 된다
abstract선택패키지를 추상 패키지로 만든다. 추상 패키지에는 액션 설정이 없다. 다른 패키지에 상속하는 용도


네임스페이스

/StrutsMain/helloWorld.action
/StrutsMain/ch04/helloWorld.action
           (네임 스페이스지정시 URL의 중간경로 , ch04 폴더:가상일수도 있고 만들어줄수도있음)

액션없이 설정만으로 jsp연결

루트네임 스페이스 : 네임 스페이스 사용안할시
명시적 루트네임스페이스 : namespace="/"

디폴트 네임스페이스 : 명시안하거나
extends="struts-default"
명시적으로 명시 namespace=""


많이 사용하는 방법
<!-- 3.네임스페이스 사용 -->
<!-- 4.ActionSupport를 이용한 jsp 호출 -->
<!-- 5. 디폴트 액션  -->


01 Action 인터페이스 이해하기

execute() 메소드 : 액션 클래스가 인스턴스화되면서 자동 호출되는 기본 액션 메소드
리턴 코드
리턴코드설명
ERROR액션 실행에 실패하여 에러 페이지로 돌아감
INPUT입력 값이 부족하거나 문제가 있어 입력 페이지로 돌아감
LOGIN로그인을 하지 않아서 액션을 실행할 수 없으므로 로그인 페이지로 돌아감
NONE액션이 성공적으로 실행은 되었지만 화면을 보여주지 않음
SUCCESS액션이 성공적으로 실행되어 결과 화면을 사용자에게 보여줌


생성자, getter,setter, toString



도메인 오브젝트 사용1,2,3



ActionSupport (prepare,medelDriven,params) 클래스에 대한 이해

-ActionSupport 클래스는 Validateable 인터페이스의 validate() 메서드와, ValidationAware인터페이스의 addFieldError()메소드와 함께 사용하여유효성을 검사하는 기능을 제공한다 . 

-액션을 Actionsupport클래스을 확장하여 유효성 검사


ModelDriven

 - 도메인 오브젝트에 접근하기 위한 방법으로 ModelDriven 액션을 사용하는 방법이 있다. 

 - ModelDriven 액션 클래스를 생성하기 위해서는 ModelDriven 인터페이스를 구현해야 한다. 

 - ModelDriven 인터페이스를 API document에서 찾아보도록 한다.


class: 인터페이스를 구현한 클래스에서는 추상메소드를 오버라이딩해서 구현


@Override

public Object getModel(){

  return user; : 생성된 객체를  value stack 상단에 올림

}


struts.xml:

<interceptor-ref name="modelDriven"/>


userRegForm3.jsp: 

<input type="text" name="userId">



Preparable


 - Preparable 인터페이스는 액션의 메소드 execute를 실행하기 전에 다른 로직을 실행하고 싶을때 사용한다. 

 - Preparable인터페이스 API document에서 찾아보도록한다


class: 인터페이스를 구현한 클래스에서는 추상메소드를 오버라이딩해서 구현


@Override

public void bprepare() thorws Exception{

   user=new User(); :객체를 생성

}


struts.xml:

<interceptor-ref name="prepare"/>



유효성검사


extends ActionSupport


@Override

public void validate()


<action name="helloWorld5" class="com.ch4.action.HelloWorld5">
            <interceptor-ref name="params"/>
            <interceptor-ref name="workflow"/>
            <result name="input">name5.jsp</result>
            <result name ="success">hello.jsp</result>
</action>


====================================프로젝트========================================
Java Resources
           src
                 com.ch4.action
                       CreateUser (도메인 오브젝트 사용1) : JSP적 
                       CreateUser2 (도메인 오브젝트 사용2) : Struts2 user.프로퍼티
                       CreateUser3 (도메인 오브젝트 사용3)
                       HelloWorld (네임스페이스)
                       HelloWorld3 (파라미터값을 전달받는 예제)
                       HelloWorld4 (유효성체크)
                       HelloWorld5 (ActionSupport 상속 유효성 체크)

                 com.ch4.dao
                       UserDao (도메인 오브젝트 사용1)

                 com.ch4.domain
                       User (도메인 오브젝트 사용1)  

                 com.ch5.interceptor
                       TimerInterceptor (커스텀 인터셉터)

                 tutorial
                       HelloWorld (첫예제)
                       HelloWorld02 (POJO 형태)
                 struts-ch5.xml
                 struts-ch4.xml 
                 struts.xml (include 할것)

WebContent
         ch4
                 createSuccess.jsp (도메인 오브젝트 사용1,2,3)
                 hello.jsp (네임스페이스)
                 name3.jsp (파라미터값을 전달받는 예제)
                 name4.jsp (유효성체크)
                 name5.jsp (ActionSupport 상속 유효성 체크)
                 userForm.jsp (도메인 오브젝트 사용1): JSP적 
                 userForm2.jsp (도메인 오브젝트 사용2) : Struts2 user.프로퍼티
                 userForm3.jsp (도메인 오브젝트 사용3)

         WEB-INF
                 web.xml
         a.jsp (와일드 카드를 사용해서 출력하기)
         hello.jsp (액션없이 action출력하기)
         helloWorld.jsp (첫예제)
         helloWorld02.jsp (POJO 형태)
         index.html
         some.jsp (디폴트 액션 연습 500에러)

====================================프로젝트========================================


====================================코드========================================
Java Resources
           src
                 com.ch4.action
                       CreateUser (도메인 오브젝트 사용1) : JSP적

'Struts2 > 기본(Oracle)' 카테고리의 다른 글

struts2 ActionSupport를 이용한 JSP 호출 (form만 요청할페이지에 사용)  (0) 2012.06.21
struts2 POJO형태의 액션 만들기  (0) 2012.06.20
struts2 기본예제  (0) 2012.06.20
struts2 설정  (0) 2012.06.20
struts2 란?  (0) 2012.06.20
HelloWorld
package tutorial;

import com.opensymphony.xwork2.Action;

public class HelloWorld  implements Action{

    private String message;
    
    public String getMessage(){
        return message;
    }
    
    @Override
    public String execute() throws Exception {
        
        message ="Hello, World";
        
        return SUCCESS;
    }
}

struts.xml
<!--?xml version="1.0" encoding="UTF-8" ?-->


<struts>
    <!-- 1.기본연결 -->
    <package name="tutorial" extends="struts-default">
        <action name="helloWorld" class="tutorial.HelloWorld">
            <result name="success">/helloWorld.jsp</result>
        </action>
    </package>
</struts>

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>struts2Main</display-name>
    <!-- 스트럿츠는 필터가 서블릿보다 먼저 동작하여 요청을 받는다  -->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
        <init-param>
            <param-name>struts.i18n.encoding</param-name>
            <param-value>utf-8</param-value>
           </init-param> 
    </filter>
    
    <!-- 모든요청을 필터가 받는다. -->
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>

</web-app>
helloWorld.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>테스트</title>
</head>
<body>
${message}
</body>
</html>



'Struts2 > 기본(Oracle)' 카테고리의 다른 글

struts2 ActionSupport를 이용한 JSP 호출 (form만 요청할페이지에 사용)  (0) 2012.06.21
struts2 POJO형태의 액션 만들기  (0) 2012.06.20
struts2 이론  (0) 2012.06.20
struts2 설정  (0) 2012.06.20
struts2 란?  (0) 2012.06.20

work_struts


새프로젝트 만들기 


톰켓서버설정














인코딩정보 4군대













struts import 하기















요소역할비고
필터URL의 확장자가 action이면 FilterDispatcher에 의해서 액션을 실행하기 위한 환경을 구축하도록 한다.web.xml
액션리절트가 필요로 하는 메시지를 제공한다.HelloStruts.java
매핑액션실행 후 결과를 처리할 리절트와의 매핑을 설정한다.struts.xml
리절트메시지를 출력하기 위한 화면 처리를 담당한다.helloStruts.jsp



 web.xml : 웹 어플리케이션 Deployment Descriptor(DD), Struts2 필터 등록

<!-- Struts2 dispatcher start -->

 <filter>

                 <filter-name>struts2</filter-name>

                 <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

                 <init-param>

                          <param-name>struts.i18n.encoding</param-name>

                          <param-value>utf-8</param-value>

                 </init-param>

        </filter>

        <filter-mapping>

                 <filter-name>struts2</filter-name>

                 <url-pattern>*.action</url-pattern>

        </filter-mapping>

        <!-- Struts2 dispatcher end -->



'Struts2 > 기본(Oracle)' 카테고리의 다른 글

struts2 ActionSupport를 이용한 JSP 호출 (form만 요청할페이지에 사용)  (0) 2012.06.21
struts2 POJO형태의 액션 만들기  (0) 2012.06.20
struts2 이론  (0) 2012.06.20
struts2 기본예제  (0) 2012.06.20
struts2 란?  (0) 2012.06.20



프레임워크은 ‘핵심적인 클래스와 인터페이스, 정보파일(XML)을 미리 모아놓은 집합 또는 라이브러리’라고 할 수 있다. 

1) 스트럿츠 프레임워크는 Jakarta프로젝트에서 개발, 오픈 소스의 웹 어플리케이션 프레임워크.
2) 스트럿츠는 MVC 패턴의 프레임워크.
3) 스트럿츠2는 스트럿츠와 웹워크가 결합한 형태

4) 다운로드와 설치 : http://struts.apache.org 에 접속 최신 버전 다운로드




<스트럿츠2의 특징>

1) 완전히 새로운 프레임워크. 
    스트럿츠1 때와는 다른 웹워크의 MVC 아키텍처 채용
2)  직관적인 개발. 
    POJO 기반 액션(Action)
3)  Zero Configuration 지향. 
    기본 값 지원으로 많은 설정 생략 가능. 
    어노테이션 사용으로 설정 파일에서 설정 생략
4)  신속한 리로딩. 
    변경된 환경 설정 파일의 내용을 웹 컨테이너 재시작 없이 리로드
5) POJO 액션, POJO 폼
   프레임워크에 종속되지 않음
6) 손쉬운 Ajax(Asynchronous Javascript And XML)구현
    Dojo 프레임워크 포함
    Ajax 테마 지원 태그
7)  다양한 표현식 언어 EL(Expression Language) 지원
     JSTL 사용 가능
     OGNL(Object Graph Navigation Language) 지원
8)  다양한 리절트 타입의 지원 및 프로파일링
     JSP 외의 프리마터(Freemarker), 밸로시티(Velocity) 등의 사용 가능




'Struts2 > 기본(Oracle)' 카테고리의 다른 글

struts2 ActionSupport를 이용한 JSP 호출 (form만 요청할페이지에 사용)  (0) 2012.06.21
struts2 POJO형태의 액션 만들기  (0) 2012.06.20
struts2 이론  (0) 2012.06.20
struts2 기본예제  (0) 2012.06.20
struts2 설정  (0) 2012.06.20
자바/오라클 - 안드로이드 - jsp - struts2

01. jsp/  .HTML .JSP - 자바라이브러리 사용을 위하여
 
02.  a.jsp 보여줘 /    A.java -> A.class
                                  a.jsp   -> a.servlet
 
03. a.jsp안에 form태그가 있어서  ->  
       서블릿(init,doPost(요청, 응답), doGET)   - > b.jsp
 
04. jsp  파일의 구조 . 
      태그 / <%스크립틀릿  %> / <%! 선언부 %> / <%=표현식 %>
 
05. 요청 - 응답(버퍼에 담았다가 한번에 보여줍니다)
 
06.  기본객체. out, request, response, session, pagecontext, application..
      <%  out.write("~~")   ; request.getParamater('id');    %>
 
07. 페이지 제어 . <jsp:forward page=" " >    request.dispacher()
                             <jsp:include 
                            <jsp:redirect 
 
08. 에러페이지 지정 .   에러의 종류에 따라 다른 페이지를 보여줄 수 있다.
 
09. 쿠키 생성 가능 . 요청에 쿠키가 묻어 갑니다. 
 
10.  세션 : 세션에 일반적으로 ID등을 bind시킨다. setting   . 
       예)session.setAttribute("id", "sogangori");
 
11.  <jsp:useBean >  객체를 만든다. <%  new Item(); %>
         a.jsp에서 form으로 id, pw, name => b.jsp 
          <%  request.getParameter("id");  


              new Item(id, pw, name);
	%>
         <jsp:useBean name="item" > 
 
12.  DataBase저장소 
        jsp안에서 <%  db 연결후에 명령 날리기  %>  <%= 표현할 값  %>

 
13.   <%  db 연결후에 명령 날리기  %> 이 안의 반복되는 부분을
        *.java 로 만들어 놓고,  메서드를 호출한다. 
       DBConnection.java {
               메서드 connect(){
		1. 드라이버로딩. 2.커넥션맺기 
	}
     }
     <% DBConnection.java  객체 생성후 connect()메서드 호출 %>

 
14.  드라이버로딩...  등의 딱 1번만 하면 될 일등을 web.xml 에게 맡긴다. 

 
15.  db의 모든 리스트를 가져와서 화면에 출력하기 
       list.jsp   <%    db에서 list가져오는 명령1. 
	            db에서 list가져오는 명령2. 

			....

	             db에서 list가져오는 명령10.
                             C  컨트롤러 
	 %>

       위의 기능은 Service패키지 안의 ListAction.java 파일로 빼버린다. 
       		arrayList.addItem()  // Item  모델 M
        list.jsp   <% arrayList = new ListAction.getAllList(); %>
                      request.setAttribute(arrayList);
                      <jsp:forward  "V 뷰페이지" > 

 
16. *.jsp 파일에 <% %> 언어가 완전히 사라져버린다. 

 
17. struts2   프레임 워크
     사용자의 요청(URL)을 스트러츠2가 받는다. 
     A.action   =>  struts2가 받아서 => struts.xml 안에서 액션을 찾아서
     =>  어떤 Login.java자바클래스를 실행할지, 그안의 어떤 메서드를 실행할까..
     => 어떤 페이지를 사용자에게 보여줄지.

 
18. Login.java

      clas Login extends ActionSupport{
           String id, pw;

           execute(){
              //여러가지 작업을 한다.
             if(조건1) return "success";   <result name="success"> success.jsp
             if(조건2) return "fail";            <result name="fail"> fail.jsp
         }

       public void setId(String kk){
             id= kk;
      }
	 
      public void getId(){
             return id;                     //  .jsp   ${id}
      }

 
19. ActionSupport 라는 클래스, ModelDriven, Preparable 
 
20. <intercepter>
 
21. <result type="dispacher">
        <result type="redirect">
 
 
22. jsp   표준태그 라이브러리 <% %>  jstl
        struts  표준태그 라이브러리    <%@ taglib prefix="s"   ... <s:
		
                 <s:property    페이지나 세션, 리퀘스트, 어플 
                 <s:iterator    리스트를 하나하나씩 표현할 수 있다. 

 
23. 유효성검사 , 파일 업로드, 다운로드 
 
24. 예외처리, 로깅, 프로파일 
 
25. 스프링 .. 유연한 프레임워크 ..  
        db와 커넥션 맺는 클래스 (DBConnetor.java) -> new DBConnector();
        스프링이 객체를 만들어 놓으면 웹종료시까지 사용가능 
        전역(클래스)변수 -  클래스 종료 시까지 사용하다. 
        스프링이 생성한 객체 - 웹(서버) 종료 시까지 사용가능하다. 

 
26. iBatis   -  DB처리를 해주는 라이브러리 
        xml파일에  query를 넣어둔다. 
       <select name="select"   resultType="Item">
             SELECT * FROM BBS;
        </select>
       
         *.java에서 .queryForList("select"); 
        1. db관련 소스를 50% 이하로 줄여준다.
        2. 커넥션과 관련된 예외 처리를 자동으로 처리해준다.

 
27. tiles 라이브러리   *.tiles =>   tiles-basic.xml  =>  화면 보여주기
                                     *.action => struts.xml =>  어떤 자바파일 실행 
                                     => 화면 보여주기 
 
28.  html   <   HTML태그(마크업), script, css
 
29. script - HTML5의 새로운기능, jquery를 공부합니다.
 
30. jquery - mobile 





1.게시판에 사용될 테이블 만들기



_M#]



2.게시판 프로젝트 시작하기



3.게시판 리스트를 위한 프로그래밍



4.게시물 쓰기


5.게시물 상세보기


06.게시물 수정하기


07.게시물 삭제하기



08.예외 처리 페이지







action/ListAtion.java

package action; import java.sql.SQLException; import java.util.HashMap; import java.util.List; import java.util.Map; import model.User; import conn.Ibatis; public class ListAction { List<User> list; public String execute(){ Ibatis ibatis=new Ibatis(); try { //db에서 모든 글을 가져오기 list=ibatis.sqlMapper.queryForList("selectAllUsers"); //select하기 ? Map<String, String> map=new HashMap<String, String>(); map.put("USER_ID", "^^"); //list=ibatis.sqlMapper.queryForList("select", map); // 지우기 ibatis.sqlMapper.delete("delete", map); } catch (SQLException e) { System.out.println(e.getMessage()); } return "success"; } public List<User> getList() { return list; // <s:iterater value="list">로 호출할 것이 } }



conn/Ibatis.java
package conn;

import java.io.IOException;
import java.io.Reader;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import model.User;

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

public class Ibatis {
	public static SqlMapClient sqlMapper;	
	static {
		try {
			//sqlMapConfig.xml 파일의 설정내용을 가져온다.
			Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
			//sqlMapConfig.xml의 내용을 적용한 sqlMapper 객체 생성.
			sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
			reader.close(); 
		} catch (IOException e) {
			throw new RuntimeException(
					"SqlMapClient 인스턴스 생성시 예외발생." + e, e);
		}
	}   
}

model/User.java
package model;

public class User {
	private String userId;  
	private String userPW;
	private String userName;
	public String getUserId() {
		return userId;
	}
	public void setUserId(String userId) {
		this.userId = userId;
	}
	public String getUserPW() {
		return userPW;
	}
	public void setUserPW(String userPW) {
		this.userPW = userPW;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	@Override
	public String toString() {
		String result;
		result=String.format("[User:ID=%s,Password=%s,Name=%s]", 
				userId, userPW, userName);
		return result;
	}
}


test/UserTest.java
package test;

import java.io.IOException;
import java.io.Reader;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import model.User;

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

public class UserTest {
	private static SqlMapClient sqlMapper;
	static List<User> list;
	static {
		try {
			//sqlMapConfig.xml 파일의 설정내용을 가져온다.
			Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
			//sqlMapConfig.xml의 내용을 적용한 sqlMapper 객체 생성.
			sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
			reader.close(); 
		} catch (IOException e) {
			throw new RuntimeException(
					"SqlMapClient 인스턴스 생성시 예외발생." + e, e);
		}
	}   

	public static List<User> getList() {
		return list;   //${list}  <s:property value="list"> <s:iterator 로 화면에 출력
	}
}


13-1.sql
create table if not exists user(
  USER_ID varchar(20) primary key,
  USER_PW varchar(20),
  USER_NAME varchar(20)
);
insert into user value('^^', 'pppp1111', 'Hong');
insert into user value('-_-', '1111pppp', 'Min');
commit;
insert into user (USER_ID, USER_PW, USER_NAME )
 values ('pinksubean', 'pppp1111', 'park');
insert into user (USER_ID, USER_PW, USER_NAME )
 values ('pinkonejee', '1111pppp', 'kim');
SqlMapConfig.xml
<?xml version="1.0" encoding="euc-kr" ?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" 
"http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>

  <properties resource="dbconnect.properties" />

  <settings 
    useStatementNamespaces="false"
    cacheModelsEnabled="true" 
    enhancementEnabled="true"
    lazyLoadingEnabled="true" 
    maxRequests="32" 
    maxSessions="10" 
    maxTransactions="5" 
    />

  <transactionManager type="JDBC">
    <dataSource type="DBCP">
      <property name="JDBC.Driver" value="${driver}" />
      <property name="JDBC.ConnectionURL" value="${url}" />
      <property name="JDBC.Username" value="${username}" />
      <property name="JDBC.Password" value="${password}" />
      <property name="JDBC.DefaultAutoCommit" value="false" />
    </dataSource>
  </transactionManager>

   <sqlMap resource="User.xml" />
</sqlMapConfig> 
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>
  <constant name="struts.i18n.encoding" value="UTF-8" />
  <constant name="struts.devMode" value="true" />
  
  <package name="ch12"  extends="struts-default">

	
	<action name="List" class="action.ListAction">
		<result>list.jsp</result>
	</action>

   </package>    
</struts>

User.xml
<?xml version="1.0" encoding="euc-kr" ?>

<!DOCTYPE sqlMap      
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"      
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="User">
  <!--  전화번호부 테이블 DATA0=(user_name) DATA1 DATA2 -->
  <!-- 리절트 맵 정의 -->
  <resultMap id="UserResult" class="model.User">
    <result property="userId" column="USER_ID"/>
    <result property="userPW" column="USER_PW"/>
    <result property="userName" column="USER_NAME"/>
  </resultMap>
  
  <!-- select 쿼리문 정의 -->
  <select id="selectAllUsers" resultMap="UserResult">
    select * from USER
  </select>
   <!-- 상세 내용 보기 -->
     <select id="select" parameterClass="java.util.Map"
             resultMap="UserResult">
             select * from USER where USER_ID=#USER_ID#
     </select>
  
    <!--  글 지우기  -->
  	<delete id="delete" parameterClass="java.util.Map">
  		delete  from USER where USER_ID=#USER_ID#
  	</delete>
  	
  	<!--  글 수정하기 -->
  	<update id="update" parameterClass="java.util.Map">
  		update USER (USER_PW, USER_NAME  ) 
  		set ( #USER_PW#, #USER_NAME#  ) where USER_ID=#USER_ID#
  	</update>
</sqlMap>

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>아이바티스 공부</display-name>
 
    
  <filter>
  <filter-name>struts2</filter-name>
  <filter-class>
  org.apache.struts2.dispatcher.FilterDispatcher
  </filter-class>
   <init-param> 
     <param-name>struts.i18n.encoding</param-name>
     <param-value>euc-kr</param-value>
  </init-param> 
  </filter>
  <filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
  </filter-mapping>  
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>
list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>    
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
	게시글 목록 <br/>
	<s:iterator value="list">
		<s:property value="userId"/> / 
		<s:property value="userPW"/> /
		<s:property value="userName" />		<hr/>  
	</s:iterator> <br/> 
	private String userId;  
	private String userPW;
	private String userName;
</body>
</html>




스프링 라이브러리 다운 받기

http://www.springsource.org/download






action/UserRegAction4.java
package action;

import model.User;
import dao.UserDao;
import com.opensymphony.xwork2.ActionSupport;

public class UserRegAction4 extends ActionSupport {
	private User user=new User();	
	private UserDao userDao;
	
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}		
	
	public UserDao getUserDao() {
		return userDao;
	}
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
	@Override
	public String execute() throws Exception {
		//userDao=new UserDao();
		// 객체 생성을 spring 이 해주었다. 
		userDao.create(user);
		return SUCCESS;
	}
}


dao/UserDao.java
package dao;

import model.User;

public class UserDao {
	public void create(User user){
		System.out.println("사용자를 추가했습니다.");
		System.out.println("추가된 사용자의 정보");
		System.out.println(user);
	}
}

model/User.java
package model;

public class User {
	private String userId;  
	private String userPW;
	private String userName;
	public String getUserId() {
		return userId;
	}
	public void setUserId(String userId) {
		this.userId = userId;
	}
	public String getUserPW() {
		return userPW;
	}
	public void setUserPW(String userPW) {
		this.userPW = userPW;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	@Override
	public String toString() {
		String result;
		result=String.format("[User:ID=%s,Password=%s,Name=%s]", 
				userId, userPW, userName);
		return result;
	}
}

struts.properties
struts.i18n.reload=true
struts.devMode=true
struts.configuration.xml.reload=true
struts.objectFactory=org.apache.struts2.spring.StrutsSpringObjectFactory
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>
  <constant name="struts.i18n.encoding" value="UTF-8" />
  <constant name="struts.devMode" value="true" />
  
  <package name="ch12"  extends="struts-default">

    <action name="userRegForm">
      <result>/jsp/userRegForm4.jsp</result>
    </action>  
    
    <!--  spring 적용된 userRegAction4  -->
    <action name="userRegAction" class="userRegAction4"> 
      <result name="input">/jsp/userRegForm4.jsp</result>  
      <result name="success">/jsp/userRegSuccess4.jsp</result>
    </action>
   </package>    
</struts>

jsp/useRegForm4.jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>회원 가입</title>
</head>
<body>
<center>
<h2>회원 가입</h2><p>
<s:form action="userRegAction"  validate="true">
    <s:textfield label="아이디" name="user.userId" value="%{user.userId}" />  
    보는는 쪽 : 객체.setUser().setUserId()  /  받는쪽 : 객체.getUser().getUserId();  
    <s:password label="비밀번호" name="user.userPW"  value="%{user.userPW}" />
    <s:textfield label="이름" name="user.userName"  value="%{user.userName}" />
    <s:submit/>
</s:form>
</center>
</body>
</html>
jsp/useRegSuccess4.jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>회원 가입 완료</title>
</head>
<center>
<body>
<b><font color="red">회원 가입이 완료되었다.</font></b><p>
 아 이 디 : <s:property value="user.userId"/>  <p>
 비밀번호 : <s:property value="user.userPW"/>  <p>
 이 름  : <s:property value="user.userName"/> <p>
</body>
</center>
</html>
appliactionContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="byName">
<bean id="userDao" class="dao.UserDao" />
<!--  userDao = new UserDao(); 객체를 생성해 둡니다. 
	   db와 연동시켜주는 객체는 싱글톤을 사용하거나 
	   userDao.getInstance(); - 싱글톤 객체 얻는 명령.. 
	   userDao.insert  userDao.selectAll.. 등등
	   
 -->
<bean id="userRegAction4" class="action.UserRegAction4" />
<!--  action.UserRegAction4 클래스를 userRegAction4로
	   불러 사용할 수 있습니다. 
	   + action.UserRegAction4 클래스의 객체를 생성해둡니다.
	   new UserRegAction4(); 
  -->

</beans>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>Chapter14</display-name>
    <context-param>
	    <param-name>contextConfigLocation</param-name>
	    <param-value>
	    	/WEB-INF/applicationContext.xml
	    </param-value>
	</context-param>
	
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
  <filter>
  <filter-name>struts2</filter-name>
  <filter-class>
  org.apache.struts2.dispatcher.FilterDispatcher
  </filter-class>
   <init-param> 
     <param-name>struts.i18n.encoding</param-name>
     <param-value>UTF-8</param-value>
  </init-param> 
  </filter>
  <filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
  </filter-mapping>  
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>



MyException.java
package Service;

public class MyException {
	String name;
	String message;
	
	public String execute() throws Exception{
		message="실행중입니다";
		System.out.println("MyException-execute");
		// 일부러 예외를 만들어 보자
		
		int len = name.length(); 
		//java.lang.NullPointerException 발생
		
		message="에러 없이 실행 완료";
		return "success";		
	}

	public String getMessage() {
		return message;
	}
	
}

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>
	<constant name="struts.i18n.encoding" value="UTF-8" />
	<constant name="struts.devMode" value="true" />
	
	<package name="hi" extends="struts-default" 
		namespace="/"	>
		
	<!--  예외 발생하면 기본적으로  Exception.jsp 띄우기 -->
	<global-results>
		<result name="error">/Exception.jsp</result>
	</global-results>	
	<global-exception-mappings>
		<exception-mapping result="error" 
		exception="java.lang.Exception"/>
	</global-exception-mappings>
		
	<!--   <result name="error">/Exception.jsp</result>
		   <exception-mapping result="error" 
	     	exception="java.lang.NullPointerException"/>
	-->
	
    
    <action name="Exception"  class="Service.MyException">
    	<result name="error">/Exception.jsp</result>
    	<result>/Exception.jsp</result>
    	<exception-mapping result="error" 
    	exception="java.lang.NullPointerException" />
    </action>
	</package>
</struts>
pageError.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ page isErrorPage="true"%>
<html>
<body>
<h1>에러 페이지</h1>
${exception}
</body>
</html>

Exception.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
	${message }
</body>
</html>





로깅

http://logging.apache.org 

log4j-1.2.15.jar


log4j.properties
# Log4J Settings for log4j 1.2.x (via jakarta-commons-logging)
#
# The five logging levels used by Log are (in order):
#
#   1. DEBUG (the least serious)
#   2. INFO
#   3. WARN
#   4. ERROR
#   5. FATAL (the most serious)

# Set root logger level to WARN and append to stdout
log4j.rootLogger=WARN, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%d %5p (%c:%L) - %m%n

# OpenSymphony Stuff
log4j.logger.com.opensymphony=INFO
log4j.logger.org.apache.struts2=DEBUG

log4j.logger.com.opensymphony.xwork2.util.profiling.UtilTimerStack=INFO





프로파일링


s06.FileIO.zip





스트럿츠 2는 서버에 파일 업로드하기 위해서는 이 기능을 지원하는 IO 컴퍼넌트 ,

FileUpload 컴퍼넌트의 2가지 라이브러리가 필요하다.

commons-fileupload-1.2.1.jar

commons-io-1.4.jar


※Struts 2의 기본 설정 파일에서는 업로드 파일 크기를 2MB로 제한하고 있다.


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>
	<constant name="struts.i18n.encoding" value="UTF-8" />
	<constant name="struts.devMode" value="true" />
	
	<package name="hi" extends="struts-default" 
		namespace="/"	>
		
	
	<action name="FileUploadForm" class="file.FileUploadAction">
      <result>/jsp/fileUpload.jsp</result>
    </action>
    <action name="FileUploadAction" class="file.FileUploadAction">
      <result name="input">/jsp/fileUpload.jsp</result>
      <result>/jsp/fileUploadOK.jsp</result>
    </action>
    
      
    
	<action name="FileList" class="file.FileListAction">
	    <result>/jsp/fileDownload.jsp</result>
	</action>		
    <action name="FileDownload" class="file.FileDownloadAction">
            <result type="stream">
                <param name="contentType">binary/octet-stream</param>
                <param name="contentLength">${contentLength}</param>
                <param name="contentDisposition">${contentDisposition}</param>
                <param name="inputName">inputStream</param>
                <param name="bufferSize">4096</param>
            </result>
    </action>  
    
 
	</package>
</struts>

struts.properties
struts.i18n.encoding=UTF-8
struts.multipart.maxSize=2097152
struts.devMode = true

jsp/fileUpload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>파일 업로드</title>
</head>

<body>
  <h2>파일 업로드 입력 폼</h2>
  <s:form action="FileUploadAction" method="POST" enctype="multipart/form-data">
  <s:file name="upload" label="File"  size="50"/>
  <s:submit />
  </s:form>
</body>
</html>

jsp/fileUploadOK.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>파일 업로드</title>
</head>

<body>
  <h2>파일 업로드 입력 완료</h2>

  <p>
    <ul>
    <li>ContentType: <s:property value="uploadContentType" /> / ${uploadContentType}</li>
    <li>FileName: <s:property value="uploadFileName" /></li>
    <li>File: <s:property value="upload" /></li>
    </ul>
  </p>

</body>
</html>
jsp/fileDownload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>파일 다운 로드</title>
</head>

<body>
<h4>다운로드 목록</h4><hr>
다운로드 디렉토리 : <s:property value="BasePath"/> 
   
<ul>

<s:iterator value="listFile" status="stat">
	<s:url id="download" action="FileDownload">
		<s:param name="basePath" value="basePath" />
		<s:param name="fileName"><s:property value="listFile[#stat.index].name" /></s:param>
	</s:url>
	<li><s:a href="%{download}"><s:property value="listFile[#stat.index].name" /></s:a><br/></li>
</s:iterator>
</ul>
<br/>
* 파일 이름을 클릭하면 파일이 다운로드됩니다. 
</body>
</html>

FileListAction.java
package file;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import com.opensymphony.xwork2.ActionSupport;

public class FileListAction extends ActionSupport {
	
	private static final String BasePath = "C:/upload/";
	
	private List<File> listFile = new ArrayList<File>();
	private String basePath;
    
	public String execute() throws Exception {
		basePath = BasePath;
		File dir = new File(basePath);
		File[] files = dir.listFiles();
		
		if (null != files) {
			for (File f: files) {
				if (f.isFile()) {
					listFile.add(f);
				}
			}
		}		
		
		return SUCCESS;
	}

	public List getListFile() {
		return listFile;
	}
	public void setListFile(List<File> listFile) {
		this.listFile = listFile;
	}
	public String getBasePath() {
		return basePath;
	}
	public void setBasePath(String basePath) {
		this.basePath = basePath;
	}
}

FileUpload.java
package file;

import java.io.File;

import org.apache.commons.io.FileUtils;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.profiling.UtilTimerStack;

public class FileUploadAction extends ActionSupport {
	
	  private static final String UploadPath = "C:/upload/";

	  // 스트럿츠2 파일 업로드의 특징 : intercepter가 파일 객체의 3가지 정보를 셋팅합니다. 
	  private File upload; // <s:file name="upload" 파라미터
	  private String uploadContentType;
	  private String uploadFileName;
	  
	  File saveFile;
	  
	  @Override
	  public String execute() throws Exception {
		  //프로파일링 셋팅하자
		  UtilTimerStack.setActive(true);
		  
		    if(upload != null && upload.exists()){
		    	saveFile=new File(UploadPath+uploadFileName);
		    	FileUtils.copyFile(upload, saveFile); //왼쪽 것을 오른쪽으로 복사한다. 
		    }
		    return SUCCESS;
	  }

	public File getUpload() {
		return upload;
	}
	public void setUpload(File upload) {
		this.upload = upload;
	}
	public String getUploadContentType() {
		return uploadContentType;
	}
	public void setUploadContentType(String uploadContentType) {
		this.uploadContentType = uploadContentType;
	}
	public String getUploadFileName() {
		return uploadFileName;
	}
	public void setUploadFileName(String uploadFileName) {
		this.uploadFileName = uploadFileName;
	}

	
}

FileDownloadAction.java
package file;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URLEncoder;

import com.opensymphony.xwork2.ActionSupport;

public class FileDownloadAction extends ActionSupport {	
		
	private String basePath;
	private String fileName;              //파일의 이름
	private String contentType;          //스트림 타입
	private String contentDisposition;	 //스트림의 원래 이름
	private InputStream inputStream;  //스트림 데이터
	private long contentLength;          //스트림의 크기	

	public String execute() throws Exception {
	    	//inputPath
	    	String inputPath = basePath + "/" + fileName;

	    	//contentLength
	    	File f = new File(inputPath);
	    	setContentLength(f.length());
	    	
	    	//contentDisposition
	    	setContentDisposition("attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));

	    	//inputStream    	
	    	setInputStream(new FileInputStream(inputPath));
	    	
	        return SUCCESS;
	    }

		public String getBasePath() {
			return basePath;
		}
		public void setBasePath(String basePath) {
			this.basePath = basePath;
		}
		public String getContentDisposition() {
			return contentDisposition;
		}
		public void setContentDisposition(String contentDisposition) {
			this.contentDisposition = contentDisposition;
		}
		public long getContentLength() {
			return contentLength;
		}
		public void setContentLength(long contentLength) {
			this.contentLength = contentLength;
		}
		public String getContentType() {
			return contentType;
		}
		public void setContentType(String contentType) {
			this.contentType = contentType;
		}
		public String getFileName() {
			return fileName;
		}
		public void setFileName(String fileName) {
			this.fileName = fileName;
		}
		public InputStream getInputStream() {
			return inputStream;
		}
		public void setInputStream(InputStream inputStream) {
			this.inputStream = inputStream;
		}
}









다중 파일 업로드


MultiUploadListAction.java
package file;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.io.FileUtils;

import com.opensymphony.xwork2.ActionSupport;

public class MultiUploadListAction extends ActionSupport {
	
	  private static final String UploadPath = "C:/upload/";

	  private List<File> uploads = new ArrayList<File>();
	  private List<String> uploadsFileName = new ArrayList<String>();
	  private List<String> uploadsContentType = new ArrayList<String>();
	  
	  File saveFile;
	  
	  @Override
	  public String execute() throws Exception {
		  for (int i = 0; i < uploads.size(); i++) {
		        File destFile = new File(UploadPath
		            + getUploadsFileName().get(i));
		        
		        FileUtils.copyFile(getUploads().get(i), destFile);
		  }
		  return SUCCESS;
	  }

	public List<File> getUploads() {
		return uploads;
	}

	public void setUploads(List<File> uploads) {
		this.uploads = uploads;
	}

	public List<String> getUploadsFileName() {
		return uploadsFileName;
	}

	public void setUploadsFileName(List<String> uploadsFileName) {
		this.uploadsFileName = uploadsFileName;
	}

	public List<String> getUploadsContentType() {
		return uploadsContentType;
	}

	public void setUploadsContentType(List<String> uploadsContentType) {
		this.uploadsContentType = uploadsContentType;
	}

	public File getSaveFile() {
		return saveFile;
	}

	public void setSaveFile(File saveFile) {
		this.saveFile = saveFile;
	}

	public static String getUploadPath() {
		return UploadPath;
	}	
}

struts.xml
<action name="MultiUploadListForm">
      <result>/jsp/multiUploadList.jsp</result>
    </action>
    <action name="MultiUploadListAction" class="file.MultiUploadListAction">
      <result>/jsp/multiUploadListOK.jsp</result>
    </action> 
multiUploadList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>파일 업로드</title>
</head>

<body>
  <h2>다중파일 업로드 입력 폼 (리스트)</h2>
  <s:form action="MultiUploadListAction" method="POST" 
      enctype="multipart/form-data">
    <s:file label="File (1)" name="uploads" size="50"/>
    <s:file label="File (2)" name="uploads" size="50"/>
    <s:file label="FIle (3)" name="uploads" size="50"/>
    <s:submit />
  </s:form>
</body>
</html>

multiUploadListOK.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>파일 업로드</title>
</head>

<body>
  <h2> 리스트를 이용한 다중 파일 업로드 입력 완료 화면 </h2>
  <s:iterator value="uploads" status="stat">
  File ( <s:property value="%{#stat.index + 1}" /> ) <br/>
   컨텐츠 타입 : 
   <s:property value="%{uploadsContentType[#stat.index]}" /> <br/>
   파일 이름 : 
   <s:property value="%{uploadsFileName[#stat.index]}" /> <br/>
   임시 파일 이름 :    
   <s:property value="%{uploads[#stat.index]}" /> <br/>
   <hr/>
 </s:iterator>
</body>
</html>



Mysql.java
package dao;

public class Mysql {
	
	public void insert(String id){
		System.out.println("커넥션 연결됨");
		System.out.println(id+" 회원 가입 처리되었습니다");
	}
	
}

LoginAction.java
package Service;

public class LoginAction {
	
	public String execute(){
		System.out.println("로그인 처리중");
		System.out.println("id 비번 모두 일치함 통과");
		return "success";
	}
}

RegMember.java
package Service;

import dao.Mysql;

public class RegMember {
	String id;
	
	public String getId() { //jsp에서 ${id}
		return "id :"+ id+"";
	}
	
	public void setId(String id) {
		System.out.println("RegMember-setId="+id);
		this.id = id;
	}
	
	public String execute(){
		System.out.println("RegMember-execute");
		new Mysql().insert(id); //db에 회원가입 요청 
		
		return "success";
	}
}

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>
	<constant name="struts.i18n.encoding" value="UTF-8" />
	<constant name="struts.devMode" value="true" />
	
	<package name="hi" extends="struts-default" 
		namespace="/"	>
		
		<action name="RegMember" class="Service.RegMember" >
		<interceptor-ref name="params" />
		<result type="chain">
			<param name="actionName">LoginAction</param>
			<param name="namespace">/</param>
		</result>
	</action>
	
	<action name="LoginAction" class="Service.LoginAction" >
		<interceptor-ref name="chain"></interceptor-ref>
		<interceptor-ref name="params"></interceptor-ref>
		<result>/Success.jsp</result>
	</action>
	</package>
</struts>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>04.validate</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <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>
Form.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
	회원가입페이지 
	<form action="RegMember.action"  >
		<input text="text" name="id" size="8">
		<input type="submit" value="보내기">
	</form>
</body>
</html>
Success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
	회원가입 성공 ${id}
</body>
</html>





DBHelper.java
package DAO;

import java.util.ArrayList;
import java.util.List;

import model.Article;

public class DBHelper {
	
	
	public List<Article> selectAll(){
		System.out.println("db에서 글 모두 가져온다");
		List<Article> list=new ArrayList<Article>();
		Article article1=new Article(1, "첫", "안녕1");
		Article article2=new Article(2, "첫~", "안녕2");
		Article article3=new Article(3, "첫~~", "안녕3");
		Article article4=new Article(4, "첫~~~", "안녕4");
		Article article5=new Article(5, "첫@@@", "안녕5");
		list.add(article1);
		list.add(article2);
		list.add(article3);
		list.add(article4);
		list.add(article5);
		return list;
	}
}

Article.java
package model;

//게시글 하나의 정보를 담는 모델
public class Article {
	private int no; //글번호
	private String title; //제목
	private String content; //내용
		
	public Article(int no, String title, String content) {
		super();
		this.no = no;
		this.title = title;
		this.content = content;
	}

	public Article() {		
	}
		
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
}

ListService.java
package model;

//게시글 하나의 정보를 담는 모델
public class Article {
	private int no; //글번호
	private String title; //제목
	private String content; //내용
		
	public Article(int no, String title, String content) {
		super();
		this.no = no;
		this.title = title;
		this.content = content;
	}

	public Article() {		
	}
		
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
}

list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>    
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
	게시글 리스트를 보여주는 페이지 <br/>
	<table>
	</table>
	
	
	
	<s:iterator value="list"> <!-- List<Article> list;// 게시글이 5개 들어갈 것이다.    -->
		<s:property value="no" /> / 
		<s:property value="title" /> /
		<s:property value="content" /> 
	</s:iterator>
	
	<s:if test="true">
		true면 항상 나옵니다 <br/>
	</s:if>
	<s:if test="1<5">
		1<5 ? <br/>
	</s:if>
	<s:if test="false">
		if
	</s:if>
	<s:elseif test="2==3">
		elseif
	</s:elseif>
	<s:else>
		if, elseif, else 
	</s:else> <br />
	append는 2개의 리스트를 합칩니다. 
	<s:append id="totallist">
		<s:param value="list" />
		<s:param value="list" />
	</s:append>
	iterator는 list를 풀어서 반복시킵니다. 
	<s:iterator value="totallist"> 
		<s:property value="no"/> , <s:property value="title"/>
		, <s:property value="content" /> <br/>
	</s:iterator>
	generator는 iterator를 만듭니다. <br />
	
	<s:generator id="list" separator="," val="%{ ' 안,녕,하,세,요' }" 
			count="5" >
		<s:iterator>
			<s:property />
		</s:iterator>
	</s:generator>
	
	<br/> merge는 list를 합칠때 섞습니다 
	<s:merge id="totallist">
		<s:param value="list" />
		<s:param value="list" />
	</s:merge>
	
	<s:iterator value="totallist"> 
		<s:property value="no"/> , <s:property value="title"/>
		, <s:property value="content" /> <br/>
	</s:iterator>
	
	bean은 클래스의 객체를 만들때 사용합니다  <br/>
	<s:bean name="model.Article" id="art">
		<s:param name="no" value="7" />
		<s:param name="title" value="'타이틀'" />
		<s:param name="content" value="'~~컨텐트~~'" />
	</s:bean>   <br />
	
	 no: <s:property value="#art.no" />
	title :  <s:property value="#art.title" />
	content :  <s:property value="#art.content" />	
	
	set은 특정 영역에 값을 셋팅합니다. 예) 로그인 유무  <br />
	<s:set name="title" value="#art.title"  scope="application"></s:set>
	<s:set name="ses" value="'세션영역에 값 셋팅'" scope="session" />
	<s:set name="req" value="'리퀘스트 영역에 값 셋팅'" scope="request" />
	<s:set name="pag" value="'페이지 영역에 값 셋팅'" scope="page" />
	<s:set name="hello" value="#art.no"  />
	
	특정 영역에 셋팅된 값을 꺼내기 <br />
	app : <s:property value="#application.title" /> , ${title} <br/>
	ses : <s:property  value="#session.ses" /> , ${ses } <br />
	pag : <s:property value="#page.pag" /> , ${pag} <br/>
	hello : <s:property value="#hello"/> , ${hello } <br/>
	
</body>
</html>


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="hi" extends="struts-default" 
		namespace="/"	>
		
		<action name="list" class="Service.ListService" >			
			<result name="success">/list.jsp</result>
		</action>
		
		
		<!--  맨 아래에 있어야 합니다.  
				디폴트 와일드카드 맵핑 
				-->		
		<action name="*">
			<result>{1}.jsp</result>
		</action>	
	</package>
	
	
</struts>

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>04.validate</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <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>


프로젝트 생성시 버전을 2.5로 해줘야함..




web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>04.vaildate</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <filter>
	  <filter-name>struts2</filter-name>	  
	  <filter-class>
		  org.apache.struts2.dispatcher.FilterDispatcher
	  </filter-class>
  	<init-param>
  		<description>한글인코딩하기, FilterDispatcher실행중에
  				struts.i18n.encoding의 값을 찾아서 셋팅합니다  			
  		</description>
  		<param-name>struts.i18n.encoding</param-name>
  		<param-value>UTF-8</param-value>
  	</init-param>
  </filter>
  
  <filter-mapping>
	  <filter-name>struts2</filter-name>
	  <url-pattern>/*</url-pattern> <!--  사이트.com/abc.jsp -->
  </filter-mapping>  
</web-app>


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="hi" extends="struts-default" 
		namespace="/"	>
		
		<!--  지정된 패키지 내에서 .. 결과가 input 이면  -->
		<global-results>
			<result name="input">/LoginForm.jsp</result>
			<result name="error">/error.jsp </result>
		</global-results>
		
		<action name="LoginForm"   >
			<result>LoginForm.jsp</result>
		</action>
		
		<action name="LoginProcess"  class="Service.LoginProcess">			
			<result name="success">LoginSuccess.jsp</result>
		</action>
		
		<action name="LoginProcess2"  class="Service.LoginProcess2">
			<result name="input">/LoginForm2.jsp</result>			
			<result name="success">LoginSuccess2.jsp</result>
		</action>
		
		<!--  맨 아래에 있어야 합니다.  
				디폴트 와일드카드 맵핑 
				-->		
		<action name="*">
			<result>{1}.jsp</result>
		</action>	
	</package>
</struts>


LoginForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!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=UTF-8">
<title>LoginForm.jsp</title>
</head>
<body>
	로그인폼.jsp<br/>
	패키지명:Service, 클래스명:LoginProcess.java</br>
	<form action="LoginProcess.action">
		id:<input type="text" name="id">${fieldErrors.id}</br>
		pw:<input type="text" name="pw"></br>
		email:<input type="text" name="email"></br>
		<input type="submit" value="보내기"></br>
	</form>
</body>
</html>


LoginSuccess.jsp
package Service;

import com.opensymphony.xwork2.ActionSupport;

public class LoginProcess extends ActionSupport {
	String id , pw, email;
	
	@Override
	public void validate() {
		//setter 메서드 다음에 호출된다
		if(id==null || id.length()<2){
			addFieldError("id", "아이디를 2자 이상 입력하세요");
			// return "input";이 됩니다. 
		}
		super.validate();
	}
	
	
	public String execute(){
		if(id.equals("error")){
			return "error";
		}
		return "success";
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPw() {
		return pw;
	}

	public void setPw(String pw) {
		this.pw = pw;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}
}





error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>error</title>
</head>
<body>
	에러 페이지
</body>
</html>


LoginForm2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>    
<!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=UTF-8">
<title>LoginForm2.jsp </title>
</head>
<body>
	로그인폼2.jsp <br />
	
	<s:property value="message"/><br/>
	s:form 태그를 사용하면 필드에러(~~.java실행할 때 validate()메서드에서 addFiedError());)
	를 내가 직접 호출할 필요가 없습니다.<br/>
	
	<s:form action="LoginProcess2.action">
		<!--  실행될 ~.java 의 필드 String id= %{id} ;  -->
		<s:textfield label="아이디" name="id" value="%{id}" /><br/>
		<s:password label="비밀번호" name="pw" value="%{pw}" /> <br/>
		<s:textfield label="이메일" name="email" value="%{email}" /> <br/>
		<s:submit />
	</s:form>
	
</body>
</html>


LoginProcess2.java
package Service;

import DAO.DBHelper;

import com.opensymphony.xwork2.ActionSupport;

public class LoginProcess2 extends ActionSupport {
	String id , pw, email;
	String message;
	
	@Override
	public void validate() {
		//setter 메서드 다음에 호출된다
		if(id==null || id.length()<2){
			addFieldError("id", "아이디를 2자 이상 입력하세요");
			// return "input";이 됩니다. 
			message="다시 입력하세요";
		}
		super.validate();
	}
	
	
	public String getMessage() {
		return message;
	}


	public String execute(){
		if(id.equals("error")){
			return "error";
		}
		//db에서 id와 비번을 체크하는 기능을 넣었다고 가정
		Boolean check=new DBHelper().check(id, pw);
		if(check){
			message="로그인에 성공했습니다.";
		}
		else message="처음 방문했습니다.";
		return "success";
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPw() {
		return pw;
	}

	public void setPw(String pw) {
		this.pw = pw;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}
}


DBHelper.java
package DAO;

public class DBHelper {
	String myId="abc";
	String myPw="123";
	
	public DBHelper(){
		
	}
	
	public boolean check(String id,String pw){
		if(id.equals(myId) && pw.equals(myPw)){
			System.out.println("db조회 결과 계정 맞습니다.");
			return true;
		}
		return false;
	}
}


04.vaildate.zip


05.sstl.zip


'Struts2 > 2012.04월 강좌(MySQL)' 카테고리의 다른 글

4일차 chain result type  (0) 2012.06.08
3일차 Struts Standard Tag Library  (0) 2012.06.08
2일차 interface 활용하기  (0) 2012.06.05
2일차 ActionSupport 클래스를 확장한 액션  (0) 2012.06.05
2일차 form  (0) 2012.06.05



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="hi" extends="struts-default" 
		namespace="/"	>
		<action name="LoginForm"   >
			<result>/login/LoginForm.jsp</result>
		</action>	
		<!--  LoginCheck.action?userId=xxx&userPw=yyy -->
		<action name="LoginCheck"  class="service.LoginCheck">
			<result name="input">/login/LoginForm.jsp</result>
			<result>/login/LoginSuccess.jsp</result>
		</action>
		
		<action name="LoginCheck2"  class="service.LoginCheck2" method="login">
			<result name="input">/login/LoginForm2.jsp</result>
			<result>/login/LoginSuccess2.jsp</result>
		</action>
	</package>
</struts>


index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Index Page</title>
</head>
<body>
	인덱스 페이지
	
	<jsp:forward page="/login/LoginForm2.jsp"></jsp:forward>
</body>
</html> 


LoginForm2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title> LoginForm.jsp  </title>
</head>
<body>
	LoginForm.jsp <br />
	<form action="LoginCheck2.action" method="get">
		userId : <input type="text" name="user.userId"> ${fieldErrors.userId} <br/>
		userPw : <input type="text" name="user.userPw"> ${fieldErrors.userPw} <br/>
		<input type="submit" value="보내기" >
	</form>
	
</body>
</html>


LoginSuccess2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>LoginSuccess</title>
</head>
<body>
	LoginSuccess.jsp  <br/>
	
	객체.getUser.getId() 메서드가 호출됩니다. <br/>
	user Id : ${user.userId} / userPw : ${user.userPw} / <br/>
	${hello} <br/>
	${a.b.c.d.e} == getA().getB().getC().getD().getE();
</body>
</html>


LoginCheck.java
package service;

import model.User;

import com.opensymphony.xwork2.ActionSupport;

public class LoginCheck2 extends ActionSupport{
	User user;
	
	public String login(){
		System.out.println("LoginCheck2 - login");
		//db에 있는 사용자 정보를 체크하자
		new CheckUserService().check(user);
		
		//체크성공했다
		return "success";
	}

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}
}


User.java
package model;

//한명의 회원정보를 저장하는 클래스 - 필드, 생성자,set,get
public class User {
	String userId;
	String userPw;
	
	public User(){
		System.out.println("기본 생성자 User");
		
	}
	
	public User(String userId, String userPw) {
		super();
		this.userId = userId;
		this.userPw = userPw;
	}

	public String getUserId() {
		System.out.println("getUserId");
		return userId;
	}

	public void setUserId(String userId) {
		System.out.println("setUserId");
		this.userId = userId;
	}

	public String getUserPw() {
		System.out.println("getUserPw");
		return userPw;
	}

	public void setUserPw(String userPw) {
		System.out.println("setUserPw");
		this.userPw = userPw;
	}
	
	
}


CheckUserService.java
package service;

import model.User;

//db를 조회해서 id와 pw가 맞는지를 확인하는 클래스
public class CheckUserService {
	
	public void check(User user){
		//db 조회 했다.
		System.out.println("CheckUserServive - check 성공");
	}
}





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="hi" extends="struts-default" 
		namespace="/"	>
		<action name="LoginForm"   >
			<result>/login/LoginForm.jsp</result>
		</action>	
		<!--  LoginCheck.action?userId=xxx&userPw=yyy -->
		<action name="LoginCheck"  class="service.LoginCheck">
			<result name="input">/login/LoginForm.jsp</result>
			<result>/login/LoginSuccess.jsp</result>
		</action>
		
		<action name="LoginCheck2"  class="service.LoginCheck2" method="login">
			<result name="input">/login/LoginForm2.jsp</result>
			<result>/login/LoginSuccess2.jsp</result>
		</action>
		
		<action name="LoginCheck3"  class="service.LoginCheck3">
			<result name="input">/login/LoginForm3.jsp</result>
			<result>/login/LoginSuccess3.jsp</result>
		</action>
	</package>
</struts>


index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Index Page</title>
</head>
<body>
	인덱스 페이지
	
	<jsp:forward page="/login/LoginForm3.jsp"></jsp:forward>
</body>
</html> 


LoginForm3.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title> LoginForm.jsp  </title>
</head>
<body>
	LoginForm.jsp <br />
	<form action="LoginCheck3.action" method="get">
		userId : <input type="text" name="userId"> ${fieldErrors.userId} <br/>
		userPw : <input type="text" name="userPw"> ${fieldErrors.userPw} <br/>
		<input type="submit" value="보내기" >
	</form>
	
</body>
</html>


LoginCheck3.java
package service;


import model.User;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Preparable;

public class LoginCheck3 extends ActionSupport 
					implements ModelDriven,Preparable{
	User user;
	
	//2번째
	public Object getModel() {
		System.out.println("getModel");
		return user;
	}
	
	//1번째 prepare는 execute직전에  호출되는 메서드로서 
	//execute를 하기 위한 준비작업 기능을 넣는다.
	public void prepare() throws Exception {
		System.out.println("prepare");
		user=new User();
	}
	public String execute(){
		return "success";
	}
	
	//3번째 jsp에서 실행됨
	public User getUser() {
		return user;
	}
}


LoginSuccess3.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>LoginSuccess3</title>
</head>
<body>
	LoginSuccess3.jsp  <br/>
	
	객체.getUser.getId() 메서드가 호출됩니다. <br/>
	user Id : ${user.userId} / userPw : ${user.userPw} / <br/>
	${hello} <br/>
	${a.b.c.d.e} == getA().getB().getC().getD().getE();
</body>
</html>




소스

03.form.zip




index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Index Page</title>
</head>
<body>
	인덱스 페이지
	
	<jsp:forward page="/select.jsp"></jsp:forward>
</body>
</html> 


select.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<ul>
		<li>
			<a href="First.action">   첫번째 예제 </a>
		</li> 
		<li>
			<a href="Second.action">   두번째 예제 </a>
		</li>
		<li>
			<a href="Third.action">   세번째 예제 </a>
		</li>
	</ul>
</body>
</html>




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="hi" extends="struts-default" 
		namespace="/"	>
		<action name="LoginForm"   >
			<result>/login/LoginForm.jsp</result>
		</action>	
		<!--  LoginCheck.action?userId=xxx&userPw=yyy -->
		<action name="LoginCheck"  class="service.LoginCheck">
			<result name="input">/login/LoginForm.jsp</result>
			<result>/login/LoginSuccess.jsp</result>
		</action>
		
		<action name="LoginCheck2"  class="service.LoginCheck2" method="login">
			<result name="input">/login/LoginForm2.jsp</result>
			<result>/login/LoginSuccess2.jsp</result>
		</action>
		
		<action name="LoginCheck3"  class="service.LoginCheck3">
			<result name="input">/login/LoginForm3.jsp</result>
			<result>/login/LoginSuccess3.jsp</result>
		</action>
		
		<action name="First">
		    <result type="dispatcher">/login/LoginForm.jsp</result>
		</action>
		<action name="Second">
		    <result type="dispatcher">/login/LoginForm2.jsp</result>
		</action>
		<action name="Third">
		    <result type="redirect">/login/LoginForm3.jsp</result>
		</action>
	
	</package>
</struts>





03.form.zip


index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Index Page</title>
</head>
<body>
	인덱스 페이지
	
	<jsp:forward page="/select.jsp"></jsp:forward>
</body>
</html> 


select.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<ul>
		<li>
			<a href="First.action">   첫번째 예제 </a>
		</li> 
		<li>
			<a href="Second.action">   두번째 예제 </a>
		</li>
		<li>
			<a href="Third.action">   세번째 예제 </a>
		</li>
		<li>
			<a href="Hello.action">   Hello </a>
		</li>
		<li>
			<a href="Hello2.action">   Hello2 </a>
		</li>
	</ul>
</body>
</html>


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="hi" extends="struts-default" 
		namespace="/"	>
		<action name="LoginForm"   >
			<result>/login/LoginForm.jsp</result>
		</action>	
		<action name="LoginForm2"   >
			<result>/login/LoginForm2.jsp</result>
		</action>
		
		<!--  LoginCheck.action?userId=xxx&userPw=yyy -->
		<action name="LoginCheck"  class="service.LoginCheck">
			<result name="input">/login/LoginForm.jsp</result>
			<result>/login/LoginSuccess.jsp</result>
		</action>
		
		<action name="LoginCheck2"  class="service.LoginCheck2" 
				method="login">
			<result name="input">/login/LoginForm2.jsp</result>
			<result>/login/LoginSuccess2.jsp</result>
		</action>
		
		<!--  Hello.action 요청이 오면
			  service.Hello.class 객체생성후 execute 실행
			  return success/fail 결과에 따라 다른 액션 실행
		-->
		<action name="Hello" class="service.Hello">
			<result name="success" type="redirectAction">
				<param name="actionName">LoginForm</param>
			</result>
			<result name="fail" type="redirectAction">
				<param name="actionName">LoginForm2</param>
			</result>
		</action>
		
		<!-- Hello2.action요청이 오면 LoginCheck.action을 실행해
			 LoginCheck.action?userId=gusfree&userPw=12345
			 처럼 파라미터가 붙어서 실행이 된다
		 -->
		<action name="Hello2">
			<result type="redirectAction">
				<param name="actionName">LoginCheck</param>
				<param name="userId">gusfree</param>
				<param name="userPw">12345</param>
			</result>
		</action>
		
		<action name="LoginCheck3"  class="service.LoginCheck3" >
			<result name="input">/login/LoginForm3.jsp</result>
			<result>/login/LoginSuccess3.jsp</result>
		</action>
		
		<action name="First">
			<result type="dispatcher">/login/LoginForm.jsp</result>
		</action>
		<action name="Second">
			<result type="dispatcher">/login/LoginForm2.jsp</result>
		</action>
		<action name="Third">
			<result type="redirect">/login/LoginForm3.jsp</result>
		</action>
	</package>
</struts>


Hello.java
package service;

import java.util.Random;

public class Hello {
	public String execute(){
		System.out.println("Hello - execute");
		if(new Random().nextInt(100)<50){
			return "fail";
		}
		return "success";
	}
}



'Struts2 > 2012.04월 강좌(MySQL)' 카테고리의 다른 글

3일차 Struts Standard Tag Library  (0) 2012.06.08
3일차 validate()  (0) 2012.06.07
2일차 ActionSupport 클래스를 확장한 액션  (0) 2012.06.05
2일차 form  (0) 2012.06.05
1일차 interceptor  (0) 2012.06.04

+ Recent posts