登录和注册(精华版)
(一)实现功能
1.使用cookie记录登录成功的用户名,用户选择记住用户名,则用户再次登录时用户名自动显示
2.实现文件上传功能(上传文件的表单上传于普通的表单上传不同,必须是post,必须有value,enctype必须是multipart/form-data)
3.图片上传后的名称不能重复,使用随机生成的字符串(UUID)
4.实现图片显示功能(使用相对路径),通过session存放的地址信息,显示在页面中
5.使用session存放用户信息,在整个会话中都可以调用session中的信息
(二)页面显示
(三)代码实现
web.xml(配置)
<!DOCTYPEweb-appPUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <servlet> <servlet-name>ts</servlet-name> <servlet-class>servlet.InitServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ts</servlet-name> <url-pattern>/y</url-pattern> </servlet-mapping> </web-app>
pom.xml(配置)
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
User.java
package entity; public class User { private String username; private String password; 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 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; } }
InitServlet.java
package servlet; import entity.User; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import java.util.ArrayList; import java.util.List; @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 servlet; import entity.User; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import util.UploadUtil; import javax.servlet.ServletContext; 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 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; @WebServlet("/LoginServlet") public class LoginServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //数据的接收 //文件上传基本操作 try { //定义一个Map集合存放接收到的数据 Map<String,String> map=new HashMap<String,String>(); //1.创建一个磁盘文件项工厂对象 DiskFileItemFactory diskFileItemFactory=new DiskFileItemFactory(); //2.创建一个核心解析类 ServletFileUpload servletFileUpload=new ServletFileUpload(diskFileItemFactory); //3.解析request请求 List<FileItem> list=servletFileUpload.parseRequest(req); //定义一个List集合,用于保存复选框中的值 List<String> hobbyList=new ArrayList<String>(); //4.遍历集合,获得每个FileItem,判断是表单项还是文件上传项 String url=null; for(FileItem fileItem:list){ //判断是否是普通表单项 if(fileItem.isFormField()){ //接收表单项参数的值 String name=fileItem.getFieldName(); String value=fileItem.getString("UTF-8"); if("hobby".equals(name)){ //接收复选框的值 String hobbyvalue=fileItem.getString("UTF-8"); //将值存入hobbyList集合中 hobbyList.add(hobbyvalue); hobbyvalue=hobbyList.toString().substring(1,hobbyList.toString().length()-1); map.put(name,hobbyvalue); }else{ map.put(name,value); } }else{ //文件上传项 //文件上传功能 //获得文件上传的名称 String fileName=fileItem.getName(); //通过工具获得唯一文件名 String uuidFileName= UploadUtil.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(); } } User user=new User(); user.setUsername(map.get("username")); user.setPassword(map.get("password")); user.setSex(map.get("sex")); user.setHobby(map.get("hobby")); user.setPath(url); List<User> userlist=(List<User>)this.getServletContext().getAttribute("list"); userlist.add(user); System.out.println(user.getUsername()+","+user.getPassword()+","+user.getSex()+","+user.getHobby()+","+user.getPath()); resp.sendRedirect("login.jsp"); } catch (FileUploadException e) { e.printStackTrace(); } } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } }
LogonServlet.java
package servlet; import entity.User; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; import java.io.IOException; import java.util.List; @WebServlet("/LogonServlet") public class LogonServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String user=req.getParameter("user"); String password=req.getParameter("password"); String baocun=req.getParameter("baocun"); List<User> list=(List<User>)this.getServletContext().getAttribute("list"); for(User us:list){ if(us.getUsername().equals(user)&&us.getPassword().equals(password)){ //判断是否记住用户名 if("true".equals(baocun)){ //是,则将用户名存入cookie中 Cookie cookie=new Cookie("user",user); //在response中存入cookie resp.addCookie(cookie); } //在session中存入用户信息 HttpSession session=req.getSession(); session.setAttribute("user",us); req.getRequestDispatcher("/success.jsp").forward(req,resp); } else{ req.getRequestDispatcher("error.jsp").forward(req,resp); } } } }
UploadUtil.java
package util; import java.util.UUID; public class UploadUtil { //生成唯一的文件名 public static String getUUIDFileName(String fileName){ int idx=fileName.lastIndexOf("."); String extention=fileName.substring(idx); //生成随机字符串,避免文件名重复 String uuidFileName= UUID.randomUUID().toString().replace("-","")+extention; return uuidFileName; } }
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h2>注册</h2><a href="login.jsp">登录</a> <form action="LoginServlet" method="post" enctype="multipart/form-data"> 用户名:<input type="text" name="username"><br> 密码:<input type="password" name="password"><br> 性别:<input type="radio" name="sex" value="男">男 <input type="radio" name="sex" value="女">女<br> 爱好:<input type="checkbox" name="hobby" value="足球"> <input type="checkbox" name="hobby" value="篮球"> <input type="checkbox" name="hobby" value="武术"> <input type="checkbox" name="hobby" value="羽毛球"><br> 上传头像:<input type="file" name="photo"> <input type="submit" value="注册"> </form> </body> </html>
login.jsp
<%-- Created by IntelliJ IDEA. User: Administrator Date: 2019/7/25 0025 Time: 下午 4:09 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <%! String uname; %> <% Cookie[] cookies=request.getCookies(); for(Cookie cookie:cookies){ if(cookie.getName().equals("user")){ uname=cookie.getValue(); }else{ uname=""; } } %> <h2>登录</h2><a href="index.jsp">注册</a> <form action="LogonServlet" method="post"> 用户名:<input type="text" name="user" value="<%=uname%>"><br> 密码:<input type="text" name="password" ><br> <input type="checkbox" name="baocun" value="true">记住用户</input><br> <input type="submit" value="登录"> </form> </body> </html>
success.jsp
<%@ page import="entity.User" %><%-- Created by IntelliJ IDEA. User: Administrator Date: 2019/7/27 0027 Time: 上午 10:40 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> 登录成功! <% //得到session中存放的user User user=(User)session.getAttribute("user"); //得到文件名字 int idx=user.getPath().lastIndexOf("//"); String filename=user.getPath().substring(idx+1); System.out.println(filename); %> <img src="/upload/<%=filename%>"> </body> </html>
error.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> 登录失败! </body> </html>