• Unexpected Exception caught setting 'username' on 'class com.bj186.crm.web.action.UserAction: Error setting expression 'username' with value ['艾格尼丝', ]


    问题场景: 在使用表单向Action传递数据的时候, 遇到了这个问题, 导致了空指针异常. 

    问题描述:

    10:14:56.622 [http-nio-8080-exec-45] ERROR com.opensymphony.xwork2.interceptor.ParametersInterceptor - Developer Notification (set struts.devMode to false to disable this message):
    Unexpected Exception caught setting 'password' on 'class com.bj186.crm.web.action.UserAction: Error setting expression 'password' with value ['123456', ]
    10:14:56.648 [http-nio-8080-exec-45] ERROR com.opensymphony.xwork2.interceptor.ParametersInterceptor - Developer Notification (set struts.devMode to false to disable this message):
    Unexpected Exception caught setting 'submit' on 'class com.bj186.crm.web.action.UserAction: Error setting expression 'submit' with value ['', ]
    10:14:56.649 [http-nio-8080-exec-45] ERROR com.opensymphony.xwork2.interceptor.ParametersInterceptor - Developer Notification (set struts.devMode to false to disable this message):
    Unexpected Exception caught setting 'username' on 'class com.bj186.crm.web.action.UserAction: Error setting expression 'username' with value ['艾格尼丝', ]
    java.lang.NullPointerException
        at com.bj186.crm.web.action.UserAction.login(UserAction.java:70)
        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 ognl.OgnlRuntime.invokeMethod(OgnlRuntime.java:902)
        at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1547)
        at ognl.ObjectMethodAccessor.callMethod(ObjectMethodAccessor.java:68)

    问题分析: 这个问题非常隐蔽, 是Struts2在接受值的时候, 不能正确的接收. 问题的根本原因在于没有创建接收数据的对象

    解决思路: 在Action中把需要接收数据的类的对象new出来

    private User user = new User();

    并且设置它的getter和setter方法

    然后这个问题就解决了!!!

    附Struts2的UserAction.java的代码

    package com.bj186.crm.web.action;
    
    import com.bj186.crm.entity.User;
    import com.bj186.crm.service.UserService;
    import com.opensymphony.xwork2.Action;
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.ModelDriven;
    import com.opensymphony.xwork2.util.ValueStack;
    import org.apache.struts2.ServletActionContext;
    import org.springframework.web.context.WebApplicationContext;
    import org.springframework.web.context.support.WebApplicationContextUtils;
    
    import javax.servlet.ServletContext;
    import java.util.Arrays;
    import java.util.List;
    
    public class UserAction extends ActionSupport implements ModelDriven<User> {
        private User user = new User();
        private UserService userService;
        private ValueStack valueStack;
    
        //测试添加上User的get和set方法
        public void setUser(User user) {
            //ServletActionContext.getRequest().getParameter("username")
            this.user = user;
        }
    
        public User getUser() {
            return user;
        }
    
        public void setUserService(UserService userService) {
            this.userService = userService;
        }
    
        public UserAction() {
            //1.获取ServletContext
            ServletContext servletContext = ServletActionContext.getServletContext();
            //2.通过整合包中的工具类, 从servletContext的作用域上获取目标--Spring的容器WebApplicationContext
            WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);
            //3.从Spring的容器中获取对象
            userService = webApplicationContext.getBean("userService", UserService.class);
            System.out.println("userService:"+userService);
            //4.获取值栈
            ActionContext context = ActionContext.getContext();
            valueStack = context.getValueStack();
        }
    
        public String execute() {
            System.out.println("正在UserAction的execute()方法中!");
            return Action.SUCCESS;
        }
    
        /**
         * 添加用户
         * @return 字符串状态
         */
        public String register() {
            User user = (User) valueStack.findValue("user");
            userService.register(user);
            return Action.SUCCESS;
        }
    
        /**
         * 用户登录
         * @return
         */
        public String login() {
            String username = user.getUsername();
            String password = user.getPassword();
            boolean isLogin = userService.verifyLogin(username,password);
            return isLogin? Action.SUCCESS: Action.NONE;
        }
    
        /**
         * 删除用户
         * @return 字符串状态
         */
        public String deleteUser(Integer uid) {
            userService.deleteUser(uid);
            return Action.SUCCESS;
        }
    
        /**
         * 修改用户
         * @return 字符串状态
         */
        public String updateUser() {
            User user = (User)valueStack.findValue("user");
            userService.updateUser(user);
            return Action.SUCCESS;
        }
    
        /**
         * 查询用户
         * @return 字符串状态
         */
        public String getUserById(Integer uid) {
            User user = userService.selectUserById(uid);
            System.out.println("查询出来的用户是: " + user);
            return Action.SUCCESS;
        }
    
        /**
         * 显示用户页面
         * @return
         */
        public String showAllUsers() {
            System.out.println("显示所有的用户");
            return Action.SUCCESS;
        }
    
        /**
         * 查询出所有的用户
         * @return
         */
        public String selectAllUsers() {
            List<User> userList = userService.selectAllUsers();
            valueStack.set("userList",userList);
            System.out.println("查到的用户个数为: " + userList.size());
            return Action.SUCCESS;
        }
    
        @Override
        public User getModel() {
            return user;
        }
    }
    View Code

    前端页面的index.jsp代码

    <%-- Created by IntelliJ IDEA. --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>用户管理系统首页</title>
      </head>
      <body>
          <h2 style="color:red;">欢迎光临!</h2>
      <form action="<%=request.getContextPath()%>/user_login.action" method="post">
          <input name="username" type="text"><br/>
          <input name="password" type="password"><br/>
          <button name="submit" type="submit">登录</button>
      </form>
      </body>
    </html>
    View Code
  • 相关阅读:
    struts2在result中使用el表达式碰到的问题
    JSP学习笔记—— jsp中include文件指令乱码的三种解决方案
    SSH整合,applicationContext.xml中配置hibernate映射文件问题
    struts上传文件失败 ContentType not allowed错误解决方法【转】
    mysql5 乱码问题解决方案
    java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory的解决
    JQuery使用on绑定动态生成元素时碰到的问题
    Oracle异常处理
    C#窗口拦截键盘事件
    Oracle中动态SQL详解
  • 原文地址:https://www.cnblogs.com/zjulanjian/p/10953837.html
Copyright © 2020-2023  润新知