struts2知识点总结
- 什么是Struts2
Struts2 是一个MVC框架,重点在控制器上
Struts1 + xword=Struts2
背景:在web开发中,不同的功能采用不同的Servlet,造成维护和管理的不便;
struts2通过过滤器,将不同的操作引导到不同的方法执行中去。
- Struts2 的配置
- 导入jar包 Struts2的压缩包->apps->struts2-rest-showcase.war->
WEB-INF->lib(导入struts2-rest-plugin-2.5.18.jar可能会报错,所以可以不导入该包)
- 创建action,action是一个类,每次访问action的时候,默认会执行execute()
- 配置action的访问路径,创建Struts2核心配置文件:核心配置文件名称和位置是固定的,名称:struts.xml 位置:/src (普通javaee项目),maven项目在资源文件下
- 引入dtd的约束:struts2-core-2.* ->struts-2.*.dtd中有对应的约束
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
- action的配置(核心标签):
package:
name属性:包的名称,用于区分Action
extends:标准声明,继承struts-default
namespace:命名空间,用于声明访问项目的根路径
action:
name 属性:action 的访问名称
class:action 类的全路径
method:执行action中的指定方法(默认执行execute)
result:
name:和方法的返回值对应
type:指定页面请求的方式
dispatcher(默认,转发)
redirect:重定向(到jsp)
redirect-action:重定向到(action)
chain:访问链
- 在web.xml 中配置过滤器
<filter>
<filter-name>action</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>action</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- struts2的执行过程
关于过滤器:StrutsPrepareAndExecuteFilter
过滤器在服务启动的时候创建,创建过程时执行init方法,并加载配置文件,包括自带的配置文件
default.properties
struts-default.xml
struts-plugin.xml
struts.xml
struts.propersties
web.xml
前三个是struts2 的标准内部配置文件,无法修改,后三个可以,我们的配置重点在后面三个文件中;启动加载有顺序;struts2 可以配置常量,后三个文件都可以,但后面声明的会覆盖之前的常量
- 在struts2中配置修改常量
在struts.xml中修改(常用)
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
在src下创建struts.properties,并在其中修改(较少用)
在web.xml中创建(少用)
在struts2中,通过表单向action提交数据中含有中文时,框架会帮我们解决编码的问题,不需要额外处理
- struts2的分模块开发
使用include标签
<include file="com/ehome/action/hello.xml"></include>
- action的三种编写方式
- 声明一个普通的action类,不继承也不实现任何接口
- 创建类,实现Action接口
- 创建类,继承ActionSupport(主要)
- 访问action的方法(重要)
- 使用action标签的method属性,通过设置,指定要执行的action
- 使用通配符,在action标签中,用*来设置name属性
但struts2 2.5需要在package中配置
<global-allowed-methods>regex:.*</global-allowed-methods>
- 动态访问方式(了解)
在action方法中存在返回值,如果有返回值则必须是String,也可以没有返回值,指定execute方法返回值为void,或者返回NONE,在result标签中就不需要配置
- 结果页面配置
全局结果页面:
如果有多个action,它们的返回值相同、配置的页面也相同
<!--全局结果配置,局部优先级更高-->
<global-results>
<result name="success">/hello.jsp</result>
</global-results>
注:注意标签的顺序 <global-results> 要在<global-allowed-methods>regex:.*</global-allowed-methods> 之前,拦截器在最前面
局部结构界面:
<action name="form_*" class="com.xh.ehome.control.FromAction" method="{1}">
<result name="context">/context.jsp</result>
</action>
- 在action中获取表单提交的顺序
- 使用ActionContext获取(非重点)
- 使用ServletActionContext(重要)
- 使用接口注入方式(少用)
核心: 实现ServletRequestAware接口
实现接口:
重写setServletRequest方法,一旦被调用,就可以获取request对象
把该对象赋值给Action自己定义的request对象(传递引用)
4、在action中操作域对象
request、session、servletContext 三种作用域的传值
核心:使用ServletActionContext
在jsp中通过域对象获取数据
- Struts2 提供获取表单数据的方式(将获取的表单数据进行封装)
4.1 使用request分别获取属性,并调用bean方法(原始)
4.2属性封装:在action中声明表单项对应的字段,并指定bean方法即可
4.3 模型驱动封装(可以直接把值封装到对象中,重点)
核心:
action实现ModelDriven接口,并重写getModel方法
在action中声明实体类对象并实例化
在getModel方法中返回该实体对象,完成
注意:不能同时使用属性封装和模型驱动封装,如果都用,只会执行模型驱动封装(定义的属性将得不到值)
4.4 表达式封装(非重点)
核心:
把表单数据封装到实体类对象中,只需创建对象不需实例化,
为该对象声明get和set
在表单输入项中写表达式: user.username
表达式封装和模型驱动封装对比:都可以把数据封装到实体类对象中去
但,模型驱动封装只能封装到一个实体类对象中,而表达式封装可以封装到多个不同的对象中
4.5表单数据封装到List/Map 中(和表达式封装类似)
List的封装
Map的封装