struts2-错误处理和中文显示

struts会自动将错误的信息返回给表单的上方,并且会自动将表单中部分的信息回显到以前的页面。然而传统的HTML不会提供这一功能

注意这里面的错误提示,必须使用struts自定义的标签库,才会有上面的效果

默认的错误提示是黑色的英文字体,如果想将错误提示信息变成红色,只需要在需要回显的jsp页面的head标签里面加上一个<s:head></s:head>标签即可

如果想将默认的英文提示转化为自己想提示的中文字符,只需要在放置模型的包下面添加一个配置文件

格式:模型名.properties

并且其内容为invalid.fieldvalue.需要判断的字段名=想要的提示语句(如果出现中文乱码,只需要根据实际情况调整文件字符集编码格式即可)

在表单的某一字段前面提示为必填项,只需要在struts对应的标签后面添加上如下的属性

<s:textfield name="username" label="用户名" requiredLabel="true" requiredPosition="left"></s:textfield>
	

这里面的requiredLabel表示是否显示必填提示,requiredPosition表示显示必填提示的位置是在label的左边还是右边

效果如下

如果想要password在发生错误后回显,只需要在其标签内部加上下面这一属性,这样在表单发生错误的时候,回显页面时password字段仍然存在

<s:password name="password" label="密码" showPassword="true" requiredLabel="true" requiredPosition="left"></s:password>
<s:password name="repassword" label="确认密码" showPassword="true" requiredLabel="true" requiredPosition="left"></s:password>
	

 

下面进入正题:表单的数据验证方式(struts)

1. 服务端Action验证:

(1)重写action的validate方法 :全局,对所有的访问这个action的action都成立

前提:此action必须继承ActionSupport,因为在执行所有的action方法之前会调用这个validate方法,如果数据不对,可以往FieldError添加字段错误信息,比如下面这个action

package action;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import module.User;
import org.apache.commons.lang3.StringUtils;
import org.apache.struts2.interceptor.validation.SkipValidation;
import service.UserService;
import service.impl.UserServiceImpl;

public class RegisterAction extends ActionSupport implements ModelDriven<User> {
    private User user=new User();
    @Override
    public User getModel() {
        return user;
    }

    @Override
    public void validate() {
        if (StringUtils.isEmpty(user.getUsername())){
            addFieldError("username","用户名不能为空!");
        }
    }
   
    //@SkipValidation
    public String login(){
        /**
         * struts2在使用模型驱动注入参数时,会自动类型转化
         * servlet接受到表单的参数都是字符串类型的
         * struts2会把string类型转化为date和布尔类型
         * 如果是checkbox的表单会以逗号+空格的形式拼接成字符串
         */
        System.out.println(user);
        //调用业务方法
        UserService userService=new UserServiceImpl();
        //userService.register(user);
        return NONE;
    }
    public String add(){
        System.out.println(user);
        return NONE;
    }
}

 模型User如下:

package module;

import java.util.Date;

public class User {
    private String username;
    private String password;
    private Date birthday;
    private String hobby;
    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 Date getBirthday() {
        return birthday;
    }

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

    public String getHobby() {
        return hobby;
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }

    public boolean isMarried() {
        return married;
    }

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

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

上面判断username是否为空,如果为空,在FieldError域里面添加一个错误信息  “用户名不为空”

注意:

1. 这里面的addFieldError(fieldName,errorMessage)方法中,参数1为jsp页面中对应struts标签的name属性值

2. validate()方法对于action来说是全局的,也就是说action的所有方法都可以调用,也就是说调用其他方法之前都会先执行这个方法,如果一旦出现错误就不往下走

3. 如果不希望某一方法执行validate方法,仅仅需要在这个方法上面加上一个注解

@SkipValidation

(2)定义一个方法,名字为validate+想要验证的方法名(第一个字母大写):局部:仅仅对名字中的这个方法成立

只针对某一方法生效,并不是全局的,比如validateRegister(){},仅仅对register()方法进行判断

2. xml声明式验证

(1)在action包中声明一个ActionName-validation.xml文件

这种方法是全局配置,所有访问这个action的action都会被拦截

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
    <field name="username">
        <field-validator type="requiredstring">
            <param name="fieldName">username</param>
            <message>用户名不能为空</message>
        </field-validator>
    </field>
    <validator type="requiredstring">
        <param name="fieldName">password</param>
        <message>密码不能为空</message>
    </validator>
</validators>

(2)在action包中声明一个ActionName-actionName-validation.xml

action文件

HobbyAction

package action;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import module.Hobby;
import module.User;
import service.UserService;
import service.impl.UserServiceImpl;

public class HobbyAction extends ActionSupport implements ModelDriven<Hobby> {
    private Hobby hobby=new Hobby();

    @Override
    public Hobby getModel() {
        return hobby;
    }

    public String add(){
        System.out.println(hobby);
        return NONE;
    }
}

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>
    <constant name="struts.devMode" value="true" />
    <package name="p1" extends="struts-default" namespace="/user">
        <action name="register" class="action.RegisterAction" method="login">
            <result name="input">/register2.jsp</result>
        </action>
    </package>
    <package name="p2" extends="struts-default" namespace="/hobby">
        <action name="hobby" class="action.HobbyAction" method="add">
            <result name="input">/hobby.jsp</result>
        </action>
    </package>
</struts>

命名xml文件为

HobbyAction-hobby-validation.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
    <!-- 1. 用户名不能为空-->
    <validator type="requiredstring">
        <param name="fieldName">username</param>
        <message>用户名不能为空</message>
    </validator>
    <!-- 2. 年龄应该是18-100-->
    <validator type="int">
        <param name="fieldName">age</param>
        <param name="min">18</param>
        <param name="max">100</param>
        <message>年龄应该为18-100</message>
    </validator>
    <!-- 3. 邮箱格式应该正确,并且不为空-->
    <validator type="email">
        <param name="fieldName">email</param>
        <message>邮箱应该写正确格式</message>
    </validator>
    <validator type="requiredstring">
        <param name="fieldName">email</param>
        <message>邮箱应该不为空</message>
    </validator>
    <!-- 4. 密码格式应该正确,不能为空,且应该3-8个字符-->
    <validator type="stringlength">
        <param name="fieldName">password</param>
        <param name="minLength">3</param>
        <param name="maxLength">8</param>
        <message>密码为3-8个字符</message>
    </validator>
    <validator type="requiredstring">
        <param name="fieldName">password</param>
        <message>密码不能为空</message>
    </validator>
    <validator type="expression">
        <param name="expression">
            <![CDATA[ password == repassword]]>
        </param>
        <message>确认密码应该和原密码一致</message>
    </validator>
    <validator type="url">
        <param name="fieldName">url</param>
        <message>个人主页默认以http://开头</message>
    </validator>
    <validator type="required">
        <param name="fieldName">gender</param>
        <message>性别为必填项</message>
    </validator>
</validators>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值