`
dishell
  • 浏览: 68786 次
  • 性别: Icon_minigender_1
  • 来自: 西安
最近访客 更多访客>>
社区版块
存档分类
最新评论

Struts 跨页提交表单

阅读更多
问题描述:有时,表单数据太多,无法在同一个页面显示,需要分页完成(如用户注册表单)。这时,既可以为每一个表单创建一个ActionForm,也可以只创建一个ActionForm,它和多个表单对应。这里讨论如何用一个ActionForm对应表单。

1.把HTML表单拆分到多个JSP页面中

这里我们把注册表单拆分为两个表单:第一个在insertContent.jsp中定义,包括name和phone字段,第二个表单在insertContent_next.jsp中定义,包括address字段。这两个表单分别对应不同的Action: “/insert1”和“/insert2”,但是这两个Action与同一个ActionForm映射。

注意在insertContent.jsp和insertContent_next.jsp中定义一个隐含字段page,它代表当前页面编号,AcitonForm将通过这个字段来识别当前正在处理的是哪个表单。insertContent.jsp中:
<html:form action="/insert1.do">

       <html:hidden property="page" value="1" />省略. . . . . .

</html:form>

insertContent_next.jsp类似:

    <html:form action="/insert2.do">

       <html:hidden property="page" value="2" />省略. . . . . .

    </html:form>


2.创建和多个HTML表单对应的ActionForm(InsertForm.java)

需要注意一下几点:

(1)提供和HTML表单的隐藏字段page对应的page属性,并生成get和set方法

(2)    在reset()方法中,只能把和当前正在处理的表单相关的属性恢复为默认值,否则,如果每次都把ActionForm的所有属性恢复为默认值,将使用户输入的上一页表单数据丢失。由于Struts框架先调用reset()方法,然后再把用户输入的表单数据组装到ActionForm中,因此在reset()方法中,不能根据page属性来判断处理的是哪个页面,而应该直接从HttpServletRequest对象中读取当前表单的page字段值:page=new Integer(request.getParameter("page")).intValue();

完整代码如下:

public void reset(ActionMapping mapping, HttpServletRequest request) {

       //根据“page”的值处理不同的字段

       int numPage = 0;

         try {

               numPage = new Integer(request.getParameter("page")).intValue();

         } catch (Exception e){}

         if (numPage == 1){name = null;

                phone = null;}

         if (numPage == 2){ address = null;}

         page = null;

    }

(3) 在validate()方法中,仅对和当前表单相关的属性进行验证。由于Struts框架在调用validate()方法之前,已经把用户输入的表单数据组装到ActionForm中,因此在validate()方法中可以根据page属性决定正在处理哪个表单。 代码如下:   
public ActionErrors validate(ActionMapping mapping,

           HttpServletRequest request) {

       ActionErrors errors = new ActionErrors();

        int numPage = 0;

        try{

               numPage = new Integer(page).intValue();

        } catch (Exception e){

        }

        if (numPage == 1){

               if (((name == null) || (name.length() < 1)))

                      errors.add("name", new ActionMessage("error.name.required"));

               if (((phone == null) || (phone.length() < 1)))

                      errors.add("phone", new ActionMessage("error.phone.required"));

        }

        if (numPage == 2) {

               if (((address == null) || (address.length() < 1)))

                      errors.add("address", new ActionMessage(

                                    "error.address.required"));

        }

        return errors;

}


3.配置ActionForm和多个Action映射
当ActionForm 与多个表单对应时,应该把 ActionForm 存放在 session 中,当用户提交第一个表单时,请求由 org.apache.strutsactions.ForwardAction来处理,ForwardAction 类是 Struts 框架内置的 Action 类,他的 execute()方法负责把请求再转发给<action>元素的 parameter 属性指定的 web 组件。当用户提交第 二个表单时,请求被转发给相应的 InsertAction.
struts-config.xml 源代码
 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>

<data-sources />

<form-beans >

    <form-bean name="insertForm" type="com.yourcompany.struts.form.InsertForm" />

</form-beans>

<global-exceptions />

<global-forwards />

<action-mappings >

   <action   path="/insert1"

              parameter="/insertContent_next.jsp"

              type="org.apache.struts.actions.ForwardAction"

              name="insertForm"

              scope="session"

              input="/insertContent.jsp"

              validate="true">

    </action>

    <action   path="/insert2"

              type="com.yourcompany.struts.action.InsertAction"

              name="insertForm"

              scope="session"

              input="/insertContent_next.jsp"

              validate="true">

     </action>

</action-mappings>

<message-resources parameter="com.yourcompany.struts.ApplicationResources" />

</struts-config>

分享到:
评论

相关推荐

    Struts中处理表单跨页提交源代码

    这时,既可以为每一个表单创建一个ActionForm,也可以只创建一个ActionForm,它和多个表单对应。这里讨论如何用一个ActionForm对应表单。 程序完整解释可以到我的空间查看: ...

    跨页提交注册,是一中需要验证的注册和登陆

    例如,`&lt;s:form&gt;`标签用于创建一个Struts表单,`&lt;s:textfield&gt;`标签用于创建输入字段,`&lt;s:submit&gt;`标签用于提交表单等。这些标签可以帮助开发者快速构建动态、交互的注册和登录界面,同时,它们也支持数据验证和...

    struts2令牌解决页面重复提交问题

    在Web开发中,一个常见的问题就是防止用户意外或恶意地重复提交表单,这可能导致数据的不一致性和服务器负载的增加。Struts2提供了一种称为“令牌”或“Token Session”的机制来解决这个问题。 令牌机制的工作原理...

    ajax跨页面提交表单

    点击“添加用户”链接时,通过JavaScript打开了一个新的窗口或标签页到userAdd.jsp页面,在该页面中填写用户信息后提交表单。用户添加操作完成后,通过AJAX请求成功回调,关闭新打开的页面,并刷新user.jsp页面,以...

    Struts2 防重复提交Demo

    2. **提交表单**:用户提交表单时,这个令牌一起发送到服务器。 3. **验证令牌**:Struts2拦截器(如TokenInterceptor)会检查这个令牌,如果令牌存在且未被使用过,那么处理表单请求,否则返回错误页面或重定向。 4...

    填写内容为用户的个人信息,提交后由Struts2进行处理,将用户提交的数据显示在页面中。

    在这个场景中,用户填写的个人信息被用来创建一个表单,该表单的数据随后会被提交到服务器,由Struts2框架接手处理。Struts2的工作流程和涉及的关键知识点如下: 1. **表单数据收集**:用户在前端界面填写个人信息...

    利用struts的token控制重复提交

    Struts的Token机制主要用来防止用户意外或恶意的多次提交表单,例如在刷新页面时重复提交数据。它的工作原理如下: 1. **生成Token**: 当用户访问一个需要防重复提交的表单时,服务器会生成一个唯一的Token并将其...

    通过xml配置搞定Struts重复提交问题

    这个过滤器会在用户提交表单时生成一个唯一的令牌,并将其存储在用户的会话(session)中。当表单被提交时,服务器会检查这个令牌,如果令牌匹配且未被使用过,则处理请求,否则将忽略此次提交。 要实现TokenFilter...

    struts2_token控制刷新重复提交

    客户端在提交表单时会携带这个令牌,服务器端验证令牌的正确性,如果验证通过则处理请求,否则拒绝。 **Struts2中的Token插件** 在Struts2中,Token插件是内建的,它提供了一种简单的方式来实现重复提交的防护。...

    基于Java的Struts表单校验设计源码

    Java是当前广泛使用的编程语言之一,它以其跨平台、面向对象和安全性高等特点,被应用于各种类型的软件开发中。Struts框架是Java的一种MVC架构模式实现,主要应用于Web应用程序的构建。表单校验是Web开发中不可或缺...

    Struts 之旅 - 重复提交 token

    当用户提交表单时,服务器会检查这个 token 是否有效,有效则处理请求,无效则拒绝。 2. **Token存储**:生成的 token 通常会存储在服务器的 session 中,与用户的会话关联。这样,即使用户重复提交,服务器也能...

    struts2token回退刷新

    Struts2 Token回退刷新是一种防止重复提交的安全机制,尤其在处理并发操作和防止 CSRF(跨站请求伪造)攻击时显得尤为重要。Struts2框架提供了一种令牌验证的方式来确保每个表单提交是唯一的,避免了恶意用户通过...

    struts2令牌

    在Web应用程序开发过程中,为了防止重复提交表单或CSRF(跨站请求伪造)等安全问题,Struts2框架提供了一种名为“令牌”的机制。该机制通过在用户会话中存储一个随机生成的唯一值,并在表单提交时验证该值是否有效来...

    struts2 令牌使用例子

    在处理表单提交时,为了防止重复提交或者跨站请求伪造(CSRF)攻击,Struts2引入了令牌机制。这个"struts2 令牌使用例子"是一个很好的实践教程,帮助开发者理解如何在实际应用中实施这一安全策略。 首先,我们需要...

    struts2的token实现.

    当用户提交表单时,服务器会检查提交的Token值是否与Session中的Token值匹配,如果匹配则处理请求,否则视为无效请求并忽略。 ### 二、Struts2 Token插件配置 1. **启用Token插件**:在Struts2的配置文件`struts....

    用form提交打开新页面,类似于支付时候的效果

    2. **Dialog对话框**:在描述中提到的"dialog"可能指的是在提交表单前显示一个确认对话框。在HTML5中,我们可以使用`&lt;dialog&gt;`元素来创建自定义对话框。然而,由于浏览器支持度问题,通常会结合JavaScript库如jQuery...

    Struts网上图书商城

    通常会有一个对应的JSP表单,用户在表单上填写信息后提交。 5. **struts-config.xml**:这是Struts的核心配置文件,定义了Action、ActionForm、ActionMapping以及视图的映射关系。通过这个文件,Struts知道如何处理...

    Struts1.x令牌(Token)的使用.rar

    而Struts1.x的令牌机制(Token)则是防止重复提交、跨页请求攻击的重要手段。在此,我们将深入探讨Struts1.x令牌的使用方法及其背后的原理。 首先,理解为何需要令牌。在Web应用中,用户可能会意外或恶意地多次点击...

    Struts1.x实现防止提交的Token使用示例

    当用户提交表单时,框架会检查这个Token是否有效。 3. **配置Token插件**: 首先,需要在struts-config.xml文件中启用Token插件,配置如下: ```xml &lt;plug-in className="org.apache.struts.action.TokenPlugin...

Global site tag (gtag.js) - Google Analytics