熟悉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:
在值栈中可以看到错误信息的存在,它的存储形式为Map形式,所以在jsp页面添加EL表达式从request去出错误信息显示在jsp页面上。
5.点击提交按钮:
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.运行程序,点击提交按钮:
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.小结:
这节本身没有什么难度,通过这一节希望大家养成多看源代码的习惯,能让自己有非常的提升。