一、Struts2概述
1.1 Struts2
MVC框架是指Model、View、COntroller
Struts2是一个MVC框架,主要作用VIEW和Controller层.
View可以改造,因为struts提供了自己的一套标签库。
strut2提供了核心控制器,以及用户自定义的业务控制器,解决了控器制问题。
1.2 框架
框架是一个半成品,剩余的工作,要和根据实际的项目业务情况,进行填充。
Struts1不是Struts2的前身,Strut2的前身是webwork,webwork的核心是xwork,struts2保留了struts1的开发流程
常用的MVC框架:
Struts2 Struts1 webWork springMVC JSF
二、Struts2入门
1、导入jar包
2、编写strut2编写web.xml中的核心控制器(前端控制器)
实际上是一个过滤器 **StrutsPrepareAndExecuteFilter**
<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是基于filter开发
struts1是基于Servlet开发
3、编写业务控制器(action类),类似于Servlet
创建类以名称Action结尾,继承ActionSupport类
里面有普通方法,返回逻辑视图,字符串
4、配置第三步的action类。在struts.xml
配置文件名必须是struts.xml,放在类路径下
<package name="default" namespace="/" extends="struts-default">
<!--
name表示浏览器的访问路径
class表示Action类的全限定了类名
method 表示访问时调用的方法名
-->
<action name="index1" class="cn.lx.action.HelloAction" method="">
<!--
result表示逻辑视图与物理视图的映射关系
name表示方法返回的逻辑视图名
值为物理视图名,也即jsp路径
默认使用转发的方式进行页面跳转
-->
<result name="hello">/index.jsp</result>
</action>
</package>
5、编写jsp测试页面
三、Struts2分析运行过程
![一张图片](https://img-blog.csdn.net/20160611223451152)
四、Struts2源码分析执行过程
五、Struts2配置文件
配置文件的加载过程
truts2 配置文件 由核心控制器加载 StrutsPrepareAndExecuteFilter (预处理,执行过滤)
init_DefaultProperties(); // [1] ---------- org/apache/struts2/default.properties
init_TraditionalXmlConfigurations(); // [2] --- struts-default.xml,struts-plugin.xml,struts.xml
init_LegacyStrutsProperties(); // [3] --- 自定义struts.properties
init_CustomConfigurationProviders(); // [5] ----- 自定义配置提供
init_FilterInitParameters() ; // [6] ----- web.xml
init_AliasStandardObjects() ; // [7] ---- Bean加载
结论 :
default.properties 该文件保存在 struts2-core-2.3.7.jar 中 org.apache.struts2包里面 (常量的默认值)
struts-default.xml 该文件保存在 struts2-core-2.3.7.jar (Bean、拦截器、结果类型 )
struts-plugin.xml 该文件保存在struts-Xxx-2.3.7.jar (在插件包中存在 ,配置插件信息 )
struts.xml 该文件是web应用默认的struts配置文件 (实际开发中,通常写struts.xml ) ******************************
struts.properties 该文件是Struts的默认配置文件 (配置常量 )
web.xml 该文件是Web应用的配置文件 (配置常量 )
* 后加载文件中struts2 常量会覆盖之前加载文件 常量内容
1、程序员需要掌握的是struts.xml文件的配置
六、Struts2常量
这些常量可以在default.properties文件中找到
1、struts.i18n.encoding=UTF-8
可以解决的是post乱码问题,解决不了get请求乱码问题
2、struts.objectFactory = spring
让spring来管理 struts2的javabean对象
3、struts.multipart.saveDir= 文件保存目录
struts.multipart.maxSize=2097152 文件大小
文件上传使用
4、struts.action.extension=action,,
解释说明了为什么struts默认处理的是action或者空白结尾的请求
可以进行修改
5、struts.devMode = false
开发者模式,false表示不是开发者模式,true表示开发者模式
作用是设置为开发者模式时,实现配置文件的自动加载,也即对配置文件的修改不用重启服务器可以自动加载
6、struts.enable.DynamicMethodInvocation = false
动态方法调用,false表示不允许动态方法调用,true表示允许动态方法的调用。
七、Action类的编写方式
1、Action是多实例的,每次请求会创建一个实例,无线程冲突问题。
测试方法:在Action构造方法中加上输出语句,运行时,发现每次请求都会调用构造方法。证明了Action是多实例的,无并发安全问题。
7.1 编写Action类的三种方法
1、继承ActionSupport类
2、实现Action接口 ActionSupport也实现了Action接口
ActionSupport类实现了Action接口,同时可以更加方便的实现数据校验,且实现了本地化国家化
Action接口中有五个常量,一个默认方法
五个常量用于表示返回值,逻辑视图
SUCCESS、NONE、ERROR、INPUT、LOGIN
默认方法excute
3、非侵入设计:可以做到与struts2本身的API解耦合,还可以与ServletAPI解耦合
直接创建一个普通类不继承和实现任何类或接口 ,好处不需要服务器就可以实现代码测试
4、Action类的方法规定
必须是共有的,返回值是String或void
必须是无参的
八、Struts2数据封装的方式
1、ServletActionContext 中有getRequest()方法返回Request对象,其他操作和Servlet一样
该方法为直接访问ServletAPI,进行数据封装
2、与Servlet API 解耦
ActionContext ac = ActionContext.getContext();
Map<String,Object> map = ac.getParameters() 返回的是Map<String,Object[]>
直接操作其中的数据就可以了
3、在Action类中设置成员变量,提供set方法,访问该action类时会自动给变量赋值
底层是通过拦截器和值栈实现的
4、使用POJO了类来实现数据封装
Action类创建私有成员变量 ,private Customer customer;
生成setter/gettter方法
改造jsp页面,将jsap页面的表单的name属性改成 customer.custName customer.custID
3和4方法为属性驱动,通过获取属性来封装数据
5、模型驱动封装数据
Action类实现ModelDrivven<T>接口,重现getModel(){}方法
Action类中创建私有的Customer对象,并进行初始化,getModel中返回的是Customer对象
使用模型驱动jsp页面不需要改动,还使用custName()就可以
模型驱动具有局限性,使用模型驱动只能封装一个对象,如果一个表单中有多个对象的数据,只能一个对象使用模型驱动封装数据,别的对象采用属性驱动封装数据。
九、配置文件的详解
9.1 配置文件的详解
<package name="default" namespace="/" extends="struts-default">
<!--
name表示浏览器的访问路径
class表示Action类的全限定了类名
method 表示访问时调用的方法名
-->
<action name="CustomerAction_addUI" class="cn.lx.web.action.CustomerAction" method="addUI">
<!--
result表示逻辑视图与物理视图的映射关系
name表示方法返回的逻辑视图名
对应的值为物理视图名,也即jsp路径
-->
<result name="success">jsp/customer/add.jsp</result>
</action>
</package>
1、package主要作用是封装Action类的,便于管理Action类
name:表示包的名称,包名是唯一的。
namespace:命名空间 例如 namespace="/customer"
一个Actoion 的访问路径是 namespace+action中配置的name属性的值
使用namespace可以将配置文件进行分离,使用 <include file=""></include>进行组装,和jsp组合不同
extends表示该包继承的父包,一般都会继承struts-default包,可以通过这个继承父包中的很多配置信息
2、action
name表示浏览器的访问路径
class表示Action类的全限定了类名 默认值为ActionSupport
由struts-default.xml配置文件中的 <default-class-ref class=“”>节点决定 ,可以自定义默认类
method 表示访问时调用的方法名name表示浏览器的访问路径 默认为excute
result表示逻辑视图与物理视图的映射关系
name表示方法返回的逻辑视图名 默认为success
type代表页面跳转的类型
默认为dispatcher 转发
redirct 重定向
redictAction 重定向到Action 类
对应的值为物理视图名,也即jsp路径
9.2 配置文件的详解
使用通配符进行配置
<action name="CustomerAction_*" class="cn.lx.web.action.CustomerAction" method="{1}" >
<result name="save">/jsp/success.jsp</result>
<result name="addUI" >/jsp/customer/add.jsp</result>
</action>
method="{1}" {1}可以获取到第一个*的值
这种配法,可以使用一个Action只用配置一个action节点