最近寫東西的時候遇到個問題,下邊是錯誤代碼:
嚴重: Servlet.service() for servlet [DispatcherServlet] in context with path [/OA] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'user_id' not found. Available parameters are [id, param1]] with root cause
org.apache.ibatis.binding.BindingException: Parameter 'user_id' not found. Available parameters are [id, param1]
at org.apache.ibatis.binding.MapperMethod$ParamMap.get(MapperMethod.java:165)
at org.apache.ibatis.reflection.wrapper.MapWrapper.get(MapWrapper.java:44)
at org.apache.ibatis.reflection.MetaObject.getValue(MetaObject.java:116)
下邊的東西太多,上邊的錯誤就能看出來 “user_id”找不到,調試了半小時,最終是搞好了。 問題出在dao方法上,因爲使用ajax傳值我方法這麼寫的
//重置密碼
@Update("update t_user set login_password='admin' where user_id=#{user_id}")
int updatePwd(@Param("id")int id);
把@Param註解去掉就好了,具體什麼原因我也不太清楚。 下邊代碼也貼上 用ajax傳值重置密碼。 直接UserService代碼:
/**
* 重置密碼admin
* @param id
*/
public Map<String,Object> updatePwd(int id) {
int result=userdao.updatePwd(id);
Map<String, Object> map=new HashMap<>();
System.out.println(result+"重置密碼");
if(result>0){
map.put("status","success");
}else{
map.put("status","error");
}
return map;
}
UserController
/**
* 重置密碼
* @param id
* @param request
* @return
*/
@RequestMapping(value="updatePwd",method=RequestMethod.POST)
@ResponseBody
public Map<String,Object> updatePwd(int id) {
return userservice.updatePwd(id);
}
jsp頁面 這裏就粘貼重置這部分 頁面使用bootStrap
<div id="loginError" style="text-align:center;color:#cc5965;font-weight:700;margin-bottom:5px;"></div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav navbar-right">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><span>${user.user_name}</span><i class="glyphicon glyphicon-user"></i> <span class="caret"></span></a>
<ul class="dropdown-menu">
<c:if test="${user!=null}">
<li><a href="#">個人資料</a></li>
<li><a href="javascript:Reset();">重置密碼</a></li>
<li><a href="<%=path%>/loginOutput">退出</a></li>
</c:if>
<c:if test="${user==null }">
<li><a href="<%=path%>/loginInput">登錄</a></li>
</c:if>
</ul>
</li>
</ul>
</div>
頁面效果
這裏寫了個鼠標懸停出現菜單 移除關閉效果 jQuery代碼是這樣的:
<script type="text/javascript">
//鼠標懸停 自動出現菜單
$(document).on("mouseenter",".dropdown",function(){
$(this).addClass("open");
})
//鼠標移除 關閉菜單
$(document).on("mouseleave",".dropdown",function(){
$(this).removeClass("open");
})
</script>
接着傳值的問題,在使用js/jquery/ajax是不能直接獲取session的值的,在這裏使用別的方法獲取,首先 登錄成功之後把用戶對象扔到session裏
request.getSession().setAttribute("user", user);
這樣就可以了. 但是在JS代碼裏想獲取這個session是可以的 我們可以這麼寫
var user='<%=request.getSession().getAttribute("user")%>';
這裏獲取的是user對象 然而並沒有什麼卵用 裏邊的屬性拿不出來。只能換一種了,可以這麼玩:
<input type="hidden" id="userid" name="user_id" value="${user.user_id }"/>
這樣就可以了,下邊是ajax了。
<script type="text/javascript">
function Reset(){
var userid=$('#userid').val();
$.ajax({
url:'${pageContext.request.contextPath}/updatePwd',
method:'post',
data:{
id:userid
},
dataType:'json',
success:function(ret){
if(ret.status=='success'){
$("#loginError").html("重置密碼成功!密碼爲admin !");
var href = '${pageContext.request.contextPath}/indexInput';
window.top.location.href = href;
}else if(ret.status=='error'){
$("#loginError").html("重置密碼失敗!請聯繫管理員!");
}
}
})
}
</script>