[TOC]
知识详解
简介
概念
运行web层,处理访问服务器的请求,代理Servlet
struct2与struct1区别:struct2前身是webwork框架
优势
自动封装参数、参数校验、结果的处理(转发(重定向))、国际化、显式等待页面、表单防止重复提交
搭建
- 导包
- 书写action类
- 书写src/structs.xml核心配置文件
1 |
|
- 将structs2核心过滤器配置到web.xml
1 | <filter> |
Struts构造原理图
配置详解
struts.xml配置
1 | <struts> |
struts2常量配置
default.properties文件所在位置:
Libraries
Web App Libraries
struts2-core-2.5.20.jar
static
default.properties
常量的三种修改方式:
方式先后也是文件加载顺序
struts.xml中,在\
根下,配置(常用): 1
2
3
4<struts>
<constant name="" value="">
...
</struts>src下新建struts.properties,在文件里填写修改的键值对
web.xml中,filter前进行配置
1
2
3
4
5<context-param>
<param-name> </param-name>
<param-value> </param-value>
</context-param>
<filter>......
常量
1 | <!-- i18n:国际化,使用配置文件配置多个语言,可解决post提交乱码问题--> |
struts2配置进阶
动态方法调用
方式一:(了解)
调用方法时,方法前加 ‘ !’
主配置文件,struts下配置:
1 | <!-- 配置动态方法调用是否开启的常量,默认是false --> |
- 次配置
1 | <struts> |
方式二:
次配置
1 | <struts> |
默认配置(了解)
1 | <package name="dynamic" namespace="/dynamic" extends="struts-default"> |
action类创建方式
action类:public,返回String,可抛异常
1、创建一个类,可以是POJO(普通类,不需要继承任何父类或实现接口),使struts2代码侵入性更低
2、实现Action接口,
1)里面有execute方法,提供Action方法的规范
2)Action接口预置了一些字符串,可在返回时使用
3、继承一个类,ActionSupport(重点)
帮助实现了Action、Validateable、ValidationAwre、TextProvider、LocaleProvider
结果跳转方式
转发(默认 )
重定向
转发到Action
1 | <result name="success" type="chain"> |
重定向到Action
1 | <result name="success" type="rediretAction"> |
访问ServletAPI方式
ActionContext:数据中心,可获得原生request(HttpServletRequest)、原生response(HttpServletResponse)、原生ServletContext、request域(Map)、session域(Map)、application域(Map)、params(Map)、attr域(Map,三个域合一)、ValueStack、、、
生命周期:每次请求都会创建一个与请求对应的ActionContext对象,请求处理完域销毁,与当前线程绑定
三种方式本质都是从ActionContext获得
通过actionContext
1 | public String hello() { |
通过ServletActionContext
不推荐
1 | //获得actionAPI方式2 |
实现接口Aware
1 | Public class Demo entends ActioSUpport implments ServletRequestAware{ |
获得参数
扩展
- Struts MVC
Filter:Ctroller
Action:Module
Result:View
- Action生命周期:每次请求到来时,都会创建一个新的Action实例,不会产生并发现象,线程安全,可使用成员变量来接受参数
属性驱动获得参数
Action准备与参数键同名属性
可自动转换八大基本类型及其包装类和Date(支持特定字符串类型,例:yyyy-MM-dd)
1 | //获得参数 |
1 | <form action="${pageContext.request.contextPath }/Demo8Action"> |
对象驱动
Action准备与参数键同名属性 xxx.yyy
1 | public class Demo8Action extends ActionSupport{ |
1 | <form action="${pageContext.request.contextPath }/Demo8Action"> |
模型驱动
实现ModelDrivern接口,实现getModel方法,返回需要封装参数的对象
1 | public class Demo8Action extends ActionSupport implements ModelDriven<Customer>{ |
1 | <form action="${pageContext.request.contextPath }/Demo8Action"> |
集合类型封装获得参数:
1 | <form action="${pageContext.request.contextPath }/Demo8Action"> |
注:封装集合类型参数在前端可直接使用,使用时,map需先给出key
表达式
OGNL表达式
OGNL:对象视图导航语言,例:$(user.addr.name)这种写法就成为对象视图导航
OGNL不仅仅可视图导航,还支持比EL表达式更加丰富的功能
准备工作
OGNL从OGNLContext对象取值(复习:EL取值:11大内置对象)
OGNLContext对象分为ROOT和Context两部分:
ROOT:可放置任何对象
Context: 只存放Map
基本语法
取值
ROOT取值:expression直接写要取值的属性名
Context取值:expression写:#key.属性
1 | public class demo1 { |
赋值
ROOT:属性=值
Context:#key.属性=值
1 | //赋值 |
调用方法
1 | Ognl.getValue("setName('jerry')", context, oc.getRoot()); |
创建List和Map对象
1 | //创建list对象 |
OGNL与struts2结合
OGNlContext–>ValueStack值栈
ROOT:栈,栈中放置当前访问的Action对象
Context:ActionContext(数据中心)
结合体现:
参数接收
struts2的参数交给OGNL引擎处理
1 | //将参数压入栈 |
配置文件
${ognl表达式}
1 | <result name="success" type="redirectAction"> |
struts2标签
扩展:源码流程
request.getAttribute()查找顺序:
- 原生request域
- ValueStack的栈(Root)
- ValueStack的Context部分(ActionContext)
拦截器的调用:递归调用
defaultActionInvocation调用interceptor.intercept(),interceptor调用defaultActionInvocation.invoke()
拦截器
准备工作:用户登录
1 | public class UserAction extends ActionSupport implements ModelDriven<Customer>{ |
1 | public class UserService { |
1 | <package name="crm" namespace="/" extends="struts-default"> |
1 | <!--密码错误在新页面提示--> |
自定义拦截器
拦截器生命周期:随项目的启动创建,随项目的关闭而销毁
拦截器的创建
方式一:实现接口Interceptor
方式二:继承AbstractInterceptor(该继承抽象类空实现了Interceptor)
方式三:继承MethodFilterInterceptor,功能:定制拦截器拦截的方法,可定制需要拦截或不需要拦截的方法
1 | //拦截器:创建方式一 |
拦截器配置
拦截方法指定
不拦截和需要拦截的方法不能同时指定
1 | <package> |
定义全局结果集
1 | <global-results></global-results> |
标签
(了解)
struts标签分类:
普通标签:
- 控制标签(iterater、if、elseif、else)
- 数据标签(property)
ul标签:
- 表单标签(form、textfield、password、file、checkboxlist、redio…)
- 非表单标签(Actionerror)
普通标签
1 | <!--普通标签--> |
表单标签
1 | <!-- struts表单标签 --> |
非表单标签
1 | //action中的方法加入错误提示信息 |