前一段时间整合struts2,spring,hibernate三个框架的时候主要还是学习,基本上action里就一个execute方法,然后所有的增删改查都放在execute方法里,完全梅雨哦问题。
    最近,又再做一个稍微大的,由于action里功能需求多,就基本用动态执行action里的方法,就是通过“具体action名字!具体方法.action”的方式访问action里的方法,然后返回一个对应的字符串返回值,再跳转到对应页面或已经申明的action。
    这样做后,我发现思路的确比较清晰了,但是当执行信息更新时候,页面提交的值在执行对应update()方法前所有的字段都是获取不到的。
    我推测:之前在执行execute方法时候会自动执行属性的setter和getter方法,而自己定义的update方法不会这么做。
    请问:我该如何做呢,总不该每次在update方法里再通过request.getParameter()方法把每个字段获取出来然后再更新吧

解决方案 »

  1.   

    那简单的用户信息来说,你可以把username,password声明为成员变量,这样你可以直接调用但是我觉得不好,你不如将用户的信息封装到一个类中,设好他的getter,setter方法,在action类中直接声明这个类的对象。
      

  2.   

    是的,我更新的是一个用户或者别的对象的信息,当然是在action里定义一个对象,生成它的getter和setter方法的,前台jsp页面是通过一个submit将整个form信息提交到对应的方法里的,form的action是这样的:action="user!update.action"
    但就是不行,把update方法搬到execute方法里之后就可以了,问题还是那个问题,郁闷ing
      

  3.   

    updateUser.jsp页面:
    <%@ 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>
      

  4.   

    经过调试发现,程序做的过程仅仅是jsp提交到UserAction里,立即执行update方法,然后就报错:
    attempt to create saveOrUpdate event with null entity明显的是没有对象可用更新,然后看了看调试状态下的user对象,的确为null,然后别的newPassword和rePassword2之类的都为空。
      

  5.   

    在struts配置文件中class=“userAction”  没有加包名  应改为class=“com.ordertickets.action.userAction”
      

  6.   

    我是用spring管理struts2中的action的,一开始我就说过了,我使用的是struts2+spring+hibernate三个框架整合的
      

  7.   

    sorry! 没看清楚,我用struts2写了个小例子能成功,不知道你的问题出在哪里
      

  8.   


    Struts2 中 action 的execute方法会自动去执行,你把这个方法去掉就可以访问到 update方法了。