servlet
一、引言1.1 C/S架构和B/S架构1.2 C/S架构(Client/Server 客户端/服务器)1.3 B/S架构(Browser/Server 浏览器/服务器)二 、服务器2.1 概念2.1.1 什么是Web2.1.2 什么是Web服务器2.2 常见服务器2.3 Tomcat服务器2.4 Tomcat安装2.4.1 下载2.4.2 解压安装2.4.3 Tomcat目录结构2.5 Tomcat启动和停止2.5.1 启动2.5.2 验证2.5.3 停止2.5.4 修改端口号2.6 项目部署及访问静态资源2.6.1 创建项目2.6.2 URL访问资源2.6.3 Tomcat响应流程图2.7 常见错误2.7.1 Tomcat控制台闪退2.7.2 404三 、Servlet【重点
】3.1 概念3.1.1 Servlet作用3.2 Servlet开发步骤3.2.1 搭建开发环境3.2.2 编写Servlet3.2.3 部署Servlet3.2.4 配置Servlet3.3 运行测试3.4 常见错误3.4.1 500错误四、IDEA创建Web项目4.1 IDEA创建Web项目4.2 IDEA开发Servlet4.2.1 编写Servlet4.2.2 配置web.xml4.2.3 部署Web项目4.3 IDEA部署Web项目4.3.1 IDEA集成Tomcat4.3.2 项目部署Tomcat4.4 其他操作4.4.1 关联第三方jar包五、HTTP协议5.1 什么是HTTP5.2 HTTP协议特点5.3 HTTP协议通信流程5.4 请求报文和响应报文5.4.1 HTTP请求报文5.4.2 HTTP响应报文5.4.3 常见状态码六、Servlet详解【重点
】6.1 Servlet核心接口和类6.1.1 Servlet接口6.1.2 GenericServlet抽象类6.1.3 HttpServlet类6.2 Servlet两种创建方式6.2.1 实现接口Servlet6.2.2 继承HttpServlet(推荐)6.2.3 常见错误6.3 Servlet两种配置方式6.3.1 使用web.xml(Servlet2.5之前使用)6.3.2 配置属性6.3.3 使用注解 (Servlet3.0后支持,推荐)6.3.4 @WebServlet注解常用属性七、Servlet应用【重点
】7.1 request对象7.1.1 get和post区别7.1.2 request主要方法7.1.3 request应用7.1.4 get请求收参问题7.1.5 get中文乱码7.1.6 post中文乱码7.2 response对象7.2.1 response主要方法7.2.2 response应用7.2.3 解决输出中文乱码7.3 综合案例(Servlet + JDBC)7.3.1 数据库7.3.2 DBUtils7.3.3 AdminDaoImpl7.3.4 AdminServiceImpl7.3.5 HTML页面代码7.3.6 LoginServlet7.3.7 ShowAllAdminServlet八、 转发与重定向8.1 现有问题8.1.1 业务、显示分离8.2 转发8.2.1 页面跳转8.2.2 数据传递8.2.3 转发特点8.3 重定向8.3.1 页面跳转8.3.2 数据传递8.3.3 重定向特点8.4 转发、重定向总结九、 Servlet生命周期9.1 生命周期四个阶段9.1.1 实例化9.1.2 初始化9.1.3 服务9.1.4 销毁9.1.5 Servlet执行流程十、Servlet特性10.1 线程安全问题10.2 如何保证线程安全十一、状态管理11.1 现有问题11.2 概念11.3 状态管理分类十二、Cookie的使用12.1 什么是Cookie12.2 创建Cookie12.3 获取Cookie12.4 修改Cookie12.5 Cookie编码与解码12.5.1 创建带中文Cookie12.5.2 读取带中文Cookie12.6 Cookie优点和缺点12.6.1 优点12.6.2 缺点十三、Session对象【重点
】13.1 Session概述13.2 Session原理13.3 Session使用13.3.1 获取Session13.3.2 Session保存数据13.3.3 Session获取数据13.3.4 Session移除数据13.4 Session与Request应用区别13.4.1 Session应用13.4.2 GetValueServlet.java13.5 Session的生命周期13.5.1 Session失效13.4 浏览器禁用Cookie解决方案【了解】13.4.1 浏览器禁用Cookie的后果13.4.2 URL重写13.4.3 实现URL重写13.5 Session实战权限验证13.5.1 创建管理员表13.5.2 登录页面13.5.3 LoginMgrController13.5.4 ShowAllAdminController13.6 Session实战保存验证码13.6.1 创建验证码13.6.2 登录页面13.6.3 LoginMgrController十四、ServletContext对象【重点
】14.1 ServletContext概述14.2 获取ServletContext对象14.3 ServletContext作用14.3.1 获取项目真实路径14.3.2 获取项目上下文路径14.3.3 全局容器14.4 ServletContext特点14.5 ServletContext应用场景14.6 作用域总结十五、过滤器【重点
】15.1 现有问题15.2 概念15.3 过滤器作用15.4 编写过滤器15.4.1 实现过程15.5 过滤器配置15.5.1 注解配置15.5.2 xml配置15.5.3 过滤器路径15.6 过滤器链和优先级15.6.1 过滤器链15.6.2 过滤器优先级15.7 过滤器典型应用15.7.1 过滤器解决编码15.7.2 权限验证十六、监听器1. 概念2. 实现原理3.监听器类型4.监听器配置方式十七、综合案例(EmpProject)17.1 数据库环境搭建17.1.1 创建数据库17.1.2 创建数据表17.2 创建Web项目17.3 基础环境搭建17.4 管理员登录功能17.5 查询所有员工功能17.5.1 调用业务逻辑Controller17.5.2 显示页面JSP17.5.3 权限验证过滤器17.5.4 字符编码过滤器17.6 删除员工功能17.6.1 删除员工Controller17.7 修改员工功能17.7.1 查询单个员工Controller17.7.2 显示修改页面JSP17.7.3 修改员工信息Controller
一、引言
1.1 C/S架构和B/S架构
C/S和B/S是软件发展过程中出现的两种软件架构方式。
1.2 C/S架构(Client/Server 客户端/服务器)
特点:必须在客户端安装特定软件
优点:图形效果显示较好(如:3D游戏)
缺点:服务器的软件和功能进行升级,客户端也必须升级、不利于维护
常见的C/S程序:QQ、微信等
C/S架构 |
---|
1.3 B/S架构(Browser/Server 浏览器/服务器)
特点:无需安装客户端,任何浏览器都可直接访问
优点:涉及到功能的升级,只需要升级服务器端
缺点:图形显示效果不如C/S架构
需要通过HTTP协议访问
B/S架构 |
---|
二 、服务器
2.1 概念
2.1.1 什么是Web
Web(World Wide Web) 称为万维网,简单理解就是网站,它用来表示Internet主机上供外界访问的资源。
Internet上供外界访问的资源分为两大类
静态资源:指Web页面中供人们浏览的数据始终是不变的。(HTML、CSS, 图片, javascript脚本)
动态资源:指Web页面中供人们浏览的数据是由程序产生的,不同时间点,甚至不同设备访问Web页面看到的内容各不相同。(JSP/Servlet)
在Java中,动态Web资源开发技术我们统称为Java Web。
2.1.2 什么是Web服务器
Web服务器是运行及发布Web应用的容器,只有将开发的Web项目放置到该容器中,才能使网络中的所有用户通过浏览器进行访问。
2.2 常见服务器
开源:OpenSource(1、开放源代码 2、免费)
Tomcat(主流Web服务器之一,适合初学者)
jetty(淘宝,运行效率比Tomcat高)
resin(新浪,所有开源服务器软件中,运行效率最高的)
三者的用法从代码角度完全相同,只有在开启、关闭服务器软件时对应的命令稍有区别。掌握一个即掌握所有
收费
WebLogic(Oracle)
WebSphere(IBM)
提供相应的服务与支持,软件大,耗资源
2.3 Tomcat服务器
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,免费开源、并支持Servlet 和JSP 规范。目前Tomcat最新版本为9.0。
Tomcat 技术先进、性能稳定,深受Java 爱好者喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
2.4 Tomcat安装
2.4.1 下载
官网下载(http://tomcat.apache.org/) Tomcat8.5解压缩版本
2.4.2 解压安装
将Tomcat解压到一个没有特殊符号的目录中(一般纯英文即可)
注意
不建议将服务器软件放在磁盘层次很多的文件夹
不建议放在中文路径下
2.4.3 Tomcat目录结构
文件夹 | 说明 | 备注 |
---|---|---|
bin | 该目录下存放的是二进制可执行文件 | startup.bat启动Tomcat、shutdown.bat停止Tomcat |
conf | 这是一个非常重要的目录,这个目录下有两个最为重要的文件server.xml和web.xml | server.xml:配置整个服务器信息。例如修改端口号,编码格式等。 web.xml:项目部署描述符文件,这个文件中注册了很多MIME类型,即文档类型。 |
lib | Tomcat的类库,里面存放Tomcat运行所需要的jar文件。 | |
logs | 存放日志文件,记录了Tomcat启动和关闭的信息,如果启动Tomcat时有错误,异常也会记录在日志文件中。 | |
temp | Tomcat的临时文件,这个目录下的东西在停止Tomcat后删除。 | |
webapps | 存放web项目的目录,其中每个文件夹都是一个项目;其中ROOT是一个特殊的项目,在地址栏中没有给出项目目录时,对应的就是ROOT项目。 | |
work | 运行时生成的文件,最终运行的文件都在这里。 | 当客户端用户访问一个JSP文件时,Tomcat会通过JSP生成Java文件,然后再编译Java文件生成class文件,生成的java和class文件都会存放到这个目录下。 |
2.5 Tomcat启动和停止
2.5.1 启动
进入tomcat安装目录bin下,双击startup.bat 启动程序,出现如下界面
Tomcat启动控制台 |
---|
2.5.2 验证
打开浏览器,输入 http://localhost:8080
如果出现以下界面证明Tomcat启动成功。
Tomcat访问页面 |
---|
2.5.3 停止
双击shutdown.bat即可关闭Tomcat启动窗口。
2.5.4 修改端口号
Tomcat默认端口号为8080,可以通过conf/server.xml文件修改
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
2.6 项目部署及访问静态资源
Tomcat是Web服务器,我们的项目应用是部署在webapps下,然后通过特定的
2.6.1 创建项目
在webapps中建立文件夹(项目应用),比如:myweb
创建WEB-INF文件夹,用于存放项目的核心内容
创建classes,用于存放.class文件
创建lib,用于存放jar文件
创建web.xml,项目配置文件(到ROOT项目下的WEB-INF复制即可)
把网页hello.html复制到myweb文件夹中,与WEB-INF在同级目录
2.6.2 URL访问资源
浏览器地址中输入URL:http://localhost:8080/myweb/hello.html
URL组成 |
---|
2.6.3 Tomcat响应流程图
请求响应流程图 |
---|
2.7 常见错误
2.7.1 Tomcat控制台闪退
闪退问题是由于JAVA_HOME配置导致的,检查JAVA_HOME配置是否正确
2.7.2 404
访问资源不存在,出现404错误
404错误 |
---|
三 、Servlet【重点
】
3.1 概念
Servlet:Server Applet的简称,是服务器端的程序(代码、功能实现),可交互式的处理客户端发送到服务端的请求,并完成操作响应。
动态网页技术
JavaWeb程序开发的基础,JavaEE规范(一套接口)的一个组成部分。
3.1.1 Servlet作用
接收客户端请求,完成操作。
动态生成网页(页面数据可变)。
将包含操作结果的动态网页响应给客户端。
3.2 Servlet开发步骤
3.2.1 搭建开发环境
将Servlet相关jar包
3.2.2 编写Servlet
实现javax.servlet.Servlet
重写5个主要方法
在核心的service()方法中编写输出语句,打印访问结果
package com.qf.servlet;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.ServletException;
import java.io.IOException;
public class MyServlet implements Servlet{
public void init(ServletConfig config) throws ServletException{
}
public void service(ServletRequest request,ServletResponse response) throws ServletException,IOException{
System.out.println("My First Servlet!");
}
public void destroy(){
}
public ServletConfig getServletConfig(){
return null;
}
public String getServletInfo(){
return null;
}
}
3.2.3 部署Servlet
编译MyServlet后,将生成的.class文件放在WEB-INF/classes文件中。
3.2.4 配置Servlet
编写WEB-INF下项目配置文件web.xml
3.3 运行测试
启动Tomcat,在浏览器地址栏中输入http://localhost:8080/myweb/myservlet访问,在Tomcat中打印时间表示成功。
3.4 常见错误
3.4.1 500错误
服务端出现异常
500错误 |
---|
四、IDEA创建Web项目
4.1 IDEA创建Web项目
创建项目窗口,选择JavaEE7,并勾选Web Application
创建Web项目 |
---|
输入项目名称和项目保存位置,点击Finish,完成项目创建
项目目录设置 |
---|
Web项目目录介绍
目录结构 |
---|
4.2 IDEA开发Servlet
使用开发工具编写Servlet,仍要手工导入
4.2.1 编写Servlet
创建MyServlet,实现Servlet接口,覆盖5个方法w
4.2.2 配置web.xml
4.2.3 部署Web项目
在Tomcat的webapps目录下,新建WebProject项目文件夹
创建WEB-INF,存放核心文件
在WEB-INF下,创建classes文件夹,将编译后的MyServlet.class文件复制至此。
4.3 IDEA部署Web项目
前面我们是在Tomcat的webapps目录新建应用程序目录myweb,然后把静态资源和Servlet复制到相关目录下。使用IDEA不需要我们复制了。可以通过IDEA集成Tomcat服务器,实现自动部署。
4.3.1 IDEA集成Tomcat
点击File选项,选择Settings
Settings设置 |
---|
选择Build, Execution, Deployment下的Application Servers。
应用服务器 |
---|
点击+号,选择Tomcat Server
添加Tomcat服务器 |
---|
选择Tomcat安装目录,点击OK即可
选择Tomcat目录 |
---|
最后,点击OK
点击OK |
---|
4.3.2 项目部署Tomcat
点击 Add Configuration
添加项目配置 |
---|
点击+号,选择Tomcat Server,选择Local
选择Tomcat服务器 |
---|
点击+号 ,选择 Artifact,添加当前项目
添加当前项目 |
---|
点击运行按钮,即可运行项目
运行 |
---|
4.4 其他操作
4.4.1 关联第三方jar包
在
WEB-INF下新建lib目录 |
---|
输入lib目录
文件夹名称 |
---|
复制jar包到lib目录中
复制Jar文件 |
---|
右击lib目录,选择Add as Library...
项目集成 |
---|
选择Project Library,完成。
Global Library 表示所有工程都可以使用。
Project Library 表示当前工程中所有模块都可以使用。
Module Library 表示当前模块可以使用。
关键项目环境 |
---|
五、HTTP协议
5.1 什么是HTTP
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,是一个基于请求与响应模式的、无状态的、应用层的协议,运行于TCP协议基础之上。
5.2 HTTP协议特点
支持客户端(浏览器)/服务器模式。
简单快速:客户端只向服务器发送请求方法和路径,服务器即可响应数据,因而通信速度很快。请求方法常用的有GET、POST等。
灵活:HTTP允许传输任意类型的数据,传输的数据类型由Content-Type标识。
无连接:无连接指的是每次TCP连接只处理一个或多个请求,服务器处理完客户的请求后,即断开连接。采用这种方式可以节省传输时间。
HTTP1.0版本是一个请求响应之后,直接就断开了。称为短连接。
HTTP1.1版本不是响应后直接就断开了,而是等几秒钟,这几秒钟之内有新的请求,那么还是通过之前的连接通道来收发消息,如果过了这几秒钟用户没有发送新的请求,就会断开连接。称为长连接。
无状态:HTTP协议是无状态协议。
无状态是指协议对于事务处理没有记忆能力。
5.3 HTTP协议通信流程
客户与服务器建立连接(三次握手)。
客户向服务器发送请求。
服务器接受请求,并根据请求返回相应的文件作为应答。
客户与服务器关闭连接(四次挥手)。
HTTP原理 |
---|
5.4 请求报文和响应报文
5.4.1 HTTP请求报文
当浏览器向Web服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息(请求报文),HTTP请求信息由4部分组成: 1、请求行 请求方法/地址 URI协议/版本 2、请求头(Request Header) 3、空行 4、请求正文
请求报文 |
---|
5.4.2 HTTP响应报文
HTTP响应报文与HTTP请求报文相似,HTTP响应也由4个部分组成: 1、状态行 2、响应头(Response Header) 3、空行 4、响应正文
响应报文 |
---|
5.4.3 常见状态码
状态代码 | 状态描述 | 说明 |
---|---|---|
200 | OK | 客户端请求成功 |
302 | Found | 临时重定向 |
403 | Forbidden | 服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因 |
404 | Not Found | 请求的资源不存在,例如,输入了错误的URL。 |
500 | Internal Server Error | 服务器发生不可预期的错误,导致无法完成客户端的请求。 |
六、Servlet详解【重点
】
6.1 Servlet核心接口和类
在Servlet体系结构中,除了实现Servlet接口,还可以通过继承GenericServlet 或 HttpServlet类,完成编写。
6.1.1 Servlet接口
在Servlet API中最重要的是Servlet接口,所有Servlet都会直接或间接的与该接口发生联系,或是直接实现该接口,或间接继承自实现了该接口的类。 该接口包括以下五个方法:
init(ServletConfig config)
ServletConfig getServletConfig()
service(ServletRequest req,ServletResponse res)
String getServletInfo()
destroy( )
6.1.2 GenericServlet抽象类
GenericServlet 使编写 Servlet 变得更容易。它提供生命周期方法 init 和 destroy 的简单实现,要编写一般的 Servlet,只需重写抽象 service 方法即可。
6.1.3 HttpServlet类
HttpServlet是继承GenericServlet的基础上进一步的扩展。 提供将要被子类化以创建适用于 Web 站点的 HTTP servlet 的抽象类。HttpServlet 的子类至少必须重写一个方法,该方法通常是以下这些方法之一: doGet,如果 servlet 支持 HTTP GET 请求 doPost,用于 HTTP POST 请求 doPut,用于 HTTP PUT 请求 doDelete,用于 HTTP DELETE 请求
6.2 Servlet两种创建方式
6.2.1 实现接口Servlet
/**
* Servlet创建的第一种方式:实现接口Servlet
* */
public class HelloServlet2 implements Servlet{
6.2.2 继承HttpServlet(推荐)
/**
* Servlet implementation class HelloServlet
* Servlet的第二种创建方式,继承HttpServlet.也是开发中推荐的
*
*/
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().print("welcome use servlet");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
6.2.3 常见错误
HTTP Status 404 资源找不到 。
第一种情况:地址书写错误。
第二种情况:地址没有问题,把IDEA项目中out目录删除,然后重新运行。
Serlvet地址配置重复。both mapped to the url-pattern [/helloservlet] which is not permitted。
Serlvet地址配置错误。比如没有写/ Invalid <url-pattern> [helloservlet2] in servlet mapping。
6.3 Servlet两种配置方式
6.3.1 使用web.xml(Servlet2.5之前使用)
6.3.2 配置属性
url-pattern定义匹配规则,取值说明:
精确匹配 /具体的名称 只有url路径是具体的名称的时候才会触发Servlet
后缀匹配 *.xxx 只要是以xxx结尾的就匹配触发Servlet
通配符匹配 /* 匹配所有请求,包含服务器的所有资源
通配符匹配 / 匹配所有请求,包含服务器的所有资源,不包括.jsp
load-on-startup
1.元素标记容器是否应该在web应用程序启动的时候就加载这个servlet。
2.它的值必须是一个整数,表示servlet被加载的先后顺序。
3.如果该元素的值为负数或者没有设置,则容器会当Servlet被请求时再加载。
4.如果值为正整数或者0时,表示容器在应用启动时就加载并初始化这个servlet,值越小,servlet的优先级越高,就越先被加载。值相同时,容器就会自己选择顺序来加载。
6.3.3 使用注解 (Servlet3.0后支持,推荐)
/**
* Servlet implementation class HelloServlet
* 演示Servlet注解式配置
*/
6.3.4 @WebServlet注解常用属性
name: Serlvet名字 (可选)
value: 配置url路径,可以配置多个
urlPatterns:配置url路径 ,和value作用一样,不能同时使用
loadOnStartup:配置Servlet的创建的时机, 如果是0或者正数 启动程序时创建,如果是负数,则访问时创建。 数子越小优先级越高。
七、Servlet应用【重点
】
7.1 request对象
在Servlet中用来处理客户端请求需要用doGet或doPost方法的request对象
request |
---|
7.1.1 get和post区别
get提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连
get方式明文传递,数据量小,不安全
效率高,浏览器默认请求方式为GET请求
对应的Servlet的方法是doGet
post方法是把提交的数据放在HTTP包的Body中
密文传递数据,数据量大,安全
效率相对没有GET高
对应的Servlet的方法是doPost
7.1.2 request主要方法
方法名 | 说明 |
---|---|
String getParameter(String name) | 根据表单组件名称获取提交数据 |
void setCharacterEncoding(String charset) | 指定每个请求的编码 |
7.1.3 request应用
HTML页面
Servlet代码
7.1.4 get请求收参问题
产生乱码是因为服务器和客户端沟通的编码不一致造成的,因此解决的办法是:在客户端和服务器之间设置一个统一的编码,之后就按照此编码进行数据的传输和接收
7.1.5 get中文乱码
在Tomcat7及以下版本,客户端以UTF-8的编码传输数据到服务器端,而服务器端的request对象使用的是ISO8859-1这个字符编码来接收数据,服务器和客户端沟通的编码不一致因此才会产生中文乱码的。
解决办法:在接收到数据后,先获取request对象以ISO8859-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题。
Tomcat8的版本中get方式不会出现乱码了,因为服务器对url的编码格式可以进行自动转换。
/**
* Servlet implementation class HelloServlet
* 演示Servlet的GET请求,中文乱码的问题
*
*/
7.1.6 post中文乱码
由于客户端是以UTF-8字符编码将表单数据传输到服务器端的,因此服务器也需要设置以UTF-8字符编码进行接收。
解决方案:使用从ServletRequest接口继承而来的setCharacterEncoding(charset)方法进行统一的编码设置。
/**
* Servlet implementation class HelloServlet
* 演示Servlet的GET请求,中文乱码的问题
*
*/
7.2 response对象
response对象用于响应客户请求并向客户端输出信息。
response |
---|
7.2.1 response主要方法
方法名称 | 作用 |
---|---|
setHeader(name,value) | 设置响应信息头 |
setContentType(String) | 设置响应文件类型、响应式的编码格式 |
setCharacterEncoding(String) | 设置服务端响应内容编码格式 |
getWriter() | 获取字符输出流 |
7.2.2 response应用
//获取请求参数代码省略
//获取输出流
PrintWriter out=response.getWriter();
out.println("<html>");
out.println("<head><title>login</title></head>");
out.println("<body>");
out.println("<h1>Login Success!!!</h1>");
//out.println("<h1>登录成功!!!</h1>");
out.println("</body>");
out.println("</html>");
7.2.3 解决输出中文乱码
设置服务器端响应的编码格式
设置客户端响应内容的头内容的文件类型及编码格式
response.setCharacterEncoding("utf-8");//设置响应编码格式为utf-8
response.setHeader("Content-type","text/html;charset=UTF-8");
同时设置服务端的编码格式和客户端响应的文件类型及响应时的编码格式
response.setContentType("text/html;charset=UTF-8");
7.3 综合案例(Servlet + JDBC)
要求:实现登录功能、展示所有用户功能
以下仅展示关键代码
7.3.1 数据库
CREATE TABLE admin(
username VARCHAR(20) PRIMARY KEY,
PASSWORD VARCHAR(20) NOT NULL,
phone varchar(11) NOT NULL,
Address varchar(20) NOT NULL
)CHARSET=utf8;
INSERT INTO admin(username,PASSWORD,phone,address)
VALUES('gavin','123456','12345678901','北京市昌平区');
INSERT INTO admin(username,PASSWORD,phone,address)
VALUES('aaron','123456','12345678901','北京市昌平区');
7.3.2 DBUtils
package com.qf.servletProject.utils;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class DbUtils {
private static DruidDataSource ds;
private static final ThreadLocal<Connection> THREAD_LOCAL = new ThreadLocal<>();
static {
Properties properties = new Properties();
InputStream inputStream = DbUtils.class.getResourceAsStream("/database.properties");
try {
properties.load(inputStream);
ds = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
Connection connection = THREAD_LOCAL.get();
try {
if (connection == null) {
connection = ds.getConnection();
THREAD_LOCAL.set(connection);
}
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
public static void begin() {
Connection connection = null;
try {
connection = getConnection();
connection.setAutoCommit(false);
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void commit() {
Connection connection = null;
try {
connection = getConnection();
connection.commit();
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeAll(connection, null, null);
}
}
public static