Servlet+JSP+JDBC综合案例
层级关系:
一、Util包
包里面写一个JDBCTools.java文件
功能:实现数据库连接返回一个Connection对象,并且可以实现数据库相应资源的关闭!
注意事项:
1、定义成员变量
1 private static Connection connection ;
2 private static String url="jdbc:mysql://localhost:3306/info?useUnicode=true&CharacterEncoding=utf-8";
3 private static String user="root";
4 private static String password="000429";
2、使用静态代码块包围加载驱动的部分,只执行一次!
1 static {
2 try {
3 Class.forName("com.mysql.jdbc.Driver");
4 } catch (ClassNotFoundException e) {
5 // TODO 自动生成的 catch 块
6 e.printStackTrace();
7 }
8 }
3、写一个静态方法(返回值是Connection)getConnection( )
1 public static Connection getConnection() {
2
3 try {
4 connection=(Connection) DriverManager.getConnection(url,user,password);
5 } catch (SQLException e) {
6 // TODO 自动生成的 catch 块
7 e.printStackTrace();
8 }
9
10 return connection;
11 }
4、方法重载releas( )按连接对象 connection 表的工作空间 preparedStatement 和结果集 resultSet 的顺序依次关闭(注意判断null)
public static void release(Connection connection,PreparedStatement preparedStatement ,ResultSet resultSet)
{
if(connection!=null) {
try {
connection.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
if(preparedStatement!= null) {
try {
preparedStatement.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
if(resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
public static void release(Connection connection,PreparedStatement preparedStatement)
{
if(connection!=null) {
try {
connection.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
if(preparedStatement!= null) {
try {
preparedStatement.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
下面给出这个包(类)完整代码
1 package Util;
2
3 import java.sql.DriverManager;
4 import java.sql.PreparedStatement;
5 import java.sql.ResultSet;
6 import java.sql.SQLException;
7
8 import com.mysql.jdbc.Connection;
9
10 public class JBDCTools {
11 private static Connection connection ;
12 private static String url="jdbc:mysql://localhost:3306/info?useUnicode=true&CharacterEncoding=utf-8";
13 private static String user="root";
14 private static String password="000429";
15 static {
16 try {
17 Class.forName("com.mysql.jdbc.Driver");
18 } catch (ClassNotFoundException e) {
19 // TODO 自动生成的 catch 块
20 e.printStackTrace();
21 }
22 }
23 public static Connection getConnection() {
24
25 try {
26 connection=(Connection) DriverManager.getConnection(url,user,password);
27 } catch (SQLException e) {
28 // TODO 自动生成的 catch 块
29 e.printStackTrace();
30 }
31
32 return connection;
33 }
34 public static void release(Connection connection,PreparedStatement preparedStatement ,ResultSet resultSet)
35 {
36 if(connection!=null) {
37 try {
38 connection.close();
39 } catch (SQLException e) {
40 // TODO 自动生成的 catch 块
41 e.printStackTrace();
42 }
43 }
44 if(preparedStatement!= null) {
45 try {
46 preparedStatement.close();
47 } catch (SQLException e) {
48 // TODO 自动生成的 catch 块
49 e.printStackTrace();
50 }
51 }
52 if(resultSet != null) {
53 try {
54 resultSet.close();
55 } catch (SQLException e) {
56 // TODO 自动生成的 catch 块
57 e.printStackTrace();
58 }
59 }
60 }
61 public static void release(Connection connection,PreparedStatement preparedStatement)
62 {
63 if(connection!=null) {
64 try {
65 connection.close();
66 } catch (SQLException e) {
67 // TODO 自动生成的 catch 块
68 e.printStackTrace();
69 }
70 }
71 if(preparedStatement!= null) {
72 try {
73 preparedStatement.close();
74 } catch (SQLException e) {
75 // TODO 自动生成的 catch 块
76 e.printStackTrace();
77 }
78 }
79 }
80 }
二、数据结构层(enity包定义Student类)
1 package enity;
2
3 import java.sql.Date;
4
5 public class Student {
6 private Integer id;
7 private String studentname;
8 private String score;
9 private Date birthday;
10 public Integer getId() {
11 return id;
12 }
13 public Student(Integer id, String studentname, String score, Date birthday) {
14 super();
15 this.id = id;
16 this.studentname = studentname;
17 this.score = score;
18 this.birthday = birthday;
19 }
20
21 @Override
22
23 public String toString() {
24 return "Student [id=" + id + ", studentname=" + studentname + ", score=" + score + ", birthday=" + birthday + "]";
25 }
26 public void setId(Integer id) {
27 this.id = id;
28 }
29 public String getstudentname() {
30 return studentname;
31 }
32 public void setstudentname(String studentname) {
33 this.studentname = studentname;
34 }
35 public String getScore() {
36 return score;
37 }
38 public void setScore(String score) {
39 this.score = score;
40 }
41 public Date getBirthday() {
42 return birthday;
43 }
44 public void setBirthday(Date birthday) {
45 this.birthday = birthday;
46 }
47
48 }
三、repository包(StudentRepository类)数据层,完成数据库的相关操作
注意事项:
1、注意方法的返回值是否需要封装数据结构用List集合,比如添加方法,需要返回一个数据结构集合给servlet,以便于servlet返回数据+视图
方法内部的Connection 和 ResultSet 初始化 要为 null 在最外部
1 public List<Student> findAll(){
2 //初始化null值的三个常用变量
3 Connection connection = null;
4 ResultSet resultSet=null;
5 PreparedStatement preparedStatement=null;
6 List<Student> list=new ArrayList<>();
2、调用JDBCTools类的静态连接方法进行连接,
写SQL语句,执行SQL语句,
封装从数据库读取出来的数据结构类,
用List集合,最后释放资源。
1 package repository;
2
3 import java.sql.ResultSet;
4 import java.sql.SQLException;
5 import java.util.ArrayList;
6 import java.util.List;
7
8 import com.mysql.jdbc.Connection;
9 import com.mysql.jdbc.PreparedStatement;
10
11 import Util.JBDCTools;
12 import enity.Student;
13
14 public class StudentRepository {
15 public StudentRepository() {};
16 public List<Student> findAll(){
17 //初始化null值的三个常用变量
18 Connection connection = null;
19 ResultSet resultSet=null;
20 PreparedStatement preparedStatement=null;
21 //初始化完毕,定义一个List集合存放学生类数据结构
22
23 List<Student> list=new ArrayList<>();
24
25 try {
26 //获取连接
27 connection=JBDCTools.getConnection();
28 //SQL语句
29 String sql="select * from student;";
30 //定义工作表空间
31
32 preparedStatement = (PreparedStatement) connection.prepareStatement(sql);
33 //执行SQL语句
34
35 resultSet = preparedStatement.executeQuery();
36 //初始化学生类
37
38 Student student=null;
39 //遍历结果集
40 while(resultSet.next()){
41 Integer id=resultSet.getInt(1);
42 String name=resultSet.getString(2);
43 String score = resultSet.getString(3);
44 java.sql.Date date = resultSet.getDate(4);
45 student = new Student (id,name,score,(java.sql.Date) date);
46 list.add(student);
47 }
48 } catch (SQLException e) {
49 // TODO 自动生成的 catch 块
50 e.printStackTrace();
51 }finally {
52 //释放资源
53 JBDCTools.release(connection,preparedStatement,resultSet);
54 }
55 return list;
56 }
57 //添加
58
59 public List<Student> add(String studentname,String score) {
60 Connection connection = null;
61 PreparedStatement preparedStatement=null;
62 List<Student> list=new ArrayList<>();
63 try {
64 connection=JBDCTools.getConnection();
65 String SQL="INSERT INTO student(studentname,score,birthday) VALUE(?,?,?);";
66 //
67 preparedStatement = (PreparedStatement) connection.prepareStatement(SQL);
68 connection.setAutoCommit(false);
69 //
70 preparedStatement.setString(1, studentname);
71 preparedStatement.setString(2, score);
72 preparedStatement.setDate(3, new java.sql.Date(5));
73 int flag=preparedStatement.executeUpdate();
74 //
75 connection.commit();
76 //
77 if(flag>0) {
78 System.out.println("成功添加了"+flag+"条数据!");
79 }
80 else {
81 System.out.println("添加失败!");
82 }
83 } catch (SQLException e) {
84 // TODO 自动生成的 catch 块
85 e.printStackTrace();
86 }finally {
87 JBDCTools.release(connection,preparedStatement);
88 }
89 //返回List集合
90 return list;
91 }
92 //根据ID删除数据
93
94 public static void deleteByid(Integer id) {
95 Connection connection=null;
96 java.sql.PreparedStatement preparedStatement = null;
97 connection = JBDCTools.getConnection();
98 String sql = "DELETE FROM student where id = ?";
99 try {
100 preparedStatement = connection.prepareStatement(sql);
101 preparedStatement.setInt(1, id);
102 preparedStatement.executeUpdate();
103 } catch (SQLException e) {
104 // TODO 自动生成的 catch 块
105 e.printStackTrace();
106 }
107 finally {
108 JBDCTools.release(connection,preparedStatement);
109 }
110 }
111
112
113 //根据学号查找
114 public Student findById(Integer id) {
115 Connection connection=null;
116 PreparedStatement preparedStatement=null;
117 ResultSet resultSet=null;
118 Student student=null;
119
120 connection=JBDCTools.getConnection();
121 String sql="SELECT * FROM student where id = ?";
122 try {
123 preparedStatement=(PreparedStatement) connection.prepareStatement(sql);
124 preparedStatement.setInt(1,id);
125 resultSet = preparedStatement.executeQuery();
126 while(resultSet.next())
127 {
128 Integer id1=resultSet.getInt(1);
129 String name=resultSet.getString(2);
130 String score = resultSet.getString(3);
131 java.sql.Date date = resultSet.getDate(4);
132 student = new Student (id1,name,score,(java.sql.Date) date);
133 }
134 } catch (SQLException e) {
135 // TODO 自动生成的 catch 块
136 e.printStackTrace();
137 }finally {
138 JBDCTools.release(connection,preparedStatement,resultSet);
139 }
140 return student;
141 }
142
143
144
145
146 //修改
147 public void update (Integer id,String studentname,String score) {
148 Connection connection = null;
149 PreparedStatement preparedStatement=null;
150 try {
151 connection=JBDCTools.getConnection();
152 String SQL="UPDATE student set studentname=?,score=? where id=?";
153 preparedStatement = (PreparedStatement) connection.prepareStatement(SQL);
154 connection.setAutoCommit(false);
155 preparedStatement.setString(1, studentname);
156 preparedStatement.setString(2, score);
157 preparedStatement.setInt(3, id);
158 int flag=preparedStatement.executeUpdate();
159 connection.commit();
160 if(flag>0) {
161 System.out.println("成功修改了"+flag+"条数据!");
162 }
163 else {
164 System.out.println("修改失败!");
165 }
166 } catch (SQLException e) {
167 // TODO 自动生成的 catch 块
168 e.printStackTrace();
169 }finally {
170 JBDCTools.release(connection,preparedStatement);
171 }
172 }
173
174
175 }
四、servlet层
功能:返回数据+视图到用户界面,和用户直接交互!
注意事项:
1、表单的数据是post或者是get
href是get,对应doGet方法
2、doPost方法:
首先要处理中文乱码问题:
1 request.setCharacterEncoding("utf-8");
2 response.setCharacterEncoding("utf-8");
3 response.setContentType("application/json;charset=utf-8");
交互过程:
①获取前台jsp文件的数据:用request.getParameter()方法
调用数据处理层 studentRepository 类的相应方法!
②使用response.sendRedirect()方法重定向(一般是返回本页面servlet)
3、doGet方法:
功能:主要在处理前台 hre f链接请求。
注意事项:
①首先获取前台数据
②其次获取后台数据(也就是List集合中的数据,调用studentRepository类方法返回List对象值并保存!)
request转发!
也就是把数据一并转发到前台界面
1 List<Student> list= studentRepository.findAll();
2 request.setAttribute("list", list);
3 request.getRequestDispatcher("index.jsp").forward(request,response);
下面给出servlet层的完整代码:
1 package com.southwind.servlet;
2
3 import java.io.IOException;
4 import java.util.List;
5
6 import javax.servlet.ServletException;
7 import javax.servlet.annotation.WebServlet;
8 import javax.servlet.http.HttpServlet;
9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11
12 import enity.Student;
13 import repository.StudentRepository;
14
15 /**
16 * Servlet implementation class studentservlet
17 */
18 @WebServlet("/studentservlet")
19 public class studentservlet extends HttpServlet {
20 private StudentRepository studentRepository=new StudentRepository();
21 private static final long serialVersionUID = 1L;
22
23 /**
24 * @see HttpServlet#HttpServlet()
25 */
26 public studentservlet() {
27 super();
28 // TODO Auto-generated constructor stub
29 }
30
31 /**
32 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
33 */
34 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
35 // TODO Auto-generated method stub
36 String method = request.getParameter("method");
37 if(method==null)
38 {
39 method="findAll";
40 }
41 switch(method) {
42 case "findAll":
43 List<Student> list= studentRepository.findAll();
44 request.setAttribute("list", list);
45 request.getRequestDispatcher("index.jsp").forward(request,response);
46 break;
47 case "delete":
48 String idStr= request.getParameter("id");
49 Integer id= Integer.parseInt(idStr);
50 StudentRepository.deleteByid(id);
51 list= studentRepository.findAll();
52 request.setAttribute("list", list);
53 request.getRequestDispatcher("index.jsp").forward(request,response);
54 break;
55 case "findById":
56 idStr=request.getParameter("id");
57 id=Integer.parseInt(idStr);
58 request.setAttribute("student",studentRepository.findById(id));
59 request.getRequestDispatcher("update.jsp").forward(request, response);
60 break;
61 }
62 //返回视图+数据
63 }
64 /**
65 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
66 */
67 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
68 // TODO Auto-generated method stub
69 //处理编码问题
70 request.setCharacterEncoding("utf-8");
71 response.setCharacterEncoding("utf-8");
72 response.setContentType("application/json;charset=utf-8");
73 //处理完毕
74 String method = request.getParameter("method");
75 switch (method) {
76 case "add":
77 String studentname=request.getParameter("studentname");
78 String score=request.getParameter("score");
79 response.getWriter().write(studentname+score);
80 studentRepository.add(studentname,score);
81 break;
82 case "update":
83 String idStr= request.getParameter("id");
84 Integer id= Integer.parseInt(idStr);
85 studentname=request.getParameter("studentname");
86 score=request.getParameter("score");
87 studentRepository.update(id, studentname, score);
88 break;
89 }
90 response.sendRedirect("http://localhost:8080/bilibili/studentservlet");
91 }
92 }
五、jsp层(画前台界面,直接接收用户的数据)
注意事项:
1、表单和servlet的关联
<form action="${pageContext.request.contextPath}/studentservlet" method="post">
如果有不需要让用户选择的字段,可以使用隐藏的input标签:
<input type="hidden" name="method" value="add">
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3
4 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
5 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
6 <html>
7 <head>
8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
9 <title>Insert title here</title>
10 </head>
11 <body>
12 <table>
13 <tr>
14 <th>编号</th>
15 <th>姓名</th>
16 <th>成绩</th>
17 <th>注册日期</th>
18 </tr>
19 <tr>
20 <a href="add.jsp">添加</a>
21 </tr>
22 <c:forEach items="${list}" var="student">
23 <tr>
24 <td>${student.id}</td>
25 <td>${student.studentname}</td>
26 <td>${student.score}</td>
27 <td>${student.birthday}</td>
28 <td>
29 <a href="${pageContext.request.contextPath}/studentservlet?method=delete&id=${student.id}">删除</a>
30 <a href="${pageContext.request.contextPath}/studentservlet?method=findById&id=${student.id}">修改</a>
31 </td>
32 </tr>
33 </c:forEach>
34 </table>
35 </body>
36 </html>
add.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
4 <html>
5 <head>
6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
7 <title>插入</title>
8 </head>
9 <body>
10 <form action="${pageContext.request.contextPath}/studentservlet" method="post">
11 姓名:<input type="text" name="studentname"/><br/>
12 成绩:<input type="text" name="score"/><br/>
13 <input type="hidden" name="method" value="add">
14 <input type="submit" value="提交"/>
15 </form>
16 </body>
17 </html>
update.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
4 <html>
5 <head>
6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
7 <title>修改</title>
8 </head>
9 <body>
10 <form action="${pageContext.request.contextPath}/studentservlet" method="post">
11 编号:<input type="text" name="id" value="${student.id }" readonly/><br>
12 姓名:<input type="text" name="studentname" value="${student.studentname }"/><br/>
13 成绩:<input type="text" name="score"value="${student.score }"/><br/>
14 <input type="hidden" name="method" value="update">
15 <input type="submit" value="修改"/>
16 </form>
17 </body>
18 </html>
Servlet+JSP+JDBC综合案例的更多相关文章
- JDBC+Servlet+JSP的学生案例增删改查
数据库信息传输到页面实现. 先进行学生信息页面展示: 接口IStudentDao public interface IStudentDao { /** * 保存操作 * @param stu 学生对象 ...
- servlet+jsp+jdbc实现从数据库查询用户信息到页面
工程创建这里就不在累述了,直接从显示User信息列表开始. 备注:我用的是servlet3的注解功能实现的,所以不需要配置web.xml 这是我的工程目录: 首先我们创建实体类: public cla ...
- Servlet+JSP+JDBC设计实现图书系统——管理功能实现
写在前面,之前由于种种原因博客好久没有更新.最近打算重拾JavaWeb,所以从头开始,先用servlet+jdbc+bootstrap最基础的代码实现一个图书系统.考虑有管理员端+用户端,项目完成后会 ...
- servlet jsp jdbc bootstrarp mvc分层模式实现的第一个项目
登录注册界面 这是一个注册和登录的界面 用到了前端页面中自带的一点H5的标签和属性---巩固下 邮箱格式 :type="email" 不能为空: required=" ...
- Servlet+jsp的分页案例
查询的分页,在web中经常用到.一般,分页要维护的信息很多,我们把这些相关的信息,分装到一个类中,PageBean.具体如下: package cn.itcast.utils; import java ...
- Java——分页 Servlet + Jsp+Jdbc 有点瑕疵
1.创建数据库,插入多条数据 2.java连接DB 3.Person类: package com.phome.po; public class Person { private int id; pri ...
- EL&Filter&Listener:EL表达式和JSTL,Servlet规范中的过滤器,Servlet规范中的监听器,观察着设计模式,监听器的使用,综合案例学生管理系统
EL&Filter&Listener-授课 1 EL表达式和JSTL 1.1 EL表达式 1.1.1 EL表达式介绍 *** EL(Expression Language):表达式语言 ...
- 创建jsp+Servlet+JavaBean+JDBC+MySQL项目的过程
1 根据需求建立Mysql数据,确立数据库的表的字段.属性.主键,外键等.下面我使用的数据库名dev ,表名user,字段 name,设置为主键.用户名不能为空,字段password,密码 2 在E ...
- 综合学生信息管理系统(JSP+JDBC)
原创 通过JSP+JDBC制作一个简单的操作数据库中表信息的系统. 总体界面如下,一共有5个功能块. 功能一:列出全部学生 功能二:按条件查询学生 功能三:新添加学生 功能四:按条件删除学生 功能五: ...
随机推荐
- python基本输入输出函数
python程序设计中有三个重要的基本输入.输出函数,用于输入.转换和输出,分别是input(),eval(),print() 1,input()函数 """ input ...
- 20190627_解决ADB的device offline问题的两种方法
故障现象: error: device offline 故障解决: 第一种方法: C:\Users\WXY\Desktop\XY\adb>adb nodaemon server cannot b ...
- python装饰器基础及应用
一.简介 装饰器是是修改其它函数功能的函数:其意义是让其他函数在不修改任何代码的前提下增加额外功能 二.数据类型 首先我们来看一段简单的代码: from types import MethodType ...
- 使用PyQt(Python+Qt)+moviepy开发的视频截取、音视频分离、MP4转GIF动图工具免费下载分享
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 在因博文素材需要将软件操作制作成动画时,发现网上相关绿色使用工具都需要 ...
- 总结下flask中的宏、Jinjia2语法
这几天学的东西比较多,时间又有点不够用,趁着快吃饭了,赶紧总结总结. 00x1 宏: 如果学过C语言的童鞋,可能知道宏在C语言里面是一个定义一个固定参数的变量.在flask里面,宏是相当于一个函数的作 ...
- springboot:定时任务
在日常的开发过程中经常使用到定时任务,在springMVC的开发中,经常和quartz框架进行集成使用,但在springboot中没有这么做,而是使用了java的线程池来实现定时任务. 一.概述 在s ...
- CF873D Merge Sort
其实最优的方法其他的题解已经讲得很好了,本题解仅用于记录和分享一个新的思路. 这道题是让你输出符合条件的序列,而序列的每个数之间具有一定的逻辑关系,很容易想到拓扑排序,于是此题就变为,如何找出满足条件 ...
- Windows的API功能查询
在逆向分析时,一些Windows的API函数往往是我们的突破口.但这些函数很难记得一清二楚,以下是我的查找办法,做个小结. 官网 https://docs.microsoft.com/en-us/wi ...
- spark有个节点特别慢,解决办法
除解决数据倾斜问题外,还要开启推测执行,寻找另一个executor执行task,哪个先完成就取哪个结果,再kill掉另一个.
- Python之Windows服务
1.首先要安装pywin32-220.win-amd64-py2.7.exe 2. SvcDoRun:服务启动的时候会执行的方法 SvcStop:服务停止的时候会执行的方法 # coding=utf- ...