Tag Archives: struts2

Welcome to Struts 2

Struts 2와 관련된 국내 문서가 너무 없는거 같아 http://struts.apache.org 의 기본문서를 토대로 기본 프로젝트를 하나 만들어 보았습니다.

지극히 초보분들을 위한 내용이니, 고수 분들은 ‘뒤로’를 눌러주시면 되겠습니다^^;

기본적인 HelloWorld 프로젝트를 생성합니다. 스트럿츠 관련 라이브러리를 추가합니다. (WEB-INF/lib/)

미니멈하게 필요한 라이브러리 파일은 다음과 같습니다.



  • struts2-core.jar : 스트럿츠2의 코어 라이브러리입니다.
  • xwork.jar : 스트럿츠2의 새로운 점중 가장 큰 부분입니다. Webwork(= Xwork)와 통합 되었는데요. xwork가 주가 되고 struts가 뒷받침 해주는 형식으로 작동합니다.
  • ognl.jar : Object Graph Navigation Language라고 합니다. struts2를 위한 EL(Expression Language)라고 하는군요. JSP 2.1 스펙에 포함된 EL과 거진 비슷한거 같습니다. 좀더 편한거 같긴한데 struts2의 퍼포먼스를 좀먹는 녀석이라고 하네요. 이녀석이 꼭 있어야 한다니..OTL
  • freemarker.jar : UI 태그 탬플릿을 위해 있는 녀석입니다. 벨로시티를 생각하시면 되겠습니다.
  • commons-logging.jar : log4j와 같은 로깅을 위한 라이브러리입니다.


다음의 소스들을 보시면 느끼시겠지만, 예전의 서블릿 매핑이 아닌 필터 매핑을 하고 있습니다.

눈에 띄는것부터 보자면 excute함수의 인자가 하나도 없군요. 컨트롤러에서 특정 로직을 수행후에 view로 리턴해 줄때 열심히 setAttribute하던것도 없어졌습니다. 그냥 변수에 담아두면 가져다 쓸수 있군요.

SUCCESS를 많이 써서 그럴까요? 리턴할떄 SUCCESS가 기본 상수가 되어버린 모양입니다.

열심히 mapping어쩌고를 안써도 되게 되었네요.

또한 struts.properties에 기본적인 설정을 할수 있습니다. 캐릭터셋까지 기본설정 가능하군요. 디폴트는 UTF-8입니다.

struts2의 디폴트 확장자는 do가 아닌 action입니다.

/WEB-INF/web.xml
[code]<?xml version=”1.0″ encoding=”UTF-8″?>
<web-app id=”WebApp_ID” version=”2.4″ xmlns=”http://java.sun.com/xml/ns/j2ee”
 xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
 xsi:schemaLocation=”http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd”>
 <display-name>HelloWorld</display-name>
 <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>
</web-app>[/code]

/WEB-INF/classes/struts.xml
[code] version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE struts PUBLIC “-//Apache Software Foundation//DTD Struts Configuration 2.0//EN”
 “http://struts.apache.org/dtds/struts-2.0.dtd”>
<struts>
 <!– Configuration for the default package. –>
 <package name=”tutorial” extends=”struts-default”>
        <action name=”HelloWorld” class=”tutorial.HelloWorld”>
            <result>Helloworld.jsp</result>
        </action>
        <!– Add your actions here –>
    </package>
</struts>[/code]

/WEB-INF/classes/struts.properties
[code]### Struts default properties
###(can be overridden by a struts.properties file in the root of the classpath)
###

### Specifies the Configuration used to configure Struts
### one could extend org.apache.struts2.config.Configuration
### to build one’s customize way of getting the configurations parameters into Struts
# struts.configuration=org.apache.struts2.config.DefaultConfiguration

### This can be used to set your default locale and encoding scheme
# struts.locale=en_US
struts.i18n.encoding=UTF-8

### if specified, the default object factory can be overridden here
### Note: short-hand notation is supported in some cases, such as “spring”
### Alternatively, you can provide a com.opensymphony.xwork2.ObjectFactory subclass name here 
# struts.objectFactory = spring

### specifies the autoWiring logic when using the SpringObjectFactory.
### valid values are: name, type, auto, and constructor (name is the default)
struts.objectFactory.spring.autoWire = name

### indicates to the struts-spring integration if Class instances should be cached
### this should, until a future Spring release makes it possible, be left as true
### unless you know exactly what you are doing!
### valid values are: true, false (true is the default)
struts.objectFactory.spring.useClassCache = true

### if specified, the default object type determiner can be overridden here
### Note: short-hand notation is supported in some cases, such as “tiger” or “notiger”
### Alternatively, you can provide a com.opensymphony.xwork2.util.ObjectTypeDeterminer
### implementation name here
### Note: if you have the xwork-tiger.jar within your classpath, GenericsObjectTypeDeterminer is
### used by default
### To disable tiger support use the “notiger” property value here.
#struts.objectTypeDeterminer = tiger
#struts.objectTypeDeterminer = notiger

### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data
# struts.multipart.parser=cos
# struts.multipart.parser=pell
struts.multipart.parser=jakarta
# uses javax.servlet.context.tempdir by default
struts.multipart.saveDir=
struts.multipart.maxSize=2097152

### Load custom property files (does not override struts.properties!)
# struts.custom.properties=application,org/apache/struts2/extension/custom

### How request URLs are mapped to and from actions
#struts.mapper.class=org.apache.struts2.dispatcher.mapper.DefaultActionMapper

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

### Used by FilterDispatcher
### If true then Struts serves static content from inside its jar.
### If false then the static content must be available at <context_path>/struts
struts.serve.static=true

### Used by FilterDispatcher
### This is good for development where one wants changes to the static content be
### fetch on each request.
### NOTE: This will only have effect if struts.serve.static=true
### If true -> Struts will write out header for static contents such that they will
###             be cached by web browsers (using Date, Cache-Content, Pragma, Expires)
###             headers).
### If false -> Struts will write out header for static contents such that they are
###            NOT to be cached by web browser (using Cache-Content, Pragma, Expires
###            headers)
struts.serve.static.browserCache=true

### Set this to false if you wish to disable implicit dynamic method invocation
### via the URL request. This includes URLs like foo!bar.action, as well as params
### like method:bar (but not action:foo).
### An alternative to implicit dynamic method invocation is to use wildcard
### mappings, such as <action name=”*/*” method=”{2}” class=”actions.{1}”>
struts.enable.DynamicMethodInvocation = true

### Set this to true if you wish to allow slashes in your action names.  If false,
### Actions names cannot have slashes, and will be accessible via any directory
### prefix.  This is the traditional behavior expected of WebWork applications.
### Setting to true is useful when you want to use wildcards and store values
### in the URL, to be extracted by wildcard patterns, such as
### <action name=”*/*” method=”{2}” class=”actions.{1}”> to match “/foo/edit” or
### “/foo/save”.
struts.enable.SlashesInActionNames = false

### use alternative syntax that requires %{} in most places
### to evaluate expressions for String attributes for tags
struts.tag.altSyntax=true

### when set to true, Struts will act much more friendly for developers. This
### includes:
### – struts.i18n.reload = true
### – struts.configuration.xml.reload = true
### – raising various debug or ignorable problems to errors
###   For example: normally a request to foo.action?someUnknownField=true should
###                be ignored (given that any value can come from the web and it
###                should not be trusted). However, during development, it may be
###                useful to know when these errors are happening and be told of
###                them right away.
struts.devMode = false

### when set to true, resource bundles will be reloaded on _every_ request.
### this is good during development, but should never be used in production
struts.i18n.reload=false

### Standard UI theme
### Change this to reflect which path should be used for JSP control tag templates by default
struts.ui.theme=xhtml
struts.ui.templateDir=template
#sets the default template type. Either ftl, vm, or jsp
struts.ui.templateSuffix=ftl

### Configuration reloading
### This will cause the configuration to reload struts.xml when it is changed
struts.configuration.xml.reload=false

### Location of velocity.properties file.  defaults to velocity.properties
struts.velocity.configfile = velocity.properties

### Comma separated list of VelocityContext classnames to chain to the StrutsVelocityContext
struts.velocity.contexts =

### Location of the velocity toolbox
struts.velocity.toolboxlocation=

### used to build URLs, such as the UrlTag
struts.url.http.port = 80
struts.url.https.port = 443
### possible values are: none, get or all
struts.url.includeParams = get

### Load custom default resource bundles
# struts.custom.i18n.resources=testmessages,testmessages2

### workaround for some app servers that don’t handle HttpServletRequest.getParameterMap()
### often used for WebLogic, Orion, and OC4J
struts.dispatcher.parametersWorkaround = false

### configure the Freemarker Manager class to be used
### Allows user to plug-in customised Freemarker Manager if necessary
### MUST extends off org.apache.struts2.views.freemarker.FreemarkerManager
#struts.freemarker.manager.classname=org.apache.struts2.views.freemarker.FreemarkerManager

### See the StrutsBeanWrapper javadocs for more information
struts.freemarker.wrapper.altMap=true

### configure the XSLTResult class to use stylesheet caching.
### Set to true for developers and false for production.
struts.xslt.nocache=false

### A list of configuration files automatically loaded by Struts
struts.configuration.files=struts-default.xml,struts-plugin.xml,struts.xml

### Whether to always select the namespace to be everything before the last slash or not
struts.mapper.alwaysSelectFullNamespace=false[/code]

Class : tutorial.HelloWorld.java
[code]package tutorial;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorld extends ActionSupport {

 private static final long serialVersionUID = 1L;
 public static final String MESSAGE = “Hello World (Struts 2)”;

 public String execute() throws Exception {
  setMessage(MESSAGE);
  return SUCCESS;
 }

 private String message;

 public void setMessage(String message) {
  this.message = message;
 }

 public String getMessage() {
  return message;
 }
}[/code]

/Helloworld.jsp
[code]<%@ page language=”java” contentType=”text/html; charset=EUC-KR”
    pageEncoding=”EUC-KR”%>
<%@ taglib prefix=”s” uri=”/struts-tags” %>
<html>
    <head>
        <title>Hello World!</title>
    </head>
    <body>
        <h2><s:property value=”message” /></h2>
    </body>
</html>[/code]