Struts2总结-2
跟struts2基础总结-1 一样图片太多了,懒得链接图片,可以下载我的资源中的文档看。
http://download.youkuaiyun.com/download/tanghui20/9731751
3-1 jsp从域中获取值:
之前我么介绍了从jsp 中封装数据到action,今天我们介绍怎么从action 获取数据到jsp
这个功能需要使用到ognl 和 值栈
3-1-1理解ognl
就是一中表达式,类似于EL表达式
3-1-2理解值栈
在struts2里面提供值栈,类似于域对象,值栈应用在struts2的action里面,在值栈中可以存值和取值
3-1-3 值栈存储位置
值栈存在于每个action对象里面
(1)servlet和action区别
* servlet默认在第一次访问时候创建,创建一次,单实例对象
* action在访问时候,每次访问action时候都会创建一个action对象,多实例对象
(2)每次访问action时候,都会创建action对象,
在每个action对象里面存在一个值栈对象
3-1-4值栈使用范围
(1)值栈使用在action范围的
3-1-5获取值栈对象
(1)使用ActionContext类,得到ActionContext对象
(2)使用ActionContext对象里面的方法得到值栈对象
3-1-6 值栈内部结构
1、root是list集合
一般操作数据指的都是操作root里面数据
2、context是map集合
存储对象引用,
Context里面key名称是固定的,request、session、application、parameters、attr
3-2向值栈放数据 -- 在jsp中从值栈中获取数据
有三种方式:
第一种方式: 获取值栈对象,调用值栈对象里面的set方法
Jsp中获取:
第二种方式:获取值栈对象,调用值栈对象里面的push方法
Jsp中获取:
第三种方式:在action成员变量位置定义变量,生成这个变量的get方法 (常用)
3-2-1 向值栈放字符串(方法3)
3-2-2 jsp中获取字符串
3-2-3 向值栈放对象(方法3)
1 实现步骤
第一步 声明对象变量,生成变量的get方法
第二步 在action具体的方法中向对象里面设置值
3-2-4 jsp中获取对象
3-2-5 向值栈集合(list)(方法3)
第一步 在action声明list集合变量,生成变量的get方法
第二步 在具体执行的方法里面,向值栈的list集合中设置值
3-2-6 jsp中获取集合(list) <3种方法>
1 第一种方式
2 第二种方式
(1)在struts2标签里面有遍历操作,类似于jstl的foreach标签
<s:iterator>
3 第三种方式
3-2-7 向值栈集合(map)(方法3)
第一步 在action声明map集合变量,生成变量的get方法
第二步 在具体执行的方法里面,向值栈的map集合中设置值
3-2-8 jsp中获取集合(map)
3-2-9 获取值栈数据 set/push 方法存放的数据(了解)
4-1拦截器 interceptor
4-1-1拦截器的原理
1、分为两个部分
a) aop思想:面向切面(方面)编程
aop底层实现动态代理(增强类的方法)
在不修改源代码的基础上扩展新的功能
b) 责任链模式: 类似于过滤链
过滤链:一个请求,可以有多个过滤器进行过滤,每个过滤器只有做放行,才能到下一个过滤器
2、拦截器执行过程
(1)拦截器在action对象创建之后,action里面的方法执行之前执行
(2)在struts2里面执行默认的拦截器,在action不需要调用拦截器的方法,使 用配置方式执行--- aop思想
(3)执行很多的拦截器,比如有三个拦截器,首先执行拦截器1,做放行,执行 拦截器2,之后放行,执行拦截器3,放行之后,之后action里面的方法
4-1-2拦截器与过滤器的区别
1 过滤器:理论上可以过滤任意内容,过滤jsp、过滤html、过滤图片路径、过滤servlet、过滤action
2 拦截器:可以拦截的内容,拦截器只能拦截action
3 action和servlet区别
(1)action每次访问创建新的对象,多实例
(2)servlet第一次访问时候创建,创建一次,单实例
4-1-3自定义拦截器
第一种 创建类,继承AbstractInterceptor
第二种 创建类,继承 MethodFilterInterceptor (常用)
案例:自定义登录拦截器
需求:在系统中,有很多action的超链接,实现只有登录之后,才可以点击这些action的超链接,如果不是登录状态,点击action超链接,回到登录页面
实现:
1、登录的时候在session 中保存一个指定的值。
2、自定义拦截器中判断session 中是否有这个指定的值,
a) 有这个指定值放行
b) 没有这个指定的值
3、struts2.xml中配置自定义的拦截器
3-1 声明拦截器
3-2 在具体的action标签中使用声明的拦截器
3-3 当我们使用了自定义的拦截器struts2中默认的拦截器就不执行了需要我们手动配置
3-4 配置action 类中的那些方法不经过拦截器
4-1-4 struts2的标签
常用的标签
(1)<s:debug>标签:查看值栈存储结构
(2)<s:property value=”ognl表达式”>: 在jsp中获取值栈数据
(3)<s:iterator>标签: 遍历得到值栈集合内容
4-1-5 struts2 的表单标签
1 html表单标签
(1)form : 属性action、method、enctype
(2)输入项
- input标签输入项
- text:普通输入项
- password:密码输入项
- radio:单选
- checkbox:复选
- hidden:隐藏项
- file:文件上传项
- submit:提交
- button:普通按钮
- image:图片提交
- reset:重置
* select:下拉框
* textarea:文本域
2 在struts2里面提供表单标签,html中表单标签,在struts2里面大部分都对应的标签
属性总结:
Name: 在action 类中获取时使用的参数
Label: 在页面中显示
Value/list: 传给action 类的值
3 注意问题:
使用struts2的s:form标签时候,里面的action属性值,不能写完全路径
如果上面写法,出错
写法,直接在action属性里面写action名称
4-2 国际化资源
4-2-1国际化资源文件定义
a) 全局资源文件
在源码的某个目录创建资源文件,然后在struts.xml里面配置路径:
<constant name="struts.custom.i18n.resources" value="messages/msg" />
资源文件名必须以”_语言_国家代码”结尾
b) package资源文件
Package资源可以放到任意一个包下面,
但是名字是固定的就是package_zn_CN.properties。
c) action资源文件
Action资源文件和action放到同一目录,
且必须和action的名字对应命名 ,Action类名_zn_CN.properties。
资源文件里面的内容是以键值对的形式
login_success=欢迎登陆
msg_action=..............
msg_package=.........
以上三类资源文件的搜索顺序为:
Action资源 -> Package资源 -> 全局资源
4-2-2使用资源
前提:Action继承ActionSupport类
1. Action里面,使用getText方法
2. Jsp页面里面,使用<s:text>标签
3. 配置文件里面,使用${}和ognl表达式
4-2-3切换语言
两种方式:
1. 在struts.xml里面定义locale常量 (注意浏览器的缓存)
<constant name="struts.locale" value="en_US" />
2. 在请求url后面加上request_locale参数 (i18nIntercepter)
http://localhost/struts_demo/login.action?request_locale=en_US
4-3表单校验器
4-3-1 定义一个Action 类使用模型封装方法获取表单数据
4-3-2自定义一个校验器
文件命名:Action类名-Action标签名字-validation.xml
4-3-3 struts2.xml配置文件中配置校验器出错是的跳转页面
校验器的执行流程:
4-3-4针对表单进行校验
4-3-5使用国际化资源消息