文章目录
1. Servlet 简介
Servlet(server applet)是运行在服务器端的小程序,其实就是一个接口,定义了 Java 类被浏览器访问到(Tomcat 识别)的规则,我们可以自己定义一个类,来实现 Servlet 接口,复写方法。
作用:实现在网上实现 聊天、发帖、这样一些的交互功能
注:须补充 HTTP知识点
2. JAVAWEB 目录结构
以上图说明:
- bbs目录代表一个web应用
- bbs目录下的html,jsp文件可以直接被浏览器访问
- WEB-INF目录下的资源是不能直接被浏览器访问的
- web.xml文件是web程序的主要配置文件
- 所有的classes文件都放在classes目录下
- jar文件放在lib目录下
3. Servlet 实例
3.1 创建JavaEE WEB项目
3.2 定义类myServlet
实现 Servlet 接口,实现接口中的抽象方法。
有5个方法需要重写,有init
【初始化】,destroy
【销毁】,service
【服务】,ServletConfig
【Servlet配置】,getServletInfo
【Servlet信息】。
import javax.servlet.*;
import java.io.IOException;
public class myServlet implements Servlet {
/**
* 初始化方法
* 在Servlet被创建是执行,只会执行一次
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("初始化");
}
/**
* 获取ServletConfig配置对象
* @return
*/
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* 提供服务的方法
* 每次Servlet被访问的时候执行,可执行多次
* @return
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
servletResponse.getWriter().write("helloworld");
System.out.println("我被访问了!");
}
/**
* 获取Servlet信息,如作者、版本等
* @return
*/
@Override
public String getServletInfo() {
return null;
}
/**
* 销毁方法
* 在服务器正常关闭的时候执行,执行一次
*/
@Override
public void destroy() {
System.out.println("销毁");
}
}
3.3 配置 Servlet
在 web.xml 文件里面进行配置,在根标签里面加入如下配置。
当浏览器输入http://http://localhost:8080/myServlet 执行:
- 解析请求的URL路径, 查找映射路径
<url-pattern>/myServlet</url-pattern>
- 通过映射路径的名字找到配置Servlet的名字
<servlet-name>myServlet</servlet-name>
- 通过Servlet的名字找到class文件的存放位置
<servlet-class>myServlet</servlet-class>
- Tomcat 将字节码文件加载进内存,并创建其对象、调用其方法
<?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>
<!-- 为myServlet去一个名字(一般和类名一致)-->
<servlet-name>myServlet</servlet-name>
<!-- 类的存放位置,要填写完整路径(包名) -->
<servlet-class>myServlet</servlet-class>
</servlet>
<!-- 配置映射路径 -->
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<!-- 外界访问myServlet的路径 -->
<url-pattern>/myServlet</url-pattern>
</servlet-mapping>
</web-app>
3.4 运行结果
4. Servlet 生命周期
4.1 实践步骤
- 第一次访问Servlet,init()和service()都被调用了
- 第二次、第三次访问Servlet,service()被调用了
- 当关闭Tomcat服务器的时候,destroy()被调用了!
4.2 生命周期
- 加载Servlet:当Tomcat第一次访问Servlet的时候,Tomcat会负责创建Servlet的实例。
- 初始化:当Servlet被实例化后,Tomcat会调用init()方法初始化这个对象,只执行一次。
- 处理服务:当浏览器访问Servlet的时候,Servlet 会调用service()方法处理请求。
- 销毁:当Tomcat关闭时或者检测到Servlet要从Tomcat删除的时候会自动调用destroy()方法,让该实例释放掉所占的资源。一个Servlet如果长时间不被使用的话,也会被Tomcat自动销毁。
总结:只要访问Servlet,service()就会被调用。init()只有第一次访问Servlet的时候才会被调用。destroy()只有在Tomcat关闭的时候才会被调用。
5. 继承HttpServlet类
HttpServlet
类已经实现了Servlet接口的所有方法,编写Servlet时,只需要继承HttpServlet,重写你需要的方法即可,并且它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。
- 一般都是重写
doGet()
和doPost()
方法的。对于idea而言,创建Servlet的时候已经帮你重写好了。 - 对于开发而言,一般只有
get
和post
方式提交数据给服务器,这两个处理数据的方式是一样的,所以在doGet()
方法里,可以调用doPost()
方法进行处理。
public class demo extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("hello demo");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
}
- 执行效果如下
6. Servlet 知识点
6.1 Servlet 映射的 URL 通配符的使用
- *.拓展名
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>myServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
- 斜杠(/)开头并以 /*结尾
<servlet>
<servlet-name>demo</servlet-name>
<servlet-class>demo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
如果.扩展名
和正斜杠(/)开头并以“/”结尾
两种通配符同时出现,匹配优先级:
- 看谁的匹配度高,谁就被选择
- *.扩展名的优先级最低
6.2 Servlet 是单例的
浏览器多次对Servlet的请求,一般情况下,服务器只创建一个Servlet对象,也就是说,Servlet对象一旦创建了,就会驻留在内存中,为后续的请求做服务,直到服务器关闭。
6.3 每次访问请求对象和响应对象都是新的
对于每次访问请求,Servlet 引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()
方法,service方法再根据请求方式分别调用doXXX
方法。
request对象
代表http请求,那么我们获取浏览器提交过来的数据,找request对象即可。
response对象
代表http响应,那么我们向浏览器输出数据,找response对象即可。
6.4 load-on-startup
如果在元素中配置了一个元素,那么WEB应用程序在启动时,就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()
方法。
- 在web.xml添加load
<servlet>
<servlet-name>demo</servlet-name>
<servlet-class>demo</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
- 在
demo.java
文件中创建init()
初始化方法
@Override
public void init() throws ServletException {
super.init();
System.out.println("我被调用了!!");
}
- 在程序启动时,便会调用
init()
初始化方法
6.5 在web访问任何资源都是在访问Servlet
当你启动Tomcat,你在网址上输入http://localhost:8080。为什么会出现Tomcat小猫的页面?
由缺省Servlet为你服务的!
- 在Tomcat安装目录下 的 conf > web.xml里面配置着缺省Servlet:
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
- 缺省Servlet : 凡是在web.xml文件中找不到匹配的元素的URL,它们的访问请求都将交给缺省Servlet处理。
- 访问静态资源【本地图片,本地HTML文件】也是在访问 缺省Servlet。
例:在项目的web文件下添加1.jpg,输入网址http://localhost:8080/1.jpg
,能访问该静态资源。
注:可自行配置缺省Servlet,覆盖掉web.xml配置的缺省Servlet。