为什么第一次提交表单的时候获取不到action的某些值,而第二次就可以获得。
比如
<form action="xx.action" method="post">
 <input type="text" name="user.name" />
 <input type="text" name="user.pwd" />
 <input type="hidden" name="query" value="zz" />
 <input type="submit" value="submit" />
</form>在action有user的getter,setter。
第一次提交后action中user为空,而query能够获得到zz。但是后退再次提交后user可以获到值,query也可以。这是什么原因?谢谢。

解决方案 »

  1.   

    关于struts2参数绑定问题试验目的主要了解struts2的页面参数与后台类的绑定关系及执行过程.
    测试时间:2012年6月10日
    页面: paramBundle.jsp
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
          <title>Parameters Bundling</title>
      </head>
      <body>
        <h1>Parameters Bundling</h1> <br>
        <s:form action="paramBundle" name="form1" method="post" id="1">
         <s:textfield name="user.name" label="username"></s:textfield>
         <s:textfield name="user.pass" label="password"></s:textfield>
         <s:submit name="submit" type="submit" value="submit"></s:submit>
        </s:form>
      </body>
    </html>
    struts.xml
    <action name="paramBundle" class="com.cnuninet.food.action.ParamBundleAction" >
    <result name="input">/parambundle.jsp</result>
    <result name="success">/parambundleres.jsp</result>
    </action>
    ParamBundleAction.java类
    package com.cnuninet.food.action;import com.cnuninet.food.model.User;
    import com.opensymphony.xwork2.ActionSupport;public class ParamBundleAction extends ActionSupport { private static final long serialVersionUID = 1L;
    private User user; public User getUser() {
    System.out.println(" ParamBundleAction.getUser() is calling.");
    return user;
    } public void setUser(User user) {
    System.out.println(" ParamBundleAction.setUser() is calling.");
    this.user = user;
    } public String execute() throws Exception {
    return SUCCESS;
    }
    }User.java类
    package com.cnuninet.food.model;public class User {
    private String name;
    private String pass; public String getName() {
    System.out.println(" User.getName() is calling.");
    return name;
    } public void setName(String name) {
    System.out.println(" User.setName() is calling.");
    this.name = name;
    } public String getPass() {
    System.out.println(" User.getPass() is calling.");
    return pass;
    } public void setPass(String pass) {
    System.out.println(" User.setPass() is calling.");
    this.pass = pass;
    }
    }页面: paramBundleRes.jsp
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head> 
        <title>Parameters Bundling</title>
      </head>
      <body>
        <h1>Parameters testing for Bundling to Action</h1> <br>
        <h2><label>username:</label>${user.name}</h2>
        <h2><label>password:</label>${user.pass}</h2>
      </body>
    </html>
    执行流程:
     Step1. ParamBundleAction.getUser() is calling.  Step2. ParamBundleAction.setUser() is calling. 
     Step3. User.setName() is calling.
     Step4. ParamBundleAction.getUser() is calling.
     Step5. User.setPass() is calling. Step6. ParamBundleAction.getUser() is calling.
     Step7. User.getName() is calling.
     Step8. ParamBundleAction.getUser() is calling.
     Step9. User.getPass() is calling.
      

  2.   


    基于你的问题,完整代码实现为什么第一次提交表单的时候获取不到action的某些值,而第二次就可以获得。
    比如
    <form action="xx.action" method="post">
     <input type="text" name="user.name" />
     <input type="text" name="user.pwd" />
     <input type="hidden" name="query" value="zz" />
     <input type="submit" value="submit" />
    </form>完整代码如下:页面: paramBundle.jsp
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
          <title>Parameters Bundling</title>
      </head>
      <body>
        <h1>Parameters Bundling</h1> <br>
        <s:form action="paramBundle" name="form1" method="post" id="1">
         <s:textfield name="user.name" label="username"></s:textfield>
         <s:textfield name="user.pass" label="password"></s:textfield>
         <s:textfield name="query" label="query"></s:textfield>
         <s:submit name="submit" type="submit" value="submit"></s:submit>
        </s:form>
      </body>
    </html>
    struts.xml
    <action name="paramBundle" class="com.cnuninet.food.action.ParamBundleAction" >
    <result name="input">/parambundle.jsp</result>
    <result name="success">/parambundleres.jsp</result>
    </action>
    ParamBundleAction.java类
    package com.cnuninet.food.action;import com.cnuninet.food.model.User;
    import com.opensymphony.xwork2.ActionSupport;public class ParamBundleAction extends ActionSupport { private static final long serialVersionUID = 1L;
    private User user;
    private String query; public String getQuery() {
    return query;
    } public void setQuery(String query) {
    this.query = query;
    } public User getUser() {
    System.out.println(" ParamBundleAction.getUser() is calling.");
    return user;
    } public void setUser(User user) {
    System.out.println(" ParamBundleAction.setUser() is calling.");
    this.user = user;
    } public String execute() throws Exception {
    return SUCCESS;
    }
    }
    User.java类
    package com.cnuninet.food.model;public class User {
    private String name;
    private String pass; public String getName() {
    System.out.println(" User.getName() is calling.");
    return name;
    } public void setName(String name) {
    System.out.println(" User.setName() is calling.");
    this.name = name;
    } public String getPass() {
    System.out.println(" User.getPass() is calling.");
    return pass;
    } public void setPass(String pass) {
    System.out.println(" User.setPass() is calling.");
    this.pass = pass;
    }
    }
    页面: paramBundleRes.jsp
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head> 
        <title>Parameters Bundling</title>
      </head>
      <body>
        <h1>Parameters testing for Bundling to Action</h1> <br>
        <h2><label>username:</label>${user.name}</h2>
    <h2><label>password:</label>${user.pass}</h2>
    <h2><label>password:</label>${query}</h2>
      </body>
    </html>
      

  3.   

    <form action="xx.action" method="post">
    <input type="text" name="user.name" />
    <input type="text" name="user.pwd" />
    private String name;
    private String pass;
      

  4.   

    这是不可能的,只要有对应的get和set,还有确定输入值就会有值,你这边肯定出问题了
      

  5.   

    难道是第一次提交的时候, json化 user 为null, 第二次才有值?
    你把那个请求数据拦截到,看下。firefox 就行,看下post 的数据到底是什么样子