使用ActionForm類別

使用ActionForm類別入門 07 使用 ActionForm 類別 functiontogg id varoldAttach document getElementBy attachment id with oldAttachmen

<script language=javascript> function toggle(id) { var oldAttachmentVersionsBlock = document.getElementById(‘attachment’ + id); with (oldAttachmentVersionsBlock.style) { if ( display == “none” ) display = “” else display = “none” } var arrowIcon = document.getElementById(‘arrow’ + id); with (arrowIcon) { if (src != null && (src.indexOf(‘/confluence/images/icons/arrow_closed_active_16.gif’) != -1 || src.indexOf(‘/confluence/images/icons/arrow_closing_active_16.gif’) != -1)) { src = ‘/confluence/images/icons/arrow_opening_active_16.gif’; } else { src = ‘/confluence/images/icons/arrow_closing_active_16.gif’; } } } </script>

 

 ActionForm是表單的物件化表示,它本身其實是個JavaBean,除了標準的getter與setter等方法之外,還提供有reset()、validate()等方法供Struts組件呼叫。
 當透過發送請求來到ActionServlet後,ActionServlet會從ActionMapping物件中得知所使用的ActionForm物件,這是在struts-config.xml中設定的,如果所需的ActionForm還不存在就生成一個,之後一直使用它, ActionMapping與ActionForm物件會被當作參數傳遞給Action物件。
 在Struts 1.1中,ActionForm生成之後,會執行RequestProcessor的processPopulate()方法,首先它會呼叫 ActionForm的reset()方法,您可以在當中作一些重清ActionForm屬性的動作,然而表單的參數值會與ActionForm的 setter進行比對,如果有名稱符合的就將表單的參數值設定給對應的屬性。
 我們透過繼承ActionForm類別來使用它,下面是一個簡單的例子:

UserForm.java
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; } }

 ActionForm類別編譯後必須放置於WEB-INF中,並包括套件階層,我們必須在struts-config.xlm中定義Action物件使用哪一個ActionForm物件:

struts-config.xml
<struts-config> <form-beans> <form-bean name="userForm" type="onlyfun.caterpillar.UserForm"/> </form-beans> <global-forwards> <forward name="welcome" path="/Welcome.do"/> </global-forwards> <action-mappings> <action path="/Welcome" type="org.apache.struts.actions.ForwardAction" parameter="/pages/Welcome.jsp"/> <action path="/LoginAction" type="onlyfun.caterpillar.LoginAction" name="userForm"> <forward name="greeting" path="/pages/greeting.jsp"/> </action> </action-mappings> <message-resources parameter="resources.application"/> </struts-config>

 在這個例子中,<form-bean>標籤定義了所使用的ActionForm物件及名稱,而在<action>標籤的設定中,LoginAction指定了userForm作為其所使用的ActionForm,我們的LoginAction類別如下:

LoginAction.java
package onlyfun.caterpillar; import javax.servlet.http.*; import org.apache.struts.action.*; public class LoginAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String name = ((UserForm) form).getName(); String password = ((UserForm) form).getPassword(); if(name.equals("caterpillar") && password.equals("1234")) { request.setAttribute("valid_user", form); return mapping.findForward("greeting"); } return mapping.findForward("welcome"); } }

 ActionForm被作為參數傳遞至execute()方法,我們必須轉換為其原來的形態UserForm,這樣才可以取出當中的屬性值,在驗證使用者的名稱與密碼無誤後,我們查找greeting的ActionForward對象並傳回,這會使得ActionServlet將請求 forward至greeting.jsp:

greeting.jsp
<%@ taglib uri="/tags/struts-bean" prefix="bean" %> <%@ taglib uri="/tags/struts-html" prefix="html" %> <%@ taglib uri="/tags/struts-logic" prefix="logic" %> <%@page contentType="text/html; charset=Big5"%>
<html:html locale="true"> <head> <title><bean:message key="welcome.title"/></title>
<html:base/>
</head>
<body bgcolor="white"> <logic:present scope="request" name="valid_user"> <bean:write name="valid_user" property="name"/>您好,這是您的神秘禮物! </logic:present> <logic:notPresent scope="request" name="valid_user">
    <html:link forward="welcome">請先登入</html:link>
</logic:notPresent>
                                                                               
</body>
</html:html>

 <login:present>標籤會查看指定的範圍中是不是有指定名稱的JavaBean物件,如果有的話就使用< bean:write>寫出指定的屬性,而<login:notPresent>的作用恰恰相反,如果沒有指定名稱的JavaBean 物件,就給出一個超連結要求先進行登入,<html:link>的forward屬性會查找struts-config.xml中的< global-forward>的welcome設定。
如果驗證失敗,則查找welcome的ActionForward對象並傳回,也就是Welcome.jsp,我們用之為登入表單:

Welcome.jsp
<%@ 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:form action="/LoginAction" focus="name">
    名稱:<html:text property="name" size="20"/><br>
    密碼:<html:password property="password" size="20"/><br>
    <html:submit/> <html:reset/>
</html:form>
                                                                               
</body>
</html:html>

 <html:form>指定的LoginAction必須在struts-config.xml中有定義,<html: text>與<html:password>會取出對應的ActionForm物件中對應的屬性值,如果使用者填寫的內容不正確而被送回Welcome.jsp,使用者將可以看到先前所填寫的值,如果不想顯示先前所填寫的值,則將<html:text>與<html: password>的redisplay屬性設定為false即可,這幾個Struts標籤必須與Action物件及ActionForm物件搭配使用。
 接下來您可以測試一下程式,連上http://localhost:8080/HelloStruts/,如果您填寫了正確的表單欄位並送出,則結果會如下:

<html lang="zh"> <head> <title>哈囉!Struts!</title> <base href="http://localhost:8080/HelloStruts/pages/greeting.jsp"> </head> <body bgcolor="white">
    caterpillar您好,這是您的神秘禮物!
</body>
</html>

 ActionForm在Struts中是屬於視圖組件的一部份,它是表單的物件化表單,表單的參數會自動設定給ActionForm,無法對應的就加以忽略,您可以定義validate()方法來驗證表單設定的內容,這在下一個主題中將加以說明,在ActionForm中您可以填入表單值,作一些適當的值轉換,進行基本的資料驗證,ActionForm是表單資料發送至應用程式前的緩衝區,在某些程度上,它是應用程式的防火牆,您可以在 ActionForm中避免不正確或不安全的資料進入應用程式。
 綜合一下,ActionForm擔任以下的幾個職責:
*表單欄位的耕耘者
*資料的緩衝區
*資料的驗證
*進行屬性值的轉換
*應用程式防火牆
















版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232158.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 乘法速算(两位数)

    乘法速算(两位数)法速算(两位数)  此方法可以锻炼孩子的思维速度.思维方向.特别的作用到底是什么?我也不是很清楚.但我觉得学习他总是有好处的.因此介绍给大家.这是我从网站上查到的一部分,从一些书籍中整理而来           还有我自己总结的一点.             闲话少说.进行介绍:(一)十几乘以十几例:           13*12方法:百位是1

    2022年6月7日
    71
  • hql查询语句用法详解_sql add语句

    hql查询语句用法详解_sql add语句HQL的语法比较简单,与普通SQL的区别之处是针对对象的不同,在查询语句中将sql中的表名替换成了sql中的持久化类名,因为hibernate机制是基于对象进行查询的。 不带参数的查询,语句是“fromPOJO”的形式,其中POJO即为持久化类名称Queryquery=session.createQuery("fromUser");带参数的查询接口Query提供了…

    2022年9月29日
    2
  • PHP中include()与require()的区别说明

    PHP中include()与require()的区别说明

    2021年10月14日
    50
  • centos7安装pycharm_pycharm配置环境变量

    centos7安装pycharm_pycharm配置环境变量Centos下pycharm的安装与配置1下载安装pycharm首先在下面的网址下载安装包:https://www.jetbrains.com/pycharm/download/#section=linux然后使用下列指令将安装包放入合适的目录下(本文将安装包放入了/usr/local目录下):cd/home/yue/Downloadsmvpycharm-community-2020.1.tar.gz/usr/local然后进行安装包所在目录,进行解压:tar-zxvfpyc

    2022年8月29日
    2
  • CAP 定理简介

    CAP 定理简介1 简介 CAP 定理指的是一个分布式系统中 Consistency 一致性 Availability 可用性 Partitiontol 分区容错性 三者不可兼得 一致性 C 分布式系统中多个主机之间是否能够保持数据一致的特性 即当系统数据发生更新操作后 各个主机中的数据仍然处于一致的状态 可用性 A 系统提供的服务必须一直处于可用的状态 对于用户的每一个请求 系统总是可

    2025年11月25日
    4
  • PahoMQTT_mqtt安装

    PahoMQTT_mqtt安装1.安装npminstall paho-mqtt-s2.初始化constPahoMQTT=require(‘paho-mqtt’)constname=newDate().getTime()+’client’constclient=newPahoMQTT.Client(‘www.100link.net’,Number(61615),nam…

    2025年6月15日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号