六 Struts 拦截器、OGNL表达式
一.OGNL表达式
1.概念:是表达式语言,专门用来访问对象取值用的。
2.对比EL表达式使用场景:
A.EL主要用在web的jsp页面取值
B.OGNL适用以下环境
1.java程序中
2.在页面使用(配合struts2的标签)
3.在配置文件中使用
二.OGNL在java程序中的使用:
Ognl.getValue("表达式", 根对象);
三.OGNL在页面中取值
1.在stuts2中后台存取数据有两种情况
A.action的属性(值栈)
B.在值栈中的数据表达式不加#,在各种作用域中(request,session)的数据表达式前面加#加范围 例如:#request.mess
C.页面取值需要通过标签来访问
四.在配置文件中传递参数
<result name="ognl2" type="redirect">ognl2?id=${id}</result>
注意:配置文件中ognl表达式只能获取action中的属性
五. struts2的拦截器
1.struts2的拦截器实现原理是动态代理,是对action中的方法进行拦截,配置灵活。和web的过滤器实现原理不一样。
2.实现步骤:
a.编写一个java类,实现Intercepter接口或者继承AbstractIntercepter类
重写里面的intercept方法
b.在struts,xml中注册拦截器
<interceptors>
<interceptor name="myInter" class="com.intercepter.MyIntercepter"></interceptor>
</interceptors>
c.在action中引用拦截器:
<action name="inter" class="com.action.IntercepterAction">
<result name="success">/jsp/stulist.jsp</result>
<interceptor-ref name="myInter"></interceptor-ref>
</action>
3.拦截器栈:是可以将多个拦截器配置成一个栈,一起引用 见案例
4.注意:如果action引用了自定义拦截器,那么默认的拦截器栈将会失效,需要手动添加引用
5.默认拦截器引用:
<default-interceptor-ref name="myStack"></default-interceptor-ref>
注意:默认拦截器引用只能配置一个,会和系统默认拦截器冲突,解决办法,新建一个拦截器栈,在栈中加入默认拦截器和自定义拦截器
拦截器实例:
CRUDAction.java
package com.action;
public class CRUDAction {
String id;//xml中用OGNL表达式${id}获取该属性值
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String add(){
System.out.println("新增");
return "success";
}
public String del(){
System.out.println("删除");
id = "123";
return "del";
}
public String update(){
System.out.println("修改");
return "success";
}
public String query(){
System.out.println("查询");
System.out.println(id);
return "success";
}
}
IsLoginIntercepter.java
package com.intercepter; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.pojo.User; public class IsLoginIntercepter extends AbstractInterceptor{ @Override
public String intercept(ActionInvocation arg0) throws Exception {
//1 获取session
User user = (User) ActionContext.getContext().getSession().get("user");
if(user!=null&&user.getUsername()!=null&&!"".equals(user.getUsername())){
//已经登录
return arg0.invoke();//相当于放行
}
return "error_login";
} }
LogIntercepter.java
package com.intercepter; import java.util.Date; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class LogIntercepter extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation arg0) throws Exception {
//在执行action之前插入业务
ActionContext.getContext().getSession().get("user");//通过sessio拿当前登录用户
System.out.println("记录操作员是XXXX");
String result = arg0.invoke();//这里就是被拦截的action中的方法
System.out.println("记录操作员是XXXX,已经成功完成操作,当前时间是:"+new Date());
return result;//将结果引向目的
} }
Struts-gy.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="my" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="log" class="com.intercepter.LogIntercepter"></interceptor>
<interceptor name="islogin" class="com.intercepter.IsLoginIntercepter"></interceptor>
<interceptor-stack name="mystack">
<interceptor-ref name="log"></interceptor-ref>
<interceptor-ref name="islogin"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="islogin"></default-interceptor-ref>
<global-results>
<result name="error_login">/jsp/login.jsp</result>
</global-results>
<action name="login" class="com.action.LoginAction">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="log"></interceptor-ref>
<result name="success" type="redirect">/jsp/CRUD.jsp</result>
</action>
<action name="crud_add" class="com.action.CRUDAction" method="add">
<result name="success">/jsp/success.jsp</result>
</action>
<action name="crud_del" class="com.action.CRUDAction" method="del">
<result name="success">/jsp/success.jsp</result>
</action>
<action name="crud" class="com.action.CRUDAction">
<!-- <interceptor-ref name="log"></interceptor-ref> -->
<result name="success">/jsp/success.jsp</result>
<result name="del" type="redirect">/crud!query?id=${id}</result>
</action>
</package>
</struts>
Struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<include file="struts-gy.xml"></include>
</struts>
最后:

六 Struts 拦截器、OGNL表达式的更多相关文章
- [置顶] 使用struts拦截器+注解实现网络安全要求中的日志审计功能
J2EE项目中出于安全的角度考虑,用户行为审计日志功能必不可少,通过本demo可以实现如下功能: 1.项目中记录审计日志的方法. 2.struts拦截器的基本配置和使用方法. 3.struts拦截器中 ...
- 利用Struts拦截器限制上传图片的格式和大小
在这之前 Struts的一个核心功能就是大量的拦截器,既然是框架,那么自然也就贴心地为我们准备好了各种常用的功能,比如这里即将讨论的如何限制上传图片的格式和大小.那么既然是使用Struts已经写好的拦 ...
- Struts拦截器设置完的值为什么在页面取不到
Struts拦截器设置完的值为什么在页面取不到. ActionContext ac = (ActionContext) invocation.getInvocationContext(); ac.pu ...
- struts 拦截器 Interceptor
拦截器是AOP中的概念,它本身是一段代码,可以通过定义“织入点”,来指定拦截器的代码在“织入点”的前后执行,从而起到拦截的作用.正如上面 Struts2的Reference中讲述的,Stru ...
- struts拦截器实现原理
图1: 上1来源于Struts2官方站点,是Struts 2 的整体结构. 一个请求在Struts2框架中的处理大概分为以下几个步骤 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请 ...
- struts拦截器
struts中的拦截器相当于过滤器的作用 一在struts.xml中配置拦截器或拦截器栈 <interceptors>!--全部的拦截器 <interceptor name=&quo ...
- Struts标签、Ognl表达式、el表达式、jstl标签库这四者之间的关系和各自作用
我之前虽然会用,但是一直分不清彼此之间有什么区别,所以查找资料,将它们进行整合区分,加深了解, 一 介绍 1.Struts2的作用 Struts2标签库提供了主题.模板支持,极大地简化了视图页面的 ...
- (转)Struts 拦截器
一.拦截器是怎么实现: 实际上它是用Java中的动态代理来实现的 二.拦截器在Struts2中的应用 对于Struts2框架而言,正是大量的内置拦截器完成了大部分操作.像params拦截器将http请 ...
- struts——拦截器
什么是拦截器 拦截器(Interceptor)是Struts 2的一个强有力的工具,有许多功能都是构建于它之上,如国际化(前两篇博客介绍过).转换器,校验等. 拦截器是动态拦截Action调用的对象. ...
随机推荐
- 从0到1打造自己的VOIP网络电话系统(基于FreePBX)
从0到1打造自己的网络电话系统 最近流量卡越来越便宜了,看看自己手里的"坑不死老用户"的联通卡,顿时感觉到深深的恶意,但是iPhone没有双卡功能,所以只好自己动手打造一个网络电话 ...
- 【RL-TCPnet网络教程】第40章 RL-TCPnet之TFTP客户端(精简版)
第40章 RL-TCPnet之TFTP客户端 本章节为大家讲解RL-TCPnet的TFTP客户端应用,学习本章节前,务必要优先学习第38章的TFTP基础知识.有了这些基础知识之后,再搞本章节 ...
- Java Main参数解析(Args4j)
最近实现一个工具,Main函数会有很多参数,而且参数类型不同,为了统一解析,网上找到三方工具类Args4j,轻松搞定. 代码实例如下: 定义解析类: import java.io.File impor ...
- String、StringBuffer和StringBuilder类的区别
Java提供了String.StringBuffer和StringBuilder类来封装字符串,并提供了一系列操作字符串对象的方法. 它们的相同点是都用来封装字符串:都实现了CharSequence接 ...
- 网络协议 20 - RPC 协议(上)- 基于XML的SOAP协议
[前五篇]系列文章传送门: 网络协议 15 - P2P 协议:小种子大学问 网络协议 16 - DNS 协议:网络世界的地址簿 网络协议 17 - HTTPDNS:私人定制的 DNS 服务 网络协议 ...
- FragmentTabHostTopDemo【FragmentTabHost固定宽度且居中】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 使用FragmentTabHost实现顶部选项卡(居中且宽度非全屏)展现. 备注:该Demo主要是演示FragmentTabHost ...
- springboot~Mongodb的集成与使用
说说springboot与大叔lind.ddd的渊源 Mongodb在Lind.DDD中被二次封装过(大叔的.net和.net core),将它当成是一种仓储来使用,对于开发人员来说只公开curd几个 ...
- SLAM+语音机器人DIY系列:(二)ROS入门——2.ROS系统整体架构
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- MySQL高可用复制管理工具 —— Orchestrator使用
背景 在上一篇「MySQL高可用复制管理工具 —— Orchestrator介绍」中大致介绍了Orchestrator的功能.配置和部署,当然最详细的说明可以查阅官方文档.本文开始对Orchestra ...
- LVS负载均衡原理
一.LVS基本原理概述 LB集群的实现,LB即负载均衡集群 硬件:F5 BIG-IP,Citrix NetScaler,A10,Array,Redware 软件:Lvs,nginx,haproxy,a ...