zoukankan      html  css  js  c++  java
  • 六 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>

    最后:

  • 相关阅读:
    使用AChartEngine画图,项目总结
    Windows系统安装实验报告
    Linux系统安装实验报告
    vm虚拟机详细安装步骤
    L3-010. 是否完全二叉搜索树
    第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛
    L2-021. 点赞狂魔
    L2-020. 功夫传人
    L2-019. 悄悄关注
    L2-017. 人以群分
  • 原文地址:https://www.cnblogs.com/wlxslsb/p/10785340.html
Copyright © 2011-2022 走看看