java web从零单排第十二期《struts2》数据校验显示出错信息

熟悉servlet编程处理错误信息显示到JSP页面时,都会将错误信息保存到request中,然后在JSP页面中通过JSTL/EL表达式显示出来,而struts2也是使用这种方式,但是封装的更加完善。

1.在JSP页面中加入调试标签:

加入调试标签后的JSP页面register.jsp代码如下:

<%@ 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>
  <body>
    <s:debug></s:debug>
    <s:form action="register" method="post">
       账号<s:textfield name="username" ></s:textfield>${errors.username[0]}
      <br>
       密码<s:textfield name="password" ></s:textfield>${errors.password[0]}
     <br>
       年龄<s:textfield name="age"></s:textfield>${errors.age[0]}
     <br>
       身高<s:textfield name="height"></s:textfield>${errors.height[0]}
     <br>    
       <s:submit value="提交"></s:submit>
    </s:form>
  </body>
</html>


 


2.新建Register.java

package controller;

import com.opensymphony.xwork2.ActionSupport;

public class Register extends ActionSupport{
	
	private String username;
	private String password;
	private Integer age;
	private Double height;
	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 Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public Double getHeight() {
		return height;
	}
	public void setHeight(Double height) {
		this.height = height;
	}
	@Override
	public void validate() {
		// TODO Auto-generated method stub
		if(!username.equals("niujiabin"))
		{
			this.addFieldError("username", "用户名非法,必须为niujiabin");
		}
		if(!password.equals("jiabinniu"))
		{
			this.addFieldError("password", "密码非法,必须为jiabinniu");
		}
		if(age==null||age>=120||age<0)
		{
			this.addFieldError("age", "年龄非法,必须在0-120之间");
		}
		if(height==null||height<0||height>3)
		{
			this.addFieldError("height", "身高非法,必须在0-3米之间");
			
		}
	}
	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		return "register";
	}

}

3.配置文件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/dtd/struts-2.0.dtd">
<struts>
   <package name="Maybe" extends="struts-default">
   
   <action name="register" class="controller.Register">
     <result name="register">/showregister.jsp</result>
     <result name="input">/register.jsp</result>
   </action>
   </package> 
   
   <constant name="struts.ui.theme" value="simple"></constant>
</struts>


 


4.运行后点击debug:

java web从零单排第十二期《struts2》数据校验显示出错信息_第1张图片

java web从零单排第十二期《struts2》数据校验显示出错信息_第2张图片

在值栈中可以看到错误信息的存在,它的存储形式为Map形式,所以在jsp页面添加EL表达式从request去出错误信息显示在jsp页面上。

5.点击提交按钮:

java web从零单排第十二期《struts2》数据校验显示出错信息_第3张图片

6.显示全局出错信息修改Register.java:

package controller;

import com.opensymphony.xwork2.ActionSupport;

public class Register extends ActionSupport{
	
	private String username;
	private String password;
	private Integer age;
	private Double height;
	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 Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public Double getHeight() {
		return height;
	}
	public void setHeight(Double height) {
		this.height = height;
	}
	@Override
	public void validate() {
		// TODO Auto-generated method stub
		if(!username.equals("niujiabin"))
		{
			this.addActionError("用户名非法,必须为niujiabin");
		}
		if(!password.equals("jiabinniu"))
		{
			this.addActionError("密码非法,必须为jiabinniu");
		}
		if(age==null||age>=120||age<0)
		{
			this.addActionError("年龄非法,必须在0-120之间");
		}
		if(height==null||height<0||height>3)
		{
			this.addActionError("身高非法,必须在0-3米之间");
			
		}
	}
	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		return "register";
	}

}

调用ActionListener方法来显示错误信息。

7.修改register.jsp

<%@ 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>
  <body>
    <s:actionerror/>
    <br>
    <s:form action="register" method="post">
       账号<s:textfield name="username" ></s:textfield>
      <br>
       密码<s:textfield name="password" ></s:textfield>
     <br>
       年龄<s:textfield name="age"></s:textfield>
     <br>
       身高<s:textfield name="height"></s:textfield>
     <br>    
       <s:submit value="提交"></s:submit>
    </s:form>
  </body>
</html>


注意:actionerror标签。

8.运行程序,点击提交按钮:

java web从零单排第十二期《struts2》数据校验显示出错信息_第4张图片

 9.addFieldError和addActionError的对比

首先看一下源代码:

/*
 * Copyright 2002-2007,2009 The Apache Software Foundation.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.opensymphony.xwork2;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * ValidationAware classes can accept Action (class level) or field level error messages. Action level messages are kept
 * in a Collection. Field level error messages are kept in a Map from String field name to a List of field error msgs.
 *
 * @author plightbo 
 */
public interface ValidationAware {

    /**
     * Set the Collection of Action-level String error messages.
     *
     * @param errorMessages Collection of String error messages
     */
    void setActionErrors(Collection<String> errorMessages);

    /**
     * Get the Collection of Action-level error messages for this action. Error messages should not
     * be added directly here, as implementations are free to return a new Collection or an
     * Unmodifiable Collection.
     *
     * @return Collection of String error messages
     */
    Collection<String> getActionErrors();

    /**
     * Set the Collection of Action-level String messages (not errors).
     *
     * @param messages Collection of String messages (not errors).
     */
    void setActionMessages(Collection<String> messages);

    /**
     * Get the Collection of Action-level messages for this action. Messages should not be added
     * directly here, as implementations are free to return a new Collection or an Unmodifiable
     * Collection.
     *
     * @return Collection of String messages
     */
    Collection<String> getActionMessages();

    /**
     * Set the field error map of fieldname (String) to Collection of String error messages.
     *
     * @param errorMap field error map
     */
    void setFieldErrors(Map<String, List<String>> errorMap);

    /**
     * Get the field specific errors associated with this action. Error messages should not be added
     * directly here, as implementations are free to return a new Collection or an Unmodifiable
     * Collection.
     *
     * @return Map with errors mapped from fieldname (String) to Collection of String error messages
     */
    Map<String, List<String>> getFieldErrors();

    /**
     * Add an Action-level error message to this Action.
     *
     * @param anErrorMessage  the error message
     */
    void addActionError(String anErrorMessage);

    /**
     * Add an Action-level message to this Action.
     *
     * @param aMessage  the message
     */
    void addActionMessage(String aMessage);

    /**
     * Add an error message for a given field.
     *
     * @param fieldName    name of field
     * @param errorMessage the error message
     */
    void addFieldError(String fieldName, String errorMessage);

    /**
     * Check whether there are any Action-level error messages.
     *
     * @return true if any Action-level error messages have been registered
     */
    boolean hasActionErrors();

    /**
     * Checks whether there are any Action-level messages.
     *
     * @return true if any Action-level messages have been registered
     */
    boolean hasActionMessages();

    /**
     * Checks whether there are any action errors or field errors.
     * <p/>
     * <b>Note</b>: that this does not have the same meaning as in WW 1.x.
     *
     * @return <code>(hasActionErrors() || hasFieldErrors())</code>
     */
    boolean hasErrors();

    /**
     * Check whether there are any field errors associated with this action.
     *
     * @return whether there are any field errors
     */
    boolean hasFieldErrors();

}

从定义中就可以看出,actionError是Collection的方式进行存储的,而fieldError是以Map进行存储的。

10.小结:

这节本身没有什么难度,通过这一节希望大家养成多看源代码的习惯,能让自己有非常的提升。

 

 


 

你可能感兴趣的:(java,Web,struts2)