小弟最近在写个OA管理系统 用S2SH框架写的,
其中有一个功能是管理员添加账户。
然后我添加完成后,不知道怎么搞的,之前保存在SESSION中的当前用户,就突然变成了刚添加的,把SESSION里的值替换了。
如果说是逻辑上有问题,有的时候确是正常的,但正常的次数很少。不知道什么原因?研究好几天了。<s:property value="#session.employee.nickname" /> // 每个页面都有这行代码,我的问题就是添加账户成功后,这里的值应该是不变的,可是变了!!很纠结啊  
<!-- 业务显示页面 -->
<div class="pages" id="editinfo" style="display: none;">
<s:form action="employeeAdd" namespace="/" onsubmit="return check()"><table width="90%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="right" width="30%">账号:
</td>
<td align="left">
<s:textfield name="employee.empId" value="" id="empid" onblur="checkempid()"/>   
</td>
<td align="left" width="45%"><span id="empidmsg">*</span></td></tr>
<tr>
<td align="right" width="30%" >
密码:
</td>
<td align="left"><s:password name="employee.password " value="" id="pass" onblur="checkpass()"/></td>
<td align="left" width="45%"><span id="passmsg">*</span></td>
</tr>
<tr>
<td align="right" width="30%">昵称:
</td>
<td align="left">
<s:textfield name="employee.nickname" value="" id="nick" onblur="checknick()"/>   
</td>
<td align="left" width="45%"><span id="nickmsg">*</span></td></tr>
<tr>
<td align="right" width="30%">年龄:
</td>
<td align="left">
<s:textfield name="employee.age" value="" onblur="checkage()" id="age"/>   
</td>
<td align="left" width="45%"><span id="agemsg"></span></td></tr>
<tr>
<td align="right" width="30%">性别:
</td>
<td align="left">
<s:radio list="#{'男':'男','女':'女'}" name="employee.sex"/>
</td>
<td></td></tr><tr>
<td align="right" width="30%">手机:
</td>
<td align="left">
<s:textfield name="employee.phone" value="" id="phone" onblur="checkphone()"/>   
</td>
<td align="left" width="45%"><span id="phonemsg">*(手机号码必须为11为数字,并且开头为13,18...)</span></td></tr> <tr>
<td align="right" width="30%">地址:
</td>
<td align="left">
<s:textfield name="employee.address" value=""/>   
</td>
<td></td></tr>
<tr>
<td align="right" width="30%">权限:
</td>
<td align="left">
<s:radio list="#{0:'普通账户', 1:'admin'}" name="employee.authority"/>
</td>
<td></td></tr>
<tr>
<td align="center" colspan="3">
<br /><s:submit value="保存" onclick="return confirm('确定添加吗?');"/>
<input type="button" value="返回" id="return"/>
</td>
</tr></table>
  </s:form>
</div>
============================action中===================
//个人信息
public String employeeInfo(){
return SUCCESS;
}//个人信息修改
public String employeeInfoEdit(){employeeDao.edit(employee);
HttpSession session = ServletActionContext.getRequest().getSession();
session.setAttribute("employee", employeeDao.getById(employee.getEmpId()));return SUCCESS;
}
//注销
public String LoginOut(){
HttpSession session = ServletActionContext.getRequest().getSession();
session.removeAttribute("employee");
return SUCCESS;
}//个人账户
public String employeeOneself(){return SUCCESS;
}
//个人账户修改//管理账户
public String employeeManager(){
this.list=employeeDao.getList();
return SUCCESS;
}//添加账户 *********************目前就是执行这条语句有问题。
public String employeeAdd(){
employeeDao.addEmployee(this.getEmployee());
return SUCCESS;
}//登录
public String employeeLogin() throws Exception {
Employee loginEmp= employeeDao.login(employee.getEmpId(), employee.getPassword());
if (loginEmp != null) {
this.setEmployee(loginEmp);
HttpSession session = ServletActionContext.getRequest().getSession(true);
session.setAttribute("employee", loginEmp);
System.out.println(loginEmp.getNickname());
  return SUCCESS;
} else {
this.setMessage("用户名或密码错误!");
return ERROR;
}}
=========================== DAO层======
//添加账户
public void addEmployee(Employee employee) {
this.getHibernateTemplate().save(employee);}=================struts.xml=================
<!-- 登录 个人信息 权限管理 -->
<action name="employeeLogin" class="employeeAction" method="employeeLogin">
<result>/employeeInfo.jsp</result>
<result name="error">/login.jsp</result>
<interceptor-ref name="defaultStack"/>
</action><!--个人信息 -->
<action name="employeeInfo" class="employeeAction" method="employeeInfo">
<result>/employeeInfo.jsp</result>
</action><!-- 修改个人信息 -->
<action name="employeeInfoEdit" class="employeeAction" method="employeeInfoEdit">
<result>/employeeInfo.jsp</result>
</action><!-- 修改个人账户 -->
<action name="employeeOneselfEdit" class="employeeAction" method="employeeInfoEdit">
<result>/employeeOneself.jsp</result>
</action><!-- 添加账户-->
<action name="employeeAdd" class="employeeAction" method="employeeAdd">
<result name="success" type="redirect">/employeeManager</result>
<result name="input">/employeeManager.jsp</result>
</action> <!-- 注销-->
<action name="employeLoginOut" class="employeeAction" method="LoginOut">
<result>/login.jsp</result>
</action> <!-- 个人账户-->
<action name="employeeOneself" class="employeeAction" method="employeeOneself">
<result>/employeeOneself.jsp</result>
</action><!-- 管理账户-->
<action name="employeeManager" class="employeeAction" method="employeeManager">
<result>/employeeManager.jsp</result>
</action> 

解决方案 »

  1.   

    这样的情况,可以考虑在各个步骤获取SESSION中的用户值,断点一步步缩小改变值的方法。。
      

  2.   

    然后我添加完成后,不知道怎么搞的,之前保存在SESSION中的当前用户,就突然变成了刚添加的,把SESSION里的值替换了。
    之所以改变是因为你保存的session是相同的,用到同一个emplyee;比如:在登录用session.setAttribute("employee", loginEmp)保存,之后你添加又用session.setAttribute("employee", loginEmp);保存,,你在检查一下,避免冲突
      

  3.   

    【跪求】下列对于Java序列化作用的解释 不正确的是()A永久性保存对象 保存对象的字节序列到本地文件中
    B通过序列化对象在网络中传递对象
    C通过序列化在进程间传递对象
    D通过序列化能使Java程序顺序进行
      

  4.   

    http://happyran.zbpifa.com
    http://007ej.com/user.asp
      

  5.   

    问题已经解决,只要不把ACTION的方法 剂在一个类里就行了
      

  6.   

    我的意思是 原先我所有增删改查的ACTION 都在同一个ACTION类里写不同的方法,代码很臃肿,现在我把添加用户这个操作单独写了个ACTION类 那个情况就没有了 我也解释不了。呵呵
      

  7.   

    Spring默认的创建模式是单例的,LZ的问题很有可能是因为action是单利的,所以出现了共享数据混乱。只要把spring管理的action类的创建模式改了就可以了