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的变化很小。
结论:Struts2是一个基于MVC设计模式的Web应用框架,它的前身是WebWork框架,与Struts1区别就是技术上没有关系。相比Struts1来说,struts2具有更加先进的架构以及思想。
Struts2使用优势:自动封装参数、参数校验、结果的处理(转发|重定向)、国际化、显示等待页面、表单的防止重复提交。
WebWork介绍
WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的J2EE Web框架。WebWork目前最新版本是2.2.2,现在的WebWork2.x前身是Rickard Oberg开发的WebWork,但现在WebWork已经被拆分成了Xwork1和WebWork2两个项目。实现Interceptor接口的拦截器,代码部分在intercept方法中实现。在intercept方法中,可以直接返回一个Result字符串,这样整个执行直接“短路”,这时Action的execute方法也不会执行(一般很少会这么用)。所以,一般都会在这个方法里调用参数对象invocation的invoke方法,并返回这个方法执行的结果。这样会持续执行后面的拦截器方法以及Action的execute方法等。
结论:WebWork基于Xwork。
Struts2快速入门
导入jar包
配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--Struts2的核心filter-->
<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>
</web-app>
编写Action类
public class HelloAction {
public String helloAction(){
System.out.println("测试Action");
return "success";
}
}
配置struts.xml(src根目录下)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- package:将Action配置封装.就是可以在Package中配置很多action.
name属性: 给包起个名字,起到标识作用.随便起.不能其他包名重复.
namespace属性:给action的访问路径中定义一个命名空间
extends属性: 继承一个 指定包
abstract属性:包是否为抽象的; 标识性属性.标识该包不能独立运行.专门被继承
-->
<package name="hello" namespace="/" extends="struts-default">
<!-- action元素:配置action类
name属性: 决定了Action访问资源名.
class属性: action的完整类名
method属性: 指定调用Action中的哪个方法来处理请求
-->
<action name="helloAtion" class="com.itheima.action.HelloAction" method="helloAction">
<!-- result元素:结果配置
name属性: 标识结果处理的名称.与action方法的返回值对应.
type属性: 指定调用哪一个result类来处理结果,默认使用转发.
标签体:填写页面的相对路径
-->
<result name="success">/hello.jsp</result>
</action>
</package>
</struts>
测试
Struts2访问流程
Struts2配置详解
1、Filter(入口 ---StrutsPrepareAndExecuteFilter)
Prepare:准备 对应init方法
Execute:执行 对应doFilter
PS:filter与生命周期相关方法:init destroy doFilter
准备工作(挖源码):
--->StrutsPrepareAndExecuteFilter
--->public void init(FilterConfig filterConfig)
--->dispatcher = init.initDispatcher(config);
--->dispatcher.init();
--->
init_DefaultProperties(); // [1] 加载org/apache/struts2/default.properties文件
init_TraditionalXmlConfigurations(); // [2] 加载struts-default.xml,struts-plugin.xml,struts.xml
init_LegacyStrutsProperties(); // [3] 加载src下的struts.properties文件
init_FilterInitParameters() ; // [6] 加载Struts2的核心Filter分初始化参数
总结:
服务器启动--->创建Filter--->初始化方法init执行---->加载一些列的配置文件
default.properties struts2内置
struts-default.xml struts2内置
struts-plugin.xml struts2内置
struts.xml 自定义(重点)
struts.properties 自定义
Filter的init 自定义
注意:如果加载的内容有冲突的话,后加载的内容可以覆盖先加载的内容
2、default.properties(配置struts2默认常量)
struts.i18n.encoding=UTF-8:设置struts2的编码是UTF-8 post不用解决乱码
struts.multipart.maxSize=2097152:限制上传文件大小 2M
struts.action.extension=action,,:访问Action时的扩展名
struts.devMode = false: 设置开发模式 默认不开启开发模式 设置为true 修改struts2的内容后不需要重启服务器
3、struts-default.xml(常量)
struts-default包
结果跳转类型
interceptors拦截器
4、struts-plugin.xml
5、struts.xml(重点)------位置:类加载路径(src)下
<?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>
<!-- 1、常量配置 覆盖default.properties内容-->
<constant name="struts.devMode" value="true"></constant>
<constant name="struts.action.extension" value="action,abc,,"></constant>
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<!-- 2、包的配置
name: 包的名称
namespace:命名空间 与Action的name一起组成虚拟访问路径
namespace="/" <action name="quick">
http://localhost:8080/Struts2Day01/quick
namespace="/abc" <action name="quick">
http://localhost:8080/Struts2Day01/abc/quick
extends:该包继承哪一个包
abstract: 定义该包是一个抽象包 被别的包继承的 (了解) 默认false
作用:方便管理Action
-->
<package name="test" namespace="/" extends="struts-default">
<!-- 2.1 action的配置
name: action的虚拟名称,与namespace一起组成虚拟访问路径
class: Action全限定名
method: 指定访问该Action中的哪个方法 默认execute方法
2.2 结果视图配置result
name: 逻辑视图名 与Action的方法的返回值匹配
-->
<!-- <action name="quick_save" class="com.itheima.action.QuickAction" method="save">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
<action name="quick_update" class="com.itheima.action.QuickAction" method="update">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action> -->
<!-- 2.3 action配置优化 (通配符方式) (重点)
访问虚拟名称中可以使用*代表任意字符串
method可以使用{n}代表第n个通配符*
例如:
name="quick_*" method="{1}"
访问quick_save 去访问save方法
name="quick_*_* method="{1}{2}"
访问quick_save_User 访问saveUser方法
name="quick_*_* method="{1}-{2}"
访问quick_save_User 访问save-User方法
name="quick_*_* method="{1}_{2}"
访问quick_save_User 访问save_User方法
-->
<!-- <action name="quick_*" class="com.itheima.action.QuickAction" method="{1}">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action> -->
<!-- 2.3 action配置优化 (动态方法调用) (了解)
action在配置时 不需要指定方法是谁method
但是需要对访问的 路径进行特殊的规定
http://localhost:8080/Struts2Day01/虚拟资源名称!方法名称.action
http://localhost:8080/Struts2Day01/quick!save.action
使用动态方法调用,必须通过配置开启动态方法调用
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
-->
<!-- <action name="quick" class="com.itheima.action.QuickAction">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action> -->
<action name="quick_*" class="com.itheima.action.QuickAction" method="{1}">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
<!-- 3、包含:该文件包含其他struts的xml文件(分模块开发) -->
<!-- <include file="struts-customer.xml"></include>
<include file="struts-linkman.xml"></include> -->
</struts>
6、struts.properties
src自定义properties文件 该文件作用配置常量(等同于struts.xml中的constant)
7、Filter的init(只能配置常量)
<filter>
<filter-name>Struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>struts.action.extension</param-name>
<param-value>action,,</param-value>
</init-param>
</filter>
struts2的常用API
Action定义的三种方式:
1、POJO充当Action (了解)
2、Action类实现Action接口 (了解)
Action接口提供5个常量
SUCCESS:成功
ERROR:报错
NONE:不进行视图跳转 相当于null
INPUT:跳转到输入视图
LOGIN:跳转登录视图
3、Action类继承ActionSupport类(重点)
ActionSupport功能强大