struts2 anction使用DomainModel接收参数为空,在action中的set方法中打印发现,对象被创建多次,次数跟参数个数一样,参数都被设置到了不同的对象中,问各路大神这个问题如何解决?strutsDomainModel
解决方案 »
- struts2 xml文件有红叉错误。但运行不影响。可不好看,谁有解决办法?
- James 注册用户如何通过WEB页面的形式添加用户
- JSP新手,数据库文本格式输出问题
- 紧急求助!
- 发布一个基于JS的仿window的JAVA CMS管理系统
- 请教一个关于javascript在表格中增加一行的问题
- 怎样把eclipse和tomcat整合
- spring,hibernate,struts的权限树
- 为什么我每次在按下被定义为<html:cancel>标签的按钮后,效果同<html:submit>
- 请教一下 字节流和字符流 有什么区别? 流的输出 字节和字符有什么区别?比如 int 7 这个数是字符还是字节?
- JS里关于&符号的问题
- 请教个DIV问题
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;
}
}
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.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;
}为什么武断的说错了呢?
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.属性值
可能是你一直按标准来写,所以没遇到,就像我之前一样。。
我就较真下吧。。
新建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,传值不成功..
我就较真下吧。。
新建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,哈哈
唉,,获取您认同还真不容易.
本来我也不知道这个问题,因为一般都是习惯性的自动生成get,set方法。。
这段时间项目中用json插件,
又懒虫发错,不想在Struts配置文件中配置excludeProperties<param name="excludeProperties">
................
</param>于是就自以为是的把不想输出json的属性对应的get方法都拿掉,,
结果可想而知.............