`
lishenjie
  • 浏览: 3113 次
  • 性别: 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代码 复制代码
  1. <html:form action="/insert1.do">  
  2.   
  3.        <html:hidden property="page" value="1" />省略. . . . . .   
  4.   
  5. </html:form>  
  6.   
  7. insertContent_next.jsp类似:   
  8.   
  9.     <html:form action="/insert2.do">  
  10.   
  11.        <html:hidden property="page" value="2" />省略. . . . . .   
  12.   
  13.     </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();

完整代码如下:

Java代码 复制代码
  1. public void reset(ActionMapping mapping, HttpServletRequest request) {   
  2.   
  3.        //根据“page”的值处理不同的字段   
  4.   
  5.        int numPage = 0;   
  6.   
  7.          try {   
  8.   
  9.                numPage = new Integer(request.getParameter("page")).intValue();   
  10.   
  11.          } catch (Exception e){}   
  12.   
  13.          if (numPage == 1){name = null;   
  14.   
  15.                 phone = null;}   
  16.   
  17.          if (numPage == 2){ address = null;}   
  18.   
  19.          page = null;   
  20.   
  21.     }  


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

Java代码 复制代码
  1. public ActionErrors validate(ActionMapping mapping,   
  2.   
  3.            HttpServletRequest request) {   
  4.   
  5.        ActionErrors errors = new ActionErrors();   
  6.   
  7.         int numPage = 0;   
  8.   
  9.         try{   
  10.   
  11.                numPage = new Integer(page).intValue();   
  12.   
  13.         } catch (Exception e){   
  14.   
  15.         }   
  16.   
  17.         if (numPage == 1){   
  18.   
  19.                if (((name == null) || (name.length() < 1)))   
  20.   
  21.                       errors.add("name"new ActionMessage("error.name.required"));   
  22.   
  23.                if (((phone == null) || (phone.length() < 1)))   
  24.   
  25.                       errors.add("phone"new ActionMessage("error.phone.required"));   
  26.   
  27.         }   
  28.   
  29.         if (numPage == 2) {   
  30.   
  31.                if (((address == null) || (address.length() < 1)))   
  32.   
  33.                       errors.add("address"new ActionMessage(   
  34.   
  35.                                     "error.address.required"));   
  36.   
  37.         }   
  38.   
  39.         return errors;   
  40.   
  41. }  



3.配置ActionForm和多个Action映射
当ActionForm 与多个表单对应时,应该把 ActionForm 存放在 session 中,当用户提交第一个表单时,请求由 org.apache.strutsactions.ForwardAction来处理,ForwardAction 类是 Struts 框架内置的 Action 类,他的 execute()方法负责把请求再转发给<action>元素的 parameter 属性指定的 web 组件。当用户提交第 二个表单时,请求被转发给相应的 InsertAction.
struts-config.xml 源代码

Xml代码 复制代码
  1.  <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">  
  3.   
  4. <struts-config>  
  5.   
  6. <data-sources />  
  7.   
  8. <form-beans >  
  9.   
  10.     <form-bean name="insertForm" type="com.yourcompany.struts.form.InsertForm" />  
  11.   
  12. </form-beans>  
  13.   
  14. <global-exceptions />  
  15.   
  16. <global-forwards />  
  17.   
  18. <action-mappings >  
  19.   
  20.    <action   path="/insert1"  
  21.   
  22.               parameter="/insertContent_next.jsp"  
  23.   
  24.               type="org.apache.struts.actions.ForwardAction"  
  25.   
  26.               name="insertForm"  
  27.   
  28.               scope="session"  
  29.   
  30.               input="/insertContent.jsp"  
  31.   
  32.               validate="true">  
  33.   
  34.     </action>  
  35.   
  36.     <action   path="/insert2"  
  37.   
  38.               type="com.yourcompany.struts.action.InsertAction"  
  39.   
  40.               name="insertForm"  
  41.   
  42.               scope="session"  
  43.   
  44.               input="/insertContent_next.jsp"  
  45.   
  46.               validate="true">  
  47.   
  48.      </action>  
  49.   
  50. </action-mappings>  
  51.   
  52. <message-resources parameter="com.yourcompany.struts.ApplicationResources" />  
  53.   
  54. </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插件是内建的,它提供了一种简单的方式来实现重复提交的防护。...

    Struts 之旅 - 重复提交 token

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

    struts2token回退刷新

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

    struts2的token实现.

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

    struts2令牌

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

    struts2 令牌使用例子

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

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

    struts1_详解

    当用户提交表单后,请求会经过以下步骤: 1. **ActionServlet**:接收请求并解析请求参数。 2. **ActionMapping**:根据配置文件找到对应的Action。 3. **ActionForm**:封装表单数据。 4. **Action**:执行业务...

Global site tag (gtag.js) - Google Analytics