'Framework/STRUTS 2'에 해당되는 글 13건

struts 2 - annotation설정 2009.07.03
struts 2 - 스트럿츠 2의 defalte설정 2009.07.03
struts 2 - 기본 작동 순서 2009.07.02

struts 2 - annotation설정

Published on: 2009.07.03 01:19 by krespo


struts 2에서 제공하는 annotation을 설정함으로서 struts 2에서 기본형으로 제공되던 xml을 참조해 action을 수행할 필요가 없다. 즉 struts.xml파일을 작성하지 않고 사용할 수 있다.

기본개념

1. 기본형일 때는 jsp 페이지에서 properties 파일에서 설정한 대로 뒤에 접두사를 설정한데로 (3가지를 설정했으면 3가지 모두 ex) *.do *.action *.bit)
접근할 수 있지만 annotation을 사용하면 접두사는 무조건 .action을 사용해야 한다.

2. jsp페이지에서 register.acton 이라는 주소로 페이지를 요청했을때 수행 되어야 할 action Class의 이름은 무조건 RegisterAction 이어야 한다.
                                                         register.action  == > register + action  ==>RegiserAction
왜냐 하면 따로 Action Class를 맵핑 시켜주는 xml 문서가 존재 하지 않기 때문에 다음과 같은 이름설정으로 struts 2에서 자동적으로 맵핑이 되게 설정 되어 있다.


설정방법

1. web.xml 파일에서 filter Dispatcher 설정에서 init-param을 설정한다

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>
    org.apache.struts2.dispatcher.FilterDispatcher
   </filter-class>
   <init-param>
    <param-name>actionPackages</param-name>
    <param-value>com.myhome.anno</param-value>
   </init-param>

</filter>

- param-name 은 annotation을 사용하기 위한 예약어 이다. 꼭 저렇게 써야 한다.
- param-value 는 annotation을 통해 실행될 action이 모여있는 패키지를 설정한다.

2. annotation을 사용할 jsp 페이지의 확장자는 모두 .action 으로 수정한다.

3. jsp페이지의 .action에 대응하는 Action Class를 생성한다.

--------------------------------------------------------------------------------------
package com.myhome.anno;

import org.apache.struts2.config.Result;

import com.myhome.info.dao.InfoDAO;
import com.myhome.info.vo.InfoVO;
import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
@Result (name="success",value="/WEB-INF/anno/modify.jsp")
public class QueryAction extends ActionSupport{

 private InfoVO bean;
 @Override
 public String execute() throws Exception {
  
  bean = new InfoDAO().getQuery(bean);
  return SUCCESS;
 }
 public InfoVO getBean() {
  return bean;
 }
 public void setBean(InfoVO bean) {
  this.bean = bean;
 }
 
 
}
--------------------------------------------------------------------------------------
위에서 처럼 @result 를 통해 이동할 페이지를 선언해 주고 있다.
execute method에서 리턴 되는 값이 @result 의 name에 대응하고 반응 한다.
여기서 중요한 점은 execute method에서 "SUCCESS" 라는 대문자로 리턴 하더라도 name 에는 소문자로 "success" 라고 선언해 주어야 한다.

@results 라는 것을 통해서 @result를 복수로 설정할 수 있다.
@Results({
  @Result(name="success", value="/WEB-INF/anno/list.jsp"),
  @Result(name="input", value="/WEB-INF/anno/fail.jsp")
})

※ action을 설정한 xml 파일을 include 하고 있는 struts.xml이 존재하고 annotation을 수행할때

http://localhost:8989/struts2/00000/index.action

이라고 url이 들어왔을때 맨처음 struts.xml 파일에 include된 xml파일에서 다음과 같은 namespace가 있나 확인 한다.
만약 xml파일에 선언된 네임스페이스가 존재 하지 않을때 비로서 web.xml 파일에 설정한 init-param으로 이동하고 설정한 Action으로 이동하게 된다.

Name
Password
Homepage
Secret

struts 2 - 스트럿츠 2의 defalte설정

Published on: 2009.07.03 00:58 by krespo


1. web.xml 파일의 설정

사용자로부터 요청이 들어오게 되면 가장 먼저 실행되는 것이 Front Controller인 Filter Dispatcher이므로 filter 설정을 먼저 해주어야 한다.

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

물론 filter-name은 아무거나 설정해도 된다.

다음으로 filter-mpping부분이다.

<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

filter-name은 위에 선언했던 것이고 url-pattern은 무엇이라도 url로 들어오면 filter를 실행 시키겠다는 뜻으로 struts 나 spring 처럼 /*.do 이런식으로 확장자까지 선택해 주면 에러가 발생함으로 쓰지 않도록 한다.
뒤의 확장자는 뒤에 properties파일에서 선언하게 된다.

2. struts.properties 파일을 생성한다.



eclipse의 navigator 탭으로 이동후 src 폴더로 생성한 properties 파일을 옮기면 자동적으로 build의 classes 폴더로 이동하게 되는것을 그림과 같이 확인 할 수 있다.

설정 파일인 struts.xml 과 properties파일은 classes 폴더에서 찾기 때문에 위와 같이 해주어야 한다.

struts.properties
--------------------------------------------------------------------------------------------------
struts.enable.DynamicMethodInvocation=true
struts.i18n.reload=true                                                                       #프로그램을 수정후 서버를 restart 할 필요가 없다.
struts.devMode=true
struts.configuration.xml.reload=true         
struts.custom.i18n.resources=globalMessages
struts.url.http.port=8989                                                                       # was의 port 번호
struts.serve.static=true
struts.serve.static.browserCache=false
struts.configuration.files=struts-default.xml,struts-plugin.xml,struts.xml   # 다음에서 설정된 파일 이름으로 설정 파일을 로딩하겠다.
struts.action.extension=do,action,bit                                                    # url이 .do .action .bit 로 끝나는 것들을 접근을 허용하겠다.
struts.i18n.encoding=euc-kr                                                                # encoding type은 euc-kr이다
--------------------------------------------------------------------------------------------------

3. 위에 설정한 대로 struts.xml 파일을 생성한다.
struts.xml 파일은 다른 action이 설정되어 있는 xml파일을 include하는 형식으로 되어있다.
--------------------------------------------------------------------------------------------------
<?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>
<!--    include files -->
   <include file="info.xml"/>
   <include file="validator.xml"/>
</struts>
--------------------------------------------------------------------------------------------------

4. library파일을 추가 한다.

struts 2의 API를 다운로드 받게 되면
struts-2.0.14 -> apps 폴더의 struts2-blank-2.0.14.war 라는 파일을 압축을 푼다.
struts2-blank-2.0.14.war 파일은 기본적으로 벤더 회사가 제공하는 예제 파일이라고 보면 된다. 이 압축된 폴더에 보면 lib폴더 안에 struts 2를 구동하기 위한 가장 기초적인 libarary파일이 존재하는데 그 파일을 복사해서 붙여넣기 하는 방법을 쓴다.

5. struts.xml 파일에서 include하는 xml파일을 생성한다.

include 하는 파일에는 실질적인 action 부분이 들어있다.
--------------------------------------------------------------------------------------------------
<?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="info" namespace="/info" extends="struts-default">
    <action name="index">
     <result>/WEB-INF/info/register.jsp</result>
    </action>
    <action name="register"
      class="com.myhome.info.actions.InfoRegisterAction"
      method="execute">
     <result>/WEB-INF/info/result.jsp</result>
    </action>
    <action name="list"
      class="com.myhome.info.actions.InfoListAction">
     <result name="success">/WEB-INF/info/list.jsp</result>
    </action>
    <action name="query"
      class="com.myhome.info.actions.InfoQueryAction"
      method="execute">
     <result name="success">/WEB-INF/info/modify.jsp</result>
    </action>
    <action name="update"
      class="com.myhome.info.actions.InfoUpdateAction"
      method="execute">
     <result name="success">/WEB-INF/info/template.jsp</result>
    </action>
    <action name="delete"
      class="com.myhome.info.actions.InfoDeleteAction"
      method="execute">
     <result name="success">/WEB-INF/info/template.jsp</result>
    </action>
   </package>
</struts>
--------------------------------------------------------------------------------------------------
- package : name -> package이름을 설정한다
                  namespac -> url로 맵핑되는 namespace를 선언한다. 만약 http:localhost:8989/struts2/ 가 기본적인 주소라면 namespace는 이 부분 뒤에 들어오는 값이 된다. 즉 http:localhost:8989/strtus2/info  에서 info가 namespace가 되며 저런 url pattern이 들어오면 다음의 패키지를 참조하고 뒤에 http:localhost:8989/struts2/info/index.do 에서 index와 각각의 action name과 비교 하며 같은것을 실행 하게 된다.

- action : name -> url pattern이 이런 이름으로 들어오면 다음을 실행한다.
              class -> 실행할 action class를 선언한다.
              method -> execte메소드를 실행시키겠단 뜻으로 쓰던 안쓰던 defalte가 method="execute" 로 잡혀 있어 상관없다.
-result : name -> 각각의 action Class는 그 결과를 return값으로 설정해 주며 각각은 이미 정해진 문자열이다.(SUCCESS,INPUT,ERROR ect...)
                          각각의 Action Class에서 return 값으로 다음과 같은 전달값들을 전달해 줄때 리턴해 준 문자열과 name과 똑같으면 다음의 페이지로 이동시키게 된다.
여기서 가장 중요한 것은 Action Class에서 전달값이 "SUCCESS" 와 같은 대문자 더라도 XML 문서의 result에서는 "success" 와 같이 소문자로 받아야 된다는 점이다.

6. 실질적인 Businuss Logic을 수행하는 Action Class를 생성한다.
이 클래스는 ActionSupport Class를 상속하고 ActionSupport Class의 execute method를 override 한다.
--------------------------------------------------------------------------------------------------
package com.myhome.info.actions;

import com.opensymphony.xwork2.ActionSupport;
import com.myhome.info.dao.InfoDAO;
import com.myhome.info.vo.InfoVO;

@SuppressWarnings("serial")
public class InfoRegisterAction extends ActionSupport{

 /*form property fields*/
 
 private InfoVO bean;
 
 @Override
 public String execute() throws Exception {
  // TODO Auto-generated method stub
  bean.setWdate(this.getToday());
  new InfoDAO().register(bean);
  return SUCCESS;
 }

 protected String getToday(){
  return new java.text.SimpleDateFormat("yyyy-MM-dd").format(new java.util.Date());
 }

 public InfoVO getBean() {
  return bean;
 }

 public void setBean(InfoVO bean) {
  this.bean = bean;
 }
 
}
--------------------------------------------------------------------------------------------------

7. jsp 페이지 생성
jsp 페이지에서는 struts2에서 제공하는 테그라이브러리를 통해 bean을 생성하고 bean에 jsp에서 발생한 데이터를 저장하고 Business Logic Controller로 bean 객체를 전달하게 한다.
--------------------------------------------------------------------------------------------------
<%@ page contentType="text/html;charset=euc-kr"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:bean id="bean" name="com.myhome.info.vo.InfoVO"/>

<html>
  <head>
    <style type="text/css">
       a:active  {font-size: 11pt; text-decoration: none; color: #000000}
  a:link    {font-size: 11pt; text-decoration: none; color: #000000}
  a:visited {font-size: 11pt; text-decoration: none; color: #000000}
  a:hover   {font-size: 11pt; text-decoration: none; color: #000000}
  td        {font-size: 11pt; text-decoration: none; color: #000000}
    </style>
  </head>
  <body>
    <center><br><br>
    <h3><b>Struts2 Action (register)</b></h3>
    <form method="post" action="register.do">
     <table border=0 cellpadding=1 cellspacing=1 bgcolor="#000000">
       <tr height=30 bgcolor="#ffffff">
         <td width=100 align="right"><b>성명</b>&nbsp;
         </td>
         <td width=300 align="left">&nbsp;
            <input type="text" name="bean.name">
         </td>
       </tr>
    <tr height=30 bgcolor="#ffffff">
   <td width=100 align="right"><b>성별</b>&nbsp;
         </td>
   <td width=300 align="left">&nbsp;
   <input type="radio" name="bean.sex" value="남" checked>남
            <input type="radio" name="bean.sex" value="여">여
   </td>
    </tr>     
    <tr height=30 bgcolor="#ffffff">
      <td width=100 align="right"><b>연락처</b>&nbsp;
         </td>
   <td width=300 align="left">&nbsp;
   <input type="text" name="bean.tel">
   </td>
    </tr>
    <tr height=30 bgcolor="#ffffff">
    <td align="center" colspan=2>
   <input type="submit" value="전송하기">
            <input type="button" value="리스트"
              onClick="javascript:location.href='list.do'">
    </td>
   </tr>
    </table>
  </form>
 </center>
 </body>
</html> 
--------------------------------------------------------------------------------------------------
- 맨처음 태그를 선언하고 <s:bean>태그로 bean을 설정한다.
- 각각 데이터 입력이 일어나는 form태그의 name을 위에서 선언한 bean의 id를 써주고 그 빈객체에 대응하는 property이름을 넣어주면 자동적으로 발생하는 데이터 들이 bean으로 들어가게 된다.


bean.name -> 이렇게 하면 bean이라고 설정한 InfoVO에 name 이라는 property에 데이터가 입력 된다.

이렇게 되면 이 정보는 ActionSupport를 상속한 class로 이동하게 된다.
그 클래스 에서는
private InfoVO bean; 을 선언하고
InfoVO의 setter method를 통해 데이터가 저장되고 로직을 수행한 후에 getter를 통해 jsp페이지로 다시 정보가 이동하게 된다.

여기서 가장 중요한 점은 jsp 페이지에서 선언한 bean의 id 이름과 ActionClass의 데이터를 받을 오브젝트 이름이 같아야 한다는 점이다.
예)
jsp:
      <s:bean id="valueObject" name="com.myhome.vo.InfoVO">
                          ||
ActionClass         ||
 private InfoVO valueObject;

Action Class를 통과한 데이터가 result.jsp페이지로 이동한다면 result.jsp페이지의
<s:bean id="valueObject" name="com.myhome.vo.InfoVO">
이어야 한다.

register.jsp  --------------------------> Action Class --------------------------->result.jsp
                setter method 로 데이터 전달                       getter method로 데이터 전달



※ struts 2의 태그
① <s:iterator value="list">
list 형태로 데이터가 넘어 왔을때 foreach문 대신 사용한다.

② <s:property value="num">
property 이름으로 바로 접근 할 수 있다.

8. DB 접근을 위한 iBatis 설정

9. Value Objec Class생성

10. DB에 접근하기 위한 DAO 생성

Name
Password
Homepage
Secret

struts 2 - 기본 작동 순서

Published on: 2009.07.02 23:32 by krespo


① Clent로 부터 요청을 보내면 Front Controller인 Filter Dispatcher가 요청을 받아 들인다.
② Filter Dispatcher는 /WEB-INF 폴더 밑에 있는 classes 폴더에서 struts.xml 파일을 로딩하고 struts.properties파일을 로딩한다.
    이때 두 파일이 있으면 참조를 하고 없으면 참조 하지 않는다.
③ 설정 파일을 모두 로딩한 후에 그 정보는 Intercepter에게 전달하고 Intercepter에서는 3가지 단계를 수행한다.
    - 1단계 : FrontController에서 전달된 파라미터 정보들을 가로채게 된다.
    - 2단계 : 렌더링(언어설정 ect...), 보안설정을 한다.
    - 3단계 : 다음단계인 Business Logic Controller의 setter method()를 찾고 데이터를 Business Logic Controller의 property에 전달된 데이터를 저장한다

④ 비지니스 로직을 거친 결과를 Business Logic Controller의 getter method() 를 통해 result 로 보내주고 result는 Tempate를 호출해 적당한 출력 폼을 선택한다(JSP, Valocity, FreeMarket)
⑤ 결과값을 역으로 브라우져로 출력해 준다.
Name
Password
Homepage
Secret