接着上回说到,这次我们将修改资料和退出登录
修改资料:
有了上次的项目经验,这个功能应该很轻松就拿下了。
由于登录的时候,我们将user已经存入session了。其实可以直接从session中取出来,将需要回显的数据取出来。
就比如这样。
<tr>
<td style="text-align:right; width:20%">会员邮箱:</td>
<td style="width:40%; padding-left:20px">${u.email }</td>
td> </td>
</tr>
<tr>
<td style="text-align:right">会员名:</td>
<td style="padding-left:20px">${u.username }</td>
<td> </td>
</tr>
就像这样,从${u.email}中取出来一样。但是你发现有没有,性别那一栏有点难搞,因为你取出来不好显示啊。方法如下:
<td style="text-align:right">性别:</td>
<td colspan="2"> <input type="radio"
name="gender" value="男" ${u.gender== "男"? "checked='checked' ":"" } />
男 <input
type="radio" name="gender" value="女" ${u.gender=="女"? "checked='checked' ":"" } /> 女</td>
${u.gender== "男"? "checked='checked' ":"" }其实仔细分析下这个,你会发现,这哪是取值,分明就是个判断句。所以应该好好看下EL表达式的作用,它的确可以这样用。由此还引申出两个另外的方法。
El表达式判断是否为空字符串
${empty 值} 返回true ,表示为空字符串;
e.g <c:if test=" ${empty chapterlist} ">
<td>是吧!</td>
</c:if>
El表达式判断是否为空
${值 eq null } 返回true 的话,表示为空
<c:if test="${chapterlist eq null }">
<td>不是!!!</td>
</c:if>
页面回显说完了,当提交修改时,将对象传递过来,跟原来注册时封装表单一样的方法BeanUtils.populate(user, request.getParameterMap());
但是请大家注意了,这里你可以发现这里跟注册又不一样,咱们没有id啊,没错,注册时是可以没有,但是你要更新数据,没有id怎么查到原来的user呢?所以这里需要将id(在表单中)隐藏起来
<form action="${pageContext.request.contextPath }/modifyUserServlet" method="post">
<input type="hidden" name="id" value="${u.id }"/>
<table width="100%" border="0" cellspacing="2" class="upline">
<tr>
<td style="text-align:right; width:20%">会员邮箱:</td>
<td style="width:40%; padding-left:20px">${u.email }</td>
<td> </td>
用一个input标签隐藏起来,值从原来的session对象中取。
dao层调用的方法,update 通过id来更新。
// 修改用户信息
public void modifyUser(User user) throws SQLException {
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
qr.update("update user set password=? , gender=?, telephone=? where id=?",user.getPassword(),user.getGender(),user.getTelephone(),user.getId());
}
OK,更新完毕了,重新存入session。可能有些人觉得改完密码需要重新登录下,也行。也很简单就相当于注销。
退出登录:注销
如果上步需要注销的,只需写上这部分代码就行了。注销很简单啊,只需要把用户的session杀死,然后重定向到登录界面接好了。注销还是需要先获得session然后杀死这个session。(这又映出一个问题我们session域存了那么多,杀死哪个呢?不,是直接使session失效,即所有的都不能用。想移除某个session域,使用这个方法把session.removeAttribute()移除session中的某项属性。)
request.getSession().invalidate();//相当于注消用户
response.sendRedirect(request.getContextPath()+"/modifyUserInfoSuccess.jsp");
小结:重定向是response的事,且重定向的路径不是跟转发一样的绝对路径。转发可以绝对路径(就是直接写请求路径而不需要加别的),重定向我不知道为啥不能,它是用request.getContextPath(),先获得根路径来算的。
OK。完,这次有点短......