Servlet技术
Servlet
概念
- Servlet是Java提供的一门动态Web资源开发技术;所谓动态就是指不同用户看到的内容会不同
- Servlet是JavaEE13个规范之一;规范就是接口
- Servlet是JavaWeb三大组件之一:Servlet\Filter\Listener
- 是运行在服务器的小程序,用于接收和响应客户端请求
将来定义一个类,实现Servlet接口,复写方法即可。
2.第一个Servlet程序
步骤:
1.定义一个类,实现Servlet接口
2.实现Service方法,处理请求,响应数据
3.到web.xml中配置Servlet程序的访问地址
step1. 实现类继承Servlet接口
package com.yatolove;
import javax.servlet.*;
import java.io.IOException;
public class ServerletDemo01 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 {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
service方法用于处理请求和响应;
step2.在web.xml中的根标签内部Servlet访问路径
<servlet>
<servlet-name>demo01</servlet-name>
<servlet-class>com.example._01_servlet.ServletDemo01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo01</servlet-name>
<url-pattern>/demo01</url-pattern>
</servlet-mapping>
</servlet>
给Tomcat配置Servlet程序<servlet-name>
Servlet程序别名<servlet-class>
Servlet全类名<servlet-mapping>
配置Servlet程序访问地址<servlet-name>
告诉Tomcat当前配置的地址是哪个Servlet程序使用<url-pattern>
必须以/
开头,配置此Servlet的访问地址
/ 斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径
/demo01 表示Servlet地址为:http://ip:port/工程路径/demo01
配置常见错误
<url-pattern>
配置Servlet访问路径必须以/
开头<servlet-name>
两个必须保持一致
step3. 启动Tomcat,并通过浏览器访问
http://localhost:8080/Servlet/demo01
demo01就是配置中的url-pattern
3.Servlet-url如何定位Servlet
浏览器通过: ip:port/项目虚拟路径/Servlet资源名称
找到此Servlet
先找到web项目,然后找web.xml,然后找Servlet的url-pattern,然后根据映射关系找到Servlet类
4.Servlet生命周期
生命周期指的是Servlet的几个方法;
Servlet生命周期分为四个阶段:
- Servlet的构造方法
- 初始化阶段 调用init()方法
- 响应客户请求阶段 调用service()方法
- 终止阶段 调用destroy()方法
- init()
init()方法在Servlet类被加载的时候执行,且仅执行一次
Servlet类加载时机根据web.xml中的配置决定:
load-on-startup<0
第一次请求此Servlet的时候加载Servlet类;
load-on-startup>=0
启动Tomcat容器的时候加载Servlet类
<servlet>
<servlet-name>demo01</servlet-name>
<servlet-class>com.example._01_servlet.ServletDemo01</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>demo01</servlet-name>
<url-pattern>/demo01</url-pattern>
</servlet-mapping>
1.Serverlet的int只执行一次,说明只有一个Servlet对象,Servlet对象是单例的;
2.多个用户同时访问同一个Servlet的时候,可能存在线程安全问题
尽量不要在Servlet中定义成员变量,定义了成员变量,也不要对其进行set操作。
-
service() 每接收一次请求,调用一次
-
destroy()在Servlet销毁的时候执行,且仅执行一次
服务器正常关闭的时候才会销毁Servlet
5.Servlet请求的分发处理
- 老土方法:通过ServletRequest对象获取其请求类型,分别处理不同请求的场景
- 进阶1:在Servlet实现类中自定义doGet()和doPost()两个方法
在老土方法的基础上,通过ServletRequest获取请求类型,分别调用doGet()和doPost();
这也是HttpServlet的原理
6.通过继承HttpServlet实现Servlet程序
- 实际开发中,都是使用继承HttpServlet类的方式实现Servlet
- 使用步骤:
1.根据业务需求,重写HttpServlet类中的doGet()和doPost()
2.配置Servlet的访问路径
package servlet;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/demo08")
public class ServletDemo08 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Servlet08被访问了");
req.setAttribute("username","yatolove");
RequestDispatcher rd =req.getRequestDispatcher("/Demo09");
rd.forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
}
IDEA中直接生成Servlet程序
7.Servlet类的继承体系
Servlet接口
|
GenericServlet抽象类
|
HttpServlet 抽象类
1.GenericServlet对Serverlet接口的其他方法做了空实现,也就是说如果我们自定义类继承这个类,只需要复写Service;
public class ServletDemo02 extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
}
2.HttpServlet抽象类
对http协议封装了,只需要复写doGet/doPost方法即可
8. Servlet 注解配置
注解配置,就不用在web.xml中配置了,在创建web项目的时候可以不创建web.xml
Servlet必须在3.0及以上版本才可以。
配置方式:
1. @WebServlet(urlPattern="/demo01")
2. @WebServlet(value="/demo01")
注解类型中,如果只有一个属性的话,可以省去value
3. @WebServlet("/demo01")
9. Servlet url配置
1.@WebServlet可以指定多个访问路径
@WebServlet{"/d4","/dd4","/ddd4"}
2.路径定义规则:
1./xxx
2./xxx/xx 多层路径
3.*.do
ServletConfig类
此类是Servlet程序的配置信息类
1.ServletConfig类的三大作用
(1)获取Servlet别名
(2)获取Servlet的初始化参数
Servlet初始化参数在xml文件中配置:
(3)获取ServletContext对象
2.Servlet-ServletConfig补充说明
- Servlet程序和ServletConfig对象都是由Tomcat负责创建的,我们只负责使用
- Servlet程序默认情况下是第一次访问的时候就创建,ServletConfig是每个Servlet程序创建的时候,就创建一个对应的ServletConfig对象。
3.在HttpServlet的子类直接使用ServletConfig对象
注意:如果重写了init()方法,必须要调用super.init(config),才能直接使用getServletConfig()方法,否则空指针异常;因为在GenerisServlet中的init()方法才给ServletConfig属性赋值;如下所示:
ServletContext类
a)什么是ServletContext
获取方式:
1.getServletConfig().getServletContext()
2.直接调用从GenericServlet类继承过来的.getServletContext()
b) ServletContext类的四个作用
1.获取web.xml中配置的上下文参数
2.获取当前工程路径
3.获取工程部署后在服务器硬盘上的绝对路径
(1)
- getRealPath(“/”) 获取当前web工程的web目录
(2)
在启动Tomcat的时候,下面这个内容是IDEA整合Tocmat后,Tomcat被拷贝的一些副本内容;在这个目录下面的config中可以找到对当前web工程的路径映射,就是磁盘上web的目录
4.像map一样存取数据
- ServletContext对象的声明周期就是对应的Web项目部署到Tomcat之后创建,下线后销毁;其数据域作用域整个Web项目所有Servlet,相当于一个公共区域;
- 方法
setAttribute(String name,Object value)
getAttribute(String name)
removeAttribute(String name)
ServletContext对象范围:所有用户所有请求的数据
生命周期:服务器启动到服务器关闭
因此此对象中尽量不要存太多数据,占内存!