JavaWeb14.5【servlet&http&request:综合案例-用户登录】
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <form action="/day14_test/loginServlet" method="post"> <!--action路径的写法:虚拟目录+Servlet的资源路径--> 9 用户名:<input type="text" name="username"> <br> 10 密码:<input type="password" name="password"><br> 11 12 <input type="submit" value="登录"> 13 14 </form> 15 </body> 16 </html>
1 driverClassName=com.mysql.jdbc.Driver 2 url=jdbc:mysql:///day14 3 username=root 4 password=root 5 initialSize=5 6 maxActive=10 7 maxWait=3000
1 package com.haifei.domain; 2 3 /** 4 * 用户的实体类 javabean 5 */ 6 /*public class User { 7 8 private int id; 9 private String username; 10 private String password; 11 12 public User() { 13 } 14 15 public User(int id, String username, String password) { 16 this.id = id; 17 this.username = username; 18 this.password = password; 19 } 20 21 public void setId(int id) { 22 this.id = id; 23 } 24 25 public void setUsername(String username) { 26 this.username = username; 27 } 28 29 public void setPassword(String password) { 30 this.password = password; 31 } 32 33 public int getId() { 34 return id; 35 } 36 37 public String getUsername() { 38 return username; 39 } 40 41 public String getPassword() { 42 return password; 43 } 44 45 @Override 46 public String toString() { 47 return "User{" + 48 "id=" + id + 49 ", username='" + username + '\'' + 50 ", password='" + password + '\'' + 51 '}'; 52 } 53 }*/ 54 55 public class User { 56 57 private int id; 58 private String username; 59 private String password; 60 61 private String gender; 62 public void setHehe(String gender){ //BeanUtilsTest演示特例,一般不要这样写 63 this.gender = gender; 64 } 65 public String getHehe(){ 66 return gender; 67 } 68 69 public void setId(int id) { 70 this.id = id; 71 } 72 73 public void setUsername(String username) { 74 this.username = username; 75 } 76 77 public void setPassword(String password) { 78 this.password = password; 79 } 80 81 public int getId() { 82 return id; 83 } 84 85 public String getUsername() { 86 return username; 87 } 88 89 public String getPassword() { 90 return password; 91 } 92 93 @Override 94 public String toString() { 95 return "User{" + 96 "id=" + id + 97 ", username='" + username + '\'' + 98 ", password='" + password + '\'' + 99 ", gender='" + gender + '\'' + 100 '}'; 101 } 102 }
1 package com.haifei.util; 2 3 import com.alibaba.druid.pool.DruidDataSource; 4 import com.alibaba.druid.pool.DruidDataSourceFactory; 5 6 import javax.sql.DataSource; 7 import java.io.IOException; 8 import java.io.InputStream; 9 import java.sql.Connection; 10 import java.sql.SQLException; 11 import java.util.Properties; 12 13 /** 14 * JDBC工具类 使用Durid连接池 15 */ 16 public class JDBCUtils { 17 18 private static DataSource ds; 19 20 static { 21 //tips:选中多行代码,快捷键ctrl+alt+t 可选多种形式将所选代码包裹起来,如trycatch、if、循环等 22 try { 23 //1 加载配置文件 24 Properties prop = new Properties(); 25 InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"); //字节输入流 26 prop.load(is); 27 28 //2 初始化连接池对象 29 ds = DruidDataSourceFactory.createDataSource(prop); 30 } catch (IOException e) { 31 e.printStackTrace(); 32 } catch (Exception e) { 33 e.printStackTrace(); 34 } 35 } 36 37 /** 38 * 获取连接池对象 39 * @return 40 */ 41 public static DataSource getDataSource(){ 42 return ds; 43 } 44 45 /** 46 * 获取连接对象 47 * @return 48 * @throws SQLException 49 */ 50 public static Connection getConnection() throws SQLException { 51 return ds.getConnection(); 52 } 53 54 }
1 package com.haifei.dao; 2 3 import com.haifei.domain.User; 4 import com.haifei.util.JDBCUtils; 5 import org.springframework.dao.DataAccessException; 6 import org.springframework.jdbc.core.BeanPropertyRowMapper; 7 import org.springframework.jdbc.core.JdbcTemplate; 8 9 /** 10 * 操作数据库中User表的类 11 */ 12 public class UserDao { 13 14 //声明JDBCTemplate对象,在此类中的所有方法共用 15 private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource()); 16 17 /** 18 * 登录方法 19 * @param loginUser 此User仅包含页面输入的用户名和密码 20 * @return 查询成功时返回的User包含User对象的全部信息;查询不到时返回null 21 */ 22 public User login(User loginUser){ 23 //tips:选中多行代码,快捷键ctrl+alt+t 可选多种形式将所选代码包裹起来,如trycatch、if、循环等 24 25 try { 26 27 String sql = "select * from user where username=? and password=?"; 28 User user = template.queryForObject(sql, 29 new BeanPropertyRowMapper<User>(User.class), 30 loginUser.getUsername(), loginUser.getPassword()); 31 return user; 32 33 } catch (DataAccessException e) { 34 e.printStackTrace(); //此处应记录在日志文件中 35 return null; 36 } 37 } 38 39 40 }
1 package com.haifei.test; 2 3 import com.haifei.dao.UserDao; 4 import com.haifei.domain.User; 5 import org.junit.Test; 6 7 /** 8 * 在UserDao完成后,应先进行测试 9 * 采用JUnit进行单元测试 10 * 注解@Test public void testXxx(){} 11 */ 12 public class UserDaoTest { 13 14 @Test 15 public void testLogin(){ 16 User loginUser = new User(); 17 loginUser.setUsername("zhangsan"); 18 // loginUser.setPassword("123"); 19 loginUser.setPassword("123111"); //报错 --> 优化UserDao代码 20 //org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0 21 //at com.haifei.dao.UserDao.login(UserDao.java:23) 22 23 UserDao userDao = new UserDao(); 24 User user = userDao.login(loginUser); 25 26 System.out.println(user); //User{id=3, username='zhangsan', password='123'} 27 } 28 29 }
1 package com.haifei.web.servlet; 2 3 import com.haifei.dao.UserDao; 4 import com.haifei.domain.User; 5 import org.apache.commons.beanutils.BeanUtils; 6 7 import javax.servlet.ServletException; 8 import javax.servlet.annotation.WebServlet; 9 import javax.servlet.http.HttpServlet; 10 import javax.servlet.http.HttpServletRequest; 11 import javax.servlet.http.HttpServletResponse; 12 import java.io.IOException; 13 import java.lang.reflect.InvocationTargetException; 14 import java.util.Map; 15 16 @WebServlet("/loginServlet") 17 public class LoginServlet extends HttpServlet { 18 @Override 19 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 20 /*//设置编码 21 req.setCharacterEncoding("utf-8"); 22 //获取请求数据 23 String username = req.getParameter("username"); 24 String password = req.getParameter("password"); 25 //封装user对象 26 User loginUser = new User(); 27 loginUser.setUsername(username); 28 loginUser.setPassword(password); 29 //调用UserDao的login方法 30 UserDao userDao = new UserDao(); 31 User user = userDao.login(loginUser); 32 //判断查询结果 33 if (user != null){ 34 //登录成功 35 req.setAttribute("user", user); //键值对 36 req.getRequestDispatcher("/successServlet").forward(req, resp); 37 }else { 38 //登录失败 39 req.getRequestDispatcher("/failServlet").forward(req, resp); 40 }*/ 41 42 43 44 //设置编码 45 req.setCharacterEncoding("utf-8"); 46 47 Map<String, String[]> map = req.getParameterMap(); 48 User loginUser = new User(); 49 //使用BeanUtils工具类来封装user(简化操作,不管user对象有多少个参数都一次性封装好) 50 try { 51 BeanUtils.populate(loginUser, map); //注意此工具类来自apache.commons包下 52 } catch (IllegalAccessException e) { 53 e.printStackTrace(); 54 } catch (InvocationTargetException e) { 55 e.printStackTrace(); 56 } 57 58 //调用UserDao的login方法 59 UserDao userDao = new UserDao(); 60 User user = userDao.login(loginUser); 61 //判断查询结果 62 if (user != null){ 63 //登录成功 64 req.setAttribute("user", user); //键值对 65 req.getRequestDispatcher("/successServlet").forward(req, resp); 66 }else { 67 //登录失败 68 req.getRequestDispatcher("/failServlet").forward(req, resp); 69 } 70 } 71 72 @Override 73 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 74 this.doPost(req, resp); 75 } 76 }
1 package com.haifei.web.servlet; 2 3 import javax.servlet.ServletException; 4 import javax.servlet.annotation.WebServlet; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 import java.io.IOException; 9 10 @WebServlet("/failServlet") 11 public class FailServlet extends HttpServlet { 12 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 13 //在页面上显示提示信息 14 response.setContentType("text/html;charset=utf-8"); //设置编码 15 response.getWriter().write("登录失败,用户名或密码错误"); //输出 16 } 17 18 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 19 this.doPost(request, response); 20 } 21 }
1 package com.haifei.web.servlet; 2 3 import com.haifei.domain.User; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.annotation.WebServlet; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 import java.io.IOException; 11 12 @WebServlet("/successServlet") 13 public class SuccessServlet extends HttpServlet { 14 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 15 //获取request域中共享的user对象 16 // Object user = request.getAttribute("user"); 17 User user = (User) request.getAttribute("user"); 18 if (user != null) { 19 //在页面上显示提示信息 20 response.setContentType("text/html;charset=utf-8"); //设置编码 21 response.getWriter().write("登录成功!" + user.getUsername() + ",欢迎您"); //输出 22 } 23 } 24 25 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 26 this.doPost(request, response); 27 } 28 }
1 package com.haifei.test; 2 3 import com.haifei.domain.User; 4 import org.apache.commons.beanutils.BeanUtils; 5 import org.junit.Test; 6 7 import java.lang.reflect.InvocationTargetException; 8 9 /** 10 * 测试BeanUtils工具类的setProperty()和getProperty() 11 */ 12 public class BeanUtilsTest { 13 14 @Test 15 public void test(){ 16 /*User user = new User(); 17 try { 18 BeanUtils.setProperty(user, "username", "zhangsan"); 19 } catch (IllegalAccessException e) { 20 e.printStackTrace(); 21 } catch (InvocationTargetException e) { 22 e.printStackTrace(); 23 } 24 System.out.println(user); //User{id=0, username='zhangsan', password='null'}*/ 25 26 27 28 29 /*User user = new User(); 30 try { 31 BeanUtils.setProperty(user, "gender", "male"); 32 } catch (IllegalAccessException e) { 33 e.printStackTrace(); 34 } catch (InvocationTargetException e) { 35 e.printStackTrace(); 36 } 37 System.out.println(user); //User{id=0, username='null', password='null', gender='null'}*/ 38 39 User user = new User(); 40 try { 41 BeanUtils.setProperty(user, "hehe", "male"); 42 } catch (IllegalAccessException e) { 43 e.printStackTrace(); 44 } catch (InvocationTargetException e) { 45 e.printStackTrace(); 46 } 47 System.out.println(user); //User{id=0, username='null', password='null', gender='male'} 48 49 50 51 String gender = null; 52 try { 53 gender = BeanUtils.getProperty(user, "hehe"); 54 } catch (IllegalAccessException e) { 55 e.printStackTrace(); 56 } catch (InvocationTargetException e) { 57 e.printStackTrace(); 58 } catch (NoSuchMethodException e) { 59 e.printStackTrace(); 60 } 61 System.out.println(gender); //male 62 } 63 64 65 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!