一、分析具体功能
概述图
具体分析
第一步:我们可以通过分析得到,我们需要建立数据库stus(用户表t_user和学生表t_stu),通过Navicat配合mysql5.0建立表。
第二步:我们需要建立两个jsp文件:一个需要写注册的login.jsp页面,另外一个是通过判断之后弹出得到的学生信息stu_list.jsp页面。
而对于登录的界面需要去写三个input标签分别是账号密码和提交。然后学生信息界面我们这次做的是展示所有信息,其中就需要有一个form表单,然后表单里面对于展示所有信息就需要使用EL表达式配合JSTL的内置标签c:forEach去遍历结果,但是需要先导包。
第三步:我们需要去做一个前两步之间的login_servlet类,通过servlet需要获取信息(通过request.getParameter()方法),查询数据库(利用之前学过的jdbc用过的javaee结构),之后判断信息是否与数据库匹配(利用方法去查),最后给出判断(跳转还是给出提示)。
第四步:我们去完成jdbc关于查询数据库的操作。需要对于用户建立UserDao(写数据库操作的方法)/UserDaoImpl(通过获取后面这个类的属性,然后达到查询的功能)/JDBCUtil类(套之前写过的模板主要去创建属性配置对象,利用类加载器获取外部文件jdbc.properties,然后加载读取的信息)
第五步:去完成关于学生的操作,需要stuDao(和用户一样去写操作的代码)/Student(写每个学生信息项的get和set方法)/StuDaoImpl(和用户类一样,主要是查询)
二、具体代码:
StuDao类
1 2 3 4 5 6 7
| package dao; import java.util.List; import domain.Student; public interface StuDao { //查询出来所有的学习信息 List<Student> findAll(); }
|
UserDao类
1 2 3 4 5
| package dao; //该Dao定义了对于用户表访问的规则 public interface UserDao { boolean login(String username,String password); }
|
Student类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| package domain; public class Student { //到底有多少成员,想要在页面上显示多少 private int id; private String name; private int age; private String gender; private String address; //鼠标右键-源码-生成get和set方法 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
|
StuDaoImpl类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| package impl; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import dao.StuDao; import domain.Student; import util.JDBCUtil; public class StuDaoImpl implements StuDao { @Override public List<Student> findAll() { List<Student> list=new ArrayList(); Connection conn = null; PreparedStatement ps =null; ResultSet rs=null; try { //1.得到连接对象 conn = JDBCUtil.getConn(); String sql="select * from t_stu"; ps = conn.prepareStatement(sql); rs = ps.executeQuery(); //数据多了用对象装,对象多了用集合装 while(rs.next()) { //循环 Student stu=new Student(); //创建学生 //调用Student类里面的set get方法 stu.setId(rs.getInt("id")); stu.setAge(rs.getInt("age")); stu.setName(rs.getString("name")); stu.setGender(rs.getString("gender")); stu.setAddress(rs.getString("address"));
list.add(stu); } } catch (SQLException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); }finally{ JDBCUtil.release(conn,ps,rs); } return list; //需要返回装学生信息的集合 } }
|
UserDaoImpl类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| package impl; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import dao.UserDao; import util.JDBCUtil; public class UserDaoImpl implements UserDao { @Override public boolean login(String username,String password) //用finally所以将三个都提出来 Connection conn = null; PreparedStatement ps =null; ResultSet rs=null; try { //1.得到连接对象 conn = JDBCUtil.getConn(); //预先对sql语句执行语法的校验, ? 对应的内容,后面不管传递什么进来,都把它看成是字符串。 or select String sql="select * from t_user where username=? and password=?"; //2.创建ps对象 ps = conn.prepareStatement(sql); //? 对应的索引从 1 开始。 ps.setString(1, username); ps.setString(2, password); //3.开始执行 rs = ps.executeQuery(); //调用查询语句 //如果能成功移到下一条记录,那么表明有这个用户 return rs.next(); } catch (SQLException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); }finally{ JDBCUtil.release(conn,ps,rs); } return false; } }
|
loginServlet类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| package Servlet; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import dao.StuDao; import dao.UserDao; import domain.Student; import impl.StuDaoImpl; import impl.UserDaoImpl; /** *用于处理登录的servlet */ public class loginServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //提交的数据可能有中文: 1.在tomcat里面永久改 2.request方式 request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=utf-8"); //1.获取客户端login里面的账号和密码 String username = request.getParameter("username"); String password = request.getParameter("password"); //左父右子(面向接口)创建对象 //2.去数据库访问有没有这个用户 UserDao dao=new UserDaoImpl(); boolean isSuccess = dao.login(username, password); //3.针对Dao的结果做出响应 if(isSuccess) { //1.查询出来所有的学生信息 StuDao stuDao=new StuDaoImpl(); List<Student> list = stuDao.findAll();
//2.先把这个集合存到作用域 request.getSession().setAttribute("list", list); //2.response的重定向 --跳转到学生的jsp response.sendRedirect("stu_list.jsp"); } else { response.getWriter().write("登录失败!请重新输入用户名和密码!"); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }
}
|
JDBCUtil类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
| package util; import java.io.FileInputStream; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; public class JDBCUtil { static String driverClass = null; static String url = null; static String name = null; static String password= null; static{ try { //1. 创建一个属性配置对象 Properties properties = new Properties(); // InputStream is = new FileInputStream("jdbc.properties"); //使用类加载器,去读取src底下的资源文件。 后面在servlet InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties"); //导入输入流。 properties.load(is); //读取属性 driverClass = properties.getProperty("driverClass"); url = properties.getProperty("url"); name = properties.getProperty("name"); password = properties.getProperty("password"); } catch (Exception e) { e.printStackTrace(); } } /** * 获取连接对象 */ public static Connection getConn(){ Connection conn = null; try { Class.forName(driverClass); //静态代码块 ---> 类加载了,就执行。 java.sql.DriverManager.registerDriver(new Driver()); //DriverManager.registerDriver(new com.mysql.jdbc.Driver()); //DriverManager.getConnection("jdbc:mysql://localhost/test?user=monty&password=greatsqldb"); //2. 建立连接 参数一: 协议 + 访问的数据库 , 参数二: 用户名 , 参数三: 密码。 conn = DriverManager.getConnection(url, name, password); } catch (Exception e) { e.printStackTrace(); } return conn; } /** * 释放资源 * @param conn * @param st * @param rs */ public static void release(Connection conn , Statement st , ResultSet rs){ closeRs(rs); closeSt(st); closeConn(conn); } public static void release(Connection conn , Statement st){ closeSt(st); closeConn(conn); }
private static void closeRs(ResultSet rs){ try { if(rs != null){ rs.close(); } } catch (SQLException e) { e.printStackTrace(); }finally{ rs = null; } } private static void closeSt(Statement st){ try { if(st != null){ st.close(); } } catch (SQLException e) { e.printStackTrace(); }finally{ st = null; } } private static void closeConn(Connection conn){ try { if(conn != null){ conn.close(); } } catch (SQLException e) { e.printStackTrace(); }finally{ conn = null; } } }
|
需要导入的外部文件jdbc.properties
1 2 3 4
| driverClass=com.mysql.jdbc.Driver url=jdbc:mysql://localhost/stus name=root password=njdxrjgc7777777.
|
stu_list.jsp文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!-- 导入jsp的JSTL包 --> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>学生信息管理系统</title> </head> <body> <br>学生列表:</br> <table bordent="1" width="700px"> <tr align="center"> <td>编号</td> <td>姓名</td> <td>年龄</td> <td>性别</td> <td>住址</td> <td>操作</td> </tr> <!-- JSTL里面的标签--> <c:forEach var="stu" items="${list}"> <tr align="center"> <td>${stu.id}</td> <td>${stu.name}</td> <td>${stu.age}</td> <td>${stu.gender}</td> <td>${stu.address}</td> <td><a href="#">更新</a> <a href="#">删除</a></td> </tr> </c:forEach> </table>
</body> </html>
|
login.jsp文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h2>欢迎使用黑马学生管理系统</h2> <form action="loginServlet" method="post"> 账号:<input type="text" name="username"></br> 密码:<input type="text" name="password"></br> <input type="submit" value="登录"> </form> </body> </html>
|
登录界面:
成功后弹出界面: