loginAction.xml 

<struts>

<package name="login" extends="struts-default">

<action name="joinForm">

<result name="success">/jh/jsp/login/joinForm.jsp</result>

</action>

<action name="join" class="jh.login.action.UserJoinAction">

<result name="success" type="redirect">/list.do</result>

</action>


<action name="login" class="jh.login.action.UserLoginAction" method="login">

<result name="success" type="redirect">/list.do</result>

<result name="input">/jh/jsp/error/error.jsp</result>

</action>

<action name="loginForm">

<result name="success" type="dispatcher">/jh/jsp/login/loginForm.jsp</result>

</action>

<action name="logout" class="jh.login.action.UserLoginAction" method="logout">

<result name="success" type="redirect">/loginForm.do</result>

</action>

 

</package>

</struts>



UserLoginAction.java

public class UserLoginAction extends ActionSupport implements SessionAware {


private LoginVO vo = new LoginVO(); 

private LoginBO bo = new LoginBO();

private String userid;

private String passwd;

private String result;

SessionMap<String,Object> session;

String errMsg;

public String login() throws Exception{

vo.setUserid(userid);

vo.setPasswd(passwd);

/* [ Board 2013 ] 2013.07.12 이재희 : id,pw db에서 찾아 그 결과 값을 담는다. */

result = bo.login(vo);

if(result!=null){ /* [ Board 2013 ] 2013.07.12 이재희 : id,pw 존재하고 일치한다면 */

session.put("userid", userid); // 세션에 userid 저장

return SUCCESS;

}else{

/* [ Board 2013 ] 2013.07.12 이재희 : 인증이 잘못되어 있을 경우 result값을 다르게 주어서 다른 페이지(view)로 이동시킨다. */

            addFieldError("err.msg", "잘못된 로그인입니다"); // struts 태그 error 태그의 메시지값을 담는다.

            return INPUT;

}

}

public String logout() throws Exception{

session.remove("userid");

return SUCCESS;

}



/**

* @Method Name  : setSession

* @작성일     : 2013. 7. 10. 

* @작성자     : 이재희

* @param    :

* @Method 설명 :

*/

public void setSession(Map<String, Object> session) {

this.session = (SessionMap<String,Object>) session;

}



/**

* @return the userid

*/

public String getUserid() {

return userid;

}



/**

* @param userid the userid to set

*/

public void setUserid(String userid) {

this.userid = userid;

}



/**

* @return the passwd

*/

public String getPasswd() {

return passwd;

}



/**

* @param passwd the passwd to set

*/

public void setPasswd(String passwd) {

this.passwd = passwd;

}


}



loginForm.jsp

<form name="UserLoginForm" method="post" action="/login.do">

<table width="100%" border="0" cellspacing="0" cellpadding="1">

<tr>

<td colspan="2" id="td0">아이디 비밀번호</td>

</tr>

<tr>

<td id="td1"><input type="text" name="userid" id="tx1"

maxlength="12" /></td>

</tr>

<tr>

<td id="td1"><input type="password" name="passwd" id="tx1"

maxlength="16" /></td>

</tr>

<tr>

<td id="td11"><a id="bt_login" class="a_default" href="#"

onclick="FormSubmit( UserLoginForm );">Login</a> <a id="bt_login"

class="a_default" href="/joinForm.do">Join</a></td>

</tr>

</table>

</form>



loginok.jsp

<s:if test="#session.userid != null">

<%=session.getAttribute("userid")%> 님 안녕하세요.

<a href="/logout.do">로그아웃</a>

</s:if>

<s:else>

<script type='text/javascript'>

<!--

alert("로그인 바랍니다.");

setTimeout("location.href=' " + window.location.href + "/loginForm.do'",500);

//-->

</script>

</s:else>

<s:iterator value="fileList" status="fileStat">


<s:if test="#fileStat.last == true">

<td><input type="button" value="add" onClick="addFile();" /></td>

</s:if>


<s:else>

<td>

<input type="button" value="delete" onClick="delFile(parentNode.parentNode.rowIndex);" />

</td>

</s:else>


</s:iterator>

'Server Enterprise > Struts2' 카테고리의 다른 글

[Struts2] Session 과 로그인  (0) 2013.07.11
[Struts2] File Download  (0) 2013.05.09
[Struts2] Multi File Upload  (0) 2013.05.09
Struts2 Action과 Value Object 매핑  (0) 2013.02.21
Struts2 기본 셋팅과 사용법  (0) 2013.02.21

파일 다운로드에 대해서도 알아보자.


struts.xml

<action name="fileDownload" class="jh.board.action.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>


download.java

private String basePath;

private String fileName;

private String contentType;

private String contentDisposition;

private InputStream inputStream;

private long contentLength;

getter/setter 함수 선언;


public String execute() throws Exception {

String inputPath = basePath + "/" + fileName; // 파일을 저장해놓은 경로와 이름

File f = new File(inputPath); // 파일 경로+이름 을 이용하여 파일 생성

setContentLength( f.length() );

setContentDisposition("attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));

setInputStream(new FileInputStream(inputPath));

return SUCCESS;

}


글 작성시, 스트럿츠로 간단하게 업로드 되게 하는 방법을 알아 보자.


writeForm.jsp

<s:form action="/write.do" enctype="multipart/form-data">

<s:file name="uploads" />

<s:file name="uploads" />

<s:file name="uploads" />

<s:submit>
</s:form>

writeAction 에서건 VO 에서건 리스트 파일형태로 들고 와야한다.
private List<File> uploads = new ArrayList<File>();
private List<String> uploadsFileName = new ArrayList<String>();
private List<String> uploadsContentType = new ArrayList<String>();
List<File>과 List<String>의 getter/setter 선언.


위와 같이 uploads 에 한해 "uploadsFileName" 처럼 명명하여 파일 이름을 쓸 수 있다.


WirteAction.java

public String execute() throws Exception {

String filePath = vo.FILEPATH; // 파일 저장 위치

List<File> uploads = vo.getUploads(); // List 형태의 upload file 들

List<String> uploadsFileName = vo.getUploadsFileName(); 


bo.write(vo); 

if (uploads != null) {

for (int i=0 ; i<uploads.size(); i++) {

String saveFileName = System.currentTimeMillis() + "_"

+ uploadsFileName.get(i);

       File destFile = new File(filePath + saveFileName);

       

       fVo.setRealfilename( uploadsFileName.get(i) );

       fVo.setSavefilename( saveFileName );

       

       FileUtils.copyFile(uploads.get(i), destFile);  

       bo.saveFile(fVo);

   }

}

return SUCCESS;

}


retrieve.jsp

<s:iterator value="list" status="stat">

<s:url id="download" action="fileDownload">

<s:param name="basePath" value="basePath" />

<s:param name="fileName">

<s:property value="list[#stat.index].name" />

</s:param>

</s:url>

<li><s:a href="%{download}">

<s:property value="list[#stat.index].name" /></s:a><br /></li>

</s:iterator>




Struts2로 게시판에 관련되어 스트럿츠 값을 어떻게 전달하고 받는지 알아보자.


struts.xml

<action name="list" class="jh.board.action.BoardListAction">

<interceptor-ref name="prepare" />

<interceptor-ref name="modelDriven" />

<interceptor-ref name="params" />

<result name="success" type="dispatcher">/jh/jsp/board/list.jsp</result>

</action>


/list.action 이라고 url에 친다면 BoardListAction을 거쳐 return 값이 SUCCESS 라면

/jh/jsp/board/list.jsp 로 이동하게 된다.


<interceptor> 들도 나오는데 간단히 설명 하자면 Action에 있는 실행 메소드를 타기 전과 후에 prepare과 modelDriven 메소드를 함께 탄다는 것이다. params은 당연히 파라미터값들을 캐치하고 사용하기 위함이다.


BoardListAction.java

public class BoardListAction extends ActionSupport implements Preparable , ModelDriven<BoardVO>{


private BoardBO bo = new BoardBO();

private List<BoardVO> boardList;

private BoardVO vo;


public String execute() throws Exception {

boardList = bo.list(vo);

return SUCCESS;

}


public void prepare() throws Exception {

vo = new BoardVO();

}


public BoardVO getModel() {

return vo;

}


public List<BoardVO> getBoardList() {

return boardList;

}


public void setBoardList(List<BoardVO> boardList) {

this.boardList = boardList;

}

}


간단히 적어 보겠다.

이 리스트 페이지에는 검색할수 있는 기능이 있다.

그렇다면 우선 검색하는 값이 있는지 부터 프레젠테이션 계층에서 받아서 넘겨 줘야 한다.


그 값을 받기 위해 BoardVO vo;를 선언 하였고,

prepare()과 geModel()을 선언 하였다.


우선 prepare() 메소드는 Preparable 클래스에 있는 함수로 BoardListAction에서 implements 후 오버라이딩 한 메소드이다.


이 메소드는 해당 Action의 직접적인 로직을 수행하는 execute() 메소드 이전에 받은 값들을 Object 형으로 맵핑 및 저장해놓는 역할을 한다고 보면 된다.


그리하여 execute() 메소드에서 bo.list(vo); 하여 검색하고자 하는 value를 맵핑해놓은 Object형인 vo를 비즈니스로직단인 bo.list 메소드에 인자로 던져 준다. 그리고 최종적으로 검색을 했든 안했든 게시판 목록들을 List<BoardVO> 형태인 boardList 에 담아 둔다.


execute() 메소드에서 return SUCCESS;를 하는데 여기서 struts.xml에서 명시되어있는 list.jsp에 vo값들을 또다시 던져 주게 된다.


이것이 바로 getModel()의 return vo; 의 역할이라고 보면 되겠다.


그렇다면 List<BoardVO> 형인 boardList 는 어떻게 쓰이느냐 그건 list.jsp 안에서 볼수 있다.


<s:iterator value="boardList" status="stat">

</s:iterator>


위와 같이 boardList 명으로 명시 되어 있는 List 형을 반복하여 돌리는 struts 커스텀태그 iterator 되시겠다.


저와 같이 돌린 후 안에

<s:property value="title" />


프로퍼티 값들을 넣어놓으면 List의 수만큼 돌면서 게시판 목록 row에 값들이 뿌려지게 된다.


즉, DB에 있는 값만 프레젠테이션 계층에 뿌려줄 땐 prepare, ModelDriven을 사용할 필요가 없다. 그저 setter/getter 만 이용하면 된다.


하지만 게시판 jsp 페이지에서 다른 페이지로 이동하거나 어떤 값들을 전달하여야 할때 그 값이 Object 형일 때는 prepare()과 getModel() 메소드를 이용 해야 한다.


물론 여기서 다른페이지로 이동할 때 어떤 값이 Object 형이 아닐 때는 단순히 setter/getter 메소드만 이용하면 편하다.



'Server Enterprise > Struts2' 카테고리의 다른 글

[Struts2] File Download  (0) 2013.05.09
[Struts2] Multi File Upload  (0) 2013.05.09
Struts2 기본 셋팅과 사용법  (0) 2013.02.21
스트럿츠2 커스텀태그  (0) 2013.02.17
struts.properties  (0) 2013.02.08

Struts2 Action에서 어떻게 프레젠테이션 계층 값들을 받고 다시 return 해주는지에 관해 몇글자 적어 보려 한다.

MVC 패턴을 숙지 하고 있다면 이해하는데 별 어려움은 없지 않을까 필자는 그렇게 생각 한다.


차근차근 값들이 어떻게 넘어가고 뿌려지는지 순서에 초점을 맞추어 작성 하겠다.

자세한 내용은 또 따로 정리할 내용 이다. (귀찮아서 안할지도 모른다)


우선 원리에 대해 처음부터 상세히 적어 보려 한다. 처음 접하는 분들도 눈으로 따라오면서 흐름을 이해하기 바란다.


Struts로 개발할 해당 프로젝트의 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>


url의 모든 패턴값들을 struts2라는 필터명으로 맵핑을 한다. 어디로? 스트럿츠의 struts2.dispatcher 디스파처로 처리하게 정의 한다.


struts.xml

<struts>

<package name="board" extends="struts-default">

<action name="writeForm">

<result name="success">/jh/jsp/board/writeForm.jsp</result>

</action>

</package>

</struts>


위와 같이 struts.xml을 정의 하면 url 입력창에 /writeForm.action 이라고 치면 

result 값으로 맵핑된 /jh/jsp/board/writeForm.jsp로 이동하게 된다.


여기서 한가지 팁이 있다면 struts.properties 파일로 .action을 변경시킬 수 있다.

일단 기본적으로 아무런 스트럿츠 설정이 없다면 /write.action 해야하는게 맞다.


프로젝트에 struts.action.extension=do,action 내용이 적힌 strtus.properties 파일을 추가 하여 사용하면 /writeForm.do 하면 result로 맵핑된 /wrtieForm.jsp로 이동하게 된다.


위와 같이 action 태그에 class="" 설정이 되어있지 않다면 action 클래스를 사용하지 않는 것이다.

( Servlet MVC 에서 보자면 컨트롤러를 거치지 않고 그냥 바로 JSP를 VIew 해준 것이다.)


일단 Struts 셋팅과 간단한 url 맵핑에 대해 알아보았다.

다음엔 좀 더 심화된 Struts 사용법에 대해 알아 보도록 하자.

'Server Enterprise > Struts2' 카테고리의 다른 글

[Struts2] File Download  (0) 2013.05.09
[Struts2] Multi File Upload  (0) 2013.05.09
Struts2 Action과 Value Object 매핑  (0) 2013.02.21
스트럿츠2 커스텀태그  (0) 2013.02.17
struts.properties  (0) 2013.02.08

스트럿츠 커스텀 태그 ...


Action에서 ModelDriven 으로 객체를 return vo; 해준다면,

ibatis에서 resultMap으로 받은 객체를 jsp페이지에서 뿌려줄수 있다.


기본적으로 VO에 searchValue를 받았다면 jsp 커스텀 태그에선 아래와 같이 뿌려줄 수 있다.

<s:property value="%{searchValue}"/>


기본적으로 변수 선언과 if문에 대해서 살펴 보자.


<s:set name="searchValue" value="%{searchValue}" />

위는 action에서 받은 객체를 변수 선언 하는 법이다.


<s:set name="title" value="%{'title'}" />

위는 기본적으로 title이라는 String 값을 title이란 네임으로 변수 선언하는 법이다.


이 2개를 if문으로 매칭하고 싶다면 아래와 같이 쓰면 된다.

<s:if test="%{#searchItem == #title}"></s:if>

<s:if test="%{curPage == 1}"></s:if> <!-- 숫자 비교 -->


커스텀 태그로 for문을 만들고 싶다면 s:iterator 를 쓰면 된다.

아래와 같이, 일단 bean 설정을 한 뒤

<s:bean name="org.apache.struts2.util.Counter" id="pageCounter">

<s:param name="first" value="1" />

<s:param name="last" value="10}" />

</s:bean>


<s:iterator value="pageCounter" status="stat">

<span><s:property value="%{pageCounter.current}" /></span>

<s:/iterator>


위처럼 iterator를 사용하면 

<span>1</span> ... <span>10</span>

까지 출력이 된다. 이해가 되지 않는다면 구글찌잉... 께 물어보자.

'Server Enterprise > Struts2' 카테고리의 다른 글

[Struts2] File Download  (0) 2013.05.09
[Struts2] Multi File Upload  (0) 2013.05.09
Struts2 Action과 Value Object 매핑  (0) 2013.02.21
Struts2 기본 셋팅과 사용법  (0) 2013.02.21
struts.properties  (0) 2013.02.08

struts.i18n.reload=true

struts.devMode=false

struts.configuration.xml.reload=true

struts.configuration.package = org.apache.struts2.showcase

struts.custom.i18n.resources = globalMessages

struts.url.http.port = 8080

struts.serve.static = true

struts.serve.static.browserCache = false

struts.multipart.parser=jakarta

## struts.multipart.saveDir is Temp Directory

struts.multipart.saveDir=D:\\Users\\wjdns\\tmp

## struts.multipart.saveDir=C:\\Users\\vgate\\tomcat\\webapps\\ROOT\\upload

struts.multipart.maxSize=52428800


### Used by the DefaultActionMapper

### You may provide a comma separated list, e.g. struts.action.extension=action,jnlp,do

struts.action.extension=do,action


'Server Enterprise > Struts2' 카테고리의 다른 글

[Struts2] File Download  (0) 2013.05.09
[Struts2] Multi File Upload  (0) 2013.05.09
Struts2 Action과 Value Object 매핑  (0) 2013.02.21
Struts2 기본 셋팅과 사용법  (0) 2013.02.21
스트럿츠2 커스텀태그  (0) 2013.02.17

+ Recent posts