이글루스 | 로그인  



태그 : struts2

encoding 관련

지금까지 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)

struts2 개발 메모4

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)

struts2 개발 메모3

requiredstring = $\{getText(fieldName)} is required.
password = Password
username = User Name

 

 

Action 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가지가 있다고 한다.

Ajax Tags

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)

struts2 개발 메모 2

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

struts2 개발 메모

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 에서.actionstruts-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)

◀ 이전 페이지          다음 페이지 ▶