Struts2框架之xml声明式表单验证与错误回显

版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_41855420/article/details/102697943

在上一篇博客 Struts2框架之Action中进行表单验证,讲解了如何在Action类中进行表单验证,本篇博客将讲解一下如何使用xml声明式的方法进行表单验证。

1、 \color{red}注意:

使用xml声明式的方法进行表单验证需要导入struts2中的xwork-core的jar包,不过在2.5的版本中将xwork-core与struts2-core的jar包进行了包,无需再次单独导入。
在这里插入图片描述前端JSP中的form表单需要使用struts2中标签库的form表单,否则字段错误信息将无法显示。

2、用户注册Demo

①、项目目录结构

在这里插入图片描述

②、后端类源码

User类

package cn.hestyle.model;

import java.util.Date;

public class User {
    private String username;
    private String password;
    private String email;
    private Date birthday;
    private String hobbies;
    private boolean married;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getHobbies() {
        return hobbies;
    }

    public void setHobbies(String hobbies) {
        this.hobbies = hobbies;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public boolean isMarried() {
        return married;
    }

    public void setMarried(boolean married) {
        this.married = married;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", email='" + email + '\'' +
                ", birthday=" + birthday +
                ", hobbies='" + hobbies + '\'' +
                ", married=" + married +
                '}';
    }
}

UserAction类

package cn.hestyle.web.action;


import cn.hestyle.model.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;


/**
 * 通过实现ModelDriven<User>接口,封装表单信息为User模型
 */
public class UserAction extends ActionSupport implements ModelDriven<User> {
    //user的各个属性必须实现getter、setter方法,并且user需要手动new出来
    private User user = new User();

    /**
     * 接口ModelDriven<User>需要实现的方法
     * @return
     */
    @Override
    public User getModel() {
        return user;
    }

    /**
     * 注册action处理方法
     * @return
     */
    public String register(){
        System.out.println(user);
        return "success";
    }

    /**
     * 欢迎action处理方法
     * @return
     */
    public String welcome(){
        return "welcome";
    }
}
③、前端jsp

index.jsp表单页面

<%--
  Created by IntelliJ IDEA.
  User: hestyle
  Date: 2019/10/20
  Time: 2:35 下午
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8"%>
<%-- 使用struts中的标签需要导入struts-tags --%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>用户注册</title>
</head>
<%-- 设置错误信息为红色(突出样式) --%>
<s:head></s:head>
<body>
    <s:form action="register">
        <s:textfield name="username" label="用户名" requiredLabel="true" requiredPosition="right"/>
        <%-- showPassword的作用是当表单中字段出现问题时,把之前提交的表单回显保留 --%>
        <s:password name="password" label="密码"  showPassword="true" requiredLabel="true" requiredPosition="right"/>
        <s:textfield name="email" label="邮箱"/>
        <s:textfield name="birthday" label="生日"/>
        <%--
            checkboxlist复选框,
            list是复选框的选项,第一个'编码'value(提交到后端action中的值),第二个'编码'是选项名称,后面依次类推
        --%>
        <s:checkboxlist name="hobbies" label="爱好" list="#{'编码':'编码', '撩妹':'撩妹', '加班':'加班'}"/>
        <%--
            radio单选框
            list是复选框的选项,第一个'true'value(提交到后端action中的值),第二个'已婚'是选项名称,后面依次类推
        --%>
        <s:radio name="married" label="婚姻状况" list="#{'true':'已婚', 'false':'未婚'}"/>
        <s:submit value="注册"></s:submit>
    </s:form>
</body>
</html>

success.jsp界面

<%--
  Created by IntelliJ IDEA.
  User: hestyle
  Date: 2019/10/22
  Time: 5:01 下午
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册成功!</title>
</head>
<body>
    注册成功!
</body>
</html>

welcome.jsp页面

<%--
  Created by IntelliJ IDEA.
  User: hestyle
  Date: 2019/10/23
  Time: 9:48 上午
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>xxx主页</title>
</head>
<body>
    欢迎访问!
</body>
</html>
④、配置文件

UserAction类的xml表单检测文件UserAction-validation.xml
放在UserAction类所在的package下
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator Definition 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
    <field name="username">
        <!--    为表单中username字段添加空白validator    -->
        <field-validator type="requiredstring">
            <!--   trim的作用是剔除字符串前后的空格、tab    -->
            <param name="trim">true</param>
            <!--   如果为空,即没通过检测,返回的错误信息    -->
            <message>用户名不能为空</message>
        </field-validator>
        <!--    为表单中username字段添加长度validator    -->
        <field-validator type="stringlength">
            <param name="trim">true</param>
            <param name="minLength">5</param>
            <param name="maxLength">8</param>
            <message>密码长度在5-8</message>
        </field-validator>
    </field>
    <field name="password">
        <!--    为表单中password字段添加空白validator    -->
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>密码不能为空</message>
        </field-validator>
        <!--    为表单中password字段添加长度validator    -->
        <field-validator type="stringlength">
            <param name="trim">true</param>
            <param name="minLength">6</param>
            <param name="maxLength">10</param>
            <message>密码长度在6-10</message>
        </field-validator>
    </field>
    <field name="email">
        <!--    为表单中email字段添加电子邮箱地址格式validator    -->
        <field-validator type="email">
            <param name="trim">true</param>
            <message>邮箱格式错误</message>
        </field-validator>
    </field>
</validators>

struts.xml配置文件
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">

<struts>
	<!-- 开启开发模式(如果出现exception将会提示更详细的信息)-->
    <constant name="struts.devMode" value="true"></constant>
    <package name="user" extends="struts-default">
        <!--申明register动作,使用UserAction中的register方法处理-->
        <action name="register" class="cn.hestyle.web.action.UserAction" method="register">
            <!--input表示的是表单出现错误,重新返回到注册页面-->
            <result name="input">/index.jsp</result>
            <result name="success">/success.jsp</result>
        </action>
        <!--申明welcome动作,使用UserAction中的welcome方法处理-->
        <action name="welcome" class="cn.hestyle.web.action.UserAction" method="welcome">
            <result name="welcome">/welcome.jsp</result>
        </action>
    </package>
</struts>
⑤、浏览器访问效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

扫描二维码关注公众号,回复: 7621034 查看本文章

3、全局与局部的区别

在Action中进行表单验证有全局与局部之分,在xml申明表单验证也有全局与局部之分。在UserAction类的xml表单检测文件UserAction-validation.xml,申明的范围是整个UserAction类。但是在UserAction类中只有register动作需要进行表单验证,而welcome动作不需要表单验证。

在浏览器中访问welcome这个动作会报错。
在这里插入图片描述
后台会强制验证访问welcome.action时的表单,但是这个动作本身就没有表单,所以会提示错误input,即表单字段出现错误!。

方法一:

在不需要表单验证的动作方法前加上@SkipValidation注解,强制跳过表单验证。
在这里插入图片描述
重启服务器后即可正确访问welcome.action
在这里插入图片描述

方法二:

UserAction-validation.xml文件名修改为UserAction-方法名-validation.xml的格式,这样xml中声明的表单验证就只针对于文件名中的方法。
在这里插入图片描述

重启服务器后即可正确访问welcome.action
在这里插入图片描述

4、实现原理

xml中申明表单验证的原理是在com.opensymphony.xwork2.validator.validators中的default.xml中配置了多种字段验证器供我们在xml中调用。
在这里插入图片描述
如果你是struts 2.5之前的版本,default.xml是在xwork-core的jar包中,在2.5的版本已经和struts2-core合并了。

以上就是Struts2框架之xml声明式表单验证主要内容,用户注册使用演示了string、email等常见的字段验证器,其他字段验证器可以自己尝试一下。

猜你喜欢

转载自blog.csdn.net/qq_41855420/article/details/102697943
今日推荐