问题描述
在后台页面中,需要输入旧密码,跟两次新密码,然后提交以后,更新密码!
但是在这里遇到一个问题,点击提交以后,我的数据在后台怎么也取不到!
后台servlet代码:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("UTF-8");
UserService us = new UserServiceImpl();
User user = new User();
String password = request.getParameter("password");
String new_password = request.getParameter("new_password");
user = (User) request.getSession().getAttribute("user");
System.out.println("password="+password+"new="+new_password+"user.getUsername()="+user.getUsername());
int i=us.updateUser(user.getUsername(), password,new_password);
if(i==1){
System.out.println("密码更新成功!");
request.getSession().setAttribute("user", user);
request.getRequestDispatcher("/admin/personal/shop_info.jsp").forward(request, response);
// request.getRequestDispatcher("/admin/login/home.jsp").forward(request, response);
}else{
System.out.println("密码更新失败!");
// response.sendRedirect("/shop_Register/admin/login/register.jsp?error=yes");
request.getRequestDispatcher("/admin/personal/shop_info.jsp").forward(request, response);
}
}
前端jsp代码
<tr>
<td width="10%"style="text-align: right;"><font size="2px">旧密码</font></td>
<td width="55%"><input type="password" name="password" id ="password" class="txtinput"> </td>
</tr>
<tr>
<td width="45%" style="text-align: right;"><font size="2px">新密码</font></td>
<td width="55%"><input type="password" name="new_password" id ="new_password" class="txtinput"> </td>
</tr>
<tr>
<td style="text-align: right;"><font size="2px">重复新密码</font></td>
<td><input type="password" name="new_repassword" id="new_repassword" class="txtinput"> </td>
<td><input type="hidden" name="pas" id ="pas" value = "<%=user.getPassword() %>"/></td>
<!--
把对象密码取出来隐藏掉,后面在取值比较
-->
</tr>
<td width="100%" style="text-align:center">
<input type="button" value ="提交" onclick="window.location.href=('${pageContext.request.contextPath}/servlet/UpdateUserServlet')"/></td>
屡次提交,后台获取的数据都为Null,所以定位到问题在按钮的事件上,type="button",跟type="submit"是有区别的,submit是特殊的button,如果因为涉及到提交数据,所以应该要采用submit,这样可以直接提交数据到servlet,一般同学的情况应该都在这里,但是,我的问题是换成submit提交,会调用另一个方法,因为这个页面本身进来就加载数据了,所以改成submit没有效果。
后来就把onclick方法改变了,改成一下invock()方法
<td width="100%" style="text-align:center">
<input type="button" value ="提交" onclick="invoke()"/></td>
function invoke(){
var p=document.getElementById("password").value;
var np=document.getElementById("new_password").value;
var nrp=document.getElementById("new_repassword").value;
location.href="${pageContext.request.contextPath}/servlet/UpdateUserServlet?password="+p+"&new_password="+np;
}
</script>
通过 var p=document.getElementById("password").value;location.href="${pageContext.request.contextPath}/servlet/UpdateUserServlet?password="+p+"&new_password="+np; 这样的方法来调取参数password和new_password的值,并且反馈给后台,通过输出,就看到获取到这两个参数。
问题二
对于密码的验证,本来修改密码,需要验证旧密码是否匹配,应该是回去前端页面的密码,然后交给后台处理,如果对的,才能修改成功,但是,这样就多调用了一次,其实,我这里采用了一中比较取巧的办法,因为页面登录进来以后,session是存有User的所有信息,包括用户名和密码,所以,就不要再到后台去取了
<%
User user=(User)request.getSession().getAttribute("user");
%>
<td><input type="hidden" name="pas" id ="pas" value = "<%=user.getPassword() %>"/></td>
<!--
把对象密码取出来隐藏掉,后面在取值比较
-->
这里把密码隐藏掉,就看不见了,然后取出来在jsp中比较就可以了。
<script>
function invoke(){
var pass = document.getElementById("pas").value;
var p=document.getElementById("password").value;
var np=document.getElementById("new_password").value;
var nrp=document.getElementById("new_repassword").value;
if(p == ""){
alert("旧密码不能为空!");
return false;
}else if(np == ""){
alert("新密码不能为空!");
return false;
}else if(np != nrp){
alert("两次密码输入不同!");
return false;
}else if(pass != p){
alert("旧密码输入不正确!");
return false;
}
location.href="${pageContext.request.contextPath}/servlet/UpdateUserServlet?password="+p+"&new_password="+np;
}
</script>
取出用户的密码,然后与我输入的旧密码进行比较,如果不符,就直接弹出来提示用户,省去了一次在调用数据库的任务。还有做了一些为空的验证。问题到这里就基本解决了。