当前位置:编程学习 > JAVA >>

struts2 anction使用DomainModel接收参数为空

struts2  anction使用DomainModel接收参数为空,在action中的set方法中打印发现,对象被创建多次,次数跟参数个数一样,参数都被设置到了不同的对象中,问各路大神这个问题如何解决? struts DomainModel --------------------编程问答-------------------- 很好。。。。。。。。。。。。。。 --------------------编程问答-------------------- 代码,声明对象的代码,放在for循环里面了吗? --------------------编程问答--------------------
引用 2 楼 fangmingshijie 的回复:
代码,声明对象的代码,放在for循环里面了吗?

声明对象没有放在循环里,我想知道是不是struts2把user.name和user.pasw中的user当成了不同的对象?该如何修改? --------------------编程问答-------------------- 代码发上来,对应的页面一起。 --------------------编程问答--------------------
引用 4 楼 fangmingshijie 的回复:
代码发上来,对应的页面一起。

页面是extjs的 ,在firebug 里面调试的post请求为
question.content 232
question.num 1
question.questionNo 2
question.type 12
源代码
question.num=1&question.questionNo=2&question.content=232&question.type=12

对应action为
public class QuestionAction{


private Question quest;

int i;


public void addQuestion() throws IOException{
           //...
}



public void setQuestion(Question quest) {
i++;
System.out.println(i);
System.out.println(quest);
this.quest = quest;
}

}

--------------------编程问答-------------------- &都改为&看下 --------------------编程问答--------------------
引用 6 楼 fangmingshijie 的回复:
&都改为&看下

这个是extjs  form.submit的时候发送请求,自己没法改,以前也是用这个做的,没问题,结果今天这个就是搞不懂了。。。郁闷~ --------------------编程问答-------------------- 我碰到了和楼主一样的问题。。好像Struts2突然抽风了一样。。太奇怪了 --------------------编程问答-------------------- 找到原因了,楼主没有写question的get方法 --------------------编程问答--------------------

引用 5 楼 emf1002 的回复:
Quote: 引用 4 楼 fangmingshijie 的回复:

代码发上来,对应的页面一起。

页面是extjs的 ,在firebug 里面调试的post请求为
question.content 232
question.num 1
question.questionNo 2
question.type 12
源代码
question.num=1&question.questionNo=2&question.content=232&question.type=12

对应action为
public class QuestionAction{


private Question quest;

int i;


public void addQuestion() throws IOException{
           //...
}



public void setQuestion(Question quest) {
i++;
System.out.println(i);
System.out.println(quest);
this.quest = quest;
}

}


使用strut2你得知道以下几个规范
1.private Question quest;这个变量名需要和你的set/get(如果只是从页面获取值get不写也行,楼上说的不对)要一致,你的变量叫quest而set方法却是setQuestion这不行,要写成setQuest
2,想要用struts2从页面向JAVA传值,那么页面的参数名字与变量名也要一致你的页面参数叫question.content而java里却是叫quest肯定接不到值的
把上面两个地方都修改一致了再说吧 --------------------编程问答--------------------
引用 10 楼 xxjxxmxhlr 的回复:
Quote: 引用 5 楼 emf1002 的回复:

Quote: 引用 4 楼 fangmingshijie 的回复:

代码发上来,对应的页面一起。

页面是extjs的 ,在firebug 里面调试的post请求为
question.content 232
question.num 1
question.questionNo 2
question.type 12
源代码
question.num=1&question.questionNo=2&question.content=232&question.type=12

对应action为
public class QuestionAction{


private Question quest;

int i;


public void addQuestion() throws IOException{
           //...
}



public void setQuestion(Question quest) {
i++;
System.out.println(i);
System.out.println(quest);
this.quest = quest;
}

}


使用strut2你得知道以下几个规范
1.private Question quest;这个变量名需要和你的set/get(如果只是从页面获取值get不写也行,楼上说的不对)要一致,你的变量叫quest而set方法却是setQuestion这不行,要写成setQuest
2,想要用struts2从页面向JAVA传值,那么页面的参数名字与变量名也要一致你的页面参数叫question.content而java里却是叫quest肯定接不到值的
把上面两个地方都修改一致了再说吧


请看清楚楼主的问题在于前台提交的参数question.xxx=**&question.xxx=**到action,
action里调用了setQuestion多次,请看清楚问题的症结,
究其原因是没有写相应的getQuestion方法,导致多次赋值,
不按规范加上下面的代码其实也可以实现不是吗?

public Question getQuestion(Question quest) {
        return this.quest;
}

为什么武断的说错了呢? --------------------编程问答-------------------- public class QuestionAction{
     
     
    private Question quest;
     
    int i;
     
   
    public void addQuestion() throws IOException{
           //...
    }
     
     
   //下面是不正确的,setQuestion改为setQuest
    public void setQuestion(Question quest) {
        i++;
        System.out.println(i);
        System.out.println(quest);
        this.quest = quest;
    }
     
}



注意在页面上传值的时候,是否设置了quest.属性值 --------------------编程问答--------------------
引用 11 楼 zxzxvv 的回复:
请看清楚楼主的问题在于前台提交的参数question.xxx=**&question.xxx=**到action,
action里调用了setQuestion多次,请看清楚问题的症结,
究其原因是没有写相应的getQuestion方法,导致多次赋值,
不按规范加上下面的代码其实也可以实现不是吗?

public Question getQuestion(Question quest) {
        return this.quest;
}

为什么武断的说错了呢?

好吧,楼主不按照标准来写确实不是硬伤,个人习惯问题而已,我强调一下是希望他能规范以免有别的乱子,既然你非得纠结与此那先不说这个,至于不写get会造成多次赋值这种说法我却不能苟同了,我这么写过的次数实在不少貌似人品好的缘故从没发生过楼主这样的问题,不知这位仁兄做和解释呢,所以个人还要武断的说是错的 --------------------编程问答--------------------
引用 13 楼 xxjxxmxhlr 的回复:
Quote: 引用 11 楼 zxzxvv 的回复:

请看清楚楼主的问题在于前台提交的参数question.xxx=**&question.xxx=**到action,
action里调用了setQuestion多次,请看清楚问题的症结,
究其原因是没有写相应的getQuestion方法,导致多次赋值,
不按规范加上下面的代码其实也可以实现不是吗?

public Question getQuestion(Question quest) {
        return this.quest;
}

为什么武断的说错了呢?

好吧,楼主不按照标准来写确实不是硬伤,个人习惯问题而已,我强调一下是希望他能规范以免有别的乱子,既然你非得纠结与此那先不说这个,至于不写get会造成多次赋值这种说法我却不能苟同了,我这么写过的次数实在不少貌似人品好的缘故从没发生过楼主这样的问题,不知这位仁兄做和解释呢,所以个人还要武断的说是错的


哥们,说你武断你能做个测试么,,
可能是你一直按标准来写,所以没遇到,就像我之前一样。。
--------------------编程问答--------------------
引用 13 楼 xxjxxmxhlr 的回复:
好吧,楼主不按照标准来写确实不是硬伤....


我就较真下吧。。
新建Web项目,目录如下图


user.java代码

package com.zxzxvv.po;
public class User {
private int userId;
private String userName;

public int getUserId() {
return userId;
}
public String getUserName() {
return userName;
}
public void setUserId(int userId) {
this.userId = userId;
}
public void setUserName(String userName) {
this.userName = userName;
}
}



struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="false" />
    <constant name="struts.custom.i18n.resources" value="utf-8"/>
    <package name="default" namespace="/" extends="struts-default">
        <default-action-ref name="index" />
        <global-results>
            <result name="error">/error.jsp</result>
        </global-results>
        <global-exception-mappings>
            <exception-mapping exception="java.lang.Exception" result="error"/>
        </global-exception-mappings>
        
        <action name="userAction_*" class="com.zxzxvv.action.UserAction" method="{1}">
            <result name="success">/index.jsp</result>
        </action>
    </package>
</struts>


index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<base href="<%=basePath%>" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
<title>测试</title>
</head>

<body>
<form action="userAction_doSomethingAction.action" method="post">
<input name="user.userId" type="text" />
<input name="user.userName" type="text" />
<input type="submit" value="提交"/>
</form>
</body>
</html>


UserAction代码

package com.zxzxvv.action;

import com.opensymphony.xwork2.ActionSupport;
import com.zxzxvv.po.User;

public class UserAction extends ActionSupport{

private static final long serialVersionUID = 1L;

private User user;

public String doSomethingAction(){
System.out.println("---------------------------");
System.out.println(user.getUserId());
System.out.println(user.getUserName());
System.out.println("---------------------------");
return SUCCESS;
}

public void setUser(User user) {
System.out.println("调用了set方法");
this.user = user;
}

public User getUser() {
System.out.println("调用了get方法");
return user;
}
}


开始测试:
前台点击提交


提交的数据


后台打印结果


发现,用DomainModel,对象名.属性 提交的时候,
UserAction中getUser方法被调用了3次,
分析原理可能是,
1.struts调用getUser看user对象是否存在,不存在则创建
2.获取创建好的user,赋值userid
3.获取创建好的user,赋值username

到这里其实觉得这个测试已经没必要继续下去了,
不过为了本人难得的“较真”,

下面继续,注释掉getUser方法

package com.zxzxvv.action;

import com.opensymphony.xwork2.ActionSupport;
import com.zxzxvv.po.User;

public class UserAction extends ActionSupport{

private static final long serialVersionUID = 1L;

private User user;

public String doSomethingAction(){
System.out.println("---------------------------");
System.out.println(user.getUserId());
System.out.println(user.getUserName());
System.out.println("---------------------------");
return SUCCESS;
}

public void setUser(User user) {
System.out.println("调用了set方法");
this.user = user;
}

// public User getUser() {
// System.out.println("调用了get方法");
// return user;
// }
}


前台填写的数据


后台打印的结果


结果很明显,调用了多次set方法,userId的值为0,传值不成功.. --------------------编程问答--------------------
引用 15 楼 zxzxvv 的回复:
Quote: 引用 13 楼 xxjxxmxhlr 的回复:

好吧,楼主不按照标准来写确实不是硬伤....


我就较真下吧。。
新建Web项目,目录如下图


user.java代码

package com.zxzxvv.po;
public class User {
private int userId;
private String userName;

public int getUserId() {
return userId;
}
public String getUserName() {
return userName;
}
public void setUserId(int userId) {
this.userId = userId;
}
public void setUserName(String userName) {
this.userName = userName;
}
}



struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="false" />
    <constant name="struts.custom.i18n.resources" value="utf-8"/>
    <package name="default" namespace="/" extends="struts-default">
        <default-action-ref name="index" />
        <global-results>
            <result name="error">/error.jsp</result>
        </global-results>
        <global-exception-mappings>
            <exception-mapping exception="java.lang.Exception" result="error"/>
        </global-exception-mappings>
        
        <action name="userAction_*" class="com.zxzxvv.action.UserAction" method="{1}">
            <result name="success">/index.jsp</result>
        </action>
    </package>
</struts>


index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<base href="<%=basePath%>" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
<title>测试</title>
</head>

<body>
<form action="userAction_doSomethingAction.action" method="post">
<input name="user.userId" type="text" />
<input name="user.userName" type="text" />
<input type="submit" value="提交"/>
</form>
</body>
</html>


UserAction代码

package com.zxzxvv.action;

import com.opensymphony.xwork2.ActionSupport;
import com.zxzxvv.po.User;

public class UserAction extends ActionSupport{

private static final long serialVersionUID = 1L;

private User user;

public String doSomethingAction(){
System.out.println("---------------------------");
System.out.println(user.getUserId());
System.out.println(user.getUserName());
System.out.println("---------------------------");
return SUCCESS;
}

public void setUser(User user) {
System.out.println("调用了set方法");
this.user = user;
}

public User getUser() {
System.out.println("调用了get方法");
return user;
}
}


开始测试:
前台点击提交


提交的数据


后台打印结果


发现,用DomainModel,对象名.属性 提交的时候,
UserAction中getUser方法被调用了3次,
分析原理可能是,
1.struts调用getUser看user对象是否存在,不存在则创建
2.获取创建好的user,赋值userid
3.获取创建好的user,赋值username

到这里其实觉得这个测试已经没必要继续下去了,
不过为了本人难得的“较真”,

下面继续,注释掉getUser方法

package com.zxzxvv.action;

import com.opensymphony.xwork2.ActionSupport;
import com.zxzxvv.po.User;

public class UserAction extends ActionSupport{

private static final long serialVersionUID = 1L;

private User user;

public String doSomethingAction(){
System.out.println("---------------------------");
System.out.println(user.getUserId());
System.out.println(user.getUserName());
System.out.println("---------------------------");
return SUCCESS;
}

public void setUser(User user) {
System.out.println("调用了set方法");
this.user = user;
}

// public User getUser() {
// System.out.println("调用了get方法");
// return user;
// }
}


前台填写的数据


后台打印的结果


结果很明显,调用了多次set方法,userId的值为0,传值不成功..

哟,居然会是这样看来Struts2的机制还是有好多东西需要学啊,待会我也试试,学习了3Q,哈哈 --------------------编程问答--------------------
引用 16 楼 xxjxxmxhlr 的回复:
哟,居然会是这样看来Struts2的机制还是有好多东西需要学啊,待会我也试试,学习了3Q,哈哈


唉,,获取您认同还真不容易.
本来我也不知道这个问题,因为一般都是习惯性的自动生成get,set方法。。
这段时间项目中用json插件,
又懒虫发错,不想在Struts配置文件中配置excludeProperties

<param name="excludeProperties">
................
</param>

于是就自以为是的把不想输出json的属性对应的get方法都拿掉,,
结果可想而知.............
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,