一.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>
最后: