六 Struts2 拦截器、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>

最后:

原文地址:https://www.cnblogs.com/wlxslsb/p/10785340.html