使用Struts之ActionForm

使用Struts之ActionForm使用Struts之鸟瞰ActionForm是窗体的对象化表示,它本身其实是个JavaBean,除了标准的getter与setter等方法之外,还提供有reset()、validate()等方法供Struts组件呼叫。当透过发送请求来到ActionServlet后,ActionServlet会从ActionMapping对象中得知所使用的ActionForm对象,这是在struts-con

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定
使用Struts之ActionForm

使用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> <script language=”javascript” type=”text/javascript” src=”http://www.feedsky.com/msub_ajax_sub_js.html?burl=softwave&t=1&c=orange”></script>

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

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

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


相关推荐

  • JPG 的图片格式详解

    JPG 的图片格式详解JPGjpg 全名是 JPEG JPEG 图片以 24 位颜色存储单个光栅图像 JPEG 是与平台无关的格式 支持最高级别的压缩 不过 这种压缩是有损耗的 渐近式 JPEG 文件支持交错 jpg 功能 可以提高或降低 JPEG 文件压缩的级别 但是 文件大小是以牺牲图像质量为代价的 压缩比率可以高达 100 1 JPEG 格式可在 10 1 到 20 1 的比率下轻松地压缩文件 而图片质

    2025年10月8日
    3
  • iozone使用简介

    iozone使用简介iozone 使用简介 iozone www iozone org 是一个文件系统的 benchmark 工具 可以测试不同的操作系统中文件系统的读写性能 可以测试 Read write re read re write readbackward readstrided fread fwrite randomread pread mmap aio read aio write 等等不同的模式下的硬盘的性能 命令详情 aAutomode AAuto2mode b

    2025年9月1日
    3
  • mysql数据库多表查询练习题[通俗易懂]

    mysql数据库多表查询练习题[通俗易懂]下面练习题中设计四个表。分别为:dept表emp表salgrade表tbyear表1.查出至少有一个员工的部门。显示部门编号、部门名称、部门位置、部门人数。SELECTd.deptno,d.dname,d.loc,e1.`count(*)`FROMdeptdINNERJOIN(SELECTdeptno,COUNT(*)FROMemp…

    2022年5月21日
    57
  • IDEA中git的使用[通俗易懂]

    IDEA中git的使用[通俗易懂]IDEA中git的使用

    2022年4月23日
    61
  • Python使用captcha制作验证码[通俗易懂]

    Python使用captcha制作验证码[通俗易懂]在使用Keras搭建验证码识别模型时,需要大量的验证码图片。在这里,使用captcha模块生成验证码图片,验证码图片名称为验证码上显示的字符串。1生成单张验证码图片并显示生成一张验证码的代码如下:fromcaptcha.imageimportImageCaptchaimportmatplotlib.pyplotaspltimportnumpyasnpimport……

    2026年2月4日
    6
  • Python开发命名规范

    Python开发命名规范引言软件开发中规范的命名能够使你的代码简洁美观,完美的命名规范是一个程序员最基本的技能。下面我先简单说说两种常用的命名方式:驼峰命名法混合使用大小写字母来构成变量和函数的名字,以大写字母代替语句间隔的命名方法。程序员们为了自己的代码能更容易的在同行之间交流,所以多采取统一的可读性比较好的命名方式。大驼峰命名:首字母大写。如CamelCase、JavaScript,HelloWorl…

    2022年6月25日
    33

发表回复

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

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