一、什么是Servlet
Servlet 是运行在服务端(tomcat)的Java小程序,是sun公司提供一套定义动态资源规范; 从代码层面上来讲Servlet就是一个接口
二、Servlet的作用
用来接收、处理客户端请求、响应给浏览器的动态资源。在整个Web应用中,Servlet主要负责接收处理请求、协同调度功能以及响应数据。我们可以把Servlet称为Web应用中的『控制器』
三、Servlet的入门案例
目标:在页面上点击超链接,由Servlet处理这个请求,并返回一个响应字符串:这是我的第一个Servlet项目
思路:
1、创建动态Web module
1.1、先创建一个空的java项目
1.2、创建Web-module
创建好Module的目录:
2、创建html页面
将index.jsp删除,并在webapp目录下创建一个index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>第一个Servlet的应用程序</title>
</head>
<body>
<!--
使用绝对路径: /部署的项目名/要访问的资源路径
-->
<a href="/firstServlet/hello">访问HelloServlet</a>
</body>
</html>
什么是部署的项目名?
项目名可以修改,这里将项目名修改为:firstServlet
什么是资源路径?
就是能访问到MyFirstServlet类的路径
3、创建MyFirstServlet类,实现Servlet接口
创建Web项目会自动创建HelloServlet类,可以把它删了创建一个新的类
package com.fm.firstservlet;
import javax.servlet.*;
import java.io.IOException;
/***
* 编写Servlet的步骤:
* * 1. 编写一个类实现Servlet接口,并且重写里面的方法: 主要是要重写service方法
* * 2. 重写service方法,service方法中就是接收、处理请求,并且将信息响应给客户端
* * 3. 配置Servlet的映射路径(供客户端访问的路径):在web/WEB-INF/web.xml中配置
*/
public class MyFirstServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//使用响应输出流向浏览器输出: Hello,I am Servlet
servletResponse.getWriter().write("Hello,I am Servlet");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
4、在web.xml中配置MyFirstServlet
<?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>
<!-- 相当于给Servlet取个名,我们可以就使用Servlet的类名/类名首字母改小写-->
<servlet-name>myFirstServlet</servlet-name>
<!-- 你要配置的那个Servlet的全限定名(也就是MyFirstServlet类所在的包路径+类名)-->
<servlet-class>com.fm.firstservlet.MyFirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<!-- 和servlet标签中的servlet-name保持一致-->
<servlet-name>myFirstServlet</servlet-name>
<!-- 给HelloServlet配置的映射路径,以/开头-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
『映射路径』:Servlet并不是文件系统中实际存在的目录或文件,所以为了方便浏览器访问,我们创建了映射路径来访问它。
5、运行项目
启动项目会自动跳转到浏览器。
在浏览器手动输入访问:localhost:8080/部署的项目名
成功响应到浏览器。
6、项目的运行访问过程(总结)
图片:
文字:
1、启动项目,Tomcat服务器会运行项目并打开index.html页面
2、点击超链接,根据超链接的路径进入到web.xml文件,找到servlet-mapping标签,
获取url-pattern标签的属性值(/hello)与超链接的资源路径(/hello)是否一致。
通过servlet-name标签找到MyFirstServlet类,执行service()方法,
将"Hello,I am Servlet"写到响应输出流里,流向浏览器输出:Hello,I am Servlet
四、Servlet的生命周期和生命周期方法
1、 什么是Servlet的生命周期?
Servlet的生命周期就是servlet从创建到销毁的过程,我们所要去探讨的就是Servlet对象在什么时候创建出来以及在什么时候销毁。当然创建和销毁Servlet对象的工作是不需要我们去做的
2、Servlet对象什么时候创建?
默认情况下是在第一次有请求访问该Servlet实例的时候才会创建该Servlet对象
3、Servlet对象什么时候销毁?
在服务器关闭,或者当前项目从服务器中移除的时候会销毁当前项目中的所有Servlet对象
五、Servlet的生命周期方法
1、什么是Servlet的生命周期方法?
在Servlet的生命周期中必然会经历的方法我们称之为Servlet的生命周期方法,总共包含三个方法:init、service、destroy
2、init方法
该方法会在Servlet实例对象被创建出来之后执行,我们可以在该方法中获取当前Servlet的初始化参数,以及进行一些读取配置文件之类的操作
3、service方法
该方法会在Servlet实例对象每次接收到请求的时候均执行,我们可以在该方法中接收、处理请求,以及将客户端需要的数据响应给客户端
4、destroy方法
该方法会在Servlet实例对象销毁之前执行,我们可以在该方法中做一些资源回收、释放、关闭等等操作
六、配置Servlet提前创建
有时候我们需要在Servlet创建的时候做一些资源加载等等耗时操作,所以如果Servlet在第一次接收请求的时候才创建的话必然会影响用户的访问速度,所以此时我们需要让Servlet提前创建,将Servlet的创建提前到服务器启动的时候。
通过修改web.xml中Servlet的配置可以实现:
<!-- 配置Servlet本身 -->
<servlet>
<!-- 全类名太长,给Servlet设置一个简短名称 -->
<servlet-name>myFirstServlet</servlet-name>
<!-- 配置Servlet的全类名 -->
<servlet-class>com.fm.firstservlet.MyFirstServlet</servlet-class>
<!-- 配置Servlet启动顺序 -->
<load-on-startup>1</load-on-startup>
</servlet>
七、ServletConfig的介绍
1、 接口方法介绍
方法名 | 作用 |
getServletName() | 获取<servlet-name>HelloServlet</servlet-name>定义的Servlet名称 |
getServletContext() | 获取ServletContext对象 |
getInitParameter() | 获取配置Servlet时设置的『初始化参数』,根据名字获取值 |
getInitParameterNames() | 获取所有初始化参数名组成的Enumeration对象 |
2、获取Servlet的初始化参数
在桌面上创建一个文件aa.txt,输入内容,将文件复制粘贴到resources目录中
我们可以在web.xml中对Servlet配置初始化参数,接下来可以在Servlet的init方法中获取配置的初始化参数的值
web.xml代码
<!--
配置MyFirstServlet
-->
<servlet>
<servlet-name>myFirstServlet</servlet-name>
<servlet-class>com.fm.servlet.MyFirstServlet</servlet-class>
<!--配置当前Servlet的初始化参数-->
<init-param>
<!--参数名称-->
<param-name>configLocation</param-name>
<!--参数值-->
<param-value>aa.txt</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>myFirstServlet</servlet-name>
<url-pattern>/myFirst</url-pattern>
</servlet-mapping>
MyFirstServlet代码
package com.fm.firstservlet;
import javax.servlet.*;
import java.io.IOException;
import java.io.InputStream;
/**
* 模拟它是SpringMVC中的一个类
*/
public class MyFirstServlet implements Servlet {
private String filePath;
@Override
public void init(ServletConfig config) throws ServletException {
//使用ServletConfig对象读取初始化参数
filePath = config.getInitParameter("configLocation");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
//目标:读取aa.txt文件的内容
InputStream is = MyFirstServlet .class.getClassLoader().getResourceAsStream(filePath);
System.out.println(is);
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
八、Servlet的体系结构
1、类型关系
Servlet接口有一个实现类是GenericServlet,而GenericServlet有一个子类是HttpServlet,我们创建Servlet的时候会选择继承HttpServlet,因为它里面相当于也实现了Servlet接口,并且对一些方法做了默认实现;而且子类的功能会比父类的更加强大
2、方法关系
我们编写Servlet类继承HttpServlet的时候,只需要重写doGet()和doPost()方法就行了,因为HttpServlet重写了service()方法,在service()方法中判断请求方式,根据不同的请求方式执行doXXX()方法。
九、使用Idea直接创建Servlet
创建后Web.xml会自动生成以下代码:
<!-- IDEA会自动生成servlet标签 -->
<servlet>
<servlet-name>CreateServlet</servlet-name>
<servlet-class>com.fm.CreateServlet</servlet-class>
</servlet>
Servlet代码
package com.fm;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class CreateServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
本文暂时没有评论,来添加一个吧(●'◡'●)