案例准备

用户实体
User.java

  1. package com.imooc.domain;
  2. public class User {
  3. private String username ;
  4. private String password ;
  5. private String nickname ;
  6. private String sex;
  7. private String hobby ;
  8. private String path ;
  9. public String getUsername() {
  10. return username;
  11. }
  12. public void setUsername(String username) {
  13. this.username = username;
  14. }
  15. public String getPassword() {
  16. return password;
  17. }
  18. public void setPassword(String password) {
  19. this.password = password;
  20. }
  21. public String getNickname() {
  22. return nickname;
  23. }
  24. public void setNickname(String nickname) {
  25. this.nickname = nickname;
  26. }
  27. public String getSex() {
  28. return sex;
  29. }
  30. public void setSex(String sex) {
  31. this.sex = sex;
  32. }
  33. public String getHobby() {
  34. return hobby;
  35. }
  36. public void setHobby(String hobby) {
  37. this.hobby = hobby;
  38. }
  39. public String getPath() {
  40. return path;
  41. }
  42. public void setPath(String path) {
  43. this.path = path;
  44. }
  45. }

因为这里还没有引入数据库的概念,因此,使用集合来初始化数据:
InitServlet.java

  1. package com.imooc.servlet;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import com.imooc.domain.User;;
  8. /**
  9. * 用户注册的初始化的Servlet
  10. */
  11. @WebServlet("/InitServlet")
  12. public class InitServlet extends HttpServlet {
  13. @Override
  14. public void init() throws ServletException {
  15. // 创建一个List集合用于保存用户注册的信息:
  16. List<User> list = new ArrayList<User>();
  17. // 将list保存到ServletContext作用域中
  18. this.getServletContext().setAttribute("list",list);
  19. }
  20. }

然后,需要在web.xml中配置启动的项目:

  1. <servlet>
  2. <display-name>InitServlet</display-name>
  3. <servlet-name>InitServlet</servlet-name>
  4. <servlet-class>com.imooc.servlet.InitServlet</servlet-class>
  5. <load-on-startup>2</load-on-startup>
  6. </servlet>

注册功能

文件上传

这里有个上传文件的功能,文件上传需要有几个条件。

  • 表单必须是post提交方式
  • 表单中必须有文件上传项type = “file”,文件上传项必须有name属性和值
  • 表单的enctype属性必须设置为multipart/form-data

文件上传,这里使用了fileupload的jar包和iojar包,放在WEN-INF下的lib文件夹中。

因为这里会上传文件,因此,没有使用传统的request方法来接收参数。
RegistServlet.java

  1. package com.imooc.servlet;
  2. import java.io.IOException;
  3. import java.util.List;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import org.apache.commons.fileupload.FileItem;
  10. import org.apache.commons.fileupload.FileUploadException;
  11. import org.apache.commons.fileupload.disk.DiskFileItem;
  12. import org.apache.commons.fileupload.disk.DiskFileItemFactory;
  13. import org.apache.commons.fileupload.servlet.ServletFileUpload;
  14. /**
  15. * 用户注册的servlet
  16. */
  17. @WebServlet("/RegistServlet")
  18. public class RegistServlet extends HttpServlet {
  19. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  20. //数据的接收
  21. //文件上传的基本操作
  22. try {
  23. //1、创建一个磁盘文件项工厂对象
  24. DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
  25. //2、创建一个核心解析类
  26. ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
  27. //3、解析request请求,返回的是List集合,List集合中存放的是FireItem对象
  28. List<FileItem> list = servletFileUpload.parseRequest(request);
  29. //4、遍历集合,获得每个FileItem,判断是表单项还是文件上传项
  30. for (FileItem fileItem : list) {
  31. //判断每一项是表单项还是文件上传项
  32. if(fileItem.isFormField()) {
  33. //普通表单项
  34. //接受表单参数的值
  35. String name = fileItem.getFieldName();//获得表单项的name属性的值
  36. String value = fileItem.getString("UTF-8");//获得表单项的值
  37. System.out.println(name+" "+value);
  38. }else {
  39. //文件上传项
  40. //文件上传功能
  41. }
  42. }
  43. } catch (FileUploadException e) {
  44. // TODO Auto-generated catch block
  45. e.printStackTrace();
  46. }
  47. }
  48. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  49. doGet(request, response);
  50. }
  51. }

regist.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta charset="UTF-8">
  7. <title>注册</title>
  8. <link rel="stylesheet" href="./css/reg.css">
  9. </head>
  10. <body>
  11. <div class="reg">
  12. <div class="header">
  13. <h1>
  14. <a href="./login.jsp">登录</a> <a href="./regist.jsp">注册</a>
  15. </h1>
  16. </div>
  17. <!-- 文件上传的条件
  18. * 表单必须是post提交方式
  19. * 表单中必须有文件上传项type = "file",文件上传项必须有name属性和值
  20. * 表单的enctype属性必须设置为multipart/form-data
  21. -->
  22. <form action="/reg_login/RegistServlet" method="post" enctype="multipart/form-data">
  23. <table>
  24. <tr>
  25. <td class="td1">用户名</td>
  26. <td><input type="text" class="input1" name="username"></td>
  27. </tr>
  28. <tr>
  29. <td class="td1">密码</td>
  30. <td><input type="password" class="input1" name="password"></td>
  31. </tr>
  32. <tr>
  33. <td class="td1">昵称</td>
  34. <td><input type="text" class="input1" name="nickname"></td>
  35. </tr>
  36. <tr>
  37. <td class="td1">性别</td>
  38. <td>
  39. <input type="radio" name="sex" value="male">男
  40. <input type="radio" name="sex" value="female">女
  41. </td>
  42. </tr>
  43. <tr>
  44. <td class="td1">上传头像</td>
  45. <td><input type="file" id="photo" name="upload"></td>
  46. </tr>
  47. <tr>
  48. <td class="td1">兴趣爱好</td>
  49. <td><label>
  50. <input type="checkbox" name="hobby" value="篮球">篮球
  51. <input type="checkbox" name="hobby" value="足球">足球
  52. <input type="checkbox" name="hobby" value="排球">排球
  53. <input type="checkbox" name="hobby" value="羽毛球">羽毛球
  54. </label></td>
  55. </tr>
  56. <tr>
  57. <td colspan="2">
  58. <div class="btn-red">
  59. <input type="submit" value="注册" id="reg-btn">
  60. </div>
  61. </td>
  62. </tr>
  63. </table>
  64. </form>
  65. </div>
  66. </body>
  67. </html>

对于头像上传,如何指定唯一的文件名,而不会使重名文件覆盖。
建一个包com.imooc.utils,在下面创建一个UploadUtils的类

package com.imooc.utils;
/*
 * 文件上传的工具类
 * 
 * 
 * */

import java.util.UUID;

public class UploadUtils {
/*
 * 生产唯一的文件名:    
 */
    public static String getUUIDFileName(String fileName) {
        //将文件名的前面部分进行截取,例如xx.jps --> .jpg
        int idx = fileName.lastIndexOf(".");
        //获取文件的扩展名,jpg,png等
        String extension = fileName.substring(idx);
        String uuidFileName = UUID.randomUUID().toString().replace("-","")+extension;
        return uuidFileName;
    }

}

RegistServlet.java

package com.imooc.servlet;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.imooc.domain.User;
import com.imooc.utils.UploadUtils;

/**
 * 用户注册的servlet
 */
@WebServlet("/RegistServlet")
public class RegistServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //数据的接收
        //文件上传的基本操作

        try {
            String url = null;//把url拉出来,这样可以写入到User中
            //至于这里为什么加try catch,是因为在下面的第三步eclipse自动推荐的

            //定义一个Map集合用于保存接收到的数据:
            Map<String,String> map = new HashMap<String,String>();

            //1、创建一个磁盘文件项工厂对象
            DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();

            //2、创建一个核心解析类
            ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);

            //3、解析request请求,返回的是List集合,List集合中存放的是FireItem对象
            List<FileItem> list = servletFileUpload.parseRequest(request);
            //定义一个List集合,用于保存兴趣爱好数据
            List<String> hobbyList = new ArrayList<String>();
            //4、遍历集合,获得每个FileItem,判断是表单项还是文件上传项
            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);
                        //把list转换为字符串,并且把前后的中括号给截取掉
                        hobbyValue = hobbyList.toString().substring(1,hobbyList.toString().length()-1);
                        System.out.println(name+"   "+hobbyValue);
                        //将hobby信息添加到map集合中
                        map.put(name,hobbyValue);
                    }else {
                        //将不是hobby的信息也添加到map集合中
                        map.put(name,value);
                    }
                }else {
                    //文件上传项
                    //文件上传功能
                    //获得文件上传的名称
                    String fileName = fileItem.getName();
                    //通过工具类获得唯一文件名
                    String uuidFileName = UploadUtils.getUUIDFileName(fileName);
                    //获得文件上传的数据
                    InputStream is = fileItem.getInputStream();
                    //获得文件上传的路径
                    String path = this.getServletContext().getRealPath("/upload");
                    //将输入流对接到输出流
                    //把下面的url拉到上面去,使下面的user可以访问到
                    //String url = path+"\\"+uuidFileName;
                    url = path+"\\"+uuidFileName;
                    OutputStream os = new FileOutputStream(url);

                    //下面的输入和输出流不太懂,但最终是把上传的图片保存到了upload的文件夹下
                    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);
            //封装数据到User中:
            User user = new User();
            user.setHobby(map.get("hobby"));
            user.setNickname(map.get("nickname"));
            user.setPassword(map.get("password"));
            user.setSex(map.get("sex"));
            user.setUsername(map.get("username"));
            user.setPath(url);
            //将注册的信息存入到之前初始化的List集合中:
            //获得ServletContext对象,实际上这里应该拉上去,在user.set之前,因为有可能存在重复注册的问题,然后传递一个msg给jsp。jsp再显示此信息在网页上
            List<User> userList = (List<User>) this.getServletContext().getAttribute("list");
            userList.add(user);
            this.getServletContext().setAttribute("list",userList);

            //下面是测试代码,在控制台中把user信息都打印出来,打印出来的前提是需要在User类中重写toString方法
            for (User user1:userList) {
                System.out.println(user1);
            }

            //注册成功,跳转到登录页面
            //同时利用session把用户名username也传过去
            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);
    }

}

login.jsp

<%@ 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>
    <div class="login">
        <div class="header">
            <h1>
                <a href="./login.jsp">登录</a> <a href="./regist.jsp">注册</a>
            </h1>

        </div>

        <%
            //这里用于接收注册页面传入的username参数,然后赋值给下面的用户名的value
            String username = "";
            if(session.getAttribute("username")!=null){
                username = (String)session.getAttribute("username");
            }
        %>

        <form action="" method="post">
            <table>
                <tr>
                    <td class="td1">用户名</td>
                    <td><input type="text" class="input1" name="username" value="<%= username %>"></td>
                </tr>
                <tr>
                <td class="td1">密码</td>
                <td><input type="password" class="input1" name="password"></td>
                </tr>
                <tr>
                <td class="td1" colspan="2">
                    <input type="checkbox" name="remember" value="true" checked="checked"> 记住用户名</td>
                </tr>
                <tr>
                    <td colspan="2">
                        <div class="btn-red">
                            <input type="submit" value="登录" id="login-btn">
                        </div>
                    </td>
                </tr>
            </table>

        </form>
    </div>
</body>
</html>

登录功能

cookie是一个数组。
对数组进行遍历,找指定的名称,此时可以把查找的代码封装一下,放在在utils下单建一个类来操作。

最终的课程代码:
image.png
User.java:

package com.imooc.domain;

public class User {
    private String username ; 
    private String password ;
    private String nickname ;
    private String sex;
    private String hobby ;
    private String path ;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getNickname() {
        return nickname;
    }
    public void setNickname(String nickname) {
        this.nickname = nickname;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getHobby() {
        return hobby;
    }
    public void setHobby(String hobby) {
        this.hobby = hobby;
    }
    public String getPath() {
        return path;
    }
    public void setPath(String path) {
        this.path = path;
    }
    @Override
    public String toString() {
        return "User [username=" + username + ", password=" + password + ", nickname=" + nickname + ", sex=" + sex
                + ", hobby=" + hobby + ", path=" + path + "]";
    }
}

InitServlet.java

package com.imooc.servlet;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import com.imooc.domain.User;;
/**
 * 用户注册的初始化的Servlet
 */ 
@WebServlet("/InitServlet")
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);
    }
}

LoginServlet.java

package com.imooc.servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.imooc.domain.User;;
/**
 * 用户登录的Servlet
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {

    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");//这里的cast是eclipse推荐的,不然会报错
        for (User user:list) {
            //判断用户名和密码是否正确:
            if(username.equals(user.getUsername())) {
                //用户名正确
                if(password.equals(user.getPassword())) {
                    //密码正确

                    String remember = request.getParameter("remember");
                    //判断复选框是否选中
                    if("true".equals(remember)) {
                        //完成记住用户名的功能:
                        Cookie cookie = new Cookie("username",user.getUsername());
                        //设置路径名和有效时间:
                        cookie.setPath(request.getContextPath());
                        //设置有效时间:
                        cookie.setMaxAge(60*60*24);//保存24小时
                        //将cookie回写到浏览器:
                        response.addCookie(cookie);                                            
                        //这里加上之后,可以在浏览器f12网络中的cookie中可以看到多了一个username=xxx

                    }
                    //将用户信息保存到session中;
                    request.getSession().setAttribute("user", user);
                    //跳转到成功的页面
                    response.sendRedirect(request.getContextPath()+"/success.jsp");
                    System.out.println(request.getContextPath());
                    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);
    }

}

RegistServlet.java

package com.imooc.servlet;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.imooc.domain.User;
import com.imooc.utils.UploadUtils;

/**
 * 用户注册的servlet
 */
@WebServlet("/RegistServlet")
public class RegistServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //数据的接收
        //文件上传的基本操作

        try {
            String url = null;//把url拉出来,这样可以写入到User中
            //至于这里为什么加try catch,是因为在下面的第三步eclipse自动推荐的

            //定义一个Map集合用于保存接收到的数据:
            Map<String,String> map = new HashMap<String,String>();

            //1、创建一个磁盘文件项工厂对象
            DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();

            //2、创建一个核心解析类
            ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);

            //3、解析request请求,返回的是List集合,List集合中存放的是FireItem对象
            List<FileItem> list = servletFileUpload.parseRequest(request);
            //定义一个List集合,用于保存兴趣爱好数据
            List<String> hobbyList = new ArrayList<String>();
            //4、遍历集合,获得每个FileItem,判断是表单项还是文件上传项
            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);
                        //把list转换为字符串,并且把前后的中括号给截取掉
                        hobbyValue = hobbyList.toString().substring(1,hobbyList.toString().length()-1);
                        System.out.println(name+"   "+hobbyValue);
                        //将hobby信息添加到map集合中
                        map.put(name,hobbyValue);
                    }else {
                        //将不是hobby的信息也添加到map集合中
                        map.put(name,value);
                    }
                }else {
                    //文件上传项
                    //文件上传功能
                    //获得文件上传的名称
                    String fileName = fileItem.getName();
                    //通过工具类获得唯一文件名
                    String uuidFileName = UploadUtils.getUUIDFileName(fileName);
                    //获得文件上传的数据
                    InputStream is = fileItem.getInputStream();
                    //获得文件上传的路径
                    String path = this.getServletContext().getRealPath("/upload");
                    //将输入流对接到输出流
                    //把下面的url拉到上面去,使下面的user可以访问到
                    //String url = path+"\\"+uuidFileName;
                    url = path+"\\"+uuidFileName;
                    OutputStream os = new FileOutputStream(url);

                    //下面的输入和输出流不太懂,但最终是把上传的图片保存到了upload的文件夹下
                    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);
            //封装数据到User中:
            User user = new User();
            user.setHobby(map.get("hobby"));
            user.setNickname(map.get("nickname"));
            user.setPassword(map.get("password"));
            user.setSex(map.get("sex"));
            user.setUsername(map.get("username"));
            user.setPath(url);
            //将注册的信息存入到之前初始化的List集合中:
            //获得ServletContext对象,实际上这里应该拉上去,在user.set之前,因为有可能存在重复注册的问题,然后传递一个msg给jsp。jsp再显示此信息在网页上
            List<User> userList = (List<User>) this.getServletContext().getAttribute("list");
            userList.add(user);
            this.getServletContext().setAttribute("list",userList);

            //下面是测试代码,在控制台中把user信息都打印出来,打印出来的前提是需要在User类中重写toString方法
            for (User user1:userList) {
                System.out.println(user1);
            }

            //注册成功,跳转到登录页面
            //同时利用session把用户名username也传过去
            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);
    }

}

这里实际上有一个问题,在注册页面如果不上传附件的话,这里会报错,我觉得这里应该再加一个判断,值如果为空的话就不调用fileNameUtil了。

CookieUtils.java

package com.imooc.utils;

import javax.servlet.http.Cookie;

public class CookieUtils {
    public static Cookie findCookie(Cookie[] cookies,String name) {
        if(cookies == null) {
            //说明客户端没有携带Cookie:
            return null;
        }else {
            //说明客户端有携带Cookie
            for (Cookie cookie:cookies) {
                if(name.equals(cookie.getName())) {
                    return cookie;
                }
            }
        }
        //客户端携带的cookie不是我们给的
        return null;
    }
}

UploadUtils.java

package com.imooc.utils;
/*
 * 文件上传的工具类
 * 
 * 
 * */

import java.util.UUID;

public class UploadUtils {
/*
 * 生产唯一的文件名:    
 */
    public static String getUUIDFileName(String fileName) {
        //将文件名的前面部分进行截取,例如xx.jps --> .jpg
        int idx = fileName.lastIndexOf(".");
        //获取文件的扩展名,jpg,png等
        String extension = fileName.substring(idx);
        String uuidFileName = UUID.randomUUID().toString().replace("-","")+extension;
        return uuidFileName;
    }

}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>reg_login</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <display-name>InitServlet</display-name>
    <servlet-name>InitServlet</servlet-name>
    <servlet-class>com.imooc.servlet.InitServlet</servlet-class>
    <load-on-startup>2</load-on-startup>
  </servlet>
</web-app>

login.jsp

<%@page import="com.imooc.utils.CookieUtils"%>
<%@ 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>
    <div class="login">
        <div class="header">
            <h1>
                <a href="./login.jsp">登录</a> <a href="./regist.jsp">注册</a>
            </h1>

        </div>

        <%
            String username = "";


            //获取从客户端携带过来的所有的cookie,这里放在session的前面,如果session有值,则session优先,覆盖cookie
            Cookie [] cookies = request.getCookies();
            //从cookie数组中查找指定 名称的cookie
            Cookie cookie = CookieUtils.findCookie(cookies, "username");
                if(cookie!=null){
                    //这样的话,浏览器就会自动加载cookie里的值,写在session的上面,以便于session可以覆盖cookie的值
                    username=cookie.getValue();
                  }
            //这里用于接收注册页面传入的username参数,然后赋值给下面的用户名的value

            if(session.getAttribute("username")!=null){
                username = (String)session.getAttribute("username");
            }
            String msg = "";
            if(request.getAttribute("msg")!=null){
                msg = (String)request.getAttribute("msg");
            }


        %>
        <h3>登录页面</h3>
        <h3><%= msg %></h3>

        <form action="<%= request.getContextPath() %>/LoginServlet" method="post">
            <table>
                <tr>
                    <td class="td1">用户名</td>
                    <td><input type="text" class="input1" name="username" value="<%= username %>"></td>
                </tr>
                <tr>
                <td class="td1">密码</td>
                <td><input type="password" class="input1" name="password"></td>
                </tr>
                <tr>
                <td class="td1" colspan="2">
                    <input type="checkbox" name="remember" value="true" checked="checked"> 记住用户名</td>
                </tr>
                <tr>
                    <td colspan="2">
                        <div class="btn-red">
                            <input type="submit" value="登录" id="login-btn">
                        </div>
                    </td>
                </tr>
            </table>

        </form>
    </div>
</body>
</html>

regist.jsp

<%@ 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/reg.css">
</head>
<body>
    <div class="reg">
        <div class="header">
            <h1>
                <a href="./login.jsp">登录</a> <a href="./regist.jsp">注册</a>
            </h1>
        </div>
        <!-- 文件上传的条件
        * 表单必须是post提交方式
        * 表单中必须有文件上传项type = "file",文件上传项必须有name属性和值
        * 表单的enctype属性必须设置为multipart/form-data
         -->
        <form action="/reg_login/RegistServlet" method="post" enctype="multipart/form-data">
            <table>
                <tr>
                    <td class="td1">用户名</td>
                    <td><input type="text" class="input1" name="username"></td>
                </tr>
                <tr>
                    <td class="td1">密码</td>
                    <td><input type="password" class="input1" name="password"></td>
                </tr>
                <tr>
                    <td class="td1">昵称</td>
                    <td><input type="text" class="input1" name="nickname"></td>
                </tr>
                <tr>
                    <td class="td1">性别</td>
                    <td>
                        <input type="radio" name="sex" value="male">男
                        <input type="radio" name="sex" value="female">女
                    </td>
                </tr>
                <tr>

                <td class="td1">上传头像</td>

                    <td><input type="file" id="photo" name="upload"></td>

                </tr>
                <tr>
                    <td class="td1">兴趣爱好</td>
                    <td><label> 
                        <input type="checkbox" name="hobby" value="篮球">篮球
                        <input type="checkbox" name="hobby" value="足球">足球
                        <input type="checkbox" name="hobby" value="排球">排球 
                        <input type="checkbox" name="hobby" value="羽毛球">羽毛球
                    </label></td>
                </tr>
                <tr>
                    <td colspan="2">
                        <div class="btn-red">
                            <input type="submit" value="注册" id="reg-btn">
                        </div>
                    </td>
                </tr>
            </table>
        </form>
    </div>
</body>
</html>

success.jsp

<%@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");
        //获取最后一个\的下标,然后把文件名称定义一下
        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="<%=request.getContextPath() %>/upload/<%=fileName %>" ></td>

                </tr>
                <tr>
                    <td align="center">欢迎<%=user.getNickname() %>,登录成功!</td>
                </tr>
            </table>

        </div>
    </div>    

        <%

    }
    else{
    %>
    <h1>您还未登录,请前去<a href = "<%=request.getContextPath() %>/login.jsp">登录呦~</a></h1>

<%
    }
%>

</body>
</html>

问题点

IO不熟悉

xml的load参数不了解