提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
2.1.通过继承GenericServlet类来实现Servlet生命周期
2.3.通过继承 HttpServlet 实现 Servlet 程序
一、Servlet是什么?
-
Servlet 是 JavaEE 规范之一(规范就是接口)。
-
Servlet 是运行在服务器上的一个 java 小程序, 它可以接收客户端发送过来的请求,并响应数据给客户端。
-
Servlet 就 JavaWeb 三大组件之一。三大组件分别是: Servlet 程序、 Filter 过滤器、 Listener 监听器。
二、Servlet整体架构
三、Servlet技术
1.Servlet生命周期
-
执行 Servlet 构造器方法
-
执行init初始化方法。第一、二步是在第一次访问的时候创建Servlet程序会调用。
-
执行 service 方法。第三步,每次访问都会调用。
- 执行 destroy 销毁方法。第四步,在 web 工程停止的时候调用。
2.Servlet示例代码
2.1.通过继承GenericServlet类来实现Servlet生命周期
public class HelloServlet implements Servlet {
public HelloServlet() {
System.out.println("1 构造器方法");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2 init初始化方法");
}
/**
* service 方法是专门用来处理请求和响应的
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("3 service === Hello Servlet 被访问了");
}
@Override
public void destroy() {
System.out.println("4 销毁方法");
}
}
2.2.GET和POST请求的分发处理
GET请求和POST请求的区别:
- get请求一般是去取获取数据(其实也可以提交,但常见的是获取数据);post请求一般是去提交数据。
- get因为参数会放在url中,所以隐私性,安全性较差,请求的数据长度是有限制的,不同的浏览器和服务器不同,一般限制在 2~8K 之间,更加常见的是 1k 以内;post请求是没有的长度限制,请求数据是放在body中;
- get请求刷新服务器或者回退没有影响,post请求回退时会重新提交数据请求。
- get请求可以被缓存,post请求不会被缓存。
- get请求会被保存在浏览器历史记录当中,post不会。get请求可以被收藏为书签,因为参数就是url中,但post不能。它的参数不在url中。
public class HelloServlet implements Servlet {
/**
* service 方法是专门用来处理请求和响应的
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("3 service === Hello Servlet 被访问了");
// 类型转换(因为它有getMethod()方法)
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
// 获取请求的方式
String method = httpServletRequest.getMethod();
if ("GET".equals(method)) {
doGet();
} else if ("POST".equals(method)){
doPost();
}
}
/**
* 做get请求操作
*/
public void doGet() {
System.out.println("This is doGet method");
// System.out.println("get请求");
}
/**
* 做post请求操作
*/
public void doPost() {
System.out.println("This is doPost method");
// System.out.println("post请求");
}
}
2.3.通过继承 HttpServlet 实现 Servlet 程序
public class HelloServlet2 extends HttpServlet {
/**
* doGet()在 get 请求的时候调用
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet2 的 doGet 方法");
ServletConfig servletConfig = getServletConfig();
System.out.println(servletConfig);
// 2、获取初始化参数 init-param
System.out.println("初始化参数 username 的值是;" + servletConfig.getInitParameter("username"));
System.out.println("初始化参数 url 的值是;" + servletConfig.getInitParameter("url"));
}
/**
* doPost()在 post 请求的时候调用
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet2 的 doPost 方法");
}
}
web.xml中的配置
<servlet>
<servlet-name>HelloServlet2</servlet-name>
<servlet-class>com.example.servlet_study.HelloServlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet2</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
其中web.xml文件中<url-pattern>/hello2</url-pattern>是Servlet映射的一个虚拟路径,创建好的Servlet只有映射成虚拟路径,客户端才能对其进行访问。
同一个Servlet可以被映射成多个虚拟路径。
3.ServletConfig类
3.1.什么是ServletConfig?
-
ServletConfig 类从类名上来看,就知道是 Servlet 程序的配置信息类。
-
Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用。
-
Servlet 程序默认是第一次访问的时候创建, ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的 ServletConfig 对象。
3.2.ServletConfig 类的三大作用
-
可以获取 Servlet 程序的别名 servlet-name 的值。
-
获取初始化参数 init-param。
-
获取 ServletContext 对象。
web.xml中的配置:
<!-- servlet 标签给 Tomcat 配置 Servlet 程序 -->
<servlet>
<!--servlet-name 标签 Servlet 程序起一个别名(一般是类名) -->
<servlet-name>HelloServlet</servlet-name>
<!--servlet-class 是 Servlet 程序的全类名-->
<servlet-class>com.example.servlet_study.HelloServlet</servlet-class>
<!-- init-param是初始化参数 -->
<init-param>
<!--是参数名-->
<param-name>username</param-name>
<!--是参数值-->
<param-value>root</param-value>
</init-param>
<!-- init-param是初始化参数 -->
<init-param>
<!--是参数名-->
<param-name>url</param-name>
<!--是参数值-->
<param-value>jdbc:mysql://localhost:3306/test</param-value>
</init-param>
</servlet>
<!--servlet-mapping 标签给 servlet 程序配置访问地址-->
<servlet-mapping>
<!--servlet-name 标签的作用是告诉服务器,我当前配置的地址给哪个 Servlet 程序使用-->
<servlet-name>HelloServlet</servlet-name>
<!--url-pattern 标签配置访问地址 <br/>
/ 斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径 <br/>
/hello 表示地址为:http://ip:port/工程路径/hello <br/> -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
Servlet中的代码:
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2 init初始化方法");
// 1、可以获取 Servlet 程序的别名 servlet-name 的值
System.out.println("HelloServlet 程序的别名是:" + servletConfig.getServletName());
// 2、获取初始化参数 init-param
System.out.println("初始化参数 username 的值是;" + servletConfig.getInitParameter("username"));
System.out.println("初始化参数 url 的值是;" + servletConfig.getInitParameter("url"));
// 3、获取 ServletContext 对象
System.out.println(servletConfig.getServletContext());
}
在这里要注意如果继承的是GenericServlet类或者HttpServlet类,那么我们在重写init方法时一定要调用父类的init(ServletConfig)操作,即super.init(ServletConfig)。如果和如上代码一样实现的是Servlet接口,那么就不用执行上述操作。
4.ServletContext类
4.1.什么是 ServletContext?
-
ServletContext 是一个接口,它表示 Servlet 上下文对象。
-
一个 web 工程,只有一个 ServletContext 对象实例,代表当前web应用。
-
ServletContext 对象是一个域对象。
-
ServletContext 是在 web 工程部署启动的时候创建。在 web 工程停止的时候销毁。
什么是域对象?
域对象是指可以像Map一样存取数据的对象。这里的域指的是存取数据的操作范围(整个web工程)。
4.2.ServletContext 类的五个作用
-
获取 web.xml 中配置的上下文参数 context-param。
-
实现多个Servlet对象共享数据。
-
获取当前的工程路径,格式 : / 工程路径。
-
获取工程部署后在服务器硬盘上的绝对路径。
-
像 Map 一样存取数据。
这里不再一一阐述ServletContext的一些方法,如有需要可以自行去查看API。
总结
本篇首先介绍Servlet接口以及它的生命周期,并编写了一部分代码,接着对Servlet的结构进行了图解以及对Servlet的虚拟路径做了解释,最后讲解了ServletConfig接口和ServletContext接口的使用。