ssh框架无法获得页面传入的值

小洛打酱油 2010-07-02 09:07:58
我的页面代码是这样的:

<html>
<head>
<title>公告添加</title>
</head>
<s:head/>
<body>
<h5 align="center">添加公告</h5>
<table align="center" border="1" width="40%">
<center>
<s:form action="dormNoticeControl!addNotice.action" >


<s:textfield name="dormNoticeinfo.title" label="公告题目"/>
<s:textfield name="dormNoticeinfo.type" label="公告类型"/>
<s:textarea name="dormNoticeinfo.content" rows="5" cols="20" label="公告内容"/>
<s:textfield name="dormNoticeinfo.issuer" label="发布人"/>
<s:textfield name="dormNoticeinfo.published" label="发布时间"/>

<tr>
<td colspan="2" align="center">
<s:submit theme="simple" value="保存"/>
<s:reset theme="simple" value="重置"/>
</td>
</tr>
</s:form>
</center>
</table>
</body>
</html>


DAO里的代码是这样的:

public void addNotice(AbstractdormNoticeInfo dormNoticeinfo) { //添加新的公告
Session session=getSession();
Transaction tra=session.beginTransaction();
System.out.println("dormNotice="+dormNoticeinfo);
session.save(dormNoticeinfo);
tra.commit();
session.close();

}


运行结果报错如下:

dormNotice=null
2010-7-4 9:00:38 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet default threw exception
java.lang.IllegalArgumentException: attempt to create saveOrUpdate event with null entity
at org.hibernate.event.SaveOrUpdateEvent.<init>(SaveOrUpdateEvent.java:40)
at org.hibernate.event.SaveOrUpdateEvent.<init>(SaveOrUpdateEvent.java:23)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:518)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:514)
at com.txsm.crm.dao.impl.DormNoticeDAO.addNotice(DormNoticeDAO.java:20)
at com.txsm.crm.service.impl.DormService.addNotice(DormService.java:22)
at com.txsm.crm.action.DormNoticeAction.addNotice(DormNoticeAction.java:34)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)

...全文
545 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
这个就不太明白了,主要我常使用struts2一般都用的多例做,単例很少,所以只能凭经验说这些
小洛打酱油 2010-07-02
  • 打赏
  • 举报
回复
我想你的那个原子性的问题可能对我的用户注册登陆更有帮助
我添加可以了
我把实体类重新反转了
不过删除修改还是不行的
然后我的登陆遇到的新问题是:注册新的用户后用新用户可以登陆
但是用以前注册的用户却不可以
头疼啊!!!
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 jeffgao9696 的回复:]
同意fan578,应该就是这个问题,我也跟楼主碰到是同样的问题,查了半天大家都说的跟fan578差不多,但是就是不知道怎么解决。
[/Quote]
就是在你spring配置action的bean中加上scope=“protype”(原子性),默认是singlton
jeffgao9696 2010-07-02
  • 打赏
  • 举报
回复
同意fan578,应该就是这个问题,我也跟楼主碰到是同样的问题,查了半天大家都说的跟fan578差不多,但是就是不知道怎么解决。
  • 打赏
  • 举报
回复
那就说明,你的action是単例的,在spring容器创建时候就实例化了你的action。你在你的sping配置文件的中,给这个action 加上个scope="protype",不知道是不值这样拼写的,你去看看怎么
<bean id= "dormNoticeAction " class= "com.txsm.crm.action.DormNoticeAction " scope="protype",protype不知道写对没有,你去看看spring的bean的原子性
小洛打酱油 2010-07-02
  • 打赏
  • 举报
回复
控制台的set方法没有运行到
小洛打酱油 2010-07-02
  • 打赏
  • 举报
回复
我加了System 语句

public AbstractdormNoticeInfo getDormNoticeinfo() {
System.out.print("这里是否成功运行到????? get方法 ");
return dormNoticeinfo;

}
public void setDormNoticeinfo(AbstractdormNoticeInfo dormNoticeinfo) {
this.dormNoticeinfo = dormNoticeinfo;
System.out.print("这里是否成功运行到????? set方法");
}


结果控制台打印出:

信息: Server startup in 7167 ms
这里是否成功运行到????? get方法 这里是否成功运行到????? get方法 这里是否成功运行到????? get方法 这里是否成功运行到????? get方法 这里是否成功运行到????? get方法 这里是否成功运行到????? get方法 在action里的dormNotice=null
这里是否成功运行到????? get方法 sessionFactory=org.hibernate.impl.SessionFactoryImpl@106bde8
dormNotice=null
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 lt870730439 的回复:]
引用 10 楼 fan578 的回复:
dormNoticeinfo有get 和set方法吗?如果有,把public void addNotice(AbstractdormNoticeInfo dormNoticeinfo)改成public void addNotice()看看!

应该不是 DAO里的问题吧
action里就没有获得数据啊



引用 11 楼 huniu505 ……
[/Quote]

看你的action是不是单例的,如果是的话,你在前面执行该action时候,是否有给dormNoticeinfo注入值,如果没有,你又使用的是单例,那么就很有可能是你的action已经实例化了,后面再执行add时候,调用已经实例化的action,而实例化的时候又没有给dormNoticeinfo注入值。所以出错
你的action是用spring管理的吧,spring对于实例化有単例和多例的说话,楼主懂不?
小洛打酱油 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 fan578 的回复:]
dormNoticeinfo有get 和set方法吗?如果有,把public void addNotice(AbstractdormNoticeInfo dormNoticeinfo)改成public void addNotice()看看!
[/Quote]
应该不是 DAO里的问题吧
action里就没有获得数据啊


[Quote=引用 11 楼 huniu505 的回复:]
你看看 是不是实体类中的某些属性没有给附上值 在 session.save(dormNoticeinfo)加个断点 。感觉是你给数据库大的某个属性负上空值了
[/Quote]
我好象不会什么加断点调试的
  • 打赏
  • 举报
回复
如果有的话,你在
public void setDormNoticeinfo(AbstractdormNoticeInfo dormNoticeinfo) {
this.dormNoticeinfo = dormNoticeinfo;
}
设置断点,看是否执行,还有看你的action是不是单例的,如果是的话,你在前面执行该action时候,是否有给dormNoticeinfo注入值,如果没有,你又使用的是单例,那么就很有可能是你的action已经实例化了,后面再执行add时候,调用已经实例化的action,而实例化的时候又没有给dormNoticeinfo注入值。所以出错
个人猜测,不知道对不
冰天水月 2010-07-02
  • 打赏
  • 举报
回复
你看看 是不是实体类中的某些属性没有给附上值 在 session.save(dormNoticeinfo)加个断点 。感觉是你给数据库大的某个属性负上空值了
  • 打赏
  • 举报
回复
public void addNotice(AbstractdormNoticeInfo dormNoticeinfo) { //添加新的公告
Session session=getSession();
Transaction tra=session.beginTransaction();
System.out.println("dormNotice="+dormNoticeinfo);
session.save(dormNoticeinfo);
tra.commit();
session.close();

}


dormNoticeinfo有get 和set方法吗?如果有,把public void addNotice(AbstractdormNoticeInfo dormNoticeinfo)改成public void addNotice()看看!
小洛打酱油 2010-07-02
  • 打赏
  • 举报
回复
这是我的action类:

package com.txsm.crm.action;
public class DormNoticeAction extends ActionSupport {

protected AbstractdormNoticeInfo dormNoticeinfo;// 实体类

protected IDormService dormService;

public String execute() throws Exception {
return null;
}


public String addNotice() throws Exception { //添加公告
System.out.println("在action里的dormNotice="+this.getDormNoticeinfo());
dormService.addNotice(this.getDormNoticeinfo());

return SUCCESS;
}

public String deleteNotice() throws Exception { //删除公告
HttpServletRequest request=ServletActionContext.getRequest();

String strId=request.getParameter("id");
int id=Integer.parseInt(strId);
System.out.println("id="+id);
//dormNoticeinfo.setId(id);
//System.out.println("dormNoticeinfo="+dormNoticeinfo.toString());
//dormService.deleteNotice(dormNoticeinfo);
dormService.deleteNotice(id);
return SUCCESS;
}

public String preupdateNotice() throws Exception{ // 修改公告预处理
HttpServletRequest request=ServletActionContext.getRequest();
String strId=request.getParameter("id");

if(strId==null){
return ERROR;
}
else{
int id=Integer.parseInt(strId);
System.out.print("id="+id);
List list=new ArrayList();
list=dormService.selectNotice(id);
if(list.size()>0){
ActionContext act=ActionContext.getContext();
Map map=act.getSession();
map.put("updateNotice", list);
}
else return ERROR;
}

return "update";

}
public String updateNotice() throws Exception{

HttpServletRequest request=ServletActionContext.getRequest();
String strId=request.getParameter("id");
int id=0;
if(strId==null){
return ERROR;
}
else{
id=Integer.parseInt(strId);
}
dormNoticeinfo.setId(id);
dormService.updateNotice(dormNoticeinfo);


return SUCCESS;
}

public String selectNotice() throws Exception { //查询最新公告

List list=new ArrayList();

list=dormService.selectNotice(dormNoticeinfo);

if(list.size()>0){

ActionContext act=ActionContext.getContext();
Map map=act.getSession();
map.put("newNotice", list);
}
else{
return ERROR;
}

return "select";
}


//下面是get set方法
public AbstractdormNoticeInfo getDormNoticeinfo() {
return dormNoticeinfo;
}


public void setDormNoticeinfo(AbstractdormNoticeInfo dormNoticeinfo) {
this.dormNoticeinfo = dormNoticeinfo;
}


public IDormService getDormService() {
return dormService;
}


public void setDormService(IDormService dormService) {
this.dormService = dormService;
}




}


小洛打酱油 2010-07-02
  • 打赏
  • 举报
回复
老大们!!
我有get 和 set 方法啊
happyfmy 2010-07-02
  • 打赏
  • 举报
回复
at com.txsm.crm.dao.impl.DormNoticeDAO.addNotice(DormNoticeDAO.java:20)
at com.txsm.crm.service.impl.DormService.addNotice(DormService.java:22)
at com.txsm.crm.action.DormNoticeAction.addNotice(DormNoticeAction.java:34)


看看出错信息找原因


hougq 2010-07-02
  • 打赏
  • 举报
回复
来晚了

同意楼上
Java技术栈 2010-07-02
  • 打赏
  • 举报
回复
在action类中提供模型驱动啊

private DormNoticeinfo dormNoticeinfo;

再提供setter方法
izard999 2010-07-02
  • 打赏
  • 举报
回复
检查下 action中的属性是否有get/set,然后看看你是否添加了自己的拦截器之后把默认的拦截器栈忘记了
amos1989 2010-07-02
  • 打赏
  • 举报
回复
首先你要在后台定义一个 dormNoticeinfo 对他提供setter()

而且要保证.dormNoticeinfo他的类的属性都有getter setter方法..

struts2获取页面的值,他是根据属性的setter()注入的.
zzh200411 2010-07-02
  • 打赏
  • 举报
回复
是不是没写set/get方法?
加载更多回复(1)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧