ActionMessages & ActionErrors

ActionError与ActionMessage
ActionError与ActionMessage

ActionForm是表单的物件化,有关於表单资料的完整性检查工作该在其中进行,例如使用者是否填写了所有的栏位,ActionForm中所有的属性是否被设定了,您可以重新定义ActionForm的validate()方法来进行这项工作,例如:
代码:
package onlyfun.caterpillar;

import javax.servlet.http.*;
import org.apache.struts.action.*;

public class UserForm extends ActionForm {
     protected String name;
     protected String password;

     public void setName(String name) {
         this.name = name;
     }
     public void setPassword(String password) {
         this.password = password;
     }
     public String getName() {
         return name;
     }
     public String getPassword() {
         return password;
     }
     public void reset(ActionMapping mapping, HttpServletRequest req) {
         name = null;
         password = null;
     }

     public ActionErrors validate(ActionMapping mapping,
                                  HttpServletRequest request) {
         ActionErrors errors = new ActionErrors();

         if(getName() == null || getUsername().length() < 1) {
             errors.add("name",new ActionError("error.name.required"));
         }
         if(getPassword() == null || getPassword().length() < 1) {
             errors.add("password",new ActionError("error.password.required"));
         }

         return errors;
     }
}


当使用者发送表单,而表单中有栏位没有填写时,则请求中会包括参数名称,但是值為空字串,如果ActionForm具有某些属性,而表单并没有发送对应的参数,则不会设定ActionForm中对应的属性,这些属性将為null,我们的validate()中主要在检查这两个情况。

validate()方法会传回ActionErrors物件,ActionErrors可以储存ActionError的讯息,每一个ActionError会查询资源档中的key-value对应,当validate()丢回ActionErrors物件时,ActionServlet就不会继续进行接下来的工作,而是导回structs-config.xml所设定的位置,例如:
代码:
     <global-forwards>
         <forward
             name="welcome"
             path="/Welcome.do"/>
     </global-forwards>
                                                                                               
     <form-beans>
         <form-bean
             name="userForm"
             type="onlyfun.caterpillar.UserForm"/>
     </form-beans>
                                                                                               
     <action-mappings>
         <action
             path="/Welcome"
             type="org.apache.struts.actions.ForwardAction"
             parameter="/pages/Welcome.jsp"/>
                                                                                               
         <action
             path="/LoginAction"
             type="onlyfun.caterpillar.LoginAction"
             name="userForm"
             validate="true"
             input="/pages/Welcome.jsp">
             <forward name="greeting" path="/pages/greeting.jsp"/>
         </action>
     </action-mappings>


為了要能使用validate()方法,<action>中的validate属性必须设定為true,而input属性也是必要的,当validate()传回ActionErrors时,就会forward至input属性所设定的位置,ActionErrors中的讯息,我们可以使用<html:errors/>标籤来显示,待会就会看到。

ActionForm中验证了属性為null及空字串的可能,这是资料完整性的验证,接下来我们要验证资料的正确性,是否符合我们所设定的名称与密码,我们改写前一个主题的LoginAction,看看写法有何不同:
代码:
package onlyfun.caterpillar;

import javax.servlet.http.*;
import org.apache.struts.action.*;
import org.apache.commons.beanutils.*;

public class LoginAction extends Action {
     public ActionForward execute(ActionMapping mapping,
                                  ActionForm form,
                                  HttpServletRequest request,
                                  HttpServletResponse response)
     throws Exception {

         String name = (String) PropertyUtils.getSimpleProperty(form, "name");
         String password = (String) PropertyUtils.getSimpleProperty(form, "password");

         if(!(name.equals("caterpillar") && password.equals("1234"))) {
             ActionMessages messages = new ActionMessages();
             messages.add(ActionMessages.GLOBAL_MESSAGE,
                          new ActionMessage("message.namepass.notmatched"));
             saveMessages(request, messages);
             return mapping.findForward("welcome");
         }
         else {
             request.getSession().setAttribute("valid_user", form);
             return mapping.findForward("greeting");
         }
     }
}


在这次的程式中,我们使用了org.apache.commons.beanutils中的PropertyUtils类别来协助我们取ActionForm中的值,好处是不用理会ActionForm真正的形态,PropertyUtils会自动帮我们判断,getSimpleProperty()传回的是Object,我们将之转换為String。

ActionMessages是Struts 1.1所新增的类别,它变成了ActionErrors的父类别,同样的,ActionMessage也是Struts 1.1新增的类别,它是ActionError的父类别,资料的格式与完整性检查在ActionForm中我们已经验证了,接下来我们在Action中检查是否符合名称与密码,如果不符合就加入相关的讯息。

在Struts 1.1中特意将Message与Error区别,该是认定所谓的Error是使用者的输入在完整性或格式等上有误,而Message是指输入的资料基本上没有错误,但不能符合后续的商务处理。

為了要能够显示错误与讯息,我们必须在application_zh.properties中加入key-value对应,如下:
代码:
# -- error --
error.name.required=没有输入名称
error.password.required=没有输入密码
                                                                                               
#-- message --
message.namepass.notmatched=名称与密码不正确


為了要能使用中文,记得使用native2ascii工具程式进行转换,接下来我们来看看我们的Welcome.jsp如何撰写,要注意的是在<html:errors/>与<htm:messages/>的使用:
代码:
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@page contentType="text/html; charset=Big5"%>
<html:html locale="true">
<head>
<title><bean:message key="welcome.title"/></title>
<html:base/>
</head>
<body bgcolor="white">
<html:errors/>

<html:messages id="messages" message="true">
     <bean:write name="messages"/>
</html:messages>

<h3>请登入</h3>

<html:form action="/Login">
     名称:<html:text property="name" size="20"/><br>
     密码:<html:password property="password" size="20"/><br>
     <html:submit/> <html:reset/>
</html:form>

</body>
</html:html>


如果由於ActionForm传回ActionErrors物件而返回Welcome.jsp,则<html:errors/>标籤会显示ActionErrors中的相关错误讯息,我们利用<html:messages/>来检查返回中是否也包括ActionMessages物件,如果有的话就取出并使用<bean:write/>标籤显示之。

下面是执行时未填写栏位所显示的错误讯息的一个例子:
代码:
<html lang="zh">
<head>
<title>哈囉!Struts!</title>
<base href="http://localhost:8080/HelloStruts/pages/Welcome.jsp">
</head>
<body bgcolor="white">
<UL>
<LI>没有输入名称
</LI><LI>没有输入密码
</LI></UL>

<h3>请登入</h3>

<form name="UserForm" method="post" action="/HelloStruts/Login.do">
     名称:<input type="text" name="name" size="20" value=""><br>
     密码:<input type="password" name="password" size="20" value=""><br>
     <input type="submit" value="Submit"> <input type="reset" value="Reset">
</form>

</body>
</html>


注意到ActionErrors在Struts 1.2之后可能会被标示為deprecated,将来可能会改以ActionMessages取代,所以<html:errors/>在将来必须以下面的方式来取代:
代码:
<html:messages id="msg" >
   <bean:write name="msg"/>
</html:messages>


在之前的例子中,在<html:messages/>的属性上设定message為true,这表示显示ActionMessages的内容:
代码:
<html:messages id="messages" message="true">
     <bean:write name="messages"/>
</html:messages>

你可能感兴趣的:(apache,bean,jsp,struts,servlet)