`

[摘]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>
分享到:
评论

相关推荐

    Struts2-ActionError-ActionMessage-Example

    在Struts2框架中,ActionError和ActionMessage是处理用户输入验证和错误反馈的重要组件,它们使得开发者能够优雅地管理应用程序中的错误信息和用户消息。 ActionError类是用来存储错误信息的,它继承自`java.lang....

    Struts2&ActionError&ActionMessage&Demo

    在Struts2中,`ActionError`和`ActionMessage`是两个重要的概念,它们用于处理用户界面与控制器之间的错误信息和成功消息传递。这两个类是Struts2提供的一种灵活的方式来管理验证失败或操作成功时的反馈信息。 **...

    Struts_In_Action(中文完整版)

    6. **异常处理**:Struts的异常处理机制可以帮助开发者优雅地管理程序中的错误和异常,书中会讨论如何配置和使用ActionError和ActionMessage。 7. ** strutstiles 插件**:Struts Tiles是一个强大的布局和页面组装...

    struts in action 源码

    Struts提供了全局的异常处理机制,通过定义ActionError和ActionMessage,可以在出现异常时统一处理并展示给用户。 **拦截器(Interceptors)** Struts 2引入了拦截器,它们是实现AOP(面向切面编程)的关键。拦截...

    Struts精要指南

    ActionError和ActionMessage则是Struts中用于处理验证错误的工具。 最后,Struts与Spring、Hibernate等其他开源框架的整合也是其强大之处。通过这些整合,开发者可以构建出更强大的企业级应用,例如,使用Spring...

    Struts初步知识

    例如,Struts提供了ActionError和ActionMessage机制来处理错误信息,以及Validator框架进行数据验证。 总之,Struts为Java Web开发提供了一种强大的架构,通过规范的MVC模式,降低了开发复杂性,提高了代码的可读性...

    Struts登录案例

    5. **错误处理和国际化**:登录验证失败时,可以使用Struts的ActionError和ActionMessage机制来向用户显示错误信息。同时,通过资源包(properties文件)实现错误消息的国际化,以便支持多种语言环境。 6. **拦截器...

    Struts框架基础包

    5. **异常处理**:`struts-exception-x.x.x.jar`包含了Struts框架对异常的处理机制,如定义ActionError和ActionMessage,帮助开发者更优雅地处理程序中的异常情况。 6. **插件支持**:Struts支持多种插件,如`...

    基于struts的销售管理系统

    Struts提供全局的ActionError和ActionMessage机制。 在实际开发过程中,还需要考虑以下几点: - 配置文件:Struts的配置文件(struts-config.xml)定义了各个Action及其对应的ActionForm和结果页面,以及Action的...

    struts常见问题列表

    6. **异常处理**:Struts默认使用ActionError和ActionMessage来处理异常,这些错误信息会显示在页面上。如果希望自定义错误处理,需要在struts-config.xml中配置全局异常映射或在Action类中处理。 7. **国际化(i18...

    Spring与Struts集成方式一

    在Struts中,可以配置ActionError或ActionMessage来显示错误信息给用户。 5. **国际化和主题支持**: - Struts提供对国际化和主题的支持,Spring也可以通过ResourceBundle等方式配合实现。 6. **测试**: - 利用...

    j2ee strust应用

    7. **异常处理**:Struts提供了ActionError和ActionMessage机制来处理运行时错误和用户输入错误,可以统一管理并显示给用户。 8. **Tiles框架**:Struts的Tiles扩展允许开发者创建可复用的页面布局,提高了视图的...

    struts1做的简单登陆系统

    11. **异常处理**:Struts1允许开发者通过配置ActionError和ActionMessage来处理和展示异常信息,提供友好的用户反馈。 12. **国际化与本地化**:Struts1支持多语言,可以通过资源文件进行国际化处理,使应用能够...

    关于struts表单验证

    errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("loginform.error.username")); } if (userpass == null || userpass.equals("")) { errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError(...

    公告管理系统(struts1)

    8. **异常处理**:Struts1提供了ActionError和ActionMessage机制,可以捕获和显示业务处理中的异常信息,提供友好的用户体验。 9. **安全考虑**:对于公告管理,还需要考虑权限控制,例如只有管理员才能发布或删除...

    ssh+jqgrid的整合

    7. **异常处理与反馈**:在处理过程中,应捕获可能出现的异常,并通过Struts2的ActionError或ActionMessage机制,将错误信息返回到前端,供JQGrid显示。 8. **优化与扩展**:整合完成后,可以进一步优化性能,如...

    教案最详细的Struts学习标签.pdf

    4. **actionmessage标签**:与`actionerror`类似,`&lt;s:actionmessage&gt;`用于显示提示信息。在Action中使用`addActionMessage()`添加消息,然后在JSP页面上使用`&lt;s:actionmessage /&gt;`显示。 5. **append标签**:辅助`...

    struts1总结

    Struts1提供了一系列的异常处理机制,如`ActionError`和`ActionMessage`等,用于捕捉和处理异常情况。此外,还可以通过配置文件来定义全局的异常处理逻辑。 #### 八、Struts1的国际化支持 Struts1支持多语言环境,...

    Struts2标签库

    4. `&lt;s:actionmessage&gt;`:与`s:actionerror`类似,但用于显示普通的提示信息,比如用户操作成功后的反馈。当在Action中使用`addActionMessage()`添加消息后,`&lt;s:actionmessage /&gt;`会把这些信息展示在页面上。 5. `...

Global site tag (gtag.js) - Google Analytics