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;

                   }

         }

原文地址:https://www.cnblogs.com/lulu638/p/4321147.html