Java Web初试---连接数据库完成学生信息录入

  题目要求:1登录账号:要求由6到12位字母、数字、下划线组成,只有字母可以开头;2登录密码:要求显示“• ”或“*”表示输入位数,密码要求八位以上字母、数字组成;3性别:要求用单选框或下拉框实现,选项只有“男”或“女”;4学号:要求八位数字组成,前四位为“2018”开头,输入自己学号;5 姓名:输入自己的姓名6 电子邮箱:要求判断正确格式[email protected]7 点击“添加”按钮,将学生个人信息存储到数据库中;8 可以演示连接上数据库。

  思路:连接数据库;JSP设置网页(由于要求不高,设计不是很精致);判定格式,提示错误信息;信息导入数据库

  代码如下:

  package util        DBUtil.java

 1 package util;
 2 
 3 
 4 import java.sql.Connection;
 5 import java.sql.DriverManager;
 6 import java.sql.ResultSet;
 7 import java.sql.SQLException;
 8 import java.sql.Statement;
 9 
10 
11 
12 public class DBUtil {
13     //useSSL=false:避免连接时出现SSL问题
14     public static String db_url = "jdbc:mysql://localhost:3306/exam?useSSL=false";
15     public static String db_user = "root";//用户名
16     public static String db_pass = "Inazuma";//密码
17     
18     public static Connection getConn () {
19         Connection conn = null;
20         
21         try {
22             Class.forName("com.mysql.jdbc.Driver");//加载JDBC驱动
23             conn = DriverManager.getConnection(db_url, db_user, db_pass);
24         } catch (Exception e) {
25             e.printStackTrace();
26         }
27         
28         return conn;
29     }
30     
31     //关闭Connection和Statement对象
32     public static void close (Statement state, Connection conn) {
33         if (state != null) {
34             try {
35                 state.close();
36             } catch (SQLException e) {
37                 e.printStackTrace();
38             }
39         }
40         
41         if (conn != null) {
42             try {
43                 conn.close();
44             } catch (SQLException e) {
45                 e.printStackTrace();
46             }
47         }
48     }
49     //若调用ResultSet对象,执行下段close方法
50     public static void close (ResultSet rs, Statement state, Connection conn) {
51         if (rs != null) {
52             try {
53                 rs.close();
54             } catch (SQLException e) {
55                 e.printStackTrace();
56             }
57         }
58         
59         if (state != null) {
60             try {
61                 state.close();
62             } catch (SQLException e) {
63                 e.printStackTrace();
64             }
65         }
66         
67         if (conn != null) {
68             try {
69                 conn.close();
70             } catch (SQLException e) {
71                 e.printStackTrace();
72             }
73         }
74     }
75     
76     
77 }

此段代码为JDBC驱动程序,用于连接数据库。

  package Servlet          ExamServlet.java

 1 package Servlet;
 2 import java.io.IOException;
 3 
 4 import javax.servlet.ServletException;
 5 import javax.servlet.annotation.WebServlet;
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 import javax.servlet.http.HttpServlet;
 9 
10 
11 import Dao.ExamDao;
12 
13 @WebServlet("/ExamServlet")
14 public class ExamServlet  extends HttpServlet{
15     private static final long serialVersionUID = 1L;
16     ExamDao Dao=new ExamDao();
17 
18     //resp:HTTP协议
19     protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
20         req.setCharacterEncoding("utf-8");
21         //获取网页中action里method参数
22         String method = req.getParameter("method");
23         //若相同执行其方法
24         if ("add".equals(method)) {
25             add(req, resp);
26         }
27     }
28     //向数据库写入信息
29     private void add(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
30         req.setCharacterEncoding("utf-8");
31         String ZH=req.getParameter("username");
32         String MM=req.getParameter("password");
33         String XB=req.getParameter("sex");
34         String XM=req.getParameter("pname");
35         String XH=req.getParameter("number");
36         String YX=req.getParameter("address");
37         String XX=req.getParameter("school");
38         String XI=req.getParameter("xi");
39         String BJ=req.getParameter("class");
40         String NF=req.getParameter("year");
41         String SYD=req.getParameter("home");
42         String BZ=req.getParameter("bz");
43         int i = Dao.Judge(ZH, MM, XH, YX);  //给i赋值,若出现错误则用其判定执行的错误语句
44         
45         //执行成功
46         if(Dao.add(ZH, MM, XB, XM, XH, YX, XX,XI,BJ,NF,SYD,BZ)) {
47             req.setAttribute("message", "添加成功");
48             req.getRequestDispatcher("Test.jsp").forward(req,resp);
49         }
50         //执行失败
51         else {
52             //用户名错误
53             if(i == 1) {
54                 req.setAttribute("message", "用户名错误");
55             }
56             //密码错误
57             else if(i == 2) {
58                 req.setAttribute("message", "密码错误");
59             }
60             //学号错误
61             else if(i == 3) {
62                 req.setAttribute("message", "学号错误");
63             }
64             //邮箱格式错误
65             else if(i == 4) {
66                 req.setAttribute("message", "邮箱格式错误");
67             }
68             //向jsp文件中传值
69             req.getRequestDispatcher("Test.jsp").forward(req,resp);
70         }
71     }
72 }

 此代码用于读取jsp制作的网页中,文本框输入的信息,并将其传给ExamDao类,实现对数据库的增加数据操作,同时向jsp文件传递req,resp,决定输出的提示信息。

  package Dao          ExamDao.java

  1 package Dao;
  2 
  3 import java.sql.Connection; 
  4 import java.sql.Statement;
  5 //调用DBUtil初始化Connection和Statement对象
  6 import util.DBUtil;
  7 public class ExamDao {
  8     public boolean add(String ZH,String MM,String XB,String XM,String XH,String YX,String XX,String XI,String BJ,String NF,String SYD,String BZ) {
  9         //insert into 后接表名,表名(表中头名)values后输入数据,数据见上方代码,其中String类等数据从Servlet传来。
 10         String sql="insert into student(username,password,sex,pname,number,address,school,xi,class,year,home,bz)"
 11                 + "values('"+ZH+"','"+MM+"','"+XB+"','"+XM+"','"+XH+"','"+YX+"','"+XX+"','"+XI+"','"+BJ+"','"+NF+"','"+SYD+"','"+BZ+"')";
 12         Connection conn = DBUtil.getConn();
 13         //驱动连接
 14         Statement state = null;
 15         boolean f=false;
 16         int a = 0;
 17         int temp = 0;
 18         ExamDao n= new ExamDao();
 19         
 20         try {
 21             temp = n.Judge(ZH, MM, XH, YX);
 22             if(temp == 0) {
 23                 state = conn.createStatement();
 24                 //每执行一条语句,a++
 25                 //executeUpdate:返回int,表示多少眺语句受到了影响
 26                 a=state.executeUpdate(sql);
 27             }
 28             else
 29                 a = 0;
 30         } catch (Exception e) {
 31             e.printStackTrace();
 32         } finally {
 33             DBUtil.close(state, conn);
 34         }
 35         
 36         if (a > 0) {
 37             //返回为真
 38             f = true;
 39         }
 40         //返回为假
 41         return f;
 42         
 43     }
 44     //根据题目要求判定格式
 45     public int Judge(String ZH,String MM,String XH, String YX) {
 46         //用户名格式:首元素为字母;长度6-12位;由字母,下划线,数字构成
 47         if(ZH!=null) {
 48             //正则表达式:字母,下划线,数字
 49             String rz = "^\\w+$";
 50             int s1 = ZH.length();
 51             String c = ZH.substring(0, 1);
 52             String nc = c.toLowerCase();
 53             char c1 = nc.charAt(0);
 54             //出错返回为1
 55             if(s1<6||s1>12) {
 56                 return 1;
 57             }
 58             else if(c1<'a'||c1>'z') {
 59                 return 1;
 60             }
 61             else if(!ZH.matches(rz)) {
 62                 return 1;
 63             }
 64         }
 65         //密码格式:不小于八位,由数字或字母组成
 66         if(MM!=null) {
 67             //正则表达式:字母,数字
 68             String rm = "^[a-z0-9A-Z]+$";
 69             int s2 = MM.length();
 70             //出错返回为2
 71             if(s2<8) {
 72                 return 2;
 73             }
 74             else if(!MM.matches(rm)) {
 75                 return 2;
 76             }
 77         }
 78         //学号格式:固定八位,全数字,前四位必须为“2018”
 79         if(XH!=null) {
 80             int s3 = XH.length();
 81             //出错返回3
 82             if(s3<8) {
 83                 return 3;
 84             }
 85             else {
 86                 //数字串的正则表达式
 87                 String rx = "[0-9]*";
 88                 String x = XH.substring(0,4);
 89                 boolean y = x.equals("2018");
 90                 if(s3!=8||!y) {
 91                     return 3;
 92                 }
 93                 else if(!XH.matches(rx)) {
 94                     return 3;
 95                 }
 96             }
 97         }
 98         //邮箱:标准格式
 99         if(YX!=null) {
100             //邮箱格式的正则表达式
101             String regex = "\\w+@\\w+(\\.\\w{2,3})*\\.\\w{2,3}";
102             //出错返回4
103             if(!YX.matches(regex)) {
104                 return 4;
105             }
106         }
107         return 0;
108     }
109 }

此代码用于执行增加数据操作,同时判断输入格式,返回不同的值,在ExamServlet文件中用i记录返回值,并以此判断是否能成功执行,以及错误时的提示错误信息。

  Test.jsp

 1 <!--UTF-8:避免中文变成乱码  -->
 2 <%@ page language="java" contentType="text/html; charset=UTF-8"
 3     pageEncoding="UTF-8"%>
 4 <!DOCTYPE html>
 5 <html>
 6 <head>
 7 <meta charset="UTF-8">
 8 <title>添加学生信息</title>
 9 <!-- 设置格式:右对齐 -->
10 <style>
11         .a{
12             width: 300px;
13             height: 30px;
14              
15         }
16         #b{
17             width: 500px;
18             border: 1px solid red;
19             text-align: right;
20         }
21     </style>
22 </head>
23 <body>
24 <!-- 文本及文本框 -->
25 <div id="b">
26 <form action="ExamServlet?method=add"  method="post" >
27 登录账号:<input type="text"name="username"><br>
28 登录密码:<input type="password"name="password"><br>
29 性别:<select name="sex">
30 <option value="男"></option>
31 <option value="女"></option>
32 </select><br>
33 姓名:<input type="text"name="pname"><br>
34 学号:<input type="text"name="number"><br>
35 电子邮件:<input type="text"name="address"><br>
36 所在学校:<input type="text"name="school"><br>
37 所在系:<input type="text"name="xi"><br>
38 所在班级:<input type="text"name="class"><br>
39 入学年份(届):<input type="text"name="year"><br>
40 生源地:<input type="text"name="home"><br>
41 备注:<input type="text"name="bz"><br>
42 <button type="submit">添加</button>
43 </form>
44 </div>
45 </body>
46 <!-- 输出提示信息 -->
47 <%
48          Object message = request.getAttribute("message");
49          if(message!=null && !"".equals(message)){
50      
51     %>
52          <script type="text/javascript">
53               alert("<%=request.getAttribute("message")%>");
54          </script>
55     <%} %>
56 </html>

此代码用于形成网页。

预览

信息提示:

数据库信息(含第一次添加成功的信息)应用软件:Navicat for MySQL

错误反省:1.创建项目时,导入jar包过程中出现操作失误,导致创建好的项目没有成功连接数据库

     2.根据情况返回错误信息:由于我的代码是把提示信息写入ExamServlet文件,再传值,所以需要在Servlet文件中就要确定要传值形式,一开始用i作为标准写if语句,以防万一我将ExamDao中Judge方法复制了过去,所有return语句改为对i的赋值语句,但我并没有考虑到默认值为null的情况,示范的时候为了节省时间,是不会把所有信息都填上的,这就导致了有些为了取子串而定义的String类对象出现异常,同时导致了ExamDao中Judge方法出现错误,最后执行失败。经过多次尝试后,在对要求的信息格式进行判断之前,会先判定该值是否为空,为了使代码看着更加简洁,我在ExamServlet文件中导入Dao包,初始化ExamDao对象后调用Judge方法将返回值赋给i,问题解决。

猜你喜欢

转载自www.cnblogs.com/20183711PYD/p/11715994.html