Struts2学习2——Struts配置

来源:互联网 发布:长整型数据范围 编辑:程序博客网 时间:2024/06/06 05:34

MyEclipse创建Struts2项目步骤:
http://blog.csdn.net/xundh/article/details/42234325

Struts2框架的主要配置文件

配置文件 可选 位置(相对于webapp) 说明 web.xml 否 WEB-INF Web部署描述文件,包括所有必需的框架组件 struts.xml 是 /WEB-INF/classes Struts2框架的主要配置文件,包含action映射,result映射和拦截器配置等 struts.properties 是 /WEB-INF/classes Struts2框架的属性配置文件 struts-default.xml 是 /WEB-INF/lib/struts2-core-x.x.x.jar Struts2框架提供的默认配置 struts-plugin.xml 是 /WEB-INF/struts2-xxx-plugin.jar Struts2框架的插件配置文件

web.xml配置示例

<?xml version="1.0" encoding="UTF-8"?>  <web-app id="WebApp_9" 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>Struts Blank</display-name>      <filter>          <!-- 配置Struts2核心Filter的名字 -->          <filter-name>struts2</filter-name>          <!-- 配置Struts2核心Filter的实现类 -->          <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>      </filter>      <!-- 配置Filter拦截的URL -->      <filter-mapping>          <!-- 配置Struts2的核心FilterDispatcher拦截所有用户请求 -->          <filter-name>struts2</filter-name>          <url-pattern>/*</url-pattern>      </filter-mapping>      <welcome-file-list>          <welcome-file>index.html</welcome-file>      </welcome-file-list>  </web-app>  

如上述代码,加载FilterDispatcher后,FilterDisplatcher就会加载应用Struts2框架。
FilterDisplatcher包含一些初始化参数:
- config:表示加载XML配置文件列表,多个文件名之间用英文,分隔。如果没有设置这个参数,Struts2框架将默认加载 struts.xml struts-default.xml struts-plugin.xml
- actionPackages 表示需要加载的Java包名的列表,多个包名之间使用英文逗号分隔。Struts2框架将加载这些包中的Action类
- configProviders 表示实现了ConfigurationProvider接口的Java类的列表,多个类名之间使用英文,分隔。ConfigurationProvider接口描述了框架的配置,默认情况下,Struts2框架使用StrutsXmlConfigurationProvider从XML文档中加载它的配置,使用configProviders参数,可以用来指定自己的ConfigurationProvider接口实现类。
- * 任何其它的参数都被当作是Struts2的常量。
在web.xml文件中,可以指定相应的初始化参数。例如,通过在元素中使用元素配置actionpackage参数:

<filter>   <filter-name>struts2</filter-name>   <filter-class>       org.apache.struts2.dispatcher.FilterDisplatcher   </filter-class>   <init-param>      <param-name>actionPackages</param-name>      <param-value>         org.apache.struts2.showcase.person      </param-value>   </init-param></filter>

Action业务控制器

package action;import com.opensymphony.xwork2.ActionSupport;public class ShowWords extends ActionSupport{   private String name;   private String words;   public String execute(){     //Action默认执行方法      if("".equals(name)){         return INPUT;          //返回逻辑视图INPUT      }else{         words="welcome:"+name;         return SUCCESS;         //返回逻辑视图SUCCESS      }   }}

常量
- SUCCESS
- NONE
- ERROR
- INPUT
- LOGIN
Action类通常继承ActionSupport类。

动态方法调用

action="Action名称!方法名称";或action="Action名称!方法名称.action";

使用method属性

<action name="Action名称" class="包名.Action类名" mthod="方法名称">    <result>视图URL</result></action>

method属性的值表示在Action类中的方法名称,如:调用Action类中的register()方法,则可以设置method=”register”。如果在元素中不指定method,则默认为execute。

通配符映射

<package name="default" extends="struts-default">      <action name="book_*" class="action.AddBook" method="{1}">          <result name="success">/addSuccess.jsp</result>      </action></package>

默认Action

<package name="default" extends="struts-default">    <default-action-ref name="NoAction" />    <action name="addBook" class="action.AddBook">        <result name="success">/addSuccess.jsp</result>    </action>    <action name="NoAction" class="action.NoAction">        <result name="success">/ok.jsp</result>    </action></package>

上面使用default-action-ref 配置一个默认Action,只包含一个属性name,属性名为NoAction。

结果映射

这里写图片描述

dispatcher结果类型

redirect结果类型

redirectAction结果类型

其它结果类型

  • stream
  • chain
  • httpheader
  • plainText
  • xslt
  • velocity

使用通配符动态配置result

<package name="default" extends="struts-default">    <action name="book_*" class="action.AddBook" method="{1}">        <result name="success">/{1}.jsp</result>    </action></package>

使用OGNL动态配置result

使用注解配置Action

struts.xml配置文件

应用中的所有常量、Action和拦截器等几乎都配置在该文件中。通常放在WEB-INF/classes下,在该目录下的struts.xml可以被Struts2框架自动加载。
Struts2框架提供了struts.xml文件的DTD文件。在struts-core-x.x.x.jar中,包含有一个struts-2.0.dtd文件,该文件就是struts.xml文件和struts-default.xml文件的DTD。
这里写图片描述

struts.xml 配置文件 内容可以分为三大类:
管理元素、用户请求处理元素和错误处理元素。
这里写图片描述

<!DOCTYPE struts PUBLIC        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"        "http://struts.apache.org/dtds/struts-2.0.dtd"><struts>    <!-- struts2的action必须放在一个指定的包空间下定义 -->    <package name="default" extends="struts-default">    <!-- 定义处理请求URL为login.action的Action -->        <action name="login" class="org.qiujy.web.struts.action.LoginAction">        <!-- 定义处理结果字符串和资源之间的映射关系 -->            <result name="success">/success.jsp</result>            <result name="error">/error.jsp</result>        </action>    </package></struts>

包含配置

在Struts2中可以将一个配置文件分解成多个配置文件

<struts>    <include file="struts-default.xml"/>    <include file="struts-user.xml"/>    <include file="struts-book.xml"/>    <include file="struts-shoppingCart.xml"/>    ......   </struts>

struts-default.xml

Struts2框架的基础配置文件,为框架提供默认配置,例如:

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

package元素定义了一个默认包default,该包继承struts-default。

struts-properties

struts.configuration:该属性指定加载Struts 2配置文件的配置文件管理器。该属性的默认值是org.apache.Struts2.config.DefaultConfiguration,这是Struts 2默认的配 置文件管理器。如果需要实现自己的配置管理器,开发者则可以实现一个实现Configuration接口的类,该类可以自己加载Struts 2配置文件。

  • struts.locale:指定Web应用的默认Locale。

  • struts.i18n.encoding:指定Web应用的默认编码集。该属性对于处理中文请求参数非常有用,对于获取中文请求参数值,应该将该属性值设置为GBK或者GB2312。

    提示 当设置该参数为GBK时,相当于调用HttpServletRequest的setCharacterEncoding方法。

  • struts.objectFactory:指定Struts 2默认的ObjectFactory Bean,该属性默认值是spring。

  • struts.objectFactory.spring.autoWire:指定Spring框架的自动装配模式,该属性的默认值是name,即默认根据Bean的name属性自动装配。

  • struts.objectFactory.spring.useClassCache:该属性指定整合Spring框架时,是否缓存Bean实例,该属性只允许使用true和false两个属性值,它的默认值是true。通常不建议修改该属性值。
  • struts.objectTypeDeterminer:该属性指定Struts 2的类型检测机制,通常支持tiger和notiger两个属性值。
  • struts.multipart.parser:该属性指定处理multipart/form-data的MIME类型(文件上传)请求的框架,该属性支持cos、pell和jakarta等属性值,即分别对应使用cos的文件上传框架、pell上传及common-fileupload文件上传框架。该属性的默认值为jakarta。
    注意 如果需要使用cos或者pell的文件上传方式,则应该将对应的JAR文件复制到Web应用中。例如,使用cos上传方式,则需要自己下载cos框架的JAR文件,并将该文件放在WEB-INF/lib路径下。

  • struts.multipart.saveDir:该属性指定上传文件的临时保存路径,该属性的默认值是javax.servlet.context.tempdir。

  • struts.multipart.maxSize:该属性指定Struts 2文件上传中整个请求内容允许的最大字节数。
  • struts.custom.properties:该属性指定Struts 2应用加载用户自定义的属性文件,该自定义属性文件指定的属性不会覆盖struts.properties文件中指定的属性。如果需要加载多个自定义属性文件,多个自定义属性文件的文件名以英文逗号(,)隔开。
  • struts.mapper.class:指定将HTTP请求映射到指定Action的映射器,Struts 2提供了默认的映射器:org.apache.struts2.dispatcher.mapper.DefaultActionMapper。默认映射器根据请求的前缀与Action的name属性完成映射。

  • struts.action.extension:该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts 2处理。如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。

  • struts.serve.static:该属性设置是否通过JAR文件提供静态内容服务,该属性只支持true和false属性值,该属性的默认属性值是true。
  • struts.serve.static.browserCache:该属性设置浏览器是否缓存静态内容。当应用处于开发阶段时,我们希望每次请求都获得服务器的最新响应,则可设置该属性为false。
  • struts.enable.DynamicMethodInvocation:该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为false。
  • struts.enable.SlashesInActionNames:该属性设置Struts 2是否允许在Action名中使用斜线,该属性的默认值是false。如果开发者希望允许在Action名中使用斜线,则可设置该属性为true。
  • struts.tag.altSyntax:该属性指定是否允许在Struts 2标签中使用表达式语法,因为通常都需要在标签中使用表达式语法,故此属性应该设置为true,该属性的默认值是true。
  • struts.devMode:该属性设置Struts 2应用是否使用开发模式。如果设置该属性为true,则可以在应用出错时显示更多、更友好的出错提示。该属性只接受true和flase两个值,该属性的默认值是false。通常,应用在开发阶段,将该属性设置为true,当进入产品发布阶段后,则该属性设置为false。
  • struts.i18n.reload:该属性设置是否每次HTTP请求到达时,系统都重新加载资源文件。该属性默认值是false。在开发阶段将该属性设置为true会更有利于开发,但在产品发布阶段应将该属性设置为false。
    提示 开发阶段将该属性设置了true,将可以在每次请求时都重新加载国际化资源文件,从而可以让开发者看到实时开发效果;产品发布阶段应该将该属性设置为false,是为了提供响应性能,每次请求都需要重新加载资源文件会大大降低应用的性能。

  • struts.ui.theme:该属性指定视图标签默认的视图主题,该属性的默认值是xhtml。

  • struts.ui.templateDir:该属性指定视图主题所需要模板文件的位置,该属性的默认值是template,即默认加载template路径下的模板文件。
  • struts.ui.templateSuffix:该属性指定模板文件的后缀,该属性的默认属性值是ftl。该属性还允许使用ftl、vm或jsp,分别对应FreeMarker、Velocity和JSP模板。
  • struts.configuration.xml.reload:该属性设置当struts.xml文件改变后,系统是否自动重新加载该文件。该属性的默认值是false。
  • struts.velocity.configfile:该属性指定Velocity框架所需的velocity.properties文件的位置。该属性的默认值为velocity.properties。
  • struts.velocity.contexts:该属性指定Velocity框架的Context位置,如果该框架有多个Context,则多个Context之间以英文逗号(,)隔开。
  • struts.velocity.toolboxlocation:该属性指定Velocity框架的toolbox的位置。
  • struts.url.http.port:该属性指定Web应用所在的监听端口。该属性通常没有太大的用户,只是当Struts 2需要生成URL时(例如Url标签),该属性才提供Web应用的默认端口。
  • struts.url.https.port:该属性类似于struts.url.http.port属性的作用,区别是该属性指定的是Web应用的加密服务端口。
  • struts.url.includeParams:该属性指定Struts 2生成URL时是否包含请求参数。该属性接受none、get和all三个属性值,分别对应于不包含、仅包含GET类型请求参数和包含全部请求参数。
  • struts.custom.i18n.resources:该属性指定Struts 2应用所需要的国际化资源文件,如果有多份国际化资源文件,则多个资源文件的文件名以英文逗号(,)隔开。
  • struts.dispatcher.parametersWorkaround:对于某些Java EE服务器,不支持HttpServlet Request调用getParameterMap()方法,此时可以设置该属性值为true来解决该问题。该属性的默认值是false。对于WebLogic、Orion和OC4J服务器,通常应该设置该属性为true。
  • struts.freemarker.manager.classname:该属性指定Struts 2使用的FreeMarker管理器。该属性的默认值org.apache.struts2.views.freemarker.FreemarkerManager,这是Struts 2内建的FreeMarker管理器。
  • struts.freemarker.wrapper.altMap:该属性只支持true和false两个属性值,默认值是true。通常无需修改该属性值。
  • struts.xslt.nocache:该属性指定XSLT Result是否使用样式表缓存。当应用处于开发阶段时,该属性通常被设置为true;当应用处于产品使用阶段时,该属性通常被设置为false。
  • struts.configuration.files:该属性指定Struts 2框架默认加载的配置文件,如果需要指定默认加载多个配置文件,则多个配置文件的文件名之间以英文逗号(,)隔开。该属性的默认值为struts-default.xml,struts-plugin.xml,struts.xml

Struts 2框架有两个核心配置文件,其中struts.xml文件主要负责管理应用中的Action映射,以及该Action包含的Result定义等。除此之外,Struts 2框架还包含 struts.properties文件,该文件定义了Struts 2框架的大量属性,开发者可以通过改变这些属性来满足应用的需求。

struts.properties文件是一个标准的Properties文件,该文件包含了系列的key-value对象,每个key就是一个Struts 2属性,该key对应的value就是一个Struts 2属性值。

struts.properties文件通常放在Web应用的WEB-INF/classes路径下。实际上,只要将该文件放在Web应用的CLASSPATH路径下,Struts 2框架就可以加载该文件。

静态内容

Struts2框架的静态内容是由FilterDispacher过滤器自动提供的,任何以/struts开始的请求都认为是静态内容。
/struts/后面的内容将被映射到Struts2 核心类库 struts-core-x.x.x.jar中的公共包中。
默认情况下,Struts2框架可以自动搜索模板包template和org.apache.struts2.static包。

可以在web.xml文件中,通过 FilterDisplathcer过滤器的参数 package来指定附加的包,多个包之间使用英文逗号隔开。

Bean配置

在Struts2框架的struts-default.xml文件中,定义了大量的核心组件,这些核心组件不是直接以硬编码的形式写在代码中,而是以自己的依赖注入容器来装配。用户可以编写自己的组件实现类来扩展或者替换框架的一部分,使用元素来描述组件实现类。

在sturts.xml文件 中使用元素配置Bean,通过有以下两个作用:
- 通过Bean的静态方法向Bean注入一个值
- 创建Bean的实例化对象并将该实例作为Struts2框架的核心组件使用
struts.xml 元素的属性
这里写图片描述

常量

通常Struts2框架按以下顺序加载Struts2常量
- struts-default.xml
- struts-plugin.xml
- struts.xml
- struts.properties
- web.xml
使用元素可以配置常量,有以下必填属性
- name 指定常量的名称
- value 指定常量的属性值
如struts.xml

<constant name="struts.i18n.encoding" value="gb2312" />

如果在struts.properties实现:

struts.i18n.encoding=gb2312struts.custom.i18n.resources=globalMessages

在web.xml中配置

<filter>     <filter-name>struts2</filter-name>     <filter-class>        org.apache.struts2.dispatcher.FilterDisplatcher     </filter-class>     <init-param>         <param-name>             struts2.custom.i18n.resources         </param-name>         <param-value>globalMessages</param-value>    </init-param>    <init-param>        <param-name>struts.i18n.encoding</param-name>        <param-value>gb2312</param-value>    </init-param></filter>

包配置

使用配置包
这里写图片描述

命名空间配置

拦截器配置

<package name="struts-default">    <interceptros>        <interceptor-stack name="defaultStack">        <interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor" />        <interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor" />        <interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor" />        <interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor" />        <interceptor-ref name="validation">            <param name="excludeMethods">input,back,cancel,browse</param>        </interceptor-ref>        <interceptor-ref name="workflow">            <param name="excludeMethods">input,back,cancel,browse</param>        </interceptor-ref>    </interceptor-stack></interceptors><package>

对拦截器配置时,可以使用4种类型的元素:

<interceptors><interceptor><interceptor-ref><interceptor-stack>
在<interceptor name="拦截器名称" class="拦截器的Java类" />

中,name属性定义一个拦截器名称,该名称用于其它地方引用该拦截器。class属性定义拦截器类所在路径名称,例如interceptor.MyInterceptor,表示在interceptor文件夹下的MyInterceptor类。
在元素中,可以使用元素为拦截器配置参数。该元素只有一个属性name,属性值为定义的参数名称,元素对的内容为参数值。

间接访问Servlet API

在Struts2框架中,Action与Servlet API相分离。Struts2提供了名称为ActionContext的类,在Action中可以通过该类获得Servlet API。
Action运行期间所用的数据都保存在ActionContext中,例如session会话,以及客户端提交的参数等信息。

创建 ActionContext类:

ActionContext actionContext = ActionContext.getContext();

在ActionContext类中有一些常用方法:
这里写图片描述
通过ActionContext类的语法格式创建actionContext对象,然后使用actionContext对象调用表中的方法,可以实现相应的功能,从而实现对Servlet API的访问。

直接访问Servlet API

IoC方式

在Struts2框架中,通过IoC方式访问Servlet API,就必须在Action中实现相应的接口:
- org.apache.struts2.util.ServletContextAware
实现该接口的action可以直接访问ServletContext对象。Action必须实现该接口的void setServletContext(javax.servlet.ServletContext servletContext)方法
- org.apache.struts2.interceptor.ServletRequestAware
实现该接口的Action可以直接访问HttpServletRequest对象。Action必须实现该接口的void setServletRequest(javax.servlet.http.HttpServletRequest request)方法
- org.apache.struts2.interceptor.ServletResponseAware
实现该接口的Action可以直接访问HttpServletResponse对象。Action必须实现该接口的void setServletResponse(javax.servlet.http.HttpServletResponse response)方法
- org.apache.struts2.interceptor.SessionAware
实现该接口的Action可以直接访问HttpSession对象。Action必须实现该接口的void setSession(java.util.Map map)方法

使用IoC方式实现ServletRequestAware接口示例

package action;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import com.opensymphony.xwork2.ActionSupport;public class IoCAction extends ActionSupport implements ServletRequestAware{    private String bookName;    private double bookPrice;    private String book Press;    private HttpServletRequest request;    public void setServletRequest(HttpServletRequest request){        this.request=request;    }    public String execute(){        HttpSession session=request.getSession();        session.setAttribute("bookName",this.bookName);        session.setAttribute("bookPrice",this.bookPrice);        session.setAttribute("bookPress",this.bookPress);        return SUCCESS;    }}上述Action类不但继承ActionSupport类,还实现了ServletRequestAware接口。在Action类中实现该接口的setServletRequest()方法,从而获得HttpServletRequest对象request。然后在execute()方法,通过request对象,调用getSession()方法来获得session对象,这样也就实现了对Servlet API的访问。在IoC方式下,可以使Action实现其中的一个接口,也可以实现全部接口。

非IoC方式

在非IoC 方式中,Struts2提供ServletActionContext类来获得Servlet API。在ServletActionContext类中有以下静态方法:
- getPageContext();
- getRequest();
- getResponse();
- getServletContext();

示例:

package action;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;public class NoIoCAction extends ActionSupport{    private String bookName;    private double bookPrice;    private String bookPress;    public String execute(){        HttpServletRequest request=ServletActionContext.getRequest();        HttpSession session=request.getSession();        session.setAttribute("bookName",this.bookName);        session.setAttribute("bookPrice",this.bookPrice);        session.setAttribute("bookPress",this.bookPress);        return SUCCESS;    }}

间接访问方式,只能获得request对象,而得不到response对象。
对于IoC 与 Servlet API耦合大,不推荐使用。

0 0