■ 기본 환경 설정.

1. library 파일 추가.

 
apache 사이트의 struts에서 다운로드. 여기서는 2.0.14 버전을 사용한다. 공부용으로 사용하기 위해 Full Distribution을 다운로드 한다.

 다운로드한 파일에서 struts-2.0.14\apps\ 들어가면 struts2-blank-2.0.14.war 파일이 존재 한다. 이 파일은 예제파일로 이것을 기본으로 작업을 수행 할 수 있도록 제동된 파일이다. 이것을 압출해제 하면 struts2-blank-2.0.14\WEB-INF\lib 안에 들어있는 파일 들을 eclipse에서 생성한 프로젝트의 lib 폴더에 복사해서 사용한다.

2. web.xml 파일 설정

 <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>


* filter-name은 위에서 설정한 filter-name과 같아야 한다. url-pattern에는 다른 확장자를 사용할 수 없으면 /*가 default다. 다른 확장자는 struts.properties에서 설정 할 수 있다.

3. struts.properites 파일 생성

 메모장을 사용하여 struts.properites 파일을 만들고 eclipse의 navigator 탭에서 src 폴더로 복사하면 자동적으로 build의 classes 폴더에 생긴다.
 설정파일들을 classes 폴더에서 찾기 때문에 확인해야 한다. 작업을 하다면 많은 xml 설정 파일들을 src 폴더에 만드는데, src 폴더에 만들면 자동적으로 들어가므로 확인만 하면 된다.

 struts.properites은 Interceptor로 부터 적용할 각각의 constant(상수)만 정의한다.

struts.enable.DynamicMethodInvocation=true
struts.i18n.reload=true //개발자 디버그 모드 설정
struts.devMode=true
struts.configuration.xml.reload=true // configuration에서 설정된 모든 xml 다시 로딩해해서 무조건 처리해라. 실무에서는 사용 금지!!
struts.custom.i18n.resources=globalMessages
struts.url.http.port=8989 //was의 포트 번호, default는 80
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 // do, action, bit 확장자로 올때 접근 허용, default는 action
struts.i18n.encoding=euc-kr //ednoding 타입이 들어올때 euc-kr로 들어온다


4. struts.xml 파일 생성.

 struts.xml은 맵핑 역할을 한다. 각각의 모듈에서 작업했던 xml을 연결하는 역할만 한다. 설정을 include 시키기만 하면 된다.
 
※ struts.xml 에다가 Interceptor를 적용해도 된다. 여기다가 적용하려면 tag로, struts.properites로 적용하려면 상수로. 둘중에 아무곳에 한군데만 적용해주면 된다. 그러나 struts.xml 에다가 모두 적용을 하면 복잡하기 때문에 Interceptor 적용할 상수 정의는 struts.properites로 빼고 struts.xml에는 include만 한다.

<struts>
   <!-- include files -->
   <include file="info.xml"/>
   <include file="validator.xml"/>
   <include file="login.xml"/>
   <include file="upload.xml"/>
</struts>

5. struts.xml에 include 할 mapping 문서 만들기.(ex. info.xml)

  <package name="info" namespace="/" 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">
<!-- execute가 default이며 다른 method라면 무조건 써야된다-->
      <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> 
<!-- success 대문자 쓰면 에러 난다. -->
     </action>

    <action name="update"
           class="com.myhome.info.actions.InfoUpdateAction">
      <result name="success" type="redirect">list.action</result>
    </action> 
    
    </package>
   
</struts>

* 여기서 패키지를 직접 잡는다. spring에서 ViewResolver라고하고, 여기서 prefix와 suffix를 잡는다. 패키지 네임을 유일한 값을 설정해야 한다.

 namespace는 프로젝트 이름이 struts2이면 http:localhost:8989/struts2/ 여기 다음부터 나오는게 namespace 다. 현재 context에서 바로 파일로 들어가면 그냥 namespace="/" 하면되고, http:localhost:8989/struts2/info/index.action 으로 들어가고 싶으면 namespace="/info" 로 설정하면 index.action 으로 들어온다. index.action으로 들어오면 action name 과 같은 곳을 실행한다.

 action name은 한 xml 문서 내에서 중복되면 안되며, url pattern과 같은 이름이 들어오면 class="" 에 지정된 action이 실행된다. method="execute"는 class에서 지정된 파일안에 execute method를 실행시킨다.

 result name은 action class에서 return 값으로 설정해 놓은 값고 일치하면 result 에 지정해 놓은 jsp 파일로 값들을 전달하며, 페이지 이동을 한다. class 팔에서 return SUCCESS;은 대문자이지만 여기서는 꼭!! 소문자 success로 써야 한다.

 result type에서
<result type="chain">list<result>
//action의 name이 list인 곳으로 가라 - 또 다른 액션으로 데이타와 같이 보낸다. 기존에 있는 액션 이름을 찾아 간다.
<result type="redirect">list.action<result>
//다른 액션으로 데이타 없이 보낼 때
<result type="dispatcher">/WEB-INF/info/list.action<result>
//type의 default 값이다. 전체 경로를 써줘야 한다.

+ 추가 설명 : Action process model


- 액션은 하나의 작업 단위이며 URL이다.
- 액션은 하나의 클래스 또는 메소드이다.
- 액션은 한 종류의 비즈니스 로직을 수행하기 위한 통로이다.
- 액션은 struts.xml 에서 정의된다.
- 액션 메소드는 하나의 토큰 스트링을 반환한다.
- 액션체인 : 액션을 수행한 결과로서 다른 액션을 호출할 수 있다.
- 액션의 프로퍼티는 태그와 매핑할 수 있다.



■ 구현하기(환경설정 작업에 이어서)

구현순서(절대적인 방법은 아님!) : 위에 환경설정 ->  JSP파일 만들기 -> Class 생성(**Actions 패키지와 **action.java 파일 만들기) -> mapping 문서 만들기(struts-2.0.14\apps\struts2-blank-2.0.14\WEB-INF\classes 안에 있는 example.xml 파일에서 복사 해서 사용) -> struts.xml 파일에 include. -> iBaits 설정을 위한 Package, Class와 xml 만들기 SQLManager.java, SqlMapConfig.xml, SqlMap.xml 파일 만들기 -> **VO.java 만들기(VO에서 바로 DB로 넣는다) -> **DAO.java 만들기 -> **.jsp 에서 데이터 주고, 받기 설정하기.

▶ 구현하기 위한 추가 설명

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

@SuppressWarnings("serial")
public class InfoRegisterAction extends ActionSupport{
 
 /*form property fields*/
 private InfoVO bean;

 @Override
 public String execute() throws Exception {
  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;
 }
}

2. jsp 페이지 만들기.(register.jsp)
<%@ page contentType="text/html;charset=euc-kr"%>
<!--  모든 파라미터를 하나의 객체로 받기 위해 선언한다. 데이터를 객체로 받기 위해 bean 생성-->
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:bean id="bean" name="com.myhome.info.vo.InfoVO"/>
<html>
  <head>
... 생략 ....
    <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> 

 *  <%@ taglib prefix="s" uri="/struts-tags" %>에서 struts2에서 prefix는 s 만 받는다.
 
 <s:bean id="bean" name="com.myhome.info.vo.InfoVO"/> s:bean 태그로 bean객체를 설정해 놓고, name을 그에 맞는 property로 지정해 놓으면 자동적으로 bean에 데이터들이 들어가게 된다. 

 이렇게 입력된 데이터는 ActionSupport를 상속한 Action Class로 이동하고, Class 에서 private InfoVO bean; 을 설정하고, setter, getter를 설정해 놓으면, setter를 통해 데이터를 저장하고, getter를 통해 데이터를 jsp 페이지로 보낸다.

여기서 중요한 것은 Action Class에서
private InfoVO bean; 설정한 이름 bean과 jsp 에서 설정한 <s:bean id="bean" name="com.myhome.info.vo.InfoVO"/> bean의 id이름인 bean과 결과페이지인 jsp 페이지에서의
<s:bean id="bean" name="com.myhome.info.vo.InfoVO"/> bean의 id이름인 bean 이름이 같아야 한다.

3. struts2 태그.(list.jsp)

<s:iterator value="list">  
      <tr bgcolor="#ffffff">
       <td align="center">
        <s:property value="num"/>
       </td>
       <td align="center"><a href="javascript:query('${num }')">${name }</a></td>
       <td align="center">${sex }</td>
       <td align="center">${tel }</td>
       <td align="center">${wdate }</td> 
      </tr>
   </s:iterator>  

 Action Class에서 return 값으로 list가 넘어왔을 경우에 foreach 태그 대신에 iterator 을 사용할 수 있다.

 <s:property value="num"/> property 이름으로 바로 접근 할 수 있는 태그.

Struts2 기본 환경 설정 및 구현 끝!

+ Recent posts