• struts2笔记4


    1.自定义struts拦截器

      应用场景:如果用户登陆后可以访问action中的所有方法,如果用户没有登陆不允许访问action中的方法,并且提示“你没有操作权限”

      1)两个页面,一个用户登陆user.jsp,一个用户退出quit.jsp,都放在WebRoot目录下

    <%@ page language="java" import="java.util.*"    pageEncoding="UTF-8"%>
    <%
        request.getSession().setAttribute("user","itcast");
    %>
    用户已经登陆
    <%@ page language="java" import="java.util.*"    pageEncoding="UTF-8"%>
    <%
        request.getSession().removeAttribute("user");
    %>
    用户已经退出登陆

      2)新建一个Action用于访问

    package cn.itcast.action;
    
    
    import java.util.Date;
    
    import javax.xml.registry.infomodel.PersonName;
    
    public class HelloWorld {
        private String message;
        
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    
    
        public String execute() throws Exception{
            message="execute";
            return "SUCCESS";
        }
        
        public String add() throws Exception{
            message="add";
            return "SUCCESS";
        }
    
    }

      3)新建拦截器,当session中user有值的时候说明已经登陆,就调用invocation.invoke(),如果没有值,说明没有登陆,返回SUCCESS视图,将提示信息放在request范围

    package cn.itcast.action;
    
    
    import java.util.Date;
    
    import javax.xml.registry.infomodel.PersonName;
    
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.interceptor.Interceptor;
    import com.sun.corba.se.impl.protocol.giopmsgheaders.Message;
    import com.sun.xml.internal.bind.v2.model.core.ID;
    
    public class PermissionInterception  implements Interceptor{
        
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
    
        public void destroy() {
            // TODO Auto-generated method stub
            
        }
    
        public void init() {
            // TODO Auto-generated method stub
            
        }
    
        public String intercept(ActionInvocation invocation) throws Exception {
            Object user = ActionContext.getContext().getSession().get("user");
            if(user!=null){
                return invocation.invoke();
            }
            ActionContext.getContext().put("message", "没有权限");
            return "SUCCESS"; //返回到message视图
        }
    
    }

      4)配置struts.xml,重点是配置拦截器栈,并引用

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
    <struts>
        <constant name="struts.action.extension" value="do,action"></constant>
        <package name="itcast" namespace="/test" extends="struts-default" >
            <interceptors>
                <interceptor name="permission" class="cn.itcast.action.PermissionInterception"></interceptor>
                <interceptor-stack name="permissionStack">
                    <interceptor-ref name="defaultStack"></interceptor-ref>
                    <interceptor-ref name="permission"></interceptor-ref>
                </interceptor-stack>
            </interceptors>
            <global-results>
                <result name="SUCCESS">/WEB-INF/pages/message.jsp</result>
            </global-results>
            <action name="list_*" class="cn.itcast.action.HelloWorld" method="{1}">
                <interceptor-ref name="permissionStack"></interceptor-ref>
            </action>
         </package>
    </struts>

     2.对Action中所有方法进行输入校验

      1)新建index页面

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    
    <%@ taglib  uri="/struts-tags" prefix="s" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        
        <title>My JSP 'index.jsp' starting page</title>
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        
      </head>
      
      <body>
          <s:fielderror/>
        <form action="${pageContext.request.contextPath }/test/list_save.action" method="post">
            用户名:<input type="text" name="username"><br/>
            手机号:<input type="text" name="mobile"><br/>
            <input type="submit" value="提交"/>
        </form>
      </body>
    </html>
      这里引用struts的标签<s:fielderror/><%@ taglib uri="/struts-tags" prefix="s" %>,来显示校验的信息
      2)struts.xml,配置input页面用来显示fielderror里的校验提示信息
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
    <struts>
        <package name="itcast" namespace="/test" extends="struts-default" >
            <action name="list_*" class="cn.itcast.action.Hello" method="{1}">
                <result name="message">/WEB-INF/pages/message.jsp</result>
                <result name="input">/index.jsp</result>
            </action>
         </package>
    </struts>

      3)Action的代码,action继承ActionSupport,重写validate()方法,validate()方法会校验所有与execute方法签名相同的方法,当某个数据校验失败时,我们应该调用addFieldError();方法往系统的fielderror添加校验失败信息,如果系统的fielderror包含失败信息,struts2会将请求转发到名为input的result。在input视图中通过<s:fielderror/>来显示失败信息

    package cn.itcast.action;
    
    import java.util.regex.Pattern;
    
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    
    public class Hello extends ActionSupport{
        private String username;
        private String mobile;
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getMobile() {
            return mobile;
        }
        public void setMobile(String mobile) {
            this.mobile = mobile;
        }
        public String save(){
            ActionContext.getContext().put("message", "保存成功");
            return "message";
        }
        public String update(){
            ActionContext.getContext().put("message", "更新成功");
            return "message";
        }
        @Override
        public void validate() {
            if(this.username==null||"".equals(this.username.trim())){
                this.addFieldError("username", "用户名不能为空");
            }
            if(this.mobile==null||"".equals(this.mobile.trim())){
                this.addFieldError("mobile", "手机号不能为空");
            }else {
                if(!Pattern.compile("^1[358]\d{9}$").matcher(this.mobile).matches()){
                    this.addFieldError("mobile", "手机号格式不正确");
                }
            }
        }
        
    }

      4)当请求的action改为update时也能进行校验,说明validate方法可以对action中的所有方法进行校验

    3.对Action中指定方法进行校验,就是将validate方法名称改为validateXxx如:validateSave(S大写),就是对save方法进行校验

    4.输入校验的流程

      1)类型转换器对请求参数执行类型转换,并把转换后的值赋给Action中的属性

      2)如果在执行类型转换的过程中出现异常,系统会将异常信息保存在ActionContext,conversionError拦截器将异常信息添加到fieldErrors里,不管类型转换是否出现异常都会进入第三步

      3)系统通过反射技术先调用action中的validateXxx方法,Xxx为方法名

      4)再调用action中的validate方法

      5)经过上面4步,如果系统的fieldErrors中存在错误信息,系统系统将请求转发至input视图。如果系统中不存在任何错误信息,系统将执行action中的处理方法

  • 相关阅读:
    数据库的字符集和校对集
    登录和退出Mysql
    启动mysql服务器
    Numpy
    如何用navicat导入数据?
    MySQL不能连接本地数据库10061
    使用navicat连接Mysql8.0出现2059错误
    leetcode笔记11 First Unique Character in a String
    leetcode笔记10 Intersection of Two Arrays(求交集)
    leetcode笔记9 Move Zeroes
  • 原文地址:https://www.cnblogs.com/fanglove/p/2875300.html
Copyright © 2020-2023  润新知