关于页面报错

关于页面报错

http://img1.sycdn.imooc.com//climg/5a1f605a0001fa1c19201030.jpg

<%@page import="com.imooc.domain.User"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录成功</title>
<link rel="stylesheet" href="./css/login.css">
</head>
<body>
    <%
        if(session.getAttribute("user")!=null){
            User user = (User)session.getAttribute("user");
            System.out.println(user.getPath());
            // 获得绝对路径最后一个\的位置
            int idx = user.getPath().lastIndexOf("\\");
            // 获得文件上传的唯一文件名:
            String fileName = user.getPath().substring(idx+1);
    %>
    <div class="login">
        <div class="header">
            <h1>登录成功</h1>
        </div>
        <div class="content">
            <table align="center">
                <tr>
                    <td align="center"><img src="/reg_login/upload/<%= fileName %>" /></td>
                </tr>
                <tr>
                    <td align="center">欢迎<%= user.getNickname() %>,登录成功!</td>
                </tr>
            </table>

        </div>
    </div>    
    <%            
        }else{
    %>
    <div class="login">
        <div class="header">
            <h1>您还没有登录!请先去<a href="/reg_login/login.jsp">登录</a>!</h1>
        </div>
    </div>
    <%        
        }
    %>


</body>
</html>

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

5回答
一叶知秋519 2017-11-30 10:39:06

需要对user进行空值判断,如果user不为空,再进行后面的操作,可以这么写:

if(session.getAttribute("user")!=null){
User user = (User)session.getAttribute("user");
System.out.println(user.getPath());
// 获得绝对路径最后一个\的位置
int idx = user.getPath().lastIndexOf("\\");
....

Java中当操作一个空对象就会抛出空指针错误,提示你操作了一个不存在的对象。所以这一点,在以后编写代码的过程中也是需要注意的~~

  • 提问者 音殿 #1
    假如遇到了这种问题 我应该如何找出user的哪里空了呢?或者说哪里没能传值给user呢?
    2017-11-30 10:40:46
  • 一叶知秋519 回复 提问者 音殿 #2
    建议你去LoginServlet中将user中每一个属性值再后台打印一下,看下是否有问题,如果有空值的话,再 继续跟踪它的传值过程;一般情况下,碰到空指针异常,我们会使用断点调试或者控制台打印跟踪一下空值,然后进行代码的调整,建议你也这么试下;如果还有问题,可以再次提问。
    2017-11-30 11:17:22
  • 提问者 音殿 回复 一叶知秋519 #3
    怎么单独的去执行打印user属性值 具体该怎么操作? 我只会发布服务器 和 登陆网址
    2017-11-30 14:37:17
提问者 音殿 2017-11-30 09:40:48

public class InitServlet extends HttpServlet {
    @Override
    public void init()throws ServletException{
        //创建一个List集合用于保存用户注册的信息;
        List<User> list=new ArrayList<User>();
        //将list保存到ServletContext作用域中;
        this.getServletContext().setAttribute("list", list);
        
    }
}

提问者 音殿 2017-11-30 09:40:25

/**
 * 用户登录的Servlet
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 接收数据:
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        // 从ServletContext域中获得保存用户信息集合:
        List<User> list = (List<User>) this.getServletContext().getAttribute("list");
        for (User user : list) {
            // 判断用户名是否正确
            if (username.equals(user.getUsername())) {
                // 用户名是正确的
                if (password.equals(user.getPassword())) {

                    // 密码也正确:
                    // 登录成功:
                    // 将用户的信息保存session中:
                    request.getSession().setAttribute("user", user);
                    response.sendRedirect("/reg_login/success.jsp");
                    return;
                }
            }
        }
        // 登录失败:
        request.setAttribute("msg", "用户名或密码错误!");
        request.getRequestDispatcher("/login.jsp").forward(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

提问者 音殿 2017-11-30 09:40:05

public class UploadUtils {

    /**
     * 生成唯一的文件名
     */
    public static String getUUIDFileName(String fileName){
        //将文件名的前面部分进行截取:xx.jsp  -->  .jpg
        int idx = fileName.lastIndexOf(".");
        String extention=fileName.substring(idx);
        String uuidFileName=UUID.randomUUID().toString().replace("-", "")+extention;
        return uuidFileName;
    }
}

提问者 音殿 2017-11-30 09:39:47

public class RegistServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 数据的的接收
        // 文件上传基本操作:
        try {
            // 定义一个Map集合用于保存接收到的数据
            Map<String, String> map = new HashMap<>();
            // 1.创建一个磁盘文件项目工厂对象
            DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
            // 2.创建一个核心解析类
            ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
            // 3.解析request请求,返回的是List集合,List集合中存放的是FileItem对象
            List<FileItem> list;

            list = servletFileUpload.parseRequest(request);
            // 定义一个List集合,用于保存兴趣爱好数:
            List<String> hobbyList = new ArrayList<String>();
            // 4.遍历集合,获得每个FileItem,判断是表单项还是文件上传项
            String url = null;
            for (FileItem fileItem : list) {
                // 判断表单项还是文件上传项
                if (fileItem.isFormField()) {
                    // 普通表单项
                    // 接收表单项参数的值
                    String name = fileItem.getFieldName();// 获得表单项的name属性的值
                    String value = fileItem.getString("UTF-8");// 获得表单项的值
                    System.out.println(name + "       " + value);
                    // 接受复选框的数据
                    if ("hobby".equals(name)) {
                        String hobbyValue = fileItem.getString("UTF-8");
                        // 接收到一个值,将这个值存入到hobbyList集合中
                        hobbyList.add(hobbyValue);
                        hobbyValue = hobbyList.toString().substring(1, hobbyList.toString().length() - 1);// [xxx,yyy]
                        System.out.println(name + "         " + hobbyValue);
                        // 将爱好的数据存入到Map集合中
                        map.put(name, hobbyValue);
                    } else {
                        // 将数据存入到map集合中
                        map.put(name, value);
                    }
                } else {
                    // 文件上传项
                    // 文件上传功能
                    // 获得文件上传的名称:
                    String fileName = fileItem.getName();
                    if (fileName != null && !"".equals(fileName)) {
                        // 通过工具类获得唯一文件名:
                        String uuidFileName = UploadUtils.getUUIDFileName(fileName);
                        // 获得文件上传的数据:
                        InputStream is = fileItem.getInputStream();
                        // 获得文件上传的路径
                        String path = this.getServletContext().getRealPath("/upload");
                        // 将输入流对接到输出流就可以了:
                        url = path + "\\" + uuidFileName;
                        OutputStream os = new FileOutputStream(url);
                        int len = 0;
                        byte[] b = new byte[1024];
                        while ((len = is.read(b)) != -1) {
                            os.write(b, 0, len);
                        }
                        is.close();
                        os.close();
                    }
                }

            }
            System.out.println(map);
            // 获得ServletContext对象:
            List<User> userList = (List<User>) this.getServletContext().getAttribute("list");
            // 校验用户名
            for (User u : userList) {
                if (u.getUsername().equals(map.get("username"))) {
                    request.setAttribute("msg", "用户名已经存在!");
                    request.getRequestDispatcher("/regist.jsp").forward(request, response);
                    return;
                }
            }
            // 封装数据到User当中
            User user = new User();
            user.setUsername(map.get("username"));
            user.setPassword(map.get("password"));
            user.setSex(map.get("sex"));
            user.setNickname(map.get("nickname"));
            user.setHobby(map.get("hobby"));
            user.setPath(url);
            // 将注册用户的信息存入到List集合中:
            userList.add(user);
            for (User u : userList) {
                System.out.println(u);
            }
            this.getServletContext().setAttribute("list", userList);
            // 注册成功,跳转到登陆页面
            request.getSession().setAttribute("username", user.getUsername());
            response.sendRedirect(request.getContextPath() + "/login.jsp");
        } catch (

        FileUploadException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doGet(request, response);
    }

}

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Java Web基础入门2018版
  • 参与学习       716    人
  • 提交作业       185    份
  • 解答问题       1363    个

会Java?懂前端基础?想学后台开发?那么,赶快来学习《Java Web入门》路径吧。本路径主要介绍Java Web的基础知识,并配有大量案例,定会让你收获多多!

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师