使用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>

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • ofbiz学习笔记

    ofbiz学习笔记

  • c语言必备100代码(代码大全)

    一个完全入门初学者如何学代码,读代码和写代码,,我想学代码不知道方向谁能给我指明一个方向?1、学代码:前提是你的复有一个比较系统的学习.认真完成每一个课程中的案例.2、读代码:分制两步走:前期能读懂自己写的代码.2113后期能读懂他人写的代码和大致的知道底层的某些源码的含义.多去5261看开发文档(开发文档建议使用官方提供的4102英文版、不要使用中文自己害自己)3、写代码1653:前提是你要有…

  • oracle语句和mysql语句有什么不同_短语与句子的区别

    oracle语句和mysql语句有什么不同_短语与句子的区别Oracle与MySQL的SQL语句区别1数据库/*&amp;amp;nbsp;mysql可以创建数据库,而oracle没有这个操作,oracle只能创建实例;&amp;amp;nbsp;sql数据库操作:database&amp;amp;nbsp;格式:&amp;amp;nbsp;&amp;amp;nbsp;*createdatabase数

  • 安卓4.0/4.1/4.2手机怎么打开USB调试模式「建议收藏」

    安卓4.0/4.1/4.2手机怎么打开USB调试模式「建议收藏」提示:手机和电脑的连接方式都是ADB连接方式,所以手机上是必须打开USB调试才能正式连接和控制手机,根据安卓多个版本系统一共有3个开启USB调试模式方法。下面三个3个模式开启方法介绍::第一种模式是:

  • Vue.js 父组件向子组件传值和子组件向父组件传值

    Vue.js 父组件向子组件传值和子组件向父组件传值父组件向子组件传值组件实例定义方式,注意:一定要使用props属性来定义父组件传递过来的数据&amp;lt;script&amp;gt;//创建Vue实例,得到ViewModelvarvm=newVue({el:’#app’,data:{msg:’这是父组件中的消息’},components…

  • 上传图片ajax返回400,七牛qiu.js 上传图片 400报错

    上传图片ajax返回400,七牛qiu.js 上传图片 400报错http提示信息RequestURL:http://upload.qiniu.com/RequestMethod:POSTStatusCode:400BadRequestRemoteAddress:115.231.182.136:80ResponseHeadersviewsourceAccess-Control-Allow-Headers:X-File-Name,X-File-…

发表回复

您的电子邮箱地址不会被公开。

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