Struts2 输入验证与自定义拦截器

一:输入验证

方法一:验证规则写到了代码中,硬编码
1:对动作类中所有动作方法都进行验证

 @Override
    public void validate() {

        if ("".equals(stu.getUsername().trim())){
            //向map中添加错误
           addFieldError("stu.username","用户名不能为空!");
            //出现错误,会转向 result=input 视图
        }
    }

错误信息提示在对应jsp页面使用Struts2标签库中的<S:fieldError/>

2:对动作类中的部分方法验证
(1)使用注解对该方法跳过验证

 @SkipValidation
    public String findAll(){
        System.out.println("findAll跳过了");
        return null;
    }

(2)只针对于该方法来进行验证:validate+需要验证的方法名

 public void validateXXX() {

        if ("".equals(stu.getUsername().trim())){
            //向map中添加错误
            addFieldError("stu.us0ername","用户名不能为空!");
            //出现错误,会转向 result=input 视图
        }
    }
验证功能都是由validation 拦截器处理的
回显错误信息是由workflow 拦截器处理的

方法二:声明式验证:把验证规则写到配置文件中,更改非常便捷
1:对动作类中所有的动作方法进行验证
在对应动作类所在包中创建: 动作类名+validation.xml 配置文件
这里写图片描述
上述代码复制到你所创建的xml配置文件中

<validators>
    <!--要验证的字段名-->
    <field name="stu.username">

        <!--验证规则(为不为空什么的)-->
        <!--requiredstring:是不是空字符串
            required:是不是 null
        -->
        <field-validator type="requiredstring">
            <!--报错信息-->
            <message>您的用户名信息不能为空!</message>
        </field-validator>
    </field>
</validators>

2:对动作类中指定的动作方法进行验证
只是在创建xml配置文件,文件名变为了:动作类名-动作名-validation.xml

二:Struts2内置声明验证器的使用

这里写图片描述
上面图片指出了内置配置器的所在位置

<validators>
    <!--验证规则-->
   <validator type="regex">
       <!--要验证的字段名-->
       <param name="fieldName">stu.username</param>
       <param name="regexExpression">
           <!--正则表达式-->
       <![CDATA[
          [a-zA-Z0-9]{3,8}
       ]]>

       </param>
       <!--报错信息-->
       <message>您的名字必须由3~8个字母组成</message>
   </validator>

    <field name="stu.password">
        <field-validator type="regex">
            <param name="regexExpression">
                <![CDATA[
                  [a-zA-Z0-9]{3,8}
                ]]>
            </param>
            <message>您的密码必须由3~8个字母或数字组成</message>
        </field-validator>
    </field>


    <field name="stu.gender">
        <field-validator type="required">
            <message>请选择性别</message>
        </field-validator>
    </field>

    <field name="stu.email">
        <field-validator type="email">
            <message>请输入正确的邮箱</message>
        </field-validator>
    </field>

    <field name="stu.grade">
        <field-validator type="int">
            <param name="min">0</param>
            <param name="max">100</param>
            <message>成绩必须在0~100之间</message>
        </field-validator>
    </field>


</validators>

三:自定义拦截器

创建一个继承AbstractInterceptor的类

public class Demo1Interceptor extends AbstractInterceptor {

    /**
     * 返回值:最终目标返回值,就是一个结果逻辑视图
     */

    @Override
    public String intercept(ActionInvocation actionInvocation) throws Exception {
        System.out.println("拦截前");

        //放行
        String value = actionInvocation.invoke();

        System.out.println("拦截后");
        return value;
    }
}

struts.xml

<package name="p1" extends="struts-default">
        <!--声明自定义的拦截器-->
        <interceptors>
            <interceptor name="custom" class="com.lanou.struts.interceptors.Demo1Interceptor"/>
        </interceptors>

        <action name="demo1" class="com.lanou.struts.action.Demo1Action" method="login">
            <!--使用自定义的拦截器-->
            <!-- 一旦使用自定义拦截器,默认的拦截器将失效-->
            <interceptor-ref name="custom"/>
            <result name="success">/success.jsp</result>

        </action>
    </package>

interceptor 中的class就是继承AbstractInterceptor那个类的绝对路径

如果想让自定义的拦截器和默认的拦截器同时生效,就需要定义一个拦截器栈

struts.xml

<package name="stack" extends="struts-default">
        <!-- 声明拦截器 -->
        <interceptors>
            <interceptor name="custom" class="com.lanou.struts.interceptors.Demo1Interceptor"/>

            <!--同时生效多个拦截器-->
            <interceptor-stack name="myDefaultStack">
                <interceptor-ref name="custom"/>
                <!--这是默认拦截器-->
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
        </interceptors>

        <!--更改默认拦截器-->
        <default-interceptor-ref name="myDefaultStack"/>
        <!--一旦更改了默认拦截器就不需要在<action></action>中设置自己定义的拦截器了-->
<!--别的包如果想使用这个拦截栈只需继承这个拦截栈所在包即可-->
    </package>

四:自定义拦截器的具体使用方法

action

public class LoginAction extends ActionSupport implements ServletRequestAware {
     private HttpServletRequest request;



    public String add(){
        System.out.println("add___");
        return null;
    }

    public String upload(){
        System.out.println("upload___");
        return null;
    }

    public String login(){
        //登录成功会存个值,拦截器根据这个值来决定用户进入页面的权限,
        // 如果没登录,就会让你继续登录,登录成功才会访问add和upload
    request.getSession().setAttribute("user","ysl");
        return SUCCESS;
    }


    @Override
    public void setServletRequest(HttpServletRequest httpServletRequest) {
        this.request = httpServletRequest;
    }

    public HttpServletRequest getRequest() {
        return request;
    }

    public void setRequest(HttpServletRequest request) {
        this.request = request;
    }
}

自定义登录拦截器

/**
 * 检查登录的拦截器
 * 如果继承ActionSupport 会拦截action中的所有方法,包括 login
 * 改用 MethodFilterInterceptor,可以设置需要拦截的方法
 *
 */
public class LoginInterceptor extends MethodFilterInterceptor {

    @Override
    protected String doIntercept(ActionInvocation actionInvocation) throws Exception {
        //判断是否登录
        HttpSession session = ServletActionContext.getRequest().getSession();
        Object obj = session.getAttribute("user");


        //没登录,就会拦截,返回login,login会对应登录页面,只有登录成功才不会拦截
        if (obj==null){
            return "login";
        }


        //登录成功就会放行
        String value = actionInvocation.invoke();
        return value;
    }
}

struts.xml

    <package name="login" extends="struts-default">
        <!-- 声明拦截器 -->
        <interceptors>
            <interceptor name="login" class="com.lanou.struts.interceptors.LoginInterceptor">
                <!--除了login其他我都拦截-->
                <param name="excludeMethods">login</param>
            </interceptor>

            <!--同时生效多个拦截器-->
            <interceptor-stack name="myDefaultStack">
                <interceptor-ref name="login"/>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>

        </interceptors>

        <!--更改默认拦截器-->
        <default-interceptor-ref name="myDefaultStack"/>

    </package>



    <package name="p1" extends="login">

        <action name="login" class="com.lanou.struts.action.LoginAction" method="login">
            <result name="success">/success.jsp</result>
        </action>

        <action name="add" class="com.lanou.struts.action.LoginAction" method="add">
            <!--没登录,拦截器会返回login,就进不去只有登录过才能进去的页面,就会让你返回登录页面-->
            <result name="login">/login.jsp</result>
        </action>

        <action name="upload" class="com.lanou.struts.action.LoginAction" method="upload">
            <result name="login">/login.jsp</result>
        </action>

    </package>
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页