介绍
JavaEE提供了Servlet API,它封装好了Http请求和响应等一系列功能,并能使用其他Java API
Servlet 由 javax.servlet 和 javax.servlet.http 包创建
https://www.runoob.com/servlet/servlet-intro.html
https://www.liaoxuefeng.com/wiki/1252599548343744/1304265949708322
- 将Http请求和响应封装
Maven 引入
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
类似Tomcat这样的Web服务器也称为Servlet容器。
Servlet由Servlet容器管理
Servlet对象
Servlet配置
- 使用配置文件
- 缺点 导致web.xml文件臃肿
- 使用注解
- @WebServlet(_value=”/hello2”)_
- @WebServlet(“/hello2”)
- @WebServlet({“/hello3”, “/hello4”})
- @WebServlet(“/hello/*”)
- 一个Servlet可以有多个url,一个url不能有多个Servlet
Servlet创建时机
- 首次访问该 Servlet映射的url 默认
- 容器启动的时候创建
- 设置 loadOnStartup >= 0
- loadOnStartup 越小优先级越大
- loadOnStartup 默认为-1 即访问时创建
Servlet生命周期
- 加载Servlet类到虚拟机
- 创建对象(调用构造方法)
- 调用初始化方法init
- 调用Servlet方法处理请求
- doGet
- doPost
- 调用destroy方法销毁Servlet对象
尽量避免在Servlet中使用成员变量
每个用户访问的都是同一个Servlet类实例
可以使用成员常量
HttpServletRequest
- 获取客户端信息
- getMethod()
- 请求类型
- getRequestURL()
- URL
- getRequestURI()
- URI
- getQueryString()
- 查询字符串
- getRemoteAddr()
- 客户端IP地址
- getRemoteHost()
- 客户端主机名
- getRemotePort()
- 客户端端口
- getMethod()
- 获得用户请求数据
- getParameter(String name)
- 获得对应参数的值
- return String
- 多个值只能取到一个
- getParameterValues(String name)
- 获得对应参数的所有值
- return String[]
- getParameterNames()
- 获得所有参数名称
- return String[]
- getParameterMap()
- 获得所有元素索引
- return Map
- getParameter(String name)
- Post中文乱码问题
- getCharacterEncoding()
- 默认字符集为null,即使用系统字符集
- setCharacterEncoding(“UTF-8”);
- 需要手动设置字符集
- getCharacterEncoding()
- 其他方法
- getContextPath()
- 得到路径上下文
- getContextPath()
HttpServletResponse
- 向客户端输出响应内容
- getWriter()
- return PrintWriter
- 获得字符输出流
- getOutputStream()
- return ServletOutputStream
- 获得字节输出流
- 字节流和字符流是相互排斥的,不能同时使用
- 响应内容出现中文乱码问题
- 设置响应头(Response Headers)的字符集
- resp.setContentType(“text/html:charset=UTF-8”);
- getWriter()
Request转发和重定向
- 转发
- req.getRequestDispatcher(String name).forward(req,resp);
- 转发目标:html,servlet,jsp
- 请求的数据可以传递给下一个servlet
- url地址不会发生变化(浏览器没有新请求)
- /表示项目根目录(webapp)
- 默认表示相对路径
- 不能转发到外部URL
- 重定向
- resp.sendRedirect(“servlet2_redirect”);
- 客户端会发送一个新请求
- 可以重定向到外部URL
- /表示浏览器根目录(忽略上下文路径)
- 临时重定向
根目录区别
获得ServletContext
- 通过config
- init(_ServletConfig _config)
- config.getServletContext()
- init(_ServletConfig _config)
- 通过Request
- req.getServletContext();
- 通过config
- 获得web.xml信息
- getInitParameter(String name)
- 获得 web.xml 中对应 param-name 的值
- getInitParameter(String name)
- 设置全局属性
- setAttribute(String name,Object obj)
ServletConfig
可以为Servlet配置自己的属性
public class servlet4 extends HttpServlet {
private ServletConfig servletConfig;
@Override
public void init(ServletConfig config) throws ServletException {
servletConfig = config;
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().println(servletConfig.getInitParameter("k1"));
}
}
<servlet>
<servlet-name>servlet4</servlet-name>
<servlet-class>cn.landsall.servlet4</servlet-class>
<init-param>
<param-name>k1</param-name>
<param-value>k1-Value</param-value>
</init-param>
</servlet>
过滤器
@WebFilter属性
属性名 | 类型 | 描述 |
---|---|---|
filterName | String | 指定过滤器的 name 属性,等价于 |
value | String[] | 该属性等价于 urlPatterns 属性。但是两者不应该同时使用。 |
urlPatterns | String[] | 指定一组过滤器的 URL 匹配模式。等价于 |
servletNames | String[] | 指定过滤器将应用于哪些 Servlet。取值是 @WebServlet 中的 name 属性的取值,或者是 web.xml 中 |
dispatcherTypes | DispatcherType | 指定过滤器的转发模式。具体取值包括: ASYNC、ERROR、FORWARD、INCLUDE、REQUEST。 |
initParams | WebInitParam[] | 指定一组过滤器初始化参数,等价于 |
asyncSupported | boolean | 声明过滤器是否支持异步操作模式,等价于 |
description | String | 该过滤器的描述信息,等价于 |
displayName | String | 该过滤器的显示名,通常配合工具使用,等价于 |
//方法一
@WebFilter("/*")
public class AuthFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest _request = (HttpServletRequest) request;
HttpServletResponse _response = (HttpServletResponse) response;
//前置操作
request.setAttribute("r1","r1_Value");
//继续执行下一个过滤器或请求
chain.doFilter(request,response);
//后置操作
_response.getWriter().println("Hello World");
}
@Override
public void destroy() {
}
}
//方法二
//web.xml
//映射的顺序影响过滤器的顺序(从前往后)
<filter>
//过滤器名 名字不固定
<filter-name>AuthFilter</filter-name>
//过滤器的完整类名
<filter-class>com.imcode.common.filter.AuthFilter</filter-class>
</filter>
<filter-mapping>
//为过滤器添加映射
<filter-name>AuthFilter</filter-name>
<!-- 所有请求都经过AuthFilter -->
<url-pattern>/*</url-pattern>
<dispatcher>
[ASYNC,REQUEST,INCLUDE,FORWARD,ERROR]
</dispatcher>
<dispatcher>
[ASYNC,REQUEST,INCLUDE,FORWARD,ERROR]
</dispatcher>
</filter-mapping>
- 绝对路径匹配:以/开头 不包含通配符 * 是一个绝对访问路径。例如:/demo、/index.jsp
- 目录匹配:以/ 开头,以 结尾。例如:/、/servlet/、/servlet/xxx/
- 扩展名匹配:不能以/ 开头,也不能以结尾 只能以后缀名结尾 例如:.do、*.demo等
常用实例:
- 用户登录
- 网站浏览人数
- 同一编码
https://blog.csdn.net/u013087513/article/details/56835894
监听器
ServletContext监听器
- ServletContextListener 监听ServletContext对象
ServletContextAttributeListener 监听对ServletContext属性的操作
@WebListener()
public class Listener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
}
HttpSession监听器
HttpSessionListener 监听Session对象
- HttpSessionAttributeListener 监听Session中的属性操作
- HttpSessionActivationListener 监听HTTP会话的active和passivate情况
HttpSessionBindingListener监听器:感知Session绑定的事件监听器
@WebListener()
public class Listener implements HttpSessionListener{
@Override
public void sessionCreated(HttpSessionEvent se) {
//得到Session
HttpSession session = se.getSession();
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
}
}
ServletRequest监听器
ServletRequestListener 监听Request对象
- ServletRequestAttributeListener 监听Requset中的属性操作