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

相关推荐

发表回复

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

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