태그 : struts2
2007/09/06 struts2 개발 메모4
2007/09/06 struts2 개발 메모3
2007/09/06 struts2 개발 메모 2
2007/09/06 struts2 개발 메모
지금까지 struts1에서는 글이 깨지는 것을 방지하기 위해서 아래와 같이 filter를 사용해 왔다.
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>Shift_JIS</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
struts2에서는 struts.properties 파일에서 아래 부분을
struts.i18n.encoding=Shift_JIS
로 설정 해 주는 것만으로 가능 한거 같다.
물론 properties 파일이 싫은 사람은...
struts.xml 파일에서 저렇게 설정 해 주면 된다.
<constant value="struts.i18n.encoding" name="Shift_JIS"></constant>
내 로컬 환경에서 테스트 해 본 봐로는.. 아무 문제 없이.. 작동 하는거 같다.
혹시.. 의문 사항이 있으신 분은.. 댓글을...
# by | 2007/10/03 17:51 | struts2 | 트랙백 | 덧글(0)
addActionMessage(), addAxtionError 둘다 execute() 안에서 사용된다.
은addActionMessage()은 return success 에서 사용가능하며,
addActionError는 return error에서 사용가능하다.
addFieldError() 각 필드에 대한 validate를 정의 할수 있다.
Session을 사용할려면 ActionSupport를 extends SessionAware을 implements
Request,response도 비슷하게 하면 된다.
public class GetSession extends ActionSupport implements SessionAware{ private Map session; public String execute() throws Exception{ return SUCCESS; } public void setSession(Map session){ session = this.getSession(); } public Map getSession(){ return session; }}
<%@ taglib prefix="s" uri="/struts-tags" %><%@page language="java" import="java.util.*" %><html> <head> <title>Get Session Example!</title> </head> <body> <h1><span style="background-color: #FFFFcc"> Session Example! </span></h1> <b>Session:</b><%=session%><br> <b>Session Context: </b><%=session.getSessionContext() %><br> <b>Session Time: </b><%=new Date(session.getLastAccessedTime())%> </body></html>
뷰 단에서
jsp 페이지에 값을 표기하는 방법에는 두가지 표현식이 있는거 같다
<s:textfield label="TEST SynTax1" name="state" value="test"/>
<s:textfield label="TEST SynTax2" name="state" value="%{test}"/>
첫번째 방식은
<input type="text" name="state" value="test" id="state"/>
위의 방식으로 value 안에 하드코딩 해 버린다.
두번째 방식은 Action class에서 getTest() 메소드를 찾아서 바인딩 해 준다.
%{변수명} 이건 struts 문서를 보면.. 문법을 해석하라 뭐 이런 식으로 해석해야 하나?
String 타입만 테스트 해 본 결과 이므로 다른 타입은 직접 해 봐야 겠다.
OGNL ; Object Navigation Language 라는 놈이 나온다.
value stack(root) 에 action instance가 저장 되고 , 이것과 application, session,request, parameters 같은
값들이 공존하는 것 같다.
저기에 있는 값들을 사용할때는 #을 붙여야 하는거 같다.
Action properties 는 #을 붙여도 되지 않는다고 한다. 그런데 다른 녀석들은 붙이지 않을 경우
root에서 찾으므로 붙여줘야 한다고 한다.
<s:autocompleter theme="simple" list="state" name="StateName"/>
이 녀석 기능을 잘 살펴봐야 겠다.
<select> 박스 기능인데.. select 박스 안에서 글자를 치면.. 리스트 중에서 그 글자에
해당하는 녀석을 찾아서 자동으로 셀렉트 해 주는거 같다.
무슨.. asynchronize 관련 글이 있던거 같던데.. 뭔 말인지.. 잘 모르겠다.
The autocompleter tag loads its options asynchronously when the page loads suggested options based on the text entered by you in textbox
# by | 2007/09/06 14:04 | struts2 | 트랙백 | 덧글(0)
requiredstring = $\{getText(fieldName)} is required.password = Passwordusername = User NameAction Class 에서 Message bundle 파일을 이용하고 싶은 경우
Message bundle 파일에 다음과 같이 key, value 로 정의 되어 있다면…
HelloWorld.message = Struts is up and running ...
Missing.message = This feature is under construction.
public static final String MESSAGE= “HelloWorld.message”;
위의 방식으로 변수를 선언 한뒤 Action Class 에서
setMessage(getText(MESSAGE));
와 같이 getText를 이용하는거 같다.
Jsp 파일에서 message bundle 파일을 이용하는 방법은 세가지가 있는거 같다.
첫 번째
<s:property value="getText('some.key')"/>
두 번째
<-- Fourth Example --><s:text name="some.key"/>
<-- Fifth Example --><s:text name="some.invalid.key">
The Default Message That Will Be Displayed</s:text>세번째
<s:i18n name="some.package.bundle">
<s:text name="some.key"/>
</s:i18n>첫번째는 알겠는데… 두번째, 세번째는 잘 모르겠다.
Struts2 에서 Ajax를 사용하는 방법에는 3가지가 있다고 한다.
Jsp results
Plugins
실시간 디버거 모드를 지원한다.
우선 struts.properties 에서 devmode=true 로 설정한 다음 접속 하고자 하는
url의 맨 끝에 debug=xml or debug=console을 붙여주면 xml 형식과 ognl형식으로 보여 준다. Xml은 잘 되는데 console은 뭔가 잘 안된다.
Ex) /Struts2/user/UserAction.action?debug=xml
debug=console you may need to relax any popup blockers
뭔 말인지 잘 모르겠다.
Struts.xml 에서 constant 로 설정 가능 하며, web.xml에서도 가능하다.
<filter><filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
<init-param>
<param-name>struts.devMode</param-name>
<param-value>true</param-value>
</init-param>
</filter>
Zero configuration
Web.xml
<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.foo.bar,com.baz.quux</param-value>
</init-param>
</filter>이런 식으로 원하는 패키지를 , 로 구분해서 설정하면 자동으로 Action으로 끝나는 파일을 설정한다. 패키지의 하위 패키지까지 설정
Struts-xxx-config.xml 파일에서 execute() 이외의 메소드를 기본 호출 하고자
한다면 다음과 같이 해 주면 되는거 같다.
안해 봐서.. 잘 모르겠다… execute() 랑 같이 있을 경우 우선순위는 어떻게 되는지
Execute는 실행 하지 않는 것인지…
<action name="delete"class="example.CrudAction"method="delete">
아래와 같이 이름만 적고 클래스를 정의하지 않는 경우
com.opensymphony.xwork.ActionSupport 가 default로 불러 진다.
<action name="Hello">
// ...
</action>액션이 존재 하지 않을때를 위해서 아래와 같이 default를 사용할수 있다.
<package name="Hello"extends="action-default">
<default-action-ref name="UnderConstruction">
<action name="UnderConstruction">
<result>/UnderConstruction.jsp</result>
</action>아래와 같이 global-results를 선언해서 사용할수도 있다.
<global-results><result name="error">/Error.jsp</result>
<result name="invalid.token">/Error.jsp</result>
<result name="login"type="redirect-action">Logon!input</result>
</global-results>EL식을 사용해서 아래와 같이 동적으로 할수도 있다.
private String nextAction;
public String getNextAction() {
return nextAction;
}<action name="fragment"class="FragmentAction">
<result name="next"type="redirect-action">${nextAction}</result>
</action>Exception 을 아래와 같이 처러 가능하다.
<struts><package name="default">
...<global-results>
<result name="login"type="redirect">/Login.action</result>
<result name="Exception">/Exception.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.sql.SQLException"result="SQLException"/>
<exception-mapping exception="java.lang.Exception"result="Exception"/>
</global-exception-mappings>
...<action name="DataAccess"class="com.company.DataAccess">
<exception-mapping exception="com.company.SecurityException"result="login"/>
<result name="SQLException"type="chain">SQLExceptionAction</result>
<result>/DataAccess.jsp</result>
</action>
...
</package>
</xwork>Jsp 페이지 에서 <table> 태그가 잘 안먹히고…
자동적으로.. <table> 태그나 <tr><td>태그가 생성되는 경우가 있다..
이것은 struts.properties 파일에 있는
struts.ui.theme=simple
struts.ui.templateDir=template
#sets the default template type. Either ftl, vm, or jsp
struts.ui.templateSuffix=ftl
struts.ui.theme = xhtml 이 기본 값인데.. 이 경우 이상해 진다.
Simple로 해 주면 가장 기본적인 기능들만 가능 해 지는거 같다.
struts.ui.templateSuffix=ftl 이 옵션도 중요한데.. 이걸 괜히 jsp 로 변경
했다간 <s:property value=”name”/> 뭐 이런 struts 태크가 전혀 안 먹힌다.
이 부분은 아직 잘 모르겠다.
Simple 로 설정 할 경우에는 스트러츠 태그중에 안 되는 것이 많이 있다
# by | 2007/09/06 14:03 | struts2 | 트랙백 | 덧글(0)
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="hello" extends="struts-default" namespace="/hello">
<action name="HelloWorld" class="hello.HelloWorld">
<result>/hello/HelloWorld.jsp</result>
</action>
<!-- Add your actions here -->
</package>
</struts>
URL 경로의맨마지막에.action을붙이지않을경우웹서버가찾지못하는거같다.
아래와 같이 struts.xml 파일을 설정하고
http://localhost:8080/Struts2/hello/HelloSupport.action 불렀을때
웹 서버는 기본적으로 HelloSupport.jsp 파일을 찾는거 같다.
이 경우 hellosupport.jsp 파일을 만들어 두어도 찾지 못한다, 반드시 대소문자
구별을 하는거 같다.
<action name="*" class="hello.HelloSupport">
<result>/hello/{1}.jsp</result>
</action>
프레임워크 전반에 관한 설정은
Struts2/WEB-INF/classes/ struts-default.properties 에서 해 줄수도 있고
Struts.xml 파일에서 아래와 같은 식으로도 가능 하다.
<struts>
생략
<constant name=”struts.devMode” value=”true” />
생략
</struts>
링크
<li><a href="<s:url action="Register"/>">Register</a></li>
Parameter가 있는 링크
<s:url id="url" action="Welcome">
<s:param name="request_locale">en</s:param>
</s:url><s:a href="%{url}">English</s:a>
Struts2에서는 기본적으로 ActionSupport 클래스를 상속한다.
ActionSupport 클래스는 Action 인터페이스를 상속 하는데 Action 인터페이스를 보면
public static final String SUCCESS = "success";
public static final String NONE = "none";
public static final String ERROR = "error";
public static final String INPUT = "input";
public static final String LOGIN = "login";
다섯가지return 유형이정해져있다.
어떤액션처리에서jsp 페이지로가지않고다른액션같은곳으로가고싶을때
기본적으로type을선언하지않으면dispatcher 가되는거같다.
type =” redirect-action” 을사용하면redirect 되는거같다.
명시적으로해줘도되는거같다.
Forward가필요한경우에는type=”chain” 을사용해서하는거같다.
<action name="Logon" class="hello.Logon">
<result type="redirect-action">Menu</result>
<result name=”cancel” type="chain">Menu2</result>
<result name="input">/hello/logon.jsp</result>
</action>
Validation check 부분이 이상하다.
위에 있는<action name="Logon" class="hello.Logon">
URL Logon에 대하여 체크를 하고 싶을 경우 hello 디렉토리에 /hello/Logon-validation.xml
파일을 만들어 주면 자동으로 체크를 한다.
이경우 도대체 몇개의 validation.xml 파일을 만들어야 하는지.. ㅠ.ㅠ
Struts1에서 처럼 struts.xml 파일에서 특정 장소의 validation.xml을 include
예를들어
hello-validation.xml 파일 하나로 모든 hello 디렉토리 밑의 validation check가
가능하게 하는 방법은 없는지 찾아 봐라. 없다면.. 좌절이다…. ㅠ.ㅠ
Logon 페이지에 왔을때 첫 페이지 인데 validation check를 해 버린다.
이 경우 링크를 걸어 주는 곳에서
<li><a href="<s:url action="Logon"/>">Sign On</a></li>
<li><a href="<s:url action="Logon_input"/>">Sign On</a></li>
설정 파일에서도
<action name="Logon" class="hello.Logon">
<action name="Logon_*" method="{1}" class="hello.Logon">
이렇게 바꿔 줌으로서 처음 전이에는 에러 메세지가 보이지 않고
Logon Action Class에서 input을 리턴 했을 경우만 보여 주게 된다.
현재 validation check 에러 메시지가 폼태크 바로 위에 출력된다.
에러 메시지 출력 위치를 제어 할수 없을까?
Validation 의 경우 Message bundle 파일을 이용할수 있다.
근데.. 이것도 좀 이상하다.
위의 내용이랑 계속 연결해서 Message bundle 의 경우 역시 프로젝트 전체는 안되고
특정 디렉토리 예를 들자면 /hello/package.properties 파일을 만들어야 한다.
이럴 경우 디렉토리가 많으면.. 전부 만들어야 한다는 건데.. 뭔가 설정이 있을 듯 하다.
설정 방법은 jsp 페이지
<s:textfield label="User Name" name="username"/>
-> <s:textfield label="%{getText('username')}" name="username"/>
Login-validation.xml 파일에서
<message>Username is required</message>
-> <message key="requiredstring"/>
이런 식으로 변경해 주고
Package.properties 파일은 다음과 같이 기술한다.
# by | 2007/09/06 14:02 | struts2 | 트랙백 | 덧글(0)
1 Action 기반의프레임워크
2 성숙하고활기찬개발자와사용자그룹
3 Annotation(주석) 과XML 설정
4 POJO 기반의액션이어서테스트가쉽다
5 Spring, SiteMesh and Tiles 등과의통합
6 OGNL 표현언어integration
7 Themes(주제, 테마) 기반태그라이브러리와Ajax 태크
8 View 계층의다양한옵션(JSP, Freemarker, Velocity and XSLT)
9 Plug-ins to extend and modify framework features
Struts2 – pull-MVC (or MVC2) 프레임워크다. 전통적인MVC 프레임워크랑조금달리
Action은컨트롤러보다모델역할을한다. 비록거기에는약간겹치는부분이있다.
Five Core Components
Action, interceptors, value stack/OGNL, result types and results, view technologies
Value Stack – HttpServletRequest, HttpSession 대신에Value Stack을이용하면
Action Class get, set 설정만으로이용가능하다.
Inteceptors – filter 랑비슷하다.
Struts.properties 파일은web.xml 파일의init-param 속성과struts.xml 파일의constant 를사용해서설정가능하다.
Struts.xml 파일에서
<include file=”xxx-config.xml” />
<include file=”xxx2-config.xml” /> 를사용할때는인클루드하는순서가중요하다.
예를들어xxx2-config.xml에서xxx-config.xml에있는것을사용하려면반드시
xxx-config.xml가먼저인클루드되어야한다.
자동으로 인클루드 되는 struts-default.xml 과 struts-plugin.xml 이 있다.
Struts-default.xml은 Struts2 core 설정, struts-plugin.xml은 particular plug-in 설정
/example/HelloWorldAction.action 같은URL 에서.action은struts-properties 파일에서
Struts.action.extension = action 을바꿔주면된다.
Struts2 는 business Object, data access Object, other resource 를 취득하는 방법으로
Dependency injection, inversion of control 두가지를 제공한다.
Dependency injection – Constructor injection, interface injection and setter injection
Struts2는 setter injection을 사용한다. 적당한 프레임워크로는 Spring 이고 plugin을 통해서 설정
HttpServletRequest 같이 Spring이 관리하지 object는 setter injection과 interface injection을 조합해서 사용한다.
각각의 비지니스 외의 object는 상응하는 interface를 상속한다.
Eclipse 에서 Struts2 톰켓 프로젝트를 생성 했다고 치자
Struts2/WEB-INF/classes/struts.xml
Struts2/WEB-INF/classes/hello/HellowWorld.class
Struts2/hello/HellowWorld.jsp
Struts.xml 설정 파일에서 package 속성에서 name은 이 패키지를 구성하는 유일한
이름이어서 필수 인거 같다. 생략할 경우 에러가 났다.
Namespace 는 URL에서 사용하는 가상 경로인거 같다.
자기 마음 중복만 안되게 바꾸면 되는거 같다. 그 경우 URL도 바꿔야 한다.
Extends 는 자바의 Extends 속성과 비슷한거 같다.
struts2-core-2.0.8.jar 파일 안에 보면 struts-default.xml 파일이 있고 저 안에
struts-default 라는 패키지가 있는데 그걸 상속 하겠다는 뜻일거 같다.
실제 웹사이트 접근 경로는
http://localhost:8080/Struts2/hello/HelloWorld.action
# by | 2007/09/06 14:01 | struts2 | 트랙백 | 덧글(0)
◀ 이전 페이지 다음 페이지 ▶