public void service(ServletRequest request, ServletResponse response){
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.print("hello servlet!
");
}
package com.bjpowernode.servlet;
import jakarta.servlet.Servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.ServletConfig;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
public class StudentServlet implements Servlet{
public void init(ServletConfig config) throws ServletException{
}
public void service(ServletRequest request,ServletResponse response)
throws ServletException , IOException{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
// 编写JDBC代码,连接数据库,查询所有学生信息。
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try{
// 注册驱动 (com.mysql.jdbc.Driver,这个已过时。)
// 新版本中建议使用:com.mysql.cj.jdbc.Driver驱动。
Class.forName("com.mysql.cj.jdbc.Driver");
// 获取连接
String url = "jdbc:mysql://localhost:3306/bjpowernode";
String user = "root";
String password = "root";
conn = DriverManager.getConnection(url,user,password);
// 获取预编译的数据库操作对象
String sql = "select no,name from t_student";
ps = conn.prepareStatement(sql);
// 执行SQL
rs = ps.executeQuery();
// 处理查询结果集
while(rs.next()){
String no = rs.getString("no");
String name = rs.getString("name");
//System.out.println(no + "," + name);
out.print(no + "," + name + "
");
}
}catch(Exception e){
e.printStackTrace();
}finally{
// 释放资源
if(rs != null){
try{
rs.close();
}catch(Exception e){
e.printStackTrace();
}
}
if(ps != null){
try{
ps.close();
}catch(Exception e){
e.printStackTrace();
}
}
if(conn != null){
try{
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
public void destroy(){
}
public String getServletInfo(){
return "";
}
public ServletConfig getServletConfig(){
return null;
}
}
第一步:New Project(我比较习惯先创建一个Empty Project【空工程】,然后在空工程下新建Module【模块】,这不是必须的,只是一种习惯,你可以直接新建非空的Project),这个Empty Project起名为:javaweb(不是必须的,只是一个名字而已。一般情况下新建的Project的名字最好和目录的名字一致。)
第二步:新建模块(File --> new --> Module…)
第三步:让Module变成JavaEE的模块。(让Module变成webapp的模块。符合webapp规范。符合Servlet规范的Module)
第四步(非必须):根据Web Application生成的资源中有index.jsp文件,这里我选择删除这个index.jsp文件。
第五步:编写Servlet(StudentServlet)
第六步:在Servlet当中的service方法中编写业务代码(我们这里连接数据库了。)
第七步:在WEB-INF目录下新建了一个子目录:lib(这个目录名可不能随意,必须是全部小写的lib),并且将连接数据库的驱动jar包放到lib目录下。
第八步:在web.xml文件中完成StudentServlet类的注册。(请求路径和Servlet之间对应起来)
<?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_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>studentServlet</servlet-name>
<servlet-class>com.bjpowernode.javaweb.servlet.StudentServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>studentServlet</servlet-name>
<url-pattern>/servlet/student</url-pattern>
</servlet-mapping>
</web-app>
第九步:给一个html页面,在HTML页面中编写一个超链接,用户点击这个超链接,发送请求,Tomcat执行后台的StudentServlet。
student.html
这个文件不能放到WEB-INF目录里面,只能放到WEB-INF目录外面。
student.html文件的内容
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>student pagetitle>
head>
<body>
<a href="/xmm/servlet/student">student lista>
body>
html>
第十步:让IDEA工具去关联Tomcat服务器。关联的过程当中将webapp部署到Tomcat服务器当中。
第十一步:启动Tomcat服务器
第十二步:打开浏览器,在浏览器地址栏上输入:http://localhost:8080/xmm/student.html
注意事项
在IDEA配置过程中出现的几个问题
TomCat与IDEA版本不匹配
IDEA2018等老版本不能使用TomCat10版本,需要下载TomCat8等老版本
href路径错误
注意自动打开的页面是index.jsp页面,这时候的路径是不对,要加上配置文件中所写的正确路径
jar包导错
如果使用的是TomCat10版本的服务器就就需要添加TomCat10下面的jar包,切忌不能使用TomCat10,而添加TomCat8的jar包
页面空白
如果打开的页面实现的是空白,检查数据库密码是否错误以及mysql驱动的jar包是否添加到了WEB-INF下的lib路径下
在servlet标签中添加子标签,在该子标签中填写整数,越小的整数优先级越高。
<servlet>
<servlet-name>aservletservlet-name>
<servlet-class>com.bjpowernode.javaweb.servlet.AServletservlet-class>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>aservletservlet-name>
<url-pattern>/aurl-pattern>
servlet-mapping>
用户发送第一次请求的时候,控制台输出了以下内容:
AServlet无参数构造方法执行了
AServlet's init method execute!
AServlet's service method execute!
根据以上输出内容得出结论:
用户继续发送第二次请求,控制台输出了以下内容:
AServlet's service method execute!
根据以上输出结果得知,用户在发送第二次,或者第三次,或者第四次请求的时候,Servlet对象并没有新建,还是使用之前创建好的Servlet对象,直接调用该Servlet对象的service方法,这说明:
关闭服务器的时候,控制台输出了以下内容:
AServlet's destroy method execute!
通过以上输出内容,可以得出以下结论:
请问:destroy方法调用的时候,对象销毁了还是没有销毁呢?
思考第一个问题:我提供了一个GenericServlet之后,init方法还会执行吗?
思考第二个问题:init方法是谁调用的?
思考第三个问题:init方法中的ServletConfig对象是谁创建的?是谁传过来的?
思考一下Tomcat服务器伪代码:
public class Tomcat {
public static void main(String[] args){
// .....
// Tomcat服务器伪代码
// 创建LoginServlet对象(通过反射机制,调用无参数构造方法来实例化LoginServlet对象)
Class clazz = Class.forName("com.bjpowernode.javaweb.servlet.LoginServlet");
Object obj = clazz.newInstance();
// 向下转型
Servlet servlet = (Servlet)obj;
// 创建ServletConfig对象
// Tomcat服务器负责将ServletConfig对象实例化出来。
// 多态(Tomcat服务器完全实现了Servlet规范)
ServletConfig servletConfig = new org.apache.catalina.core.StandardWrapperFacade();
// 调用Servlet的init方法
servlet.init(servletConfig);
// 调用Servlet的service方法
// ....
}
}
在GenericServlat类当中添加成员变量ServletConfig,在init方法内,初始化成员变量ServletConfig(this->ServletConfig = ServletConfig)
如果说想要在子类当中重写GenericServlat父类的init方法会导致父类init的方法不再执行,也就是说初识化操作无法完成,那么这些如何做呢?