模拟Servlet本质
充当SUN公司的角色,制定Servlet规范
javax.servlet.Servlet接口
充当Tomcat服务器的开发者
充当Webapp的开发者
BankServlet implements Servlet
UserListServlet implements Servlet
UserLoginServlet implements Servlet
对于javaweb程序员来说,我们只需要做两件事:
编写一个类实现Servlet接口。
将编写的类配置到配置文件中,在配置文件中:指定请求路径和类名的关系。
注意:
这个配置文件的文件名不能乱来。固定的
这个配置文件的存放路径不能乱来。固定的。
文件名、文件路径都是SUN公司制定的Servlet规范中的明细。
严格意义上来说Servlet其实并不是简单的一个接口:
Servlet规范中规定了:
一个合格的webapp应该是一个怎样的目录结构
一个合格的webapp应该有一个怎样的配置文件
一个合格的webapp配置文件路径放在哪里
一个合格的webapp中java程序放在哪里
这些都是Servlet规范中规定的。
Tomcat服务器要遵循Servlet规范。JavaWEB程序员也要遵循这个Servlet规范。这样Tomcat 服务器和webapp才能解耦合。
Servlet规范是一个什么规范?
遵循Servlet规范的webapp,这个webapp就可以放在不同的WEB服务器中运行。(因为这个 webapp是遵循Servlet规范的。)
Servlet规范包括什么呢?
规范了哪些接口
规范了哪些类
规范了一个web应用中应该有哪些配置文件
规范了一个web应用中配置文件的名字
规范了一个web应用中配置文件存放的路径
规范了一个web应用中配置文件的内容
规范了一个合法有效的web应用它的目录结构应该是怎样的。……
开发一个带有Servlet
(Java小程序)的webapp(重点)
1.开发步骤是怎样的?
第一步:在webapps目录下新建一个目录,起名crm (这个crm就是webapp的名字)。当然,也 可以是其它项目,比如银行项目,可以创建—个目录bank,办公系统可以创建—个 oa.
注意:crm就是这个webapp的根
第二步:在webapp的根下新建一个目录:WEB-INF
注意:这个目录的名字是Servlet规范中规定的,必须全部大写,必须一模一样。必须的
第三步:在WEB-INF目录下新建—个目录:classes
注意;这个目录的名字必须是全部小写的classes。这也是Servlet规范中规定的。另外这 个目录下一定存放的是Java程序编译之后的class文件(这里存放的是字节码文件)
第四步:在WEB-INF目录下新建—个目录:lib
注意;这个目录不是必须的。但如果一个webapp需要第三方的jar包的话,这个jar包要放 到这个lib目录下,这个目录的名字也不能随意编写,必须是全部小写的lib。例如 java语言连接数据库需要数据库的驱动jar包。那么这个jar包就一定要放到lib目录 下。这Serlet规范中规定的。
第五步;在WEB-INF目录下新建—个文件: web.xml
注意:这个文件是必须的,这个文件名必须叫做web.xml。这个文件必须放在这里。一个 合法的webapp,web.xml文件是必须的,这个web.xml文件就是一个配置文件,在 这个配置文件中描述了请求路径和Servlet类之间的对照关系。
这个文件最好从其他的webapp中拷贝,最好别手写。复制粘贴
第六步:编写一个java程序,这个小Java程序也不能随意开发,这个小java程序必须实现 Servlet接口。
这个Servlet接口不在JDK当中。(因为Servlet不是JawaSE了。Servlet属于lavaEE,是另 外的一套类库。)
Servlet接口(Servlet.class文件)是Oracle提供的。(最原始的是sun公司提供的。)
Servlet接口是JavaEE的规范中的一员。
Tomcat服务器实现了Servlet规范,所以Tomcat服务器也需要使用Servlet接口。Tomcat 服务器中应该有这个接口,Tomcat服务器的CATALINA_HOMElib目录下有一个servlet- api.jar,解压这个servlet-api.jar之后,你会看到里面有一个Servlet.class文件。
重点:从JakartaEE9开始,Serlet接口的全名变了: jakarta.servlet.Servlet
注意:编写这个java小程序的时候,java源代码你愿意在哪里就在哪里,位置无所谓,你 只需要将java源代码编译之后的class文件放到classes目录下即可。
第七步:编译我们编写的HelloServlet
重点:你怎么能让你的HelloSerMlet编译通过呢?配置环境变量 CLASSPATHCLASSPATH=.;C:ldevlapache-tomcat-10.0.12Nliblservlet-api.jar
思考:以上配置的CLASSPATH和Tomcat服务器运行有没有关系?
没有任何关系,以上配置这个环境变量只是为了让你的HelloServlet能够正常编译 生成class文件。、
第八步:将以上编译之后的HelloServlet.class文件拷贝到WEB-INF\classes目录下
第九步:在web.xml文件中编写配置信息,让"请求路径"夭和"Servlet类名"关联在一起。
这一步用专业术语描述:在web.xml文件中注册Servlet类。
第十步:启动Tomcat服务器
第十一步:打开浏览器,在浏览器地址栏上输入一个url,这个URL必须是:
http://127.0.0.1:8080/crm/fdsa/fd/safld/sa/fd/sa/fd
非常重要的一件事:浏览器上的请求路径不能随便写,这个请求路径必须和web.xml文件中的 url-pattern一致。
注意:浏览器上的请求路径和web.xml文件中的url-pattern的唯一区别就是:浏览器上的请求路 径带项目名:/crm。浏览器上编写的路径太复杂,可以使用超链接。
(非常重要: html页面只能放到WEB-INF目录外面。)
以后不需要我们编写main方法了。tomcat服务器负责调用main方法,Tomcat服务器启 动的时候执行的就是main方法。我们javaweb程序员只需要编写Servlet接口的实现类, 然后将其注册到web.xml文件中,即可。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xm1ns="https ://jakarta.ee/xml/ns/jakartaee"xmlns : xsi="http: //www. w3.or g/2001/XMLSchema-instance"xsi:schemaLocation="https://jakarta.ee/xm1/ns/jakartaee
https://jakarta.ee/xm1/ns/jakartaee/web-app_5_0.xsd"
version="5.0"
metadata-complete="true ">
</web-app>
向浏览器响应一段HTML代码
public void service(ServletRequest request, ServletResponse response) throws
ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.print("<h1>hello Servlet</h1>");
}
Servlet连接数据库
Servlet是java程序,所有在Servlet中完全可以编写JDBC代码连接数据库
在一个webapp中去连接数据库,需要将驱动jar包放到WEB-INF/lib目录下(com.mysql.cj.jdbc.Driver这个类就在驱动jar包当中)
@Override
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 {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://localhost:3306/textdatabase01";
String root = "root";
String password = "666";
conn = DriverManager.getConnection(url,root,password);
//3.获取预编译的操作对象
String sql = "select s.no,s.name from t_student s";
ps = conn.prepareStatement(sql);
//4.执行sql语句
rs = ps.executeQuery();
//5.处理结果集
while (rs.next()){
String no = rs.getString("no");
String name = rs.getString("name");
//System.out.println(no + ":" + name);
//输出到控制台
out.print(no + ":" + name + "<br>");
//输出到浏览器上
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
//释放资源
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}