1.  Struts2的核心配置(详解)

 

本章内容目录:

 

  • 配置struts.xml文件
    1. struts.xml文件
    2. 常量配置
    3. 包配置
    4. 包含配置
  • Action配置
    1. 实现Action控制类
    2. 配置Action
    3. 使用通配符
  • Action访问Servlet API
    1. 通过ActionContext类访问
    2. 通过特定接口访问、
    3. 通过ServletActionContext访问
  • Result结果类型
    1. 配置Result
    2. 预定义的结果类型
    3. dispatcher结果类型
    4. redirect结果类型

 

2.  具体内容

2.1  配置Struts.xml文件

 

2.1.1 Struts.xml文件

 

  Struts2框架的核心配置文件是Struts.xml,该文件主要用来配置Action和请求的对应关系。Struts.xml文件可以被Struts2框架自动加载。

搭建好了的Struts2项目(可参考上一讲如何搭建Struts2项目),其配置文件Struts.xml如下所示:

  待配置的分块如下(注意注释部分):

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">

<struts>
    
    <!--constant元素用于常量的配置-->
    <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
    <constant name="struts.devMode" value="ture"/>
    
    
    <!--package元素用于包配置-->
    <package name="default"namespace="/"extends="struts-default">
        <!--配置Action-->
        <action name="index">
            <!--配置Result-->
            <result type="dispatcher">
                <param name="location">/index.jsp</param>
            </result>
        </action>
    </package>
    
<!--include元素用于包含配置--> <include file="example.xml"/> </struts>

  简单的包含关系:

 

2.1.2  常量配置

 

  Struts2中常量配置共有3种方式:

  • 在struts.xml文件中通过<constant>元素配置常量;
  • 在struts.properties文件中配置常量;
  • 在web.xml文件中通过<init-param>元素配置常量;

 

(1) 在Struts.xml文件中通过<constant>元素配置常量

  在Struts.xml文件中通过<constant…/>来配置常量时,需要两个必填的属性name和value。

  • name:该属性指定了常量的常量名;
  • value:该属性指定了常量的常量值;

  在Struts.xml文件中配置的示例代码如下:

<struts>

    <!--设置默认编码集为UTF-8-->
    <constant name="struts.enable.SlashesInActionNames" value="UTF-8"/>

    <!--设置使用开发模式-->
    <constant name="struts.devMode" value="ture"/>

</struts>

  要注意的是,在struts.properties文件能配置的常量都可以在struts.xml文件中用<constant…>元素来配置。

 

(2)在struts.properties文件是一个标准的properties文件,其格式为Key-Value对,即每个key对应一个value,key表示的是Struts2框架中的常量,而value表示的是常量值,具体配置如下:

###设置默认编码集为UTF-8
struts.il8n.encoding=UTF-8

###设置action请求的扩展名为action或者没有扩展名
struts.action.extension=action,

###设置不使用开发模式
struts.devMode=false

###设置不开启动态方法调用
struts.enable.DynamicMethodInvocation=false

  上述代码段中,=号的左边的是key,右边是key对应的value,另外,代码片段中的###表示的是properties文件中的解释信息(注释),用于解释说明。

 

(3)在web.xml文件中通过初始化参数配置常量

  在web.xml文件中配置核心过滤器StrutsPrepareAndExecuteFilter时,通过初始化参数来配置常量。通过<filter>元素的<init-param>子元素指定,每个<init-param>元素配置了一个struts常量。在web.xml文件中通过初始化参数配置常量方式,如下列代码段所示:

    <filter>
        
        <!--指定struts2的核心过滤器-->
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>

        <!--通过init-param元素配置struts2常量,配置默认编码集为UTF-8-->
        <init-param>
            <param-name>struts.il8n.encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        
    </filter>
    
    
    
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

  需要注意的是, <init-param>标签要放到<filter>之中。

  此外,Struts2框架的加载常量有一定的顺序,通常搜索顺序如下:

  • default.properties:该文件在struts2-core-2.3.24.jar文件中的org.apache.struts2包里面;
  • struts-default.xml:该文件保存在struts2-core-2.3.24.jar文件中;
  • struts-plugin.xml:该文件保存在struts-Xxx-2.3.24.jar等Struts2插件JAR包中;
  • struts.xml:该文件是Web应用自己的Struts配置文件Struts2配置文件;
  • struts.properties:该文件是Web应用默认的Struts配置文件;
  • web.xml:该文件是Web应用的配置文件;

 

2.1.3  包配置

 

  Struts2框架的核心组件是Action和拦截器,它使用包来管理Action和拦截器。每个包就是多个Action、多个拦截器、多个拦截器引用的集合。在Struts.xml文件中,package元素定义了一个包配置,每个package元素定义了一个包配置。package常用属性如下表所示:

 

属性 说明
name 必填属性,指定包的名字,此名字是该包被其他包引用的key
namespace 可选属性,该属性定义该包的命名空间
extends

可选属性,指定该包继承自其他包,可以继承其他包的Action定义、

拦截器定义等。属性直常设为“strruts-default”

abstract

可选属性,他指定该包是否是一个抽象包,抽象包不能包含Action

定义。(例如:abstract=“true”—->抽象包)

 

2.1.3  包含配置

 

  Struts2默认只加载struts.xml文件,但一旦通过多个XML文件来配置Action,就必须通过struts.xml文件来包含其他配置文件。结下来示例一段代码来说明;

<struts>

    <!--包含4个配置文件-->
    <!--   不指定路径,默认在src下时的方式  -->
    <include file="struts-shop.xml"/>
    <include file="struts-user.xml"/>
    <include file="struts-shoppingcart.xml"/>
    
    <!--  配置文件在具体包中的方式  -->
    <include file="cn/intcast/action/struts-product.xml"/>

</struts>

 

2.2  Action的配置

 

2.2.1 实现Action控制类

 

  Action作为Struts框架的核心类,实现对用户请求的处理,Action类被称为业务逻辑控制器。一个Action类代表一次请求或调用,每个请求的动作都对应于一个相应的Action类,一个Action类是一个独立的工作单元。也就是说,用户的每次请求动作都对应于一个相应的Action类里面,由这个Action类来进行处理。简而言之,Action就是用来处理一次用户请求的对象。

  实现Action控制有3中方式:

  (1) POJO的实现

  Action可以不继承特殊的类或不实现任何特殊接口,仅仅是一个POJO。POJO全称是Plain Ordinary Java Object(简单的Java对象),只要具有一部分getter/setter方法的类就可以称作为POJO。一般这个POJO类中,要有一个公共的无参构造方法和一个execute()方法。execute方法是Action类的默认请求处理方法,其方法格式如下:

public String execute() throws Exeception {
     return "success";   
}

 execute()方法要求如下:

  • 方法的权限修饰符为public
  • 返回一个字符串,就是指示的下一个页面的Result
  • 方法没有参数

  也就是说满足上述要求的POJO都可以算作是Struts的Action实现,但在实际的开发中,通常会让开发者自己编写Action类实现Action接口或者继承ActionSupport类。

  (2)实现Action接口

  (3)继承ActionSupport类

  (上述两个小部分都是java的简单实现,这篇文章不再赘述)

 

2.2.2 配置Action

 

  Action映射是框架中的基本“工作单元”。Action映射就是将一个请求的URL映射到一个Action类,当一个Actio请求匹配某个Action名称时,框架就使用这个映射来确定如何处理请求。在Struts.xml文件中,通过<action>元素对请求的Action和Action类进行配置。

  <action>元素中共有4个属性,具体说明如下:

属性 说明
name 必填属性,标识Action,指定了Action所处理的请求的URL
class 可选属性,指定Action对应的实现类
method 可选属性,指定请求Action时调用的方法
converter 可选属性,指定类型转换器的类

  需要注意的是,在配置action元素时,如果没有指定class属性直,则其默认直为com.opensymphony.work2.ActionSupport类,该默认类会使用默认的处理方法execute()方法来处理请求,实际上,ActionSupport类中的execute()不会做任何处理,而是直接返回success直。在配置<action>元素时,如果指定了method属性,则该Action可以调用method属性中指定的方法,如果不指定method属性,则Action会调用execute()方法。

  接下来看一个struts.xml文件中配置的action元素,代码片段如下所示:(注意:action的配置在struts.xml的package包平配置的内部)

 <action name="userAction"class="cn.itcast.action.UserAction">
           <result>/success.jsp</result>
 </action>

  <action>类的属性直将在其他地方引用,例如.jsp页面form表单的action属性直;class属性指明了Action的实现类。

 

2.2.3 使用通配符

 

  使用method属性时,由于在Action类中有多个业务逻矩处理方法,在配置Action时,就需要使用多个action元素。在实现同样功能的情况下减轻struts.xml配置文件的负担,借助于通配符映射。

  使用通配符配置时,<package>元素的内容如下所示;

 <package name="User"namespace="/user"extends="struts-default">
      <action name="User_Action_*" class="cn.itcast.action.UserAction" method="(1)">
          <result>/index.jsp</result>
      </action>
 </package> 

  注意对于result也可以采用通配符。

 

2.3  Action访问Servlet API

 

   在struts2中,Action并没有直接和Servlet API进行耦合,也就是说,在Struts2的Action中不能直接访问Servlet API。在实现业务逻辑时,经常要访问Servlet中的对象,如session、request和application等。在struts2中,访问Servlet API有三种方法。

 

2.3.1 通过ActionContest类访问

 

  ActionContext类访问Servlet API的常用方法:

方法声明 功能描述
void put(String key,Object value) 将key-value键值对放入ActionContext中,模拟Servlet API中的HttpServletHttpServletRequest的setAttribute()方法
Object get(String key) 通过参数key来查找当前ActionContext中的直

Map<String,Object> getApplication()

返回一个Aplication级的Map对象

static ActionContext getContext()

获取当前线程的ActionContext对象
Map<String,Object> getParameters() 返回一个包含所有HttpServletRequest参数信息的Map对象
Map<String,Object> getSession() 返回一个Map类型的HttpSession
void setApplication (Map<String,Object>application) 设置Application上下文  
void setSession (Map<String,Object>session) 设置一个Map类型的Session

 

2.3.2 通过特定接口访问

 

  • ServletRequestAware:实现该接口的Action可以直接访问Web应用的HttpServletRequest实例;
  • RequestResponseAware:实现该接口的Action可以直接访问Web应用的HttpServletResponse实例;
  • SessionAware:实现该接口的Action可以直接访问Web应用的ServletContext实例;

 

2.3.3 通过ServletActionContext访问

 

 

  • static HttpServletRequest getRequest():获取Web应用的HttpServletRequest对象;
  • static HttpServletResponse getResponse():获取Web应用的HttpServletResponse对象;
  • static ServletContext getServletContext():获取Web应用中的ServletContext对象;
  • static PageContext getPageContext():获取Web应用中的PageContext对象。

 

2.4 Result结果类型

 

2.4.1 配置Result

 

  在struts.xml文件中进行Result的配置,使用<result>元素来配置Result逻辑视图与无力视图之间的映射,<result>元素可以有name和type属性,但这两种属性都不是必选的;

  • name属性:指定逻辑视图的名称,默认值是success;
  • type属性:指定返回的视图资源类型,不同的类型代表不同的结果输出,默认值是dispatcher。

  在Struts,xml文件中的<result>元素配置代码如下:

    <action name="logiAction"class="cn.itcast.action.loginAction">
        <result name="success"type="dispatcher">
            <param name="location">/success.jsp</param>
        </result>
    </action>

  注意:<param>子元素的name属性有两个直,分别如下:

  • location:指定该逻辑视图所对应的实际视图资源;
  • parse:指定在逻辑视图资源名称中是否可以使用OGNL表达式。默认值为true,表示可以使用,如果设为false,则表示不支持。

上述配置可以简化为:

 <action name="logiAction" class="cn.itcast.action.loginAction">
        <result>/success.jsp</result>
 </action>

  需要注意的是,在Result中,指定实际资源位置时,可以使用绝对路径,也可以使用相对路径。绝对路径以斜杠(/)开头,例如<result>/success.jsp<result>,相当于当前Web应用程序的上下文路径;相对路径不以斜杠开头,例如<result>success.jsp</result>,相当于当前执行的Action路径。

 

2.4.2 预定义的结果类型

 

  在struts2中,当框架调用Action对请求进行处理后,就要向用户呈现一个结果视图。在struts2中,预定义了多种ResultType,其实就是定义了多种展示结果技术。

  每个<result-type>元素都是一种视图技术或者跳转方式的封装,其中的name属性指出在<result>元素中如何引用这种视图技术或者跳转方式,对应着<result>元素的type属性。struts2中预定义的ResultTyoe如下所示;

属性 说明
chain 用来处理Action链,被跳转的Action中仍能获取送上个页面的直、如request信息
dispatcher 用来转向页面,通常处理JSP,默认的结果类型
freemarker 用来整合FreeWorker模板结果类型
httpheader 用来处理特殊的HTTP行为结果类型
redirect 重定向到一个URL,被跳转的页面中丢失传递的信息
redirectAction 重定向到一个Action,跳转的页面中丢失传递的信息
stream 向浏览器发送InputStream对象,通常用来处理文件下载,还可用于Ajax数据
velocity 用来整合Velocity木板结果类型
xslt 用来整合XML/ XSLT结果类型
plainText 显示原始文件内容,例如文件源代码
postback  使得当前请求参数以表单形式提交

  上表列举了Struts2中预定义的全部11种结果类型,其中dispatcher是默认的结果类型,主要用来与JSP整合。在这全部11中结果类型中,dispatcher和redirect是比较常用的结果集。

  需要注意的是,dispatcher结果类型是将请求转发到JSP视图资源,而redirect类型是将请求重定向到JSP视图资源。他们之间最大的差别就是一个是请求转发、一个是请求重定向。如果重定向了请求,那么将丢失所有参数,其中包括Action的处理结果。

 

2.4.3 dispatcher结果类型

 

  dispatcher结果类型用来表示“转发”到指定的结果资源,他是struts2的默认结果类型。dispatcher结果类型实现的是org.apache. struts2. dispatcher.ServletDispatcherResult,该类有location和parse两个属性,可以通过struts.xml配置文件中的result元素的param资源书来设置,代码如下:

<result name="success"type="dispatcher">
           <param name="location">/success.jsp</param>
           <param name="parse">true</param>
</result> 

  上述代码中,location参数用于指定Action执行完毕后要转向的目标;parse参数是一个布尔型的直,默认是true,表示解析location参数中的OGNL表达式子,如果是faulse,则不解析。

 

2.4.4 redirect结果类型

 

  redirect结果类型用来重定向到指定的结果资源,该资源可以是JSP文件,也可以是Action类。使用redirect结果类型时,系统将调用HttpServletResponse的sendRedirect()方法将请求重定向到指定的URL。

  redirect结果类型实现的类是org.apache.struts2.dispatcher.ServletRedirectResult。在使用redirect时,用户要完成一次和服务器之间的交互,浏览器需要发送两次请求,请求过程如下图所示:

 

  使用redirect结果类型的工作过程如下:

  1. 浏览器发送一个请求,Struts框架调用对应的Action实例对请求进行处理;
  2. Action返回“success”结果字符串,Struts2框架根据这个结果选择对应的结果类型,这里使用的是redirect结果类型;
  3. ServletRedirectResult在内部使用HttpServletResponse的sendRedirect()方法将请求重新定向到目标资源;
  4. 浏览器重新发送一个针对目标资源的新请求;
  5. 目标资源作为响应呈现给用户。

  代码:

    <action name="logiAction" class="cn.itcast.action.loginAction">
        <result name="success"type="redirect">/success.jsp</result>
        <result name="error"type="dispatcher">/error.jsp</result>
    </action>

  上述配置中,<result>元素使用redirect类型,表示当Action处理请求后重新生成一个请求。

 

 

  PS:什么是请求转发和请求重定向,具体区别是什么?(明天补上,同学越去喝酒了,哈哈哈哈哈)

 

版权声明:本文为Mairr原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:http://www.cnblogs.com/Mairr/p/7871538.html