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包?
(`所谓配置好了是,你能在测试类中可以连接数据库,而在服务器端连不上)
解决方法就是下图
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>
2.2创建Servlet服务器对象
2.3在服务器对象的WEB-INF—lib—mysql.jdbc.×××(选择你数据库相对对应的版本);
2.4规范你的连接数据步骤,定不要忘记了写创建驱动的代码,否则Servlet会识别不了连接数据库的代码
代码是:
Class.forname("com.jdbc.mysql.Driver");
这个放在要连接的数据库connnerction 对象的前面;