Servlet问题与解决


1.发现问题

1.1出现java.sql.SQLException等问题


​废话不多说直接上图​


java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/mydb2
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:703)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:229)
at xiaoge.DemoServlet.doPost(DemoServlet.java:26)
at xiaoge.DemoServlet.doGet(DemoServlet.java:38)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
23-Mar-2020 23:16:26.984 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [G:\Tomcat8\apache-tomcat-8.5.51-windows-x64\apache-tomcat-8.5.51\webapps\manager]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:688)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:609)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:818)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1623)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:844)

先看看我的代码

package xiaoge;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
* Created by Administrator on 2020/3/23 22:11
* @author Administrator
*/
public class DemoServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String url = getServletConfig().getInitParameter("url");
String username = getServletConfig().getInitParameter("username");
String password = getServletConfig().getInitParameter("password");
String driver = getServletConfig().getInitParameter("driver");
try {
Connection connection = DriverManager.getConnection(url,username,password);
} catch (SQLException e) {
e.printStackTrace();
}finally {
{

}
}
}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}

首先我是想使用最基础的web.xml来温习一下不使用框架自己写配置文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>testServlet</servlet-name>
<servlet-class>xiaoge.DemoServlet</servlet-class>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mydb2</param-value>
</init-param>
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>1234</param-value>
</init-param>
<init-param>
<param-name>driver</param-name>
<param-value>com.jdbc.mysql.Driver</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>testServlet</servlet-name>
<url-pattern>/demo01</url-pattern>
</servlet-mapping>
</web-app>


​(配置文件是没有问题的)​​ 但是为什么会出现上述的问题呢,我也思考了好久终结了下面几种的情况


我在创建这个Servlet连接数据库时出现了几个问题(我开始搞不明白):


1.为什么在​​测试类中​​​创建一个连接数据库时,​​不用写数据库驱动​​​就可以连接,而在​​Servlet​​服务器不行?

​测试类(非服务器)Test连接数据库​


package xiaoge;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
* Created by Administrator on 2020/3/23 22:59
*/
public class Test {
public static void main(String[] args) {
try {
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb2","root","1234");
System.out.println(connection);
} catch (SQLException e) {
e.printStackTrace();
}

}


​Servlet服务器类​


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String url = getServletConfig().getInitParameter("url");
String username = getServletConfig().getInitParameter("username");
String password = getServletConfig().getInitParameter("password");
String driver = getServletConfig().getInitParameter("driver");
try {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(url,username,password);
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
}finally {
{

}
}
}


2.​​为什么连接数据库的jar包导在所有的类中,Servlet识别不了?非要你在WEB-INF下创建一个lib目录放进去连接jar包?​​(`所谓配置好了是,你能在测试类中可以连接数据库,而在服务器端连不上
解决方法就是下图
服务器出现java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/mydb2的问题_jdbc


2.归根结底能让一个Servlet连接数据库就是

2.1配置web.xml;(或者使用注解的方式)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>testServlet</servlet-name>
<servlet-class>xiaoge.DemoServlet</servlet-class>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mydb2</param-value>
</init-param>
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>1234</param-value>
</init-param>
<init-param>
<param-name>driver</param-name>
<param-value>com.jdbc.mysql.Driver</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>testServlet</servlet-name>
<url-pattern>/demo01</url-pattern>
</servlet-mapping>
</web-app>

服务器出现java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/mydb2的问题_jdbc_02

2.2创建Servlet服务器对象

服务器出现java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/mydb2的问题_tomcat_03

2.3在服务器对象的WEB-INF—lib—mysql.jdbc.×××(选择你数据库相对对应的版本);

服务器出现java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/mydb2的问题_jdbc

2.4规范你的连接数据步骤,定不要忘记了写创建驱动的代码,否则Servlet会识别不了连接数据库的代码

代码是:


​Class.forname("com.jdbc.mysql.Driver");​​ 这个放在要连接的数据库connnerction 对象的前面;