黑马程序员技术交流社区
标题:
【成都校区】 在Servlet中连接MySQL数据库
[打印本页]
作者:
meikoYang
时间:
2018-12-22 21:56
标题:
【成都校区】 在Servlet中连接MySQL数据库
今天学到Servlet,简单说下如何在Servlet程序中连接数据库。
首先,先解决Tomcat的部署。我们所写的Servlet程序,如何才能在Tomcat服务器上运行呢?
1、进入Tomcat所在目录-->webapp目录-->在里面新建一个文件夹,名字随便取(我这里的是my)-->在里面新建一个名为WEB-INF文件夹(这是规范)
-->在其文件夹内新建一个classes文件夹,一个lib文件夹,一个web.xml文件。
classes文件夹用来存放编译好的class文件,lib文件夹用来存储程序中要用到的jar包。web.xml是对Servlet程序的配置。
2、接下来在数据库中创建相应的库,表,并插入记录。然后编写Servlet程序连接数据库。
复制代码
1 package com.HelloSevrlet;
2 import javax.servlet.ServletException;
3 import javax.servlet.http.HttpServlet;
4 import javax.servlet.http.HttpServletRequest;
5 import javax.servlet.http.HttpServletResponse;
6 import java.io.IOException;
7 import java.io.PrintWriter;
8 import java.sql.*;
9
10 /**
11 * Created by Lin-953 on 2016/3/13.
12 */
13 public class ServletToJDBC extends HttpServlet {
14 @Override
15 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
16 resp.setContentType("text/html");
17 resp.setCharacterEncoding("gb2312");
18 Connection connection = null;
19 Statement statement = null;
20 ResultSet resultSet = null;
21 PrintWriter printWriter = resp.getWriter();
22 try {
23 Class.forName("com.mysql.jdbc.Driver");
24 String url = "jdbc:mysql://127.0.0.1/testing";
25 connection = DriverManager.getConnection(url, "root", "57295320.");
26 statement = connection.createStatement();
27 resultSet = statement.executeQuery("SELECT Sname FROM test");
28 printWriter.print("<html><head><title>Servlet连接数据库</title></head>");
29 printWriter.print("<body><table border=1 align=\"center\"><tr><td>Sname</td></tr>");
30 while (resultSet.next()) {
31 printWriter.print("<tr>");
32 printWriter.print("<td>" + resultSet.getString("Sname") + "</td>");
33 printWriter.print("</tr>");
34 }
35 printWriter.print("</table>");
36 printWriter.print("</html>");
37
38 } catch (ClassNotFoundException e) {
39 e.printStackTrace();
40 } catch (SQLException e) {
41 e.printStackTrace();
42 } finally {
43 try {
44 if (resultSet != null) {
45 resultSet.close();
46 resultSet = null;
47 }
48
49 if (statement != null) {
50 statement.close();
51 resultSet = null;
52 }
53
54 if (connection != null) {
55 connection.close();
56 connection = null;
57 }
58 } catch (SQLException e) {
59 e.printStackTrace();
60 }
61 }
62 printWriter.close();
63 }
64
65 @Override
66 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
67 doGet(req, resp);
68 }
69 }
为什么从HttpServlet继承?
GenericServlet中描述的比较通用的Servlet程序,对于特定的Http请求无任何反应。而HttpServlet类从GenericServlet类继承而来,并且实现了Servlet接口。可以对特定的Http请求做出响应。
为什么重写doGet和doPost这两个方法,而不是其他的方法?
想要解决这个问题,必须先了解一个Servlet的生命周期。
Servlet的生命周期分为三个阶段:初始,响应及终止。
初始阶段:在此阶段Servlet容器会对Servlet类进行装载,装载完成后对其初始化。
1、当Servlet容器启动的时候,会对Servlet进行装载。
2、当客户端首次请求访问Servlet时,Servlet容器会对Servlet类装载。
3、当有Servlet类文件更新时,Servlet容器会对Servlet重新装载。
装载完成之后,调用init()方法对Servlet对象进行初始化。
响应阶段:当客户端请求访问Servlet资源时,Servlet对象会调用Service方法响应用户请求,
而Service方法会调用doPost或doGet方法,这也是为什么要重写这两个方法的原因。在此阶段,
Servlet容器将用户请求包装成一个HttpRequest对象,最后将结果包装成一个HttpResponse对
象返回客户端。
终止阶段:当Web容器或者Sevlet容器关闭之后,Servlet对象会调用destory()方法来释放该Servlet对象所占的内存空间。
到这里了,又有个疑问了,web容器和Servlet容器到底是什么东东呢?
web容器是用来部署和管理Web应用程序的,Servlet容器是管理Servlet的生命周期的。
3、Tomcat和Intellij IDEA的配置
打开IDEA,新建一个WebApplication项目,新建成功后,在web目录下的WEB-INF目录下新建一个classpath文件夹和一个lib文件夹
-->File-->Project Structure-->Modules-->Dependencies-->选择“+”号-->JARordirectorys添加所需jar包
(我这里的是Tomcat,mysql--connector--java-bin.jar,),将我们刚才新建的lib的绝对路径也添加上去。-->
切换到Module--path,在Compiler Output栏中选择“use modules compiler output path”,然后指定我们刚才新建
的class目录。
将WEB-INF文件夹下的web.xml文件的内容拷贝到my中的WEB-INF文件夹下的web.xml文件中。根据自己所写的Servlet程序进行配置。以下
是我的配置信息。
1 <?xml version="1.0" encoding="GBK"?>
2 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
5 version="3.1">
6
7 <servlet>
8 <servlet-name>HelloServlet</servlet-name>
9 <servlet-class>com.HelloSevrlet.HelloSevlet</servlet-class>
10 </servlet>
11 <servlet-mapping>
12 <servlet-name>HelloServlet</servlet-name>
13 <url-pattern>/HelloSevlet</url-pattern>
14 </servlet-mapping>
15
16 <servlet>
17 <servlet-name>TestLifeCircleSevlet</servlet-name>
18 <servlet-class>com.HelloSevrlet.TestLifeCircleSevlet</servlet-class>
19 </servlet>
20 <servlet-mapping>
21 <servlet-name>TestLifeCircleSevlet</servlet-name>
22 <url-pattern>/TestLifeCircleSevlet</url-pattern>
23 </servlet-mapping>
一个servlet标签和一个servlet-mapping标签是一对,servlet-name标签的内容可以随便写,
但必须和servlet-mapping标签内的servlet-name标签的内容一致。servlet-class标签的内容是类所处的位置。
url-pattern中的/代表的是客户端请求访问某个Servlet的地址的父路径(相对Servlet路径来说)。
因此url-pattern是设置访问此servlet程序的路径。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2