📄 html-errors.jsp
字号:
<%@ page contentType="text/html;charset=GB2312" import="java.util.*"%>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<html>
<head>
<html:base/>
<title><html:errors></title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body bgcolor="white">
<h1><html:errors></h1>
<h2>在Struts 1.1中该标签的使用方法</h2>
<p><html:errors>标签用来在网页上输出错误消息。以下是一段实际运行效果,当用户选中下面的选择框后并提交表单时,页面上
就会显示错误消息,而当用户不选中直接点击时,会出现不同的错误消息。</p>
<html:form action="/testerr.do">
选择框:<html:checkbox property="checkbox1"/>
<html:submit/>
</html:form>
<html:errors bundle="error"/>
<p>这里使用到的代码如下所示:</p>
<font class="CodeStyle">
<html:form action="/testerr.do"><br>
选择框:<html:checkbox property="checkbox1"/><br>
<html:submit/><br>
</html:form><br>
<html:errors bundle="error"/><br>
</font>
<p>错误信息是通过什么方式添加的呢,<html:errors>标记又是通过什么方式将错误信息显示出来的呢?
在前面的章节中曾提到过ActionForm中的validate()方法,它的作用是检验用户的输入,当用户的输入不符合某种条件时,就返回一个
ActionErrors对象,倘若返回的对象不为空,Struts框架就会将请求发回页面。此时,倘若页面上有相应的显示错误的标记,就会将
在validate()方法中所添加的错误显示出来。</p>
<p>另外,除了在ActionForm的validate()方法中可以添加ActionErrors外,在Action中也可以添加。通过查看struts-config.xml文件
可以知道,与这个表单相关联的ActionForm和Action分别是ErrBean和ErrAction。以下先看看ErrBean的代码:</p>
<font class="CodeStyle">
public class ErrBean extends ActionForm{<br>
<br>
private boolean checkbox1;<br>
public boolean isCheckbox1() {<br>
return checkbox1;<br>
}<br>
<br>
public void setCheckbox1(boolean checkbox1) {<br>
this.checkbox1 = checkbox1;<br>
}<br>
<br>
public void reset(ActionMapping mapping, HttpServletRequest request){<br>
this.setCheckbox1(false);<br>
}<br>
<br>
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request){<br>
ActionErrors errors = new ActionErrors();<br>
if (checkbox1){<br>
errors.add(ActionMessages.GLOBAL_MESSAGE,new ActionError("html.errors.error1"));<br>
errors.add("checkbox1",new ActionError("html.errors.error2"));<br>
}<br>
return errors;<br>
}<br>
}<br>
</font>
<p>在<html:checkbox>标记一节已经说过,用于在ActionForm中表示一个选择框的类型通常使用boolean型。此处在ErrBean中就
声明了一个boolean型的变量checkbox1用于表示页面上的选择框。当用户在页面上点击了该选择框时,选择框的值被设置为true。然后
用户点击提交按钮,此时,Struts框架从struts-config.xml文件中得知这个提交的ActionForm的validate属性为true,因此需要调用
ErrBean的validate()方法进行验证。</p>
<p>在ErrBean的validate()方法中,首先初始化一个ActionErrors对象,然后判断checkbox1是否被选中。若选中,则向ActionErrors
对象中添加两个ActionError。添加ActionError时采用的是ActionErrors的add()方法。该方法有两个参数,第一个参数是所添加ActionError
的key,然后是ActionError的值。这样做的原因是因为在ActionErrors内部保存了一个HashMap,以此来将所有的ActionError保存。
其中,添加第一个ActionError的代码如下:</p>
<font class="CodeStyle">
errors.add(ActionMessages.GLOBAL_MESSAGE,new ActionError("html.errors.error1"));<br>
</font>
<p>这里的ActionMessages.GLOBAL_MESSAGE的值是"org.apache.struts.action.GLOBAL_MESSAGE",它是一个常量,表示全局消息。
对于每一个key来说,都可以存入多个ActionError。这是因为ActionErrors的内置的HashMap中并不是仅仅存入一个简单的ActionError
对象,而是存入一个List对象,再将多个ActionError对象存入该List中。ActionError的构造函数中的参数是资源文件中的key值,
将来在页面上就将显示该key值对应的value。下面是添加第二个ActionError的代码:</p>
<font class="CodeStyle">
errors.add("checkbox1",new ActionError("html.errors.error2"));<br>
</font>
<p>这个ActionError的key值为checkbox1,它表示和特定的表单元素相关的错误信息。在页面中的<html:errors>标签中使用
property属性来指定。</p>
<p>通过上面的代码可以看到,用户在提交表单时由ActionForm产生了错误信息,然后转交回页面。此时,就该由页面上的<html:errors>
来显示相应的错误信息了。这时,考虑另一种情形,如果页面上用户输入的信息并无错误,通过了ActionForm的validate()方法的检查,
但在Action中经由业务逻辑处理后,返回了一些错误信息。此时,仍然需要将ActionErrors对象存储进request对象中。但Action中并无
validate方法了,该怎么办呢?Action类的saveErrors()方法解决了这一困难。看看下面ErrAction的execute()方法的代码:</p>
<font class="CodeStyle">
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {<br>
<br>
ActionErrors errors = new ActionErrors();<br>
errors.add(ActionMessages.GLOBAL_MESSAGE,new ActionError("html.errors.error3"));<br>
saveErrors(request,errors);<br>
return mapping.findForward("input");<br>
}
</font>
<p>在Action类中提供了一个saveErrors()方法,可以将ActionErrors对象存入request中。通过这个方法<html:errors>标签
可以在request中找到它并将其显示在网页上。</p>
<p>前面已经看到了页面上显示的代码,下面就来讲解一下<html:errors>标记的具体用法。</p>
<p><html;errors>标记可以放在网页上的任何位置,它有以下三个比较重要的属性:</p>
<p>name属性:它指定了存放在request或session属性中的错误对象的值。我们知道,在request或session中,对象的存储一般都以
键/值对的方式来进行。ActionErrors对象在request或session中的key默认为Globals.ERROR_KEY。</p>
<p>property属性:用于指定与ActionError对应的key值,如前面例中的checkbox1。</p>
<p>bundle属性:用于指定资源文件,即显示ActionErrors信息时去哪个资源文件中读取相应的消息文本。例如在taglib1中,struts-config.xml
文件中有这样一句代码:</p>
<font class="CodeStyle">
<message-resources parameter="message" key="error"/><br>
</font>
<p>则在页面的<html:errors>标签中使用下面的方式来引用这个资源文件</p>
<font class="CodeStyle">
<html:errors bundle="error"/>
</font>
<p>以下是几个代码示例:</p>
<font class="CodeStyle">
<html:errors bundle="error"/>
</font>
<p>上面的代码表示显示所有的错误信息。</p>
<font class="CodeStyle">
<html:errors property="org.apache.struts.action.GLOBAL_MESSAGE" bundle="error"/>
</font>
<p>上面的代码表示显示所有的全局消息,也就是在向ActionErrors中添加ActionError对象时,选用ActionMessages.GLOBAL_MESSAGE
做为该ActionError的key的对象。</p>
<h2>在Struts 1.2中该标签的使用方法</h2>
<p>到目前为止,所有有关<html:errors>标签的讨论都是基于Struts 1.1的核心。但在2005年Apache正式推出Struts 1.2后,
有许多东西已经被改变。其中很重要的一个改动就是与<html:errors>标记相关的改动,主要就是已经不再推荐使用ActionError类
和ActionErrors类,因此,如果要将现有的使用到与<html:errors>标记相关的代码从Struts 1.1下移至Struts 1.2下,需要作以下
改动。</p>
<p>1. 将代码中使用到ActionError类的地方换为ActionMessage类。</p>
<p>2. 将除了在ActionForm的validate()方法以外使用到ActionErrors类的地方都替换为ActionMessages。</p>
<p>这样做的主要原因是,ActionError是ActionMessage的子类,而ActionErrors是ActionMessages的子类。开发者认为一个错误消息也是
消息的一种,并没有必要专门将其分开存放。只需要使用Globals.MESSAGE_KEY,Globals.ERROR_KEY来进行区分就分。</p>
<p>例如,在ErrAction中,若要使其支持Struts1.2,则可将代码改为如下形式:</p>
<font class="CodeStyle">
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {<br>
<br>
ActionMessages messages = new ActionMessages();<br>
messages.add(ActionMessages.GLOBAL_MESSAGE,new ActionMessage("html.errors.error3"));<br>
saveErrors(request,messages);<br>
return mapping.findForward("input");<br>
}
</font>
<p>
<a href="index.jsp">返回主页面</a>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -