使用Struts之鸟瞰

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类别来使用它,下面是一个简单的例子:

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>
<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类别如下:

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:

<%@ 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,我们用之为登入窗体:

<%@ 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担任以下的几个职责:
*窗体字段的耕耘者
*数据的缓冲区
*数据的验证
*进行属性值的转换
*应用程序防火墙
==================================================================================
The End

<script type="text/javascript" src="http://www.google.com/reader/ui/publisher.js"></script> <script type="text/javascript" src="http://www.google.com/reader/public/javascript/user/00697638153916680411/state/com.google/broadcast?n=5&callback=GRC_p(%7Bc%3A%22green%22%2Ct%3A%22%5Cu8FD9%5Cu4E9B%5Cu6587%5Cu7AE0%5Cu4E5F%5Cu503C%5Cu5F97%5Cu4E00%5Cu770B%22%2Cs%3A%22false%22%7D)%3Bnew%20GRC"></script>

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

使用Struts之ActionForm相关推荐

  1. 【Struts】——ActionForm

    上篇示例中我们看到了ActionForm,这篇我们详细了解一下: ActionForm是用于封装用户的请求参数的.上篇我们也提到了:(在ActionForm中设置用到的数据,需和表单保持一致.因为提交 ...

  2. Struts中ActionForm的生命周期

    ActionForm有两种生命周期,一种是Request,另外一种是Session,经常使用的是Request,也就是ActionFom都是存在于一个Request中,也就是从一个客户请求开始到最终响 ...

  3. Struts中ActionForm的初始化步骤

    在ActionServlet接收到某个请求并将这个请求交给具体的某个Action处理之前,struts框架会检查配置文件中对应action的name属性是否设置.如果设置了,就会根据scope属性,在 ...

  4. java struts技术_java技术框架之:struts

    一:struts的优缺点 优点: 1.开源: 2.利用Struts提供的taglib可以大大节约开发时间. 3.维护扩展比较方便.通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有 ...

  5. spring+struts+hibernate分页 完整版,项目使用中

    package com.yizhou.common.test; /**  *  * Copyright @ 2008 YIZHOU SOFTWARE Co. Ltd.  * All right res ...

  6. Struts+Spring+Hibernate练习(完整)(1)

    转载:[url]http://www.blogjava.net/oksonic/archive/2005/11/06/18370.html[/url] 工具: Eclipse3.1.MyEclipse ...

  7. 具体分析Struts工作流程

    1.Webclient提交数据到Tomcat,在form表单中需说明表单提交的action是*.do或*.action,mothod是post或get: 2.Tomcat接收Webclient提交的表 ...

  8. struts(三)——struts框架实现登录示例

    前两篇讲解了struts框架的基本实现,自己感觉讲的也有些枯燥,今天拿登录的例子来做一个实现. 1.新建一个javaweb项目,并将struts的jar包拷贝到WebRoot/WEB-INF/lib下 ...

  9. 一个简单的struts的例子

    index.jsp 代码 <%@ page language="java" import="java.util.*" pageEncoding=" ...

  10. Eclipse开发struts完全指南

    一.准备安装程序 1.JDK 5.0 安装程序下载 同意协议后,可以下载jdk-1_5_0_05-windows-i586-p.exe. 2.tomcat 5.5.9下载 下载地址:http://ja ...

最新文章

  1. 存储过程学习笔记(SQL数据库
  2. C++学习基础七——深复制与浅复制
  3. SPOJ4487(Splay树)
  4. 实现物联网项目,你需要提前知道的6件事情
  5. linux下解压 cpio.gz格式文件
  6. LeetCode 995. K 连续位的最小翻转次数(差分思想)
  7. selenium java项目_1)selenium+ java集成,待深度项目流程应用
  8. Oracle Golden Gate 系列十二 -- GG 数据初始化装载二 基于SCN 的初始化 说明 与 示例...
  9. c++ python混合编程 restful_How to use Python to build a RESTful Web Service
  10. ArrayList常用函数
  11. 这才是打开风变编程的正确操作方式
  12. 2021全国特种设备-R1快开门式压力容器充装模拟考试题库一[安考星]
  13. 2019JAVA面试题精粹附答案
  14. 【卷积神经网络环境搭建学习笔记】
  15. 卫星影像免费下载地址
  16. 成为大数据工程师需要具备什么能力?发展前景好么
  17. 这届世界杯真是谁预测谁尴尬,他却要来一次现场直播预测……
  18. 初识深度学习(将各方所写融合)
  19. 谷歌老闪退啊 和 pycharm版本问题 and 微信闪退
  20. 联想变阵记:不断调整策略架构能否助联想摆脱困局?

热门文章

  1. 单片机c语言出租车计时程序,基于单片机的出租车计费(c语言
  2. 必读的 Android 文章
  3. Linux daemontools安装及使用
  4. mysql商品表_MySQL数据库创建商品表
  5. 北京房租大涨?Python帮你揭穿真相
  6. 【2022】字节跳动面试真题,1000问(Java岗)
  7. 地心一号-基于STM8的超迷你自平衡小车-DIY套件
  8. 深刻理解Binder机制
  9. clonezilla使用_如何使用Clonezilla备份和恢复已死或即将死去的系统磁盘
  10. 台湾省谷歌高清卫星地图下载