zoukankan      html  css  js  c++  java
  • struts2入门

    Struts2

    一.Struts2概述

    1.Strtuts2和struts1简介

    Strtuts2和struts1都是遵循MVC的WEB框架

    Struts2与Servlet的API是低耦合的。

    struts1和WebWork同一时期的,而Struts2是在WebWork这个框架基础上发展起来的,学习Struts2其实就是学习WebWork。

    WebWork提供了很多核心功能:

    l  类型转换;

    l  输入校验;

    l  上传下载;

    l  拦截器;

    l  国际化;

    webwork的包名: com.opensymphony.xwork2

    真正的MVC,如下图,(模型(model)-视图(view)-控制器(controller)的缩写)

    2.Struts2处理流程分析

    在JavaWeb中,页面发出请求,由Servlet来做处理。

    在所有的MVC框架(包括Struts2)中,都会使用“前端控制器”来接收所有的请求,它会完成所有请求中“共性”的部分(你可以把“共性”的部分想象成编码转换之类的操作),然后再由“前端控制器”通过框架配置文件把请求“分发”给“业务控制器”。

    在Struts2中,前端控制器是一个Filter,名为StrutsPrepareAndExecuteFilter。通常它会过滤所有请求,然后完成共性操作,再通过struts.xml文件把请求分发给Action,Action就是Struts2中的业务控制器,等同与JavaWeb中的Servlet。

    前端控制器会接收所有的请求,然后为所有的请求完成共性的部分,再把请求分发给不同的Action对象来处理请求。Action处理的部分是请求中个性的部分!

    前端控制器是怎么找到Action的呢?前端控制器通过请求的URL,去struts.xml配置文件中查找匹配的Action。

    在Struts2中,前端控制器就是一个Filter。我们都知道Filter需要在web.xml文件中进行配置!既然要让前端控制器接收所有请求,那么这个Filter的<url-pattern>就应该是“/*”。

        <filter>

           <filter-name>struts2</filter-name>

            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

        </filter>

        <filter-mapping>

           <filter-name>struts2</filter-name>

           <url-pattern>/*</url-pattern>

        </filter-mapping>

    二.下载并搭建struts2环境

    1.搭建Struts2项目的开发环境

    创建项目,把Struts2所需jar包导入到项目中。

    这里只需要专稿blank.war中的jar包即可。

    创建Struts2的配置文件,在src目录下创建struts.xml文件。

    因为配置文件都需要有一个头,即dtd等信息,所以我们最后去blank.war中找到classes下的struts.xml文件,把内容copy过来,然后再把其中的无用信息删除,只留下根元素<struts>,以及<package>元素。

    2.编写struts.xml配置文件

    前面我们已经讲过了,前端控制器会去完成“共性”的部分,然后通过struts.xml文件中的配置信息找到被请求的Action,然后把请求分发给这个Action来处理“个性”部分。

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

    <!DOCTYPE struts   PUBLIC

        "-//Apache Software   Foundation//DTD Struts Configuration 2.3//EN"

        "http://struts.apache.org/dtds/struts-2.3.dtd">

     

    <struts>

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

           <action name="hello" class="cn.itcast.demo1.action.HelloAction"></action>

        </package>

    </struts>

    在配置文件中,我们在<package>元素中添加一个<action>元素,我们需要指定<action>元素的两个属性:

    l  name:与访问路径对应,在index.jsp中的<a>元素中我们访问的是/hello.action路径,所以在name属性指定的值也要是hello.action,但这里不能带有扩展名,所以name=”hello”;

    l  class:指定用来处理请求的Action类。

    3.编写请求处理类:HelloAction

    HelloAction不需要去继承或实现什么东西,但Struts要求Action必须要有请求处理方法,请求处理方法的格式为:public String execute(),即没有参数,返回值类型为String。

    HelloAction.java

     

    package cn.itcast.demo1.action;
    
     
    
    public class HelloAction {
    
        public String execute() {
    
           System.out.println("Hello Sturts2...");
    
           return "succ";
    
        }
    
    }

    4.指定结果页面

    execute()方法的返回值可以随意给出,这里给出的返回值为“succ”,我们需要在struts.xml文件中把“succ”与返回的结果页面绑定到一起。

    <struts>

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

           <action name="hello" class="cn.itcast.demo1.action.HelloAction">

               <result name="succ">/result.jsp</result>

           </action>

        </package>

    </struts>

    总结:

    l  搭建环境:

    • 导包:struts2安装包appslank.warlib下所有包
    • 部署前端控制器:web.xml中配置过滤器:StrtusPrepareAndExecuteFilter
    • Struts2的配置文件:src下创建struts.xml

    l  请求三步

    • 超链接指向Action:要求请求URL的后缀是.action;
    • Action类的请求处理方法签名:public String execute();
    • struts.xml文件中配置请求url和Action的联系:<action name=”xxx” class=””/>;

    三.Struts2的基本配置

    1. Struts2的基本配置文件

    在学习Struts2时,你会感觉到Struts2的配置文件多的很!但其实真正重要的配置文件没有几个,现在对我们来说,只有一个配置文件很重要,它就是struts.xml。

    下面是Struts2配置文件,以优先级由低到高的顺序给出:

    l  default.properties:这个文件在struts-core.jarorg.apache.struts2default.properties位置,它内部是常量的默认值,我们不会去修改它;

    l  struts-default.xml:这个文件在struts-core.jarstruts-default.xml位置,它内部定义了拦截器、结果类型,以及bean。我们也不会去修改它;

    l  struts-plugin.xml:在安装插件时,插件的jar包中需要带有这个文件,我们也不会去修改它;

    struts.xml:这个文件不是默认存在的,而是需要我们自己在src目录下创建的,它是我们通常要编写的配置文件,最为重要!

    struts.properties:这个文件也不是默认存在的,也是需要在src目录下创建的,这个文件中用来配置常量,但是建议大家还是在strtus.xml文件中配置常量,而不是这个文件中,所以它也使用的比较少;

    web.xml:这个文件大家再熟悉不过了,也可以在这个文件中配置常量,但也不建议在这里去配置。但这个文件中配置的常量优先级最高!

    6个配置文件中前3个是配置自带的,我们不会去修改,后3个中2个是不建议去使用的,所以最为重要的就只有struts.xml文件一个。

    这里需要注意,后加载的文件优先级最高,也就是说在web.xml文件中配置的常量优先级最高。

    2. struts.xml入门

    <struts>
        <!--
        0~N个常量配置
        name: 常量名
        value: 常量值
        -->
        <constant name="struts.devMode"   value="true" />
        <!--
        0~N个package
        name: 包名随便起,但必须是唯一名称
        namespace: 请求URL的前缀,例如当请求路径为/a/b/hello.action时,那么namespace应该为/a/b
        extends:指定父包!通常都是指定struts-default这个父包。父包中定义的东西等同于定义在当前包中。
         -->
        <package name="s1"   namespace="/" extends="struts-default">
             <!--
            默认Action:在找不到请求的Action时,执行的Action。与404的友好页面相同
            name:指定<action>元素的name属性值。
             -->
            <default-action-ref name="error"   />
            <!--
            默认Action处理类:对于<action>元素而言,它的class属性是可选的!
            在没有指定class时,执行的Action类为默认Action处理类。
            例如:<action name="xxx">时,其class默认为ActionSupport
            其实我们不指定<default-class-ref>默认也是ActionSupport,这是因为在
            父包struts-default中已经定义过<default-class-ref>元素了。
             -->
             <default-class-ref class="com.opensymphony.xwork2.ActionSupport"   />
            <!--
            配置Action
            name:Action的配置名称,没有后缀.action。与namespace共同定位请求URL
            class:请求处理Action类。默认值由<default-class-ref>来指定。
            -->
            <action name="hello"   class="cn.itcast.action.HelloAction">
                <!--
                结果处理类
                name:execute()方法返回的字符串匹配。默认值为success
                  内容:物理路径。即真实的页面路径!
                -->
                <result name="success">/demo1/hello.jsp</result>
             </action>
             <action name="error">
                <result>/error.jsp</result>
             </action>
        </package>
    </struts>

    2.1 <package>元素

    首先说一下struts.xml文件根元素是<struts>,在<struts>元素下可以有多个<package>元素,在<package>元素中可以配置多个<action>元素。

    千万不要认为它与Java类中的package cn.itcast有什么关系! <package>只是一个XML元素,与Java类没什么关系。

    <package>中不只是可以<action>,还可以包含拦截器的定义,以及结果类型的定义!

    <package>元素有3个重要的属性:

    l  name:这个名字可以随便起,只要与其它<package>的name不相同即可;

    l  namespace:名称空间!通常该值为“/”,如果希望指定namespace也要以“/”开头。它与<action>的name属性共同决定访问路径。例如namespace的值为/admin,某个<action>的name为hello,那么在浏览器中访问这个Action时就需要使用/admin/hello.action来访问;

    l  extends:指定当前包的父包,用来继承父包中的东西。通常我们会去继承struts-default这个包,因为struts-default中定义了很多拦截器,以及结果类型,我们自定义的<package>就不用再去定义,而是直接继承过来。struts-default包在struts-default.xml文件中定义。

    2.2 <action>元素

    <action>元素最为重要的有两个属性:

    l  name:用来指定当前<action>的名字,它与<package>的namespace来共同决定当前Acton的访问路径;

    l  class:用来指定当前<action>的类型。

    <package namespace=”/” …>

      <action name=”foo” …/>

    <package>

    这个action foo的访问路径为:/foo.action;

    <package namespace=”/admin” …>

      <action name=”foo” …/>

    <package>

    这个action foo的访问路径为:/admin/foo.action

     <package>的namespace的默认值为””,在其它名称空间不存在时,会去””名称空间下去查找Action。

    2.3 <action>默认处理类

    <action>元素的class属性也有默认值:com.opensymphony.xwork2.ActionSupport,也就是说在没有给<action>元素指定class属性时,会执行ActionSupport类的execute()方法。也就是说,ActionSupport就是<action>的默认处理类!!!

    查看ActionSupport源代码中它的execute()方法返回值为”success”,所以这时你需要为<action>元素添加<result name=”success”>子元素!

    <action name=”hello”>

      <result name=”success”>/index.jsp</result>

    </aciton>

    其实每个<package>元素都可以指定一个<default-class-ref class=”…”/>元素,该元素的class指定的就是<action>的class的默认值。因为我们的<package>没有指定<default-class-ref>元素,所以是从父包sturts-default处继承而来,可以查看struts-default.xml文件中的<default-class-ref>元素的class指定的就是com.opensymphony.xwork2.ActionSupport。

    下面代码中,没有为<action>指定class属性值,但因为指定了Action默认值为HelloAction,所以就会访问HelloAction。

    <struts>

        <package name="b"   namespace="/" extends="struts-default">

           <default-class-ref class="cn.itcast.demo1.action.HelloAction"   />

           <action name="hello">

               <result name="succ">/result.jsp</result>

           </action>

        </package>

    </struts>

    我们可以通过<default-action-ref name="">来指定默认的<action>,这样在用户访问不存在的路径时,就会去访问默认<action>。

    默认<action>是用来代替404页面的!

    <struts>

        <package name="b"   namespace="/" extends="struts-default">

            <default-action-ref name="error"></default-action-ref>

           <action name="error">

               <result name="success">/404.jsp</result>

           </action>

        </package>

    </struts>

    注意,默认<action>与<action>默认处理类的区别:

    l  默认<action>:当用户访问一个不存在的路径时,会执行默认<action>;

    l  <action>默认处理类:当<action>没有指定class属性时,执行默认的处理类。

     <result>元素的name属性默认值

    <result>元素的name属性默认值为success,也就是说:

    <result>/index.jsp</result>

    等同于

    <result name=”success”>/index.jsp</result>

    3. struts中存在一些内置常量

    在struts2-core-*.jar的org.apache.struts2的default.properties文件中存在一些内置常量

    常用的内置常量设置

        <!-- 针对post请求参数编码有效 -->

        <constant name="struts.i18n.encoding" value="UTF-8"></constant>

        <!-- 配置需要struts框架处理的uri的扩展名 -->

        <constant name="struts.action.extension" value="do,,action"></constant>

        <!-- 开发模式:打印更多的异常信息。配置文件会自动加载 -->

        <!-- devMode模式是开发模式,开启它则默认开启了struts.i18n.reload、struts.configuration.xml.reload -->

        <constant name="struts.devMode" value="true"></constant>

        <!-- 配置不支持动态方法调用 -->

        <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>

        <!-- 让struts重新加载配置文件,但不会导致web应用重新启动。 -->

        <constant name="struts.configuration.xml.reload" value="false"></constant>

         <!-- 指定每次请求到达,重新加载资源文件 -->

        <constant name="struts.i18n.reload" value="true"/>

        <!-- 表达式直接访问static静态方法的开关 -->

        <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>

        <!-- 配置全局国际化消息资源包,value写资源包的基名,多个资源包之间用逗号,分隔-->

        <constant name="struts.custom.i18n.resources" value="com.itheima.resources.msg"></constant>

        <!-- 更改strutsUI标签的显示样式模板,参考struts2-core-*.jar中的template -->

        <constant name="struts.ui.theme" value="xhtml"></constant>

        <!-- 动作名字里面默认是不允许出现/的,以下常量设置可以出现/ -->

        <constant name="struts.enable.SlashesInActionNames" value="true"></constant>

        <!-- 动作名字里面默认是不允许出现/的,如果有名称空间,除了以上常量,还需要打开这个开关 -->

        <constant name="struts.mapper.alwaysSelectFullNamespace" value="true"></constant> 

     

    常量可以在下面多个文件中进行定义,struts2加载常量的搜索顺序如下,后面的设置可以覆盖前面的设置:

    default.properties文件

    struts-default.xml

    struts-plugin.xml

    struts.xml

    struts.properties(为了与webwork向后兼容而提供)

    web.xml

     

    包含配置(<include>):在struts.xml文件这,使用<include>属性来包含其他配置文件,需要放在<struts>下,<package>外。

    <include file="struts-mobile.xml"></include>

     四.Actoin处理请求

    1        Action的三种书写方式

    我们必须遵守Struts2对Action的要求,Struts2给出三种对Action的书写方法:

    l  无耦合(POJO);

    l  实现Action接口;

    l  继承ActionSupport。

    1.1 无耦合方式(POJO)

    Action可以是一个POJO,即不继承,也不实现类的普通Java类。但是要求Action必须要有一个execute()方法:

    l  访问修饰为public;

    l  返回值为String;

    l  名称为execute;

    l  没有参数的。

    这种方式用的很少,但我们要知道这种方式的存在!

    1.2 实现Action接口

    让我们的Action去实现com.opensymphony.xwork2.Action接口。

    package com.opensymphony.xwork2;

     

    public interface 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";

       

        public String execute() throws   Exception;

    }

    这个类只给出一个方法,即execute()方法,这说明在实现Action接口后,如果没有给出execute()方法就会编译出错。这与第一种方式使用POJO不同,如果在使用POJO时没有给出execute()方法,那是不会编译出错的,而是在运行时会报错,说找不到execute()方法。

    Action接口中还提供了5个字符串常量,这5个常量用来作为execute()方法的返回值。这也是开发中最为常见的5种逻辑视图。

    l  SUCCESS:表示成功;

    l  NONE:不跳转,与return null相同;

    l  ERROR:表示出错,对应的物理视图应该是用来显示错误信息的;

    l  INPUT:表示表单数据的输入有错误,对应的物理视图应该是表单页面;

    l  LOGIN:表示访问了受限资源,需要登录后才能访问,对应的物理视图应该是登录页面。

      其实你不使用这些常量也一样,只要把<result>元素配置好即可。当然,这些Action常量地球人都认识,如果你的逻辑视图名称为a,它对应的物理视图为a.jsp,那么谁知道你是在表示什么啊。

      这种方式同样使用的很少,但我们要知道这种方式的存在!

    1.3 继承ActionSupport类

    这是最后一种编写Action的方式,也是我们最后最为常用的方式。让我们的Action类去继承com.opensymphony.xwork2.ActionSupport类。ActionSupport类实现了Action接口,我们的Action需要去覆盖ActionSupport的execute()方法。

    继承ActionSuppot类的好处:

    l  表单校验;

    l  错误信息的设置;

    l  获取国际化信息。

    2 Action的请求处理方法

    上面讲解了三种Action的书写方式,即Struts2如何找到Action类。下面要讲解的是Struts2如何找到Action中请求处理方法。

    2.1 指定请求处理方法名称

    上面我们已经了解到Action的请求处理方法名称为execute,其实这只是默认的请求处理方法的名称。也就是说Struts2允许我们来指定请求方法名称。这需要在<action>元素的method属性中指定请求处理方法的名称。

    当没有指定<action>元素的method属性时,那么请求处理方法名称为execute()。在指定method属性的值时,那么请求处理方法的名称就是method属性的值。

    但要注意,无论请求处理方法的名称是什么,返回值必须是String,而且不能有任何参数。

      <body>

        <a href="<c:url value='/Order_add.action'/>">添加订单</a><br/>

        <a href="<c:url value='/Order_mod.action'/>">修改订单</a><br/>

        <a href="<c:url value='/Order_del.action'/>">删除订单</a><br/>

      </body>

        <package name="s3"   namespace="/" extends="struts-default">

           <action name="Order_add" class="cn.itcast.test.action.OrderAction"   method="add">

               <result>/index.jsp</result>

           </action>

           <action name="Order_mod" class="cn.itcast.test.action.OrderAction"   method="mod">

               <result>/index.jsp</result>

           </action>

           <action name="Order_del" class="cn.itcast.test.action.OrderAction"   method="del">

               <result>/index.jsp</result>

           </action>

        </package>

    public class OrderAction extends ActionSupport {

        public String add() {

           System.out.println("add()");

           return SUCCESS;

        }

        public String mod() {

           System.out.println("mod()");

           return SUCCESS;

        }

        public String del() {

           System.out.println("del()");

           return SUCCESS;

        }

    }

    2.2 动态方法调用和*通配符

    如果Action中存在多个方法时,在struts.xml文件中可以只配置一个<action>元素,访问路径可以在紧跟action名称的后面增加一个感叹号(!)后接着指定要访问的方法名,这就是动态方法调用,如下:

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

        <action name="act1" class="com.itheima.action.ActionDemo1"></action>

    </package>

    以下地址都可以访问成功:

    http://localhost:8080/day22_04_strutsDI/act1!m1.action

    http://localhost:8080/day22_04_strutsDI/act1!m2.action

    尽量不要使用动态方法调用,因为不安全,会暴露方法。可以采用*通配符的方式进行替代。

     

    在action元素的name属性中可以使用*通配符,它可以匹配除了/以外的多个连续字符,例如:

    <action name="*_*" class="com.itheima.action.{1}Action" method="{2}">

        <result>/{2}{1}.jsp<result>

    </action>

    注意,这种方式需要开启动态请求调用对应的常量,这个常量的默认值可以在default.properties文件中找到:

                           

      也就是说,默认Struts2是开启了动态请求方法调用的。

    五.Action与Servlet API

     Action中3种获取Servlet API方式

    l  ActionContext解耦方式获取Servlet API;

    l  通过感知接口获取Servlet API;

    l  ServletActionContext的静态方法获取Servlet API

    1 ActionContext解耦方式获取Servlet API

    首先需要获取ActionContext对象:ActionContext ac = ActionContext.getContext();

    1. 获取请求参数

    Map<String,Object> params = ac.getParameters();

    其中params中的数据就是请求参数,它等同与request.getParameterMap()。

    需要注意的是,返回的Map中键是字符串,而值其实是String[]类型。下面是获取参数username的值:

    String[] value = (String[])params.get(“username”);

    String username = value[0];

    1. 在request域中存取数据

    ac.put(“aa”, “aa”);//等同与request.setAttribute(“aa”,”aa”)

    String s = (String)ac.get(“aa”);//等同与request.getAttribute(“aa”)

    在页面中可以使用EL表达式来获取这个值:${requestScope.aa}

    1. 在session域中存取数据

    Map<String,Object> sessionMap = ac.getSesson();

    sessionMap.put(“aa”,”aa”);//等同与session.setAttribute(“aa”, “aa”);

    String s = (String)sessionMap.get(“aa”);//等同与session.getAttribute(“aa”)

    在页面中可以使用EL表达式${sessionScope.aa}来获取这个值

    1. 在application域存取数据

    Map<String,Object> appMap = ac.getApplication();

    appMap.put(“aa”,”aa”);//等同与application.setAttribute(“aa”,”aa”);

    String s = (String)appMap.get(“aa”);//等同与application.getAttribute(“aa”)

    在页面中可以使用EL表达式${applicationScope.aa}来获取这个值

      请注意,这种解耦方式只能对三个域对象进行存取数据的操作,如果你想调用request.getContextPath()方法,这是不可能的,也不能application.getRealPath()。如果你不知道使用这些操作,那么使用第一种方式是灰常理想的选择!因为你根本就看不到Servlet API,解耦已经到了最佳境界。

        public String execute() throws Exception   {

           ActionContext ac = ActionContext.getContext();

          

           Map<String,Object> paramMap =   ac.getParameters();

           String username =   ((String[])paramMap.get("username"))[0];

           System.out.println(username);

          

           ac.put("aa", "aa");

           String s = (String) ac.get("aa");

           System.out.println(s);

          

           Map<String,Object> sessionMap =   ac.getSession();

           sessionMap.put("aa", "aa");

           s = (String) sessionMap.get("aa");

           System.out.println(s);

          

           Map<String,Object> appMap = ac.getApplication();

           appMap.put("aa", "aa");

           s = (String) appMap.get("aa");

           System.out.println(s);

           return SUCCESS;

        }

    2 通过感知接口获取Servlet API

    Struts2提供了三个感知接口,Actoin可以去实现它们来获取Servlet API。

    l  ServletContextAware – setServletContext(ServletContext context);

    l  ServletRequestAware – setServletRequest(HttpServletRequest req);

    l  ServletResponseAware – setServletResponse(HttpServletResponse res)。

    当Action实现了感知接口后,Struts2会在创建Action对象后,调用感知方法把Servlet API传递给Action。也就是说,在请求处理方法执行之前,已经把Servlet API传递给了Action,所以在请求处理方法中使用Servlet API是没有问题的。

    public class AwareAction extends ActionSupport

           implements   ServletContextAware,

           ServletRequestAware,   ServletResponseAware {

        private ServletContext context;

        private HttpServletRequest request;

        private HttpServletResponse response;

     

        public void   setServletContext(ServletContext context) {

           this.context = context;

        }

        public void   setServletRequest(HttpServletRequest request) {

           this.request = request;

        }

        public void   setServletResponse(HttpServletResponse response) {

           this.response = response;

        }

    }

      这种方式比较麻烦,所以很少被使用!

    3 ServletActoinContext获取Servlet API

    这种方式比较直接,可以直接通过ServletActionContext类的静态方法获取到Servlet API。当然,这种方式也会与Servlet API耦合在一起。

    HttpServletRequest request = ServletActionContext.getRequest();

    HttpServletResponse response = ServletActionContext.getResponse();

    ServletContext context = ServletActionContext.getServletContext();

      这种方式最为方便。所以也是最为常用的方式,第一种解耦方式也是很好,所以也很常用。

    六.Action返回值与<result>

    1 全局结果和局部结果

    在<action>中可以配置<result>元素,其中在<package>元素的<global-results>元素中也可以配置<result>。其中<action>中的<result>是局部结果,只有当前<action>自己可以使用,而在<global-results>中配置的<result>是全局结果,可以供当前<package>中所有的<action>使用。

        <package name="test"   namespace="/" extends="struts-default">

        <global-results>

            <result name="a">/a.jsp</result>

        </global-results>

           <action name="MyAction1" class="cn.itcast.test.action.MyAction1">

               <result name="success">/my1/index.jsp</result>

           </action>

           <action name="MyAction2" class="cn.itcast.test.action.MyAction2">

               <result name="success">/my2/index.jsp</result>

           </action>

        </package>

       当局部和全局的<result>同名时,局部的<result>优先。

    2 结果类型

    <result>元素的type属性用来指定结果类型!如果没有指定type时,默认为dispatcher,下面介绍4种常用的结果类型:

    l  dispatcher:默认值,表示转发到页面;

    l  chain:表示转发到另一个Action,所以这时<result>元素的内容需要是另一个<action>的名字;

    l  redirect:表示重定向到页面;

    l  redirectAction:表示重定向到另一个Action。

    <result>/index.jsp</result>

    等同于

    <result type=”dispatcher”>/index.jsp</result>

    等同于

    <result type=”dispatcher” name=”success”>/index.jsp</result>

    其实结果类型都是在struts-default.xml文件中定义的。

    <result-types>

    <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>

    <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult"   default="true"/>

    <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>

    <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>

    <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>

    <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>

    <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>

    <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>

    <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>

    <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult"   />

    </result-types>

    七、基于注解的struts2 开发

    1约定  struts2提供默认规则,实现零配置

     1)导入jar包  12个jar  +  struts2-convention-plugin-2.3.7.jar

     2)在web.xml 配置前端控制器

     3)编写页面

     4)插件中 plugin配置文件

     <constant name="struts.convention.package.locators" value="action,actions,struts,struts2"/>

     编写Action类,必须位于 action,actions,struts,struts2 四个包中

     <constant name="struts.convention.action.suffix" value="Action"/>

     以Action结尾

    **** <constant name="struts.convention.result.path" value="/WEB-INF/content/"/> 结果result页面存放位置

     Action被扫描后,如何确定Action的访问路径的 ?

         cn.itcast.struts2.HelloAction  (HelloAction位于直接位于四个扫描包下,namespace是/,Action的name是hello) ---- /hello.action

              cn.itcast.actions.books.BookSearchAction (BookSearchAction 不是直接位于四个扫描包下,namespace是/books, Action的name是book-search)

                       * 访问路径 /books/book-search.action

              cn.itcast.struts.user.UserAction 访问 /user/user.action

              cn.itcast.estore.action.test.LoginAction  访问 /test/login.action

              

      5) 根据常量配置 结果页面 位于 /WEB-INF/content下

             页面命名规则约定: actionName + resultCode + suffix

             例如: cn.itcast.struts.user.UserAction ------ /user/user.action 返回 SUCCESS

                        结果页面 /WEB-INF/content/user/user-success.jsp --- 找不到 /WEB-INF/content/user/user-success.html --- 找不到 /WEB-INF/content/user/user.jsp

    2注解

     注解开发第一步 基于约定的自动扫描

    约定只解决Action访问和结果页面跳转问题

    * 在开发中需要为Action指定拦截器,进行更细节result配置

    * 约定不够灵活,注解的功能 是和 xml配置方式 等价的

    使用 @Action注解配置访问路径  @Result注解 配置结果页面

    <constant name="struts.convention.classes.reload" value="false" /> Action类文件重新自动加载

    @ParentPackage 配置<package> extends 继承哪个包

    @Namespace  配置包名称空间 必须以/开头的命名空间

           例如:

        @Namespace("/employee")

             @ParentPackage("struts-default")

             public class HelloAnn extends ActionSupport {

                       @Actions(value={@Action(value="myAnn1",results=@Result(name="success",location="/02ann.jsp")),

                                         @Action(value="helloAnn1",results=@Result(name="success",location="/02ann.jsp"))   

                       public String add() throws Exception {

                                System.out.println("HelloAnn--------->add()执行了");

                                return SUCCESS;

                       }

             }

  • 相关阅读:
    Can't remove netstandard folder from output path (.net standard)
    website项目的reference问题
    The type exists in both DLLs
    git常用配置
    Map dependencies with code maps
    How to check HTML version of any website
    Bootstrap UI 编辑器
    网上职位要求对照
    Use of implicitly declared global variable
    ResolveUrl in external JavaScript file in asp.net project
  • 原文地址:https://www.cnblogs.com/lulu638/p/4321147.html
Copyright © 2011-2022 走看看