Struts2系列文章推荐: |
---|
👉 Struts2框架(一):入门xml配置及action编写 |
👉 Struts2框架(二):封装方法&其他介绍&注入方式详解 |
👉 Struts2框架(三):OGNL表达式与值栈 |
👉 待更新 |
1、上一章内容回顾
OGNL表达式
OGNL的概述
OGNL:对象图导航语言,是一门功能强大的表达式语言。
OGNL的功能
调用对象的方法
调用对象的静态方法
表达式串联
访问ActionContext和OgnlContext数据
OGNL独立的表达式:
Java环境下入门
Struts2环境下入门
值栈
值栈的概述
ValueStack:是一个接口,实现类OgnlValueStack。是数据的中转站,贯穿了整个Action,有一个Action的实例,就会创建一个ValueStack对象。
值栈的内部结构
Root :CompoundRoot,就是一个ArrayList。
Context :OgnlContext,就是一个Map。
ActionContext和值栈关系
ActionContext获得值栈的引用。
获得值栈
通过ActionContext获取
通过request获取
操作值栈
利用Action本身在栈中的特点,Action中的属性。
手动操作值栈:
获取值栈的数据
OGNL获取:<s:property value=”…”/>
EL获取值栈的数据
底层增强request.getAttribute(“”);
ONGL特殊字符
#号
获取context数据
构建map集合
%号
强制解析OGNL
$号
在配置文件中使用OGNL
2、Struts2的拦截器(*****)
拦截器概述
什么是拦截器
Interceptor:拦截器,起到拦截Action的作用。
Filter:过滤器,过滤从客户端向服务器发送的请求。
Interceptor:拦截器,拦截是客户端对Action的访问。更细粒度化的拦截。(拦截Action中的具体的方法)。
Struts2框架核心的功能都是依赖拦截器实现。
Struts2的执行流程
客户端向服务器发送一个Action的请求,执行核心过滤器(doFilter)方法。在这个方法中,调用executeAction()方法,在这个方法内部调用dispatcher.serviceAction();在这个方法内部创建一个Action代理,最终执行的是Action代理中的execute(),在代理中执行的execute方法中调用ActionInvocation的invoke方法。在这个方法内部递归执行一组拦截器(完成部分功能),如果没有下一个拦截器,就会执行目标Action,根据Action的返回的结果进行页面跳转。
拦截器入门
搭建Struts2的环境
1、创建项目 2、引入lib 3、配置web.xml
编写拦截器类
编写一个类实现Interceptor接口或者继承AbstractInterceptor类
这里最好继承AbstractInterceptor,因为实现接口还要写init等方法,很复杂
这里我写了两个拦截器,一个是Demo1,一个是Demo2
对拦截器进行配置
两种配置方法,一种是直接用拦截器名,一种是用拦截器栈
定义拦截器进行配置
定义一个拦截器栈的方式
运行结果
3、CRM的权限拦截器
实现用户登录的功能
创建表和实体
创建表
CREATE TABLE `sys_user` (
`user_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '用户id',
`user_code` varchar(32) NOT NULL COMMENT '用户账号',
`user_name` varchar(64) NOT NULL COMMENT '用户名称',
`user_password` varchar(32) NOT NULL COMMENT '用户密码',
`user_state` char(1) NOT NULL COMMENT '1:正常,0:暂停',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
创建实体
提交数据到Action
Action->Service->DAO
编写Service
编写Dao
根据结果进行页面跳转
小结
1、写这个案例的时候还是犯了错误,一个就是用属性驱动封装数据的时候,没有在jsp页面上写表达式,导致dao一直查不出来
2、还有一个错误就是hibernate的映射文件,没有配置到对应的数据库,导致一直报错而找不到问题关键所在
实现权限拦截器
编写权限拦截器
配置拦截器
小结
1、这里的权限拦截器编写上,遵循一个:获取session中数据->获得action->判断数据是否为空(根据情况来执行方法)的思路
2、写好拦截器之后要配置好,global-results很关键
4、Struts2的标签库
通用标签库
可在struts2的docs中查看tag-reference.html
判断标签
<s:if>
、<s:elseif>
、<s:else>
<s:iterator>
其他常用的标签
<s:property/>
<s:debug/>
<s:date />
----在页面上进行日期格式化。
UI标签库(方便数据回显)
1、使用UI标签库能够不用自己排版,它有一套自己的样式
2、使用UI标签库能够在用户输入出错的情况下,将其他正确的数据回显。其中,只有密码框需要设置showPassword才会显示。
3、多选框进行显示时,如果是从数据库查询出的数据,则需要切分字符串