NutzCN Logo
问答 User 删除 500 ,无法调到 java
发布于 2433天前 作者 DossShi 2078 次浏览 复制 上一个帖子 下一个帖子
标签:
    function user_delete(userId) {
        var s = prompt("请输入y确认删除");
        if (s == "y") {
            $.ajax({
                url : base + "/user/delete",
                data : {"id":userId},
                dataType : "json",
                success : function (data) {
                    if (data.ok) {
                        user_reload();
                        alert("删除成功");
                    } else {
                        alert(data.msg);
                    }
                }
            });
        }
    };
    function user_reload() {
        $.ajax({
            url : base + "/user/query",
            data : $("#user_query_form").serialize(),
            dataType : "json",
            success : function(data) {
                console.log(data);
                $("#user_count").html("共"+data.pager.recordCount+"个用户, 总计"+data.pager.pageCount+"页");
                var list_html = "";
                console.log(data.list);
                for (var i=0;i<data.list.length;i++) {
                    var user = data.list[i];
                    console.log(user);
                    var tmp = "\n<p>" + user.id + " " + user.name
                        + " <button onclick='user_update(" + user.id +");'>修改</button> "
                        + " <button onclick='user_delete(" + user.id +");'>删除</button> "
                        + "</p>";
                    list_html += tmp;
                }
                $("#user_list").html(list_html);
            }
        });
    }
[DEBUG] 14:59:32.550 org.nutz.mvc.impl.UrlMappingImpl.get(UrlMappingImpl.java:101) - Found mapping for [GET] path=/user/delete : UserModule.delete(UserModule.java:86)
[DEBUG] 14:59:32.550 org.nutz.ioc.impl.NutIoc.get(NutIoc.java:151) - Get 'userModule'<class net.wendal.nutzdemo.module.UserModule>
[WARN ] 14:59:32.551 org.nutz.mvc.impl.processor.FailProcessor.process(FailProcessor.java:28) - Error@/user/delete :
java.lang.IllegalArgumentException: argument type mismatch
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.nutz.mvc.impl.processor.MethodInvokeProcessor.process(MethodInvokeProcessor.java:25)
	at org.nutz.mvc.impl.processor.AbstractProcessor.doNext(AbstractProcessor.java:44)
	at org.nutz.mvc.impl.processor.AdaptorProcessor.process(AdaptorProcessor.java:33)
	at org.nutz.mvc.impl.processor.AbstractProcessor.doNext(AbstractProcessor.java:44)
	at org.nutz.mvc.impl.processor.ActionFiltersProcessor.process(ActionFiltersProcessor.java:58)
	at org.nutz.mvc.impl.processor.AbstractProcessor.doNext(AbstractProcessor.java:44)
	at org.nutz.mvc.impl.processor.ModuleProcessor.process(ModuleProcessor.java:123)
	at org.nutz.mvc.impl.processor.AbstractProcessor.doNext(AbstractProcessor.java:44)
	at org.nutz.mvc.impl.processor.EncodingProcessor.process(EncodingProcessor.java:27)
	at org.nutz.mvc.impl.processor.AbstractProcessor.doNext(AbstractProcessor.java:44)
	at org.nutz.mvc.impl.processor.UpdateRequestAttributesProcessor.process(UpdateRequestAttributesProcessor.java:15)
	at org.nutz.mvc.impl.NutActionChain.doChain(NutActionChain.java:44)
	at org.nutz.mvc.impl.ActionInvoker.invoke(ActionInvoker.java:67)
	at org.nutz.mvc.ActionHandler.handle(ActionHandler.java:31)
	at org.nutz.mvc.NutFilter.doFilter(NutFilter.java:198)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)
16 回复

有多个上传文件的入口方法?

目前没有写上传文件的入口
@wendal

@IocBean // 声明为Ioc容器中的一个Bean
@At("/user") // 整个模块的路径前缀
@Ok("json:{locked:'password|salt',ignoreNull:true}") // 忽略password和salt属性,忽略空属性的json输出
@Fail("http:500") // 抛出异常的话,就走500页面
@Filters(@By(type=CheckSession.class, args={"me", "/"})) // 检查当前Session是否带me这个属性
public class UserModule {

    @Inject // 注入同名的一个ioc对象
    protected Dao dao;

    @At
    public int count() { // 统计用户数的方法,算是个测试点
        return dao.count(User.class);
    }

    @At
    @Filters // 覆盖UserModule类的@Filter设置,因为登陆可不能要求是个已经登陆的Session
    public Object login(@Param("username")String name, @Param("password")String password, HttpSession session) {
        User user = dao.fetch(User.class, Cnd.where("name", "=", name).and("password", "=", password));
        if (user == null) {
            return false;
        } else {
            session.setAttribute("me", user.getId());
            return true;
        }
    }

    @At
    @Ok(">>:/") // 跟其他方法不同,这个方法完成后就跳转首页了
    public void logout(HttpSession session) {
        session.invalidate();
    }

    @At
    public Object add(@Param("..")User user) { // 两个点号是按对象属性一一设置
        NutMap re = new NutMap();
        String msg = checkUser(user, true);
        if (msg != null){
            return re.setv("ok", false).setv("msg", msg);
        }
        user = dao.insert(user);
        return re.setv("ok", true).setv("data", user);
    }

    @At
    public Object update(@Param("..")User user) {
        NutMap re = new NutMap();
        String msg = checkUser(user, false);
        if (msg != null){
            return re.setv("ok", false).setv("msg", msg);
        }
        user.setName(null);// 不允许更新用户名
        user.setCreateTime(null);//也不允许更新创建时间
        user.setUpdateTime(new Date());// 设置正确的更新时间
        dao.updateIgnoreNull(user);// 真正更新的其实只有password和salt
        return re.setv("ok", true);
    }

    @At
    public Object delete(@Param("id")int id, @Attr("me")int me) {
        if (me == id) {
            return new NutMap().setv("ok", false).setv("msg", "不能删除当前用户!!");
        }
        dao.delete(User.class, id); // 再严谨一些的话,需要判断是否为>0
        return new NutMap().setv("ok", true);
    }

    @At
    public Object query(@Param("name")String name, @Param("..")Pager pager) {
        Cnd cnd = Strings.isBlank(name)? null : Cnd.where("name", "like", "%"+name+"%");
        QueryResult qr = new QueryResult();
        qr.setList(dao.query(User.class, cnd, pager));
        pager.setRecordCount(dao.count(User.class, cnd));
        qr.setPager(pager);
        return qr; //默认分页是第1页,每页20条
    }

    @At("/")
    @Ok("jsp:jsp.user.list") // 真实路径是 /WEB-INF/jsp/user/list.jsp
    public void index() {
    }

    protected String checkUser(User user, boolean create) {
        if (user == null) {
            return "空对象";
        }
        if (create) {
            if (Strings.isBlank(user.getName()) || Strings.isBlank(user.getPassword()))
                return "用户名/密码不能为空";
        } else {
            if (Strings.isBlank(user.getPassword()))
                return "密码不能为空";
        }
        String passwd = user.getPassword().trim();
        if (6 > passwd.length() || passwd.length() > 12) {
            return "密码长度错误";
        }
        user.setPassword(passwd);
        if (create) {
            int count = dao.count(User.class, Cnd.where("name", "=", user.getName()));
            if (count != 0) {
                return "用户名已经存在";
            }
        } else {
            if (user.getId() < 1) {
                return "用户Id非法";
            }
        }
        if (user.getName() != null)
            user.setName(user.getName().trim());
        return null;
    }
}

参数类型不匹配是指?
@qq_b1ca03f7

会不会是因为 js 里面的

 dataType : "json",

与这个没办法匹配

 public Object delete(@Param("id")int id, @Attr("me")int me) {

这样的话 你需要修改ajax代码,使用传统的表单传值的方式 @jiakai

接口加一个注解@AdaptBy(type=JsonAdaptor.class)
如果还不行,入参那里使用

public Ojbect delete(@Param("..") DelObj del)

DelObj类

public class DelObj {
    private int id;
    private int me;
   get..set...
}
@Attr("me")int me

user.getId的返回值是long还是int?估计是long,然后@Attr不做转换,然后报错了

改成long me 就好了

目前还是没能调到UserModule
user.getId返回值是int

package net.wendal.nutzdemo.bean;

import java.util.Date;

import org.nutz.dao.entity.annotation.ColDefine;
import org.nutz.dao.entity.annotation.Column;
import org.nutz.dao.entity.annotation.EL;
import org.nutz.dao.entity.annotation.Id;
import org.nutz.dao.entity.annotation.Name;
import org.nutz.dao.entity.annotation.Prev;
import org.nutz.dao.entity.annotation.Table;

@Table("t_user")
public class User {

    @Id
    private int id;

    @Name
    private String name;

    @Column("passwd")
    @ColDefine(width = 128)
    private String password;

    @Column("salt")
    @ColDefine(width = 128)
    private String salt;

    @Column
    private int age;

    @Column
    @Prev(els = @EL("now()"))
    private Date createTime;

    @Column("updatetime")
    private Date updateTime;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getSalt() {
        return salt;
    }

    public void setSalt(String salt) {
        this.salt = salt;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
}

package net.wendal.nutzdemo.module;

import java.util.Date;
import javax.servlet.http.HttpSession;

import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.QueryResult;
import org.nutz.dao.pager.Pager;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
import org.nutz.lang.random.R;
import org.nutz.lang.util.NutMap;
import org.nutz.log.Log;
import org.nutz.log.Logs;
import org.nutz.mvc.adaptor.JsonAdaptor;
import org.nutz.mvc.annotation.*;
import org.nutz.mvc.filter.CheckSession;

import net.wendal.nutzdemo.bean.User;

@IocBean // 声明为Ioc容器中的一个Bean
@At("/user") // 整个模块的路径前缀
@Ok("json:{locked:'password|salt',ignoreNull:true}") // 忽略password和salt属性,忽略空属性的json输出
@Fail("http:500") // 抛出异常的话,就走500页面
@Filters(@By(type=CheckSession.class, args={"me", "/"})) // 检查当前Session是否带me这个属性
public class UserModule {

    @Inject // 注入同名的一个ioc对象
    protected Dao dao;

    @At
    public int count() { // 统计用户数的方法,算是个测试点
        return dao.count(User.class);
    }

    @At
    @Filters // 覆盖UserModule类的@Filter设置,因为登陆可不能要求是个已经登陆的Session
    public Object login(@Param("username")String name, @Param("password")String password, HttpSession session) {
        User user = dao.fetch(User.class, Cnd.where("name", "=", name).and("password", "=", password));
        if (user == null) {
            return false;
        } else {
            session.setAttribute("me", user.getId());
            return true;
        }
    }

    @At
    @Ok(">>:/") // 跟其他方法不同,这个方法完成后就跳转首页了
    public void logout(HttpSession session) {
        session.invalidate();
    }

    @At
    public Object add(@Param("..")User user) { // 两个点号是按对象属性一一设置
        NutMap re = new NutMap();
        String msg = checkUser(user, true);
        if (msg != null){
            return re.setv("ok", false).setv("msg", msg);
        }
        user = dao.insert(user);
        return re.setv("ok", true).setv("data", user);
    }

    @At
    public Object update(@Param("..")User user) {
        NutMap re = new NutMap();
        String msg = checkUser(user, false);
        if (msg != null){
            return re.setv("ok", false).setv("msg", msg);
        }
        user.setName(null);// 不允许更新用户名
        user.setCreateTime(null);//也不允许更新创建时间
        user.setUpdateTime(new Date());// 设置正确的更新时间
        dao.updateIgnoreNull(user);// 真正更新的其实只有password和salt
        return re.setv("ok", true);
    }

//    @AdaptBy(type=JsonAdaptor.class)
    @At
    public NutMap delete(@Param("id")int id, @Attr("me")int me) {
        if (me == id) {
            return new NutMap().setv("ok", false).setv("msg", "不能删除当前用户!!");
        }
        dao.delete(User.class, id); // 再严谨一些的话,需要判断是否为>0
        return new NutMap().setv("ok", true);
    }

    @At
    public Object query(@Param("name")String name, @Param("..")Pager pager) {
        Cnd cnd = Strings.isBlank(name)? null : Cnd.where("name", "like", "%"+name+"%");
        QueryResult qr = new QueryResult();
        qr.setList(dao.query(User.class, cnd, pager));
        pager.setRecordCount(dao.count(User.class, cnd));
        qr.setPager(pager);
        return qr; //默认分页是第1页,每页20条
    }

    @At("/")
    @Ok("jsp:jsp.user.list") // 真实路径是 /WEB-INF/jsp/user/list.jsp
    public void index() {
    }

    protected String checkUser(User user, boolean create) {
        if (user == null) {
            return "空对象";
        }
        if (create) {
            if (Strings.isBlank(user.getName()) || Strings.isBlank(user.getPassword()))
                return "用户名/密码不能为空";
        } else {
            if (Strings.isBlank(user.getPassword()))
                return "密码不能为空";
        }
        String passwd = user.getPassword().trim();
        if (6 > passwd.length() || passwd.length() > 12) {
            return "密码长度错误";
        }
        user.setPassword(passwd);
        if (create) {
            int count = dao.count(User.class, Cnd.where("name", "=", user.getName()));
            if (count != 0) {
                return "用户名已经存在";
            }
        } else {
            if (user.getId() < 1) {
                return "用户Id非法";
            }
        }
        if (user.getName() != null)
            user.setName(user.getName().trim());
        return null;
    }
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.6/css/bootstrap.min.css">
<title>用户的CURD</title>
</head>
<body>
<div id="top_nav">
	<a href="${base}/user/logout">登出</a>
</div>
<div class="center-wrapper">
	<div class="center-content">

		<%--<div class="row no-m">--%>
			<%--<div class="col-xs-10 col-xs-offset-1 col-sm-6 col-sm-offset-3 col-md-4 col-md-offset-4">--%>
				<%--<header class="panel-heading no-b text-center" style="font-size:30px;"> 用户列表 </header>--%>
				<%--<div id="app">--%>

					<%--<div>--%>
						<%--<table id="tb1" border="2">--%>
							<%--<thead>--%>
							<%--<tr>--%>
								<%--<td>id</td>--%>
								<%--<td>用户名</td>--%>
								<%--<td>年龄</td>--%>
								<%--<td>创建日期</td>--%>
								<%--<td>操作</td>--%>
								<%--<td>操作</td>--%>
							<%--</tr>--%>
							<%--</thead>--%>
							<%--<tbody>--%>

							<%--</tbody>--%>
						<%--</table>--%>
					<%--</div>--%>
					<%--<div>--%>
						<%--<a href="#">上一页</a>--%>
						<%--<a href="#">下一页</a>--%>
					<%--</div>--%>
				<%--</div>--%>
			<%--</div>--%>
		<%--</div>--%>
		<%--<div class="row no-m">--%>
			<%--<div class="col-xs-5 col-xs-offset-1 col-sm-3 col-sm-offset-1 col-md-2 col-md-offset-2">--%>
				<%--<section class="panel bg-white no-b fadeIn animated"> <header class="panel-heading no-b text-center" style="font-size:30px;"> 添加用户 </header>--%>
                    <%--<form id="add_form" action="#" role="form" method="post">--%>
                        <%--<div class="form-group">--%>
                            <%--<input type="text" id="username" name="name" required class="form-control input-lg mb25" placeholder="用户名">--%>
                        <%--</div>--%>
                        <%--<div class="form-group">--%>
                            <%--<input type="password" id="password" name="password" required class="form-control input-lg mb25" placeholder="密码">--%>
                        <%--</div>--%>
                        <%--<div class="form-group">--%>
                            <%--<input type="text" id="age" name="age"  required class="form-control input-lg mb25" placeholder="年龄">--%>
                        <%--</div>--%>
                        <%--<p id="tip" class="bg-danger p15" style="display: none"></p>--%>

                        <%--<div class="show">--%>
                            <%--<button class="btn btn-primary btn-lg btn-block" type="submit" id="add_button" data-loading-text="添加">添加</button>--%>
                        <%--</div>--%>
                        <%--<p id="tip2" class="bg-danger p15" style="display: none"></p>--%>

                        <%--<div class="show">--%>
                            <%--<button class="btn btn-primary btn-lg btn-block" type="submit" id="update_button" data-loading-text="更新">更新</button>--%>
                        <%--</div>--%>
                        <%--<br>--%>
                        <%--<br>--%>
                        <%--<div class="show">--%>
                            <%--<button class="btn btn-primary btn-lg btn-block" type="button" id="delete233_button" data-loading-text="删除233">删除233</button>--%>
                        <%--</div>--%>
                    <%--</form>--%>
                    <%--<form id="delete_form" action="#" role="form" method="post">--%>
                        <%--<div class="form-group">--%>
                            <%--<input type="text" id="id" namge="id" required class="form-control input-lg mb25" placeholder="ID">--%>
                        <%--</div>--%>

                        <%--<div class="show">--%>
                            <%--<button class="btn btn-primary btn-lg btn-block" type="button" id="delete_button" data-loading-text="删除">删除</button>--%>
                        <%--</div>--%>
                    <%--</form>--%>

			<%--</div>--%>
		<%--</div>--%>

		<div>
			<form action="#" id="user_query_form">
				条件<input type="text" name="name">
				页数<input type="text" name="pageNumber" value="1">
				每页<input type="text" name="pageSize" value="10">
			</form>
			<button id="user_query_btn">查询</button>
			<p>---------------------------------------------------------------</p>
			<p id="user_count"></p>
			<div id="user_list">

			</div>
		</div>
		<div>
			<p>---------------------------------------------------------------</p>
		</div>
		<div id="user_add">
			<form action="#" id="user_add_form">
				用户名<input name="name">
				密码<input name="password">
			</form>
			<button id="user_add_btn">新增</button>
		</div>
	</div>
</div>

</body>
<script type="text/javascript" src="https://cdn.staticfile.org/jquery/1.11.3/jquery.min.js"></script>
<script type="text/javascript" src="https://cdn.staticfile.org/twitter-bootstrap/3.3.6/js/bootstrap.min.js"></script>
<script type="text/javascript" src="https://cdn.staticfile.org/layer/2.3/layer.js"></script>
<script type="text/javascript">
    var pageNumber = 1;
    var pageSize = 10;
    var base = '<%=request.getAttribute("base")%>';
    function user_reload() {
        $.ajax({
            url : base + "/user/query",
            data : $("#user_query_form").serialize(),
            dataType : "json",
            success : function(data) {
                console.log(data);
                $("#user_count").html("共"+data.pager.recordCount+"个用户, 总计"+data.pager.pageCount+"页");
                var list_html = "";
                console.log(data.list);
                for (var i=0;i<data.list.length;i++) {
                    var user = data.list[i];
                    console.log(user);
                    var tmp = "\n<p>" + user.id + " " + user.name
                        + " <button onclick='user_update(" + user.id +");'>修改</button> "
                        + " <button onclick='user_delete(" + user.id +");'>删除</button> "
                        + "</p>";
                    list_html += tmp;
                }
                $("#user_list").html(list_html);
            }
        });
    }
    $(function(){
        //这里就是放页面加载的时候执行的函数。
        getList();
        getList2();
        $("#user_query_btn").click(function() {
            user_reload();
        });
        $("#user_add_btn").click(function() {
            $.ajax({
                url : base + "/user/add",
                data : $("#user_add_form").serialize(),
                dataType : "json",
                success : function(data) {
                    if (data.ok) {
                        user_reload();
                        alert("添加成功");
                    } else {
                        alert(data.msg);
                    }
                }
            });
        });
        $("#add_button").click(function() {
            // alert("添加用户");
            $.ajax({
                url : "${base}/user/add",
                data : $("#add_form").serialize(),
                method : "POST",
                dataType : "json",
                success : function(resp) {
                    // var res = resp;



                    // alert("添加成功");
                    if (resp.ok) {
                        // alert("true");
                        // getList();
                        var user = resp.data;
                        $('#tb1').append('<tr><td>' + user.id + '</td><td>' + user.name +  '</td><td>' + user.age + '</td><td>' + user.createTime + '</td><td>' + " <button onclick='user_update(" + user.id +");'>修改</button> " + '</td><td>' + " <button onclick='user_delete(" + user.id +");'>删除</button> " + '</td></tr>');
                        alert('添加成功');
                    } else {
                        alert('false ' + resp.msg);
                    }
                }
            });
            return false;
        });

        $("#update_button").click(function() {
            $.ajax({
                url : "${base}/user/update",
                data : $("#add_form").serialize(),
                // data : {"id": $("#id").val()},
                method : "POST",
                dataType : "json",
                success : function(resp) {
                    if (resp.ok) {
                        getList();
                        alert('修改成功');
                    } else {
                        alert('fasle ' + resp.msg);
                    }
                }
            });
            return false;
        });

        $("#delete_button").click(function () {
            $.ajax({
                url : "${base}/user/delete233",
                // data : $("#add_form").serialize(),
                data : {"id": $("#id").val()},
                method : "POST",
                dataType : "json",
                success : function(resp) {
                    if (resp.ok) {
                        getList();
                        alert('修改成功');
                    } else {
                        alert('fasle ' + resp.msg);
                    }
                }
            });
            return false;
        });
        $("#delete233_button").click(function() {
            $.ajax({
                url : "${base}/user/delete233",
                // data : $("#add_form").serialize(),
                data : {"id": $("#id").val()},
                method : "POST",
                dataType : "json",
                success : function(resp) {
                    if (resp.ok) {
                        getList();
                        alert('修改成功');
                    } else {
                        alert('fasle ' + resp.msg);
                    }
                }
            });
            return false;
        });
    });

	function getList() {
        // alert("登陆成功");
        $.ajax({
            url : "${base}/user/list",
            method : "GET",
            dataType : "json",
            success : function(resp) {
                $('#tb1').html('<thead>\n' + '<tr>' +'<td>id</td>' +'<td>用户名</td>' +'<td>年龄</td>' +'<td>创建日期</td>' +'<td>操作</td>' +'<td>操作</td>' +'</tr>' +'</thead>' +'<tbody>' +'' +'</tbody>')
				// $('#tb1').append
                for (var i in resp.list) {
                    var user = resp.list[i];
                    $('#tb1').append('<tr><td>' + user.id + '</td><td>' + user.name +  '</td><td>' + user.age + '</td><td>' + user.createTime + '</td><td>' + '修改' + '</td><td>' + '删除' + '</td></tr>');
                }
            }
        });
	}

	function getList2() {
        $.ajax({
            url : ${base} + "/user/query",
            data : $("#user_query_form").serialize(),
            dataType : "json",
            success : function(data) {
                console.log(data);
                $("#user_count").html("共"+data.pager.recordCount+"个用户, 总计"+data.pager.pageCount+"页");
                var list_html = "";
                console.log(data.list);
                for (var i=0;i<data.list.length;i++) {
                    var user = data.list[i];
                    console.log(user);
                    var tmp = "\n<p>" + user.id + " " + user.name + " " + user.age
                        + " <button onclick='user_update(" + user.id +");'>修改</button> "
                        + " <button onclick='user_delete(" + user.id +");'>删除</button> "
                        + "</p>";
                    list_html += tmp;
                }
                $("#user_list").html(list_html);
            }
        });
    }
    function user_update(userId) {
        var passwd = prompt("请输入新的密码");
        if (passwd) {
            $.ajax({
                url : base + "/user/update",
                data : {"id":userId,"password":passwd},
                dataType : "json",
                success : function (data) {
                    if (data.ok) {
                        user_reload();
                        alert("修改成功");
                    } else {
                        alert(data.msg);
                    }
                }
            });
        }
    };
    function user_delete(userId) {
        var s = prompt("请输入y确认删除");
        if (s == "y") {
            $.ajax({
                url : base + "/user/delete",
                data : {"id":userId},
				// method : 'GET',
                dataType : "json",
                success : function (data) {
                    if (data.ok) {
                        user_reload();
                        alert("删除成功");
                    } else {
                        alert(data.msg);
                    }
                }
            });
        }
    };


</script>
</html>

去掉@Attr,看看是不是这个原因

去掉 @Attr("me")int me 之后可以进入UserModule
这个是因为我jsp中缺少 "me",然后造成的参数不匹配吗

    @At
    public NutMap delete(@Param("id")int id) {
        dao.delete(User.class, id); // 再严谨一些的话,需要判断是否为>0
        return new NutMap().setv("ok", true);
    }

声明个@Attr("me") Object abc,然后打印一下abc的类型

在UserModule里加上了 @Attr("me") Object abc 之后就跳不过去了。但在浏览器中看到的 "me" 是"net.wendal.nutzdemo.bean.User@46563ab"

后台添加@Attr("me") Object abc 后的代码

    @At
    public NutMap delete(@Param("id")int id, @Attr("me")Object me) {
//        if (me == id) {
//            return new NutMap().setv("ok", false).setv("msg", "不能删除当前用户!!");
//        }
        dao.delete(User.class, id);
        return new NutMap().setv("ok", true);
    }

你在某个地方把user对象放到session了?而且名字还叫me

我只在UserModule存了me

    @At
    @Filters // 覆盖UserModule类的@Filter设置,因为登陆可不能要求是个已经登陆的Session
    public Object login(@Param("username")String name, @Param("password")String password, HttpSession session) {
        User user = dao.fetch(User.class, Cnd.where("name", "=", name).and("password", "=", password));
        if (user == null) {
            return false;
        } else {
            session.setAttribute("me", user.getId());
            return true;
        }
    }

把当前session登出,重新登录一次试试

找到原因了!
原本写了一个UserModule,然后挪到另一个位置了并且改成了UserModule_bak,但@At("/user")没有改,所以这里跳转的位置不对,所以真正执行的登陆代码如下,因此传入的"me"是一个user对象。并且在之后的跳转中产生各种影响。
感谢大佬的耐心指教!

    @Filters
    @POST
    @At
    public NutMap login_bak(String username, String password, HttpSession session) {
        NutMap re = new NutMap("ok", false);
        if (Strings.isBlank(username) || Strings.isBlank(password)) {
            log.debug("username or password is null");
            return re.setv("msg", "用户名或密码不能为空");
        }
        User user = dao.fetch(User.class, username);
        if (user == null) {
            log.debug("no such user = " + username);
            return re.setv("msg", "没有该用户");
        }
        String tmp = Lang.digest("SHA-256", user.getSalt() + password);
        if (!tmp.equals(user.getPassword())) {
            log.debug("password is wrong");
            return re.setv("msg", "密码错误");
        }
        session.setAttribute("me", user);
        return re.setv("ok", true);
    }
添加回复
请先登陆
回到顶部