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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值