zoukankan      html  css  js  c++  java
  • JavaWeb框架_Struts2_(二)----->Struts2的核心配置

    2.  Struts2的核心配置

    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.4  包含配置

      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:什么是请求转发和请求重定向,具体区别是什么?(参考,http://blog.csdn.net/meiyalei/article/details/2129120)

    解释一:


      一句话,转发是服务器行为,重定向是客户端行为。看两个动作的工作流程:

      转发过程:客户浏览器发送http请求----->web服务器接受此请求----->调用内部的一个方法在容器内部完成请求处理和转发动作----->将目标资源发送给客户。在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。

      重定向过程:客户浏览器发送http请求----->web服务器接受后发送302状态码响应及对应新的location给客户浏览器----->客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址----->服务器根据此请求寻找资源并发送给客户。在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。

     

    解释二:

      请求重定向其实是两次request, 第一次,客户端request,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候浏览器可以看到地址变了,而且浏览器的历史回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。
      请求转发,是服务器内部把对一个request/response的处理权,移交给另外一个 对于客户端而言,它只知道自己最早请求的那个A,而不知道中间的B,甚至C、D。 传输的信息不会丢失。

     

    解释三:

    假设你去办理某个执照,

    请求重定向:你先去了A局,A局的人说:“这个事情不归我们管,去B局”,然后,你就从A退了出来,自己乘车去了B局。

    请求转发:你先去了A局,A局看了以后,知道这个事情其实应该B局来管,但是他没有把你退回来,而是让你坐一会儿,自己到后面办公室联系了B的人,让他们办好后,送了过来。

  • 相关阅读:
    AG-Admin微服务框架入门
    使用node-webkit包装浏览器
    转 使用Docker部署 spring-boot maven应用
    转 docker的下载与安装
    Maven基本理解
    物联网垂直态势分析
    纯技术商业价值
    OpenLayers 3 入门教程
    转 从红帽、GitHub和Docker看开源商业模式的进阶
    关于 Total Commander 的标签(Tab)功能【转】
  • 原文地址:https://www.cnblogs.com/Mairr/p/7871538.html
Copyright © 2011-2022 走看看