前一段时间整合struts2,spring,hibernate三个框架的时候主要还是学习,基本上action里就一个execute方法,然后所有的增删改查都放在execute方法里,完全梅雨哦问题。
最近,又再做一个稍微大的,由于action里功能需求多,就基本用动态执行action里的方法,就是通过“具体action名字!具体方法.action”的方式访问action里的方法,然后返回一个对应的字符串返回值,再跳转到对应页面或已经申明的action。
这样做后,我发现思路的确比较清晰了,但是当执行信息更新时候,页面提交的值在执行对应update()方法前所有的字段都是获取不到的。
我推测:之前在执行execute方法时候会自动执行属性的setter和getter方法,而自己定义的update方法不会这么做。
请问:我该如何做呢,总不该每次在update方法里再通过request.getParameter()方法把每个字段获取出来然后再更新吧
最近,又再做一个稍微大的,由于action里功能需求多,就基本用动态执行action里的方法,就是通过“具体action名字!具体方法.action”的方式访问action里的方法,然后返回一个对应的字符串返回值,再跳转到对应页面或已经申明的action。
这样做后,我发现思路的确比较清晰了,但是当执行信息更新时候,页面提交的值在执行对应update()方法前所有的字段都是获取不到的。
我推测:之前在执行execute方法时候会自动执行属性的setter和getter方法,而自己定义的update方法不会这么做。
请问:我该如何做呢,总不该每次在update方法里再通过request.getParameter()方法把每个字段获取出来然后再更新吧
但就是不行,把update方法搬到execute方法里之后就可以了,问题还是那个问题,郁闷ing
<%@ page language="java" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>用户信息修改</title> <meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
--> </head>
<s:fielderror cssStyle="color:red"/>
<body style="text-align: center;">
<h2>
<font color="blue">用户信息修改</font>
</h2>
<s:form action="user!update">
<s:hidden name="user.id" />
<s:textfield name="user.accountNo" label="用户名"/>
<s:textfield name="user.name" label="真实姓名"/>
<s:radio name="user.sex" list="#{'1':'男','0':'女'}" label="性别"/>
<s:textfield name="user.phone" label="联系方式"/>
<s:textfield name="user.email" label="电子邮件"/>
<s:radio name="changePwd" list="#{'1':'是','0':'否'}" value="0" label="修改密码"/>
<s:hidden name="user.password"/>
<s:password name="oldPassword" label="旧密码"/>
<s:password name="newPassword" label="新密码"/>
<s:password name="rePassword2" label="确认密码"/>
<s:hidden name="user.valid"/>
<s:hidden name="user.orders"/>
<br />
<s:submit value="保 存 更 新" align="center"></s:submit>
</s:form>
</body>
</html>
UserAction.java代码:
package com.ordertickets.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;
import com.ordertickets.manager.UserManager;
import com.ordertickets.po.UserPO;
import com.ordertickets.service.UserService;
import com.ordertickets.vo.UserVO;@SuppressWarnings({"serial","unchecked"})
public class UserAction extends ActionSupport
{
private UserPO user;
private UserVO userVO;
private String rePassword;
private UserService userService;
private HttpServletRequest request;
private HttpSession session;
private int changePwd;
private String newPassword;
private String rePassword2;
UserManager userManager=new UserManager();
//新用户注册
public String regist()
{
UserPO u=userService.findByNo(user.getAccountNo());
if(u!=null)
{
getActionErrors().add("您注册的用户名已存在!");
return "regist_failure";
}
user.setOrders(null);
user.setValid(false);
userService.add(user);
return "regist_ok";
}
//用户更新
public String update()
{
if(changePwd==1)
{
user.setPassword(newPassword);
}
userService.update(user);
return "update_ok";
} public String lookInfo() throws Exception
{
request=ServletActionContext.getRequest();
session=request.getSession();
if(session.getAttribute("accountNo")!= null)
{
user=userService.findByNo(session.getAttribute("accountNo").toString());
userVO=userManager.convertToUserVO(user);
return "lookinfo_ok";
}
return INPUT;
}
public String getInfo()
{
request=ServletActionContext.getRequest();
session=request.getSession();
if(session.getAttribute("accountNo")!= null)
{
user=userService.findByNo(session.getAttribute("accountNo").toString());
return "getinfo_ok";
}
return INPUT;
}
public UserPO getUser()
{
return user;
} public void setUser(UserPO user)
{
this.user = user;
} public UserVO getUserVO()
{
return userVO;
} public void setUserVO(UserVO userVO)
{
this.userVO = userVO;
} public void setUserService(UserService userService)
{
this.userService = userService;
} public String getRePassword()
{
return rePassword;
} public void setRePassword(String rePassword)
{
this.rePassword = rePassword;
} public int getChangePwd()
{
return changePwd;
} public void setChangePwd(int changePwd)
{
this.changePwd = changePwd;
} public String getNewPassword()
{
return newPassword;
} public void setNewPassword(String newPassword)
{
this.newPassword = newPassword;
} public String getRePassword2()
{
return rePassword2;
} public void setRePassword2(String rePassword2)
{
this.rePassword2 = rePassword2;
}
}
struts-user.xml内容:
<struts>
<package name="user" extends="struts-default">
<interceptors>
<interceptor name="SessionInteceptor"
class="com.ordertickets.inteceptor.SessionInteceptor">
</interceptor>
</interceptors>
<action name="user" class="userAction">
<result name="regist_ok">/user/userIndex.jsp</result>
<result name="update_ok">/user/userInfo.jsp</result>
<result name="lookinfo_ok">/user/userInfo.jsp</result>
<result name="getinfo_ok">/user/userUpdate.jsp</result>
<result name="regist_failure">/user/userRegist.jsp</result>
<result name="input">/user/userIndex.jsp</result>
<interceptor-ref name="SessionInteceptor">
<param name="includeMethods">update,info,lookInfo,getInfo</param>
</interceptor-ref>
</action>
</package>
</struts>
attempt to create saveOrUpdate event with null entity明显的是没有对象可用更新,然后看了看调试状态下的user对象,的确为null,然后别的newPassword和rePassword2之类的都为空。
Struts2 中 action 的execute方法会自动去执行,你把这个方法去掉就可以访问到 update方法了。