struts 2008. 7. 31. 09:20

struts2] struts2 + ibatis 활용한 게시판1-3

         struts2 + ibatis 를 활용한 게시판

* 게시판 글쓰기 및 수정, 파일업로드 기능

1. bbs.xml
      - 글 작성하기 위해 <insert>추가 및 sql문 정의
      - 파라미터를 여러개 받아야 하기 때문에 parameterClass를 객체로 지정한다.
         즉, 여기서는 위에 정의한 alias인 bbsvo로 지정하면 된다.
      - insert에 idx로 이용되는 컬럼명은 sequence로 가져와야하기 때문에
        dual table을 이용해서 미리 시퀀스 값을 가져온다.
      -<selectKey>속성인 resultClass은 실행했을때 리턴되는값을 명시
        keyProperty에 idx가 아래의insert절의 #idx#에 맵핑된다.

2. Bbs.java
      - interface에 메소드 정의

3. BbsImple.java
     - interface에 정의된 메소드를 구현
     - insert절은 insert, delete절은 delete, select은 queryForList 호출
     -

4. struts.xml
     - 1. add 액션추가
     - 2. add_ok action 추가

5.write.jsp
    - action에서 result로 write.jsp를 호출하였기때문에 해당 페이지에서 글작성할수있는 페이지 작성
    - insertForm.jsp페이지를 해당 폼으로 설정
        <s:form action="add_ok" method="post" enctype="multipart/form-data">
            <s:include value="insertForm.jsp"></s:include>
       </s:form>

6. insertForm.jsp
    - struts2의 taglib를 이용해서 글보기시 session에 사용자 및 글제목등 관련 필드 내용을 session에
     등록한다.
     이렇게 하는이유는 insertForm.jsp 하나의 폼을 가지고 delete 및 uptate시에도 동일 폼을 사용하기
     때문에 세션으로부터 그 폼을 가져와서 재활용하려고 하는것이다. 이렇게되면 delete.jsp 같은
     페이지를 동일한 폼을 만들지 않아도 되고 글 상세보기시 session에 폼에 대한 data를 세션에 등록
     한다. 그렇게 되면 수정버튼을 클릭시 db로부터 값을 불러오지 않고  세션에 등록된 값을 가져와서
     글쓴이,제목,내용등을 사용자에게 보여줄수있는 것이다.

7.AddAction 클래스 정의
   - struts.xml에서 정의한 클래스 및 메서드 정의(AddAction.java / clear()) - 1.add action
   - write.jsp에서 action으로 정의한 struts.xml에 action등록 - 2. add_ok action
   - 파일업로드시 File변수명+FileName 이라고 해야 Struts2에서 자동으로 파일명을 인식한다.
           ex> File s_file        파일명얻어내기 : s_fileFileName
   - AddAction클래스가 호출되면 필드로 선언된 변수에 값이 셋팅이 되고 난후에 execute()메서드가
     호출된다.


8.FileService.java
   - 파일업로드를 하기 위한 FileService 파일 작성
   - 아래 fileupload에서 한 예제를 가지고 그대로 사용하면된다.
   



* bbs.xml     
 <insert id="insertBbs" parameterClass="bbsvo">
       <selectKey keyProperty="idx" resultClass="int"> 
         select BBS_idx.NEXTVAL AS idx FROM dual
       </selectKey>
       <!--
        resultClass 이것을 실행했을때 리턴되는것 명시
        keyProperty에 idx가 아래의insert절의 #idx#에 맵핑된다.
       -->
       insert into BBS_T(idx,subject,writer,writedate,contents,s_file,pwd,readhit,ip)
       values (<!-- 아래서 전달되는 변수는 parameterClass에서 찾는다. -->
       #idx#,#subject#,#writer#,sysdate,#contents#,#s_file#,#pwd#,#readHit#,#ip#
       <!-- getSubject(),getWriter()이런 메소드가 호출되면서 파라미터에  맵핑된다. -->
       )
     </insert>

* Bbs.java
      - interface에 메소드 정의
            public void addBbs(BbsVO n);

* BbsImple.java
       public void addBbs(BbsVO n) {
          insert("insertBbs",n);   //insert(ag id값, 넘겨줄인자값)
       }


* struts.xml
      <action name="add" class="action.AddAction" method="clear">
          <result>/write.jsp</result>
      </action>
      
      <action name="add_ok" class="action.AddAction">
          <result name="input">/list.jsp</result>
          <result type="redirect-action" name="success">list</result>
      </action>

*write.jsp
  <%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <link rel="StyleSheet" href="/css/style.css" type="text/css">
    <link rel="StyleSheet" href="text.css" type="text/css">
    <s:head/> <!-- taglib가 가지고 있는 head값 -->
  </head>

  <body>
    <s:form action="add_ok" method="post" enctype="multipart/form-data">
      <s:include value="insertForm.jsp"></s:include>   //insertForm.jsp를 해당페이지에 폼으로 include
    </s:form>
  </body>
</html>  


* insertForm.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>

   <%@ taglib prefix="s" uri="/struts-tags" %>
  
        <table width="100%" border="0" cellspacing="0" cellpadding="0">
              <tr>
                <td valign="top">
                  <table width="100%" border="0" cellspacing="0" cellpadding="0">
                    <tr>
                      <td align="center" height="10"></td>
                    </tr>
                    <tr>
                      <td align="center"><u><b>BBS 글쓰기</b></u></td>
                    </tr>
                    <tr>
                      <td align="center" valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="0">
                          <tr>
                            <td>&nbsp;</td>
                          </tr>
                        </table>
                        <table width="556" border="0" cellspacing="0" cellpadding="0">
                          <tr>
                            <td height="2" bgcolor="#C3C3C3"></td>
                          </tr>
                          <tr>
                            <td bgcolor="#E5E5E5"><table width="100%" border="0" cellspacing="1" cellpadding="2">
                                
                                <tr>
                                  <td width="90" height="20" align="center" bgcolor="#669AB3">
                                      <s:text name="작성자"/>
                                 </td>
                                  <td bgcolor="#F2F7F9" align="left">
                                    <s:textfield name="writer" value="%{#session.selectBoard.writer}" cssStyle="width:100px" theme="simple"/>
                                </td>
                                </tr>                              
                                <tr>
                                  <td height="20" align="center" bgcolor="#669AB3"><s:text name="제목"/></td>
                                  <td bgcolor="#F2F7F9" align="left"><s:textfield name="subject" value="%{#session.selectBoard.subject}" cssStyle="width:450px" theme="simple"/></td>
                                </tr>
                                <tr>
                                  <td height="20" align="center" bgcolor="#669AB3"><s:text name="내용"/></td>
                                  <td bgcolor="#F2F7F9" align="left"><s:textarea name="contents" value="%{#session.selectBoard.contents}" cssStyle="width: 450px; height: 200px" theme="simple"/></td>
                                </tr>
        <tr>
                                  <td height="20" align="center" bgcolor="#669AB3"><s:text name="첨부파일"/></td>
                                  <td bgcolor="#F2F7F9" align="left"><s:file name="s_file" cssStyle="width:300px" theme="simple"/>
                                    </td>
                                </tr>
                                <tr>
                                  <td height="20" align="center" bgcolor="#669AB3"><s:text name="비밀번호"/></td>
                                  <td bgcolor="#F2F7F9" align="left"><s:password name="pwd" cssStyle="width:200px" theme="simple"/>
                                    <font color="#0066CC">* 삭제.수정시 필요</font> </td>
                                </tr>
                              </table></td>
                          </tr>
                        </table>
                        <table width="556" border="0" cellspacing="0" cellpadding="0">
                          <tr>
                            <td height="20" valign="middle"><img src="/images/sub_it/point_line.gif" width="556" height="3"></td>
                          </tr>
                          <tr>
                            <td align="right"> <table width="100%" border="0" cellspacing="0" cellpadding="0">
                                <tr>
                                  <td width="315" align="center">
                                       
                                  </td>
                                  <td width="241" align="right"> <s:submit src="images/but_submit.gif" theme="simple"/>
                                  <s:reset  theme="simple"/>
                                    
                                  </td>
                                </tr>
                              </table></td>
                          </tr>
                        </table></td>
                    </tr>
                    <tr>
                      <td height="19"></td>
                    </tr>
                  </table>
                </td>
              </tr>
            </table>


*AddAction.java
package action;

import java.io.File;
import java.util.Map;

import javax.servlet.Servlet;

import org.apache.struts2.ServletActionContext;


import service.FileService;
import vo.BbsVO;

import com.opensymphony.xwork2.ActionContext;

import dao.Bbs;
import dao.DaoService;

public class AddAction {
 
 String writer,subject,contents,pwd;
 File s_file;
 String s_fileFileName,serverFullPath; //s_fileFileName이라고 작성해야 된다.
 
 public String clear() throws Exception{
  /*현재 사용되고 있는 session정보 가져오기*/
  Map<String,BbsVO> map = ActionContext.getContext().getSession();
  map.clear();
  return "success";
 }
 
 public String execute() throws Exception{
 
  /*ibatis의 Dao객체 얻기*/
 
  Bbs bbs = (Bbs)DaoService.getDao(Bbs.class);  
 
  BbsVO vo = new BbsVO();  //ibatis에서 인자로 vo를 받기때문에 값을 셋팅하고 인자로 넣어준다.
  vo.setWriter(writer);
  vo.setSubject(subject);
  vo.setContents(contents);
  vo.setS_file(s_fileFileName);
  vo.setReadHit(0);
  vo.setPwd(pwd);
  vo.setIp(ServletActionContext.getRequest().getRemoteAddr());
  String basePath="D:/jspwork/Struts2_ibatis/WebContent/upload"; //저장할경로 설정
  FileService fs = new FileService(); //서버에 파일을 저장시키위해 객체생성
  serverFullPath = fs.saveFile(s_file, basePath, s_fileFileName); // 서버에 저장(파일객체,저장경로,파일명)
 
  bbs.addBbs(vo); //위에서 셋팅한 vo객체를 ibatis 인자로 넘겨준다(이런방식으로 여러개의 파라미터를 전달할수있다)
 
  return "success";
 }
 // 일반적인 setter//getter 메소드 정의

}