使用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)
上一篇 2025年10月29日 上午11:01
下一篇 2025年10月29日 上午11:22


相关推荐

  • Vue.js构建项目笔记2:vuejs+vue-router

    Vue.js构建项目笔记2:vuejs+vue-router

    2022年3月7日
    41
  • 3D打印上位机软件

    3D打印上位机软件本文将主要介绍在3D打印中常见的3D打印上位机软件,这类3D软件将为用户提供较大的帮助,通过对这类软件的分类,用户可以选择使用最适合自己的软件。没有恐惧,我们已经回答了所有这些问题,以及熟练程度的细节和可以下载的细节。最重要的是,他们大多数是完全免费和开源的。我们错过了您最喜爱的3D打印软件吗?让我们在评论中知道,我们会在将来的更新中添加它们。1、curaCura可以被称…

    2022年5月31日
    70
  • 腾讯C端市场加码元宝,巨头纷纷“砸钱”,AI流量入口争夺战升级

    腾讯C端市场加码元宝,巨头纷纷“砸钱”,AI流量入口争夺战升级

    2026年3月13日
    3
  • 漏洞挖掘丨客户支持聊天系统中的IDOR漏洞

    漏洞挖掘丨客户支持聊天系统中的IDOR漏洞*本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。2019-04-17_165229.jpg大家好,今天分享的writeup是一个关于客户支持系统(CustomerSupport)的IDOR漏洞(不安全的直接对象引用),该漏洞可以导致目标系统的访问控制功能失效,实现客户支持平台内的任意消息读取和发送,还能下载任意用户的相关文件。…

    2022年6月11日
    36
  • 盘点购物分享系统,有兴趣的来看看哦

    盘点购物分享系统,有兴趣的来看看哦最近蘑菇街,美丽说等购物分享的火爆。社会化电子商兴起。很多站长看到了市场。你是不是也想做个这类的网站倒是可以接着往下看。现在主流的购物分享系统有方维,拼品,拼图秀,爱图谱,乐兔淘,花世界等。1.方维购物分享系统:现在网上用的较多购物分享系统,比较像蘑菇街的类型。功能较全面,操作起来就是有点复杂,搞了好久才搞定她,不过你可以再网上下载说明书。开发的配套也…

    2022年5月3日
    43
  • 大数据——Impala工具使用

    大数据——Impala工具使用一 Impala 概述 Impala 是 Cloudera 公司推出 提供对 HDFS Hbase 数据的高性能 低延迟的交互式 SQL 查询功能 基于 Hive 使用内存计算 兼顾数据仓库 具有实时 批处理 多并发等优点与 ApacheHive 有相同的元数据 SQL 语法 ODBC 驱动 用户界面 能直接对存储在 HDFS 和 HBase 中的数据提供快速 交互式 SQL 查询是 CDH 平台首选的 PB 级大数据实时查询分析引擎二 Impala 优点熟悉的 SQL 接口 能够在 ApacheHadoop 中查询大量数据 集群环境

    2026年3月17日
    2

发表回复

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

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