問題描述
在後臺頁面中,需要輸入舊密碼,跟兩次新密碼,然後提交以後,更新密碼!
但是在這裏遇到一個問題,點擊提交以後,我的數據在後臺怎麼也取不到!
後臺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 ="提交" οnclick="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 ="提交" οnclick="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>
取出用戶的密碼,然後與我輸入的舊密碼進行比較,如果不符,就直接彈出來提示用戶,省去了一次在調用數據庫的任務。還有做了一些爲空的驗證。問題到這裏就基本解決了。