Servlet(一)
Servlet(一)
Servlet概述
-
Servlet是JavaEE规范之一(规范就是接口)
-
Servlet是JavaWeb三大组件之一
三大组件:
- Servlet程序
- Filter过滤器
- Listener监听器。
-
Servlet是运行在服务器上的一个小型java程序,它可以接收客户端发送过来的请求,并响应数据给客户端
Servlet技术
手动实现Servlet程序
- 编写一个类实现Servlet接口
- 实现service方法,处理请求并响应数据
- service()专门用来处理请求和响应
- 在web.xml中配置servlet程序的访问地址
- servlet标签给服务器Tomcat配置Servlet程序
- servlet-name标签给servlet程序取一个别名(一般是类名)
- servlet-class标签是servlet程序的全类名
- servlet-mapping标签给servlet程序配置访问地址
- servlet-name标签的作用是告诉服务器,当前配置的地址给哪个servlet程序使用
- url-pattern标签配置访问地址
-
/ 斜杠在服务器解析的时候表示地址为http://ip:port/工程路径
eg:/hello 表示 http://ip:port/工程路径/hello
-
- servlet标签给服务器Tomcat配置Servlet程序
Servlet生命周期
- 执行Servlet构造器方法
- 执行init初始化方法
- 执行service方法
- 执行destroy销毁方法
注意
- 第一二步是在第一次访问的时候创建Servlet程序会被调用
- 第三步service方法每次访问都会调用
- 在Web工程停止的时候调用
请求的分发处理
服务器获得请求的方式的方法:
- 类型转换,将ServletRequest类型转换为其子类HttpServletRequest类型
- 使用service方法中servletRequest变量
- 因为servletRequest变量是ServletRequest类型,此类型的子类中有getMethod()方法所以需要类型转换
- 获取请求方式:调用getMethod()方法
代码实现
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("3. service = HelloServlet被访问了");
//类型转换(因为它有getMethod()方法)
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
//获取请求的方式
String method = httpServletRequest.getMethod();
// System.out.println(method);
if("GET".equals(method)){
doGet();
}else if("POST".equals(method)){
doPost();
}
}
//做get请求的操作
public void doGet(){
System.out.println("get请求");
}
//做post请求的操作
public void doPost(){
System.out.println("post请求");
}
通过继承HttpServlet类实现Servlet程序
过程
- 编写一个类去继承HttpServlet类
- 根据需要重写doGet或doPost方法
- 在web.xml中配置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("HttpServlet中的doGet方法");
}
/**
* doPost()在post请求的时候调用
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HttpServlet中的doPost方法");
}
}
IDEA生成Servlet程序
Servlet类的继承体系
ServletConfig类
Servlet程序的配置信息类
Servlet程序和ServletConfig对象都是由Tomcat负责创建,我们负责使用
Servlet程序默认是第一次访问的时候创建,ServletConfig是每一个Servlet程序创建时就创建一个对应的ServletConfig对象
作用
- 可以获取Servlet程序的别名(servlet-name的值)
- servletConfig.getServletName()
- 获取初始化参数init-param
-
在servlet标签中的servlet-class标签后添加init-para标签
- init-para是初始化参数
- param-name参数名
- param-name参数值
-
在init()方法中使用
servletConfig.getInitParameter()
-
- 获取ServletContext对象
代码实现
配置文件
<servlet>
<servlet-name>ServletConfigHello</servlet-name>
<servlet-class>ServletConfig.HelloServlet</servlet-class>
<!-- init-para是初始化参数-->
<init-param>
<!--param-name参数名-->
<param-name>username</param-name>
<!--param-name参数值-->
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>url</param-name>
<param-value>https://www.baidu.com/</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ServletConfigHello</servlet-name>
<url-pattern>/ServletConfigHello</url-pattern>
</servlet-mapping>
代码
@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());
}
运行结果
注意
-
每一个Servlet程序中有属于自己的ServletConfig对象
-
getServletConfig()不仅可以使用在init()方法中
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletConfig servletConfig = getServletConfig(); System.out.println(servletConfig.getServletName()); }
-
如果重写了init()方法,一定要在里面调用super.init();
@Override public void init() throws ServletException { super.init(); System.out.println("重写了init初始化方法"); }
ServletContext
- Servlet是一个接口,表示servlet上下文对象
- 一个Web工程,只有一个ServletContext对象实例
- ServletContext对象是一个域对象
- 域对象:是可以将Map存储数据的对象,叫做域对象
- 这里的域指的是存储数据的操作范围
作用
- 获取web.xml中配置的上下文参数context-param
-
context-param是上下文参数(属于整个web工程)可以配置多组
<context-param> <param-name>username</param-name> <param-value>context</param-value> </context-param> <context-param> <param-name>password</param-name> <param-value>root</param-value> </context-param>
-
通过ServletConfig获取ServletContext对象
ServletContext servletContext = getServletConfig().getServletContext();
-
也可以直接调用getServletContext()方法
ServletContext servletContext = getServletContext();
-
调用getInitParameter()方法
-
- 获取当前的工程路径,格式:/工程路径
- 调用getContextPath()方法
servletContext.getRealPath("/");
- 调用getContextPath()方法
- 获取工程部署后在服务器硬盘上的绝对路径
- 像Map一样存储数据
代码实现(前三个作用)
/**
* ServletContext前三个作用的示例
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. 获取web.xml中配置的上下文参数context-param
ServletContext servletContext = getServletConfig().getServletContext();
String username = servletContext.getInitParameter("username");
System.out.println("context-param参数username的值:" + username);
System.out.println("context-param参数password的值:" + servletContext.getInitParameter("password"));
// 2. 获取当前的工程路径,格式:/工程路径
System.out.println("当前工程路径:" + servletContext.getContextPath());
// 3. 获取工程部署后在服务器硬盘上的绝对路径
/**
* / 斜杠被服务器解析地址为http://ip:port/工程名
* 映射到idea代码的web目录
*/
System.out.println("在服务器硬盘上的绝对路径:" + servletContext.getRealPath("/"));
}
运行结果(前三个作用)
像Map一样存储数据(第四个作用)
ServletContext是在web工程部署启动的时候创建的,在web工程停止的时候销毁
如果在最开始的时候(未存入数据时)调用
servletContext.getAttribute("key1")
返回为null;只要存入数据后,在此web工程下任意位置调用此方法都会显示存入的值。(ServletContext是在web工程部署启动的时候创建的,在web工程停止的时候销毁)
代码实现
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext servletContext = getServletContext();
System.out.println("获取域数据key1的值:" + servletContext.getAttribute("key1"));
servletContext.setAttribute("key1","value1");
System.out.println("获取域数据key1的值:" + servletContext.getAttribute("key1"));
}