什么是Servlet
- Servlet是JavaEE规范之一。规范就是接口
- Servet就是JavaWeb三大组件之一。三大组件分别是:Servlet程序、Filter过滤器、Listener监听器
- Servlet是运行在服务器上的一个Java程序,它可以接收客户端发送过来的请求,并响应数据给客户端。
手动实现Servlet程序
- 编写一个类去实现Servlet接口
- 实现servic 方法,处理请求,并响应数据
-
url地址到Servlet程序的访问
Servlet的生命周期
执行Servlet构造器方法
- 执行init初始化方法
- 执行service方法
- 执行destroy方法
说明
步骤1、2只在初始化后第一次访问的时候,创建Servlet程序会调用
步骤3,在每次访问都会调用
步骤4,只有在web 结束后才执行
GET和POST请求的分发处理
在service 获取 method 实现不同处理
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("3.service");
HttpServletRequest httpServlet = (HttpServletRequest) servletRequest;
String method = httpServlet.getMethod();
System.out.println(method);
}
通过继承HttpServlet实现Servlet
- 编写一个类去继承HttpServlet类
- 根据业务需要重写doGet 和 doPost方法
- 到web.xml 中配置Servlet程序访问地址 ```java package com.wujing.servletTest;
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;
/**
- @ClassName: HttpServletTest
- @Description: 测试httpServlet
- @Author liujiexin
@Date 2021/8/1 10:36 下午 */ public class HttpServletTest extends HttpServlet {
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HttpServletTest do get ");
}
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HttpServletTest do post ");
} }
```xml
<?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 标签给tomcat配置Servlet程序 -->
<servlet>
<!-- servlet-name 标签Servlet程序起一个别名(一般是类名) -->
<servlet-name>HelloServlet1</servlet-name>
<!-- servlet-class 是Servlet 程序的全类名 -->
<servlet-class>com.wujing.servletTest.HelloServlet1</servlet-class>
</servlet>
<!-- 配置访问地址 -->
<servlet-mapping>
<!-- servlet-name 对应地址访问的是哪个Servlet程序使用-->
<servlet-name>HelloServlet1</servlet-name>
<!-- url-pattern 访问的地址
/ 斜杠在服务器解析的时候,表示地址为: http://ip:port/工程路径
/hello 表示地址为: http://ip:port/工程路径/hello
-->
<url-pattern>/hello1</url-pattern>
</servlet-mapping>
<!-- servlet 标签给tomcat配置Servlet程序 -->
<servlet>
<!-- servlet-name 标签Servlet程序起一个别名(一般是类名) -->
<servlet-name>HttpServletTest</servlet-name>
<!-- servlet-class 是Servlet 程序的全类名 -->
<servlet-class>com.wujing.servletTest.HttpServletTest</servlet-class>
</servlet>
<!-- 配置访问地址 -->
<servlet-mapping>
<!-- servlet-name 对应地址访问的是哪个Servlet程序使用-->
<servlet-name>HttpServletTest</servlet-name>
<!-- url-pattern 访问的地址
/ 斜杠在服务器解析的时候,表示地址为: http://ip:port/工程路径
/hello 表示地址为: http://ip:port/工程路径/hello
-->
<url-pattern>/HttpServlet</url-pattern>
</servlet-mapping>
</web-app>
使用IDEA创建Servlet程序
Servlet类的继承体系
/**
* Receives standard HTTP requests from the public
* <code>service</code> method and dispatches
* them to the <code>do</code><i>Method</i> methods defined in
* this class. This method is an HTTP-specific version of the
* {@link javax.servlet.Servlet#service} method. There's no
* need to override this method.
*
* @param req the {@link HttpServletRequest} object that
* contains the request the client made of
* the servlet
*
* @param resp the {@link HttpServletResponse} object that
* contains the response the servlet returns
* to the client
*
* @exception IOException if an input or output error occurs
* while the servlet is handling the
* HTTP request
*
* @exception ServletException if the HTTP request
* cannot be handled
*
* @see javax.servlet.Servlet#service
*/
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String method = req.getMethod();
if (method.equals(METHOD_GET)) {
long lastModified = getLastModified(req);
if (lastModified == -1) {
// servlet doesn't support if-modified-since, no reason
// to go through further expensive logic
doGet(req, resp);
} else {
long ifModifiedSince;
try {
ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
} catch (IllegalArgumentException iae) {
// Invalid date header - proceed as if none was set
ifModifiedSince = -1;
}
if (ifModifiedSince < (lastModified / 1000 * 1000)) {
// If the servlet mod time is later, call doGet()
// Round down to the nearest second for a proper compare
// A ifModifiedSince of -1 will always be less
maybeSetLastModified(resp, lastModified);
doGet(req, resp);
} else {
resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
}
}
} else if (method.equals(METHOD_HEAD)) {
long lastModified = getLastModified(req);
maybeSetLastModified(resp, lastModified);
doHead(req, resp);
} else if (method.equals(METHOD_POST)) {
doPost(req, resp);
} else if (method.equals(METHOD_PUT)) {
doPut(req, resp);
} else if (method.equals(METHOD_DELETE)) {
doDelete(req, resp);
} else if (method.equals(METHOD_OPTIONS)) {
doOptions(req,resp);
} else if (method.equals(METHOD_TRACE)) {
doTrace(req,resp);
} else {
//
// Note that this means NO servlet supports whatever
// method was requested, anywhere on this server.
//
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[1];
errArgs[0] = method;
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
}
}
ServletConfig类
什么是ServletConfig
servlet 程序的配置类
Servlet程序 默认是第一次访问时候创建,ServletConfig是每个Servlet程序创建时,就创建一个对应的SerletConfig对象
ServletConfig的三大作用
- 可以获取Servlet程序的别名的servlet-name的值
- 获取初始化参数init-param
- 获取ServletContext对象
ServletContext 接口
什么是ServletContext
- ServletContext 是一个接口,它表示Servlet上下文对象
- 一个web工程,只有一个ServletContext 对象实例
- ServletContext 对象是一个域对象
- ServletContext 是在web工程部署启动的时候创建,在web工程停止的时候销毁(单例)
ServletContext 类的四个作用
- 获取web.xml 中配置的上下文参数context-param
- 获取当前的工程路径,格式:/工程路径
- 获取工程部署后在服务器硬盘上的绝对路径
- 像Map一样存储数据
HttpServletRequest
有什么作用
可以获取请求信息
常用方法
- getRequestURI()
- getRequestURL()
- getRemoteHost()
- getHeader()
- getParameter()
- getParameterValues()
- getMethod()
- setAttribute(key, value)
- getAttribute(key)
- getRequestDispatcher()
请求的转发
什么是转发
服务器资源,从一个资源跳到另一个资源的操作
base 标签
web中 /斜杠的不同意义
HttpServletRespose 类的作用
HttpServletRequest 表示请求过来的信息
HttpServletResponse 表示所有响应的信息
解决服务器中文乱码问题
请求重定向
重定向的方式一
resp.setStatus(302);
resp.setHeader(“Location”, “url”);
方式二
resp.sendRediret(url);
Cookie
什么是Cookie
- 是服务器通知客户端保存键值对的一种技术