最近写东西的时候遇到个问题,下边是错误代码:
严重: 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>