Struts2&基本配置&使用

Struts2概述

    Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。
执行流程图
1:
![完整执行流程][1]
2:
![执行流程][2]

struts下载地址官网

官网: https://struts.apache.org/
## Struts2的配置文件的加载顺序 ##
查看StrutsPrepareAndExecuteFilter:(核心过滤器)两个功能 :预处理 和 执行 
在预处理功能中 init 方法中会有加载配置文件的代码:
dispatcher.init();
init_DefaultProperties(); // [1] ---- 加载org.apache.struts.default.properties.配置的是struts2的所有常量.
init_TraditionalXmlConfigurations(); // [2] ---- 加载struts-default.xml、struts-plugin.xml、struts.xml
init_LegacyStrutsProperties(); // [3] ---- 加载用户自定义struts.properties
init_CustomConfigurationProviders(); // [5] ---- 加载Struts2定义Bean.
init_FilterInitParameters() ; // [6] ---- 加载web.xml
init_AliasStandardObjects() ; // [7] ---- 用户自定义Bean


结论:
default.properties
struts-default.xml
struts-plugin.xml
struts.xml ---- 配置Action以及常量.(******)
struts.properties ---- 配置常量
web.xml ---- 配置核心过滤器及常量.
***** 后配置的常量 会 覆盖先配置的常量.

Action的配置

<package>的配置:
* package:包. 不是java中说那个包. Struts2中的包 管理<action>.(随意定义用来给其他package继承)
* 属性:
* name :包名.包名是唯一的不能重复的.
* extends :继承.继承struts-default.(struts-default包中定义结果类型和拦截器.)
* namespace :名称空间.与<action>标签中的name属性共同决定Action的访问路径.
* 写法:
* namespace有名称: namespace=”/aa”
* namespace只是一个/: namespance=”/”
* namespace默认的: namespace没写.
    
* abstract :抽象的.用于使其他的包可以继承的.
* <package name="struts-default" abstract="true"> . 所以可以继承struts-default.


<action>的配置:
* action:配置Action类的访问路径.
* 属性:
* name :名称.与<package>中的namespace属性共同决定访问路径.
* class :类的全路径.要执行的Action类的全路径.
* method :方法.用来指定Action中执行那个方法的方法名.(默认的值execute)


局部结果页面:
    <action name="requestActionDemo2" class="cn.itcast.struts2.demo4.RequestActionDemo2">
        <result name="success">/demo3/demo3.jsp</result>
    </action>
全局结果页面:
    <global-results>
<result name="success">/demo3/demo2.jsp</result>
    </global-results>


<result>的配置:
result :配置Action执行后的页面跳转.
 属性:
name :逻辑视图名称.(不是真实的视图,为真实的视图起了一个别名,在Action中返回这个字符串的别名,从而找到具体页面.)


type :跳转的类型 取值:
        * dispatcher :默认值,转发. 转发到一个JSP页面
        * redirect :重定向. 重定向到一个JSP页面
        * chain :转发,转发到一个Action.
        * redirectAction :重定向到另一个Action


默认的Action:
<!-- 配置默认的Action:Action的访问路径不存在的时候,执行一个默认的Action -->
<default-action-ref name="strutsDemo1"/>




Action的默认处理类:
<!-- Action的默认处理类:Action的访问路径配置正确了,但是没有配置class属性. -->
<default-class-ref class="com.opensymphony.xwork2.ActionSupport"/>


<include file="cn/itcast/struts2/demo1/struts_demo1.xml"/>  整合其他的struts的配置文件.


Action访问三种配置

<!--演示Action的访问-->
    <package name="customer" namespace="/" extends="struts-default">
        <!--传统方式(每有一个请求路径,需要配置一条action)-->
        <!--配置save方法-->
        <action name="save" class="com.demo.action2.CustomerAction" method="save"></action>
        <!--配置delete方法-->
        <action name="delete" class="com.demo.action2.CustomerAction" method="delete"></action>


        <!--
            通配符的方式
            name : * 号是通配符(以此为例子linkman_save,linkman_后面的save字符就是*)
            class : action文件路径
            method : {1}表示第一个 * ({2}表示第二个 * ,以此类推,以此为例linkman_save,那么method值就是save)
        -->
        <action name="linkman_*" class="com.demo.action2.LinkmanAction" method="{1}"></action>


        <!--配置动态的方法访问 method属性不需要编写了-->
        <action name="user" class="com.demo.action2.UserAction">


        </action>


    </package>


Action类编写

【Action的是一个POJO的类】
Action是简单的Java对象没有实现任何借口 和 继承任何类.
public class ActionDemo1 {


public String execute(){
System.out.println("ActionDemo1执行了...");
return null;
}
}
【Action类实现一个Action的接口】
public class ActionDemo2 implements Action{


@Override
public String execute() throws Exception {
System.out.println("ActionDemo2执行了...");
return null;
}


}


Action接口中提供了5个已经定义好的视图名称:
    * SUCCESS :success,代表成功.
    * NONE :none,代表页面不跳转
    * ERROR :error,代表跳转到错误页面.
    * INPUT :input,数据校验的时候跳转的路径.
    * LOGIN :login,用来跳转到登录页面.
【Action类继承ActionSupport类】
public class ActionDemo3 extends ActionSupport{


@Override
public String execute() throws Exception {
System.out.println("ActionDemo3执行了...");
return NONE;
}
}


ActionSupport中提供了一些功能,比如数据校验,比如国际化… 如果Action继承了ActionSupport,那么Action就会有这些功能.
原文地址:https://www.cnblogs.com/sybk/p/10004735.html