1、什么是servlet
第一个servlet应用程序,实现servlet接口
定义:凡是实现了servlet api接口(或者继承servlet api接口的实现类)的类就是servlet应用程序;
命周期:
- 创建servlet应用程序的实例:只会执行一次,在首次通过url-pattern映射访问时,创建实例;
- 初始化init方法:只会执行一次,在创建完servlet应用程序的实例后,立刻调用,一般都是用户初始化servlet应用程序;
- 业务处理service方法:执行多次,每当访问请求映射到servlet应用程序时,都会调用service方法,进行请求处理;
- 销毁destroy方法:只会执行一次,在web应用程序卸载时,统一调用,多用户释放服务器资源;
2、创建Servlet的三种方式
2.1 实现 servlet接口
- public class HelloServlet implements Servlet {
- // 空参构造
- public HelloServlet() {
- System.out.println("---------HelloServlet 空参构造--------------");
- }
-
- @Override
- public void destroy() {
- System.out.println("---------HelloServlet destroy--------------");
- }
- @Override
- public ServletConfig getServletConfig() {
- System.out.println("---------HelloServlet getServletConfig--------------");
- return null;
- }
- @Override
- public String getServletInfo() {
- System.out.println("---------HelloServlet getServletInfo--------------");
- return null;
- }
- @Override
- public void init(ServletConfig config) throws ServletException {
- System.out.println("---------HelloServlet init--------------");
- }
- @Override
- public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
- System.out.println("---------HelloServlet service--------------");
- }
- }
复制代码 2.1.1 servlet的生命周期
- //第一次访问映射路径:
- ---------HelloServlet 空参构造---------
- ---------HelloServlet init-----------(//如果配置了load-on-startup 项目启动前面两步就会立刻执行)
-
- ---------HelloServlet service--------(//每次访问映射路径都会调用此方法)
- ---------HelloServlet destroy--------(//关闭服务才会调用)
复制代码 2.2 继承 GenericServlet
- public class HelloServlet2 extends GenericServlet{
- @Override
- public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
- }
- }
复制代码 2.3 继承 HttpServlet
- public class StudentInfoServlet extends HttpServlet{
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- }
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
- // 一般直接在get请求处理方法中,直接调用post方法,实现两种请求统一处理
- //doPost(request, response);
- }
- }
复制代码 3、Servlet 的注册配置
3.1 注册
-
- <servlet>
-
- <servlet-name>helloServlet</servlet-name>
-
- <servlet-class>com.kgc.servlet.HelloServlet</servlet-class>
- </servlet>
-
- <servlet-mapping>
- <servlet-name>helloServlet</servlet-name>
- <url-pattern>/hello</url-pattern>
- </servlet-mapping>
复制代码 3.2 模糊映射
- <servlet-mapping>
- <servlet-name>helloServlet</servlet-name>
-
-
-
-
-
- </servlet-mapping>
复制代码 3.3 初始化参数
3.3.1 单个servlet内部初始化参数
- <servlet>
- <servlet-name>helloServlet</servlet-name>
- <servlet-class>com.kgc.servlet.HelloServlet</servlet-class>
-
- <init-param>
- <param-name>key</param-name>
- <param-value>value</param-value>
- </init-param>
- </servlet>
复制代码 3.3.2 获取单个servlet内部初始化参数
- @Override
- public void init(ServletConfig config) throws ServletException {
- System.out.println("---------HelloServlet init--------------");
- //获取当前servelt初始化参数
- //通过 config 对象获取
- String encoding = config.getInitParameter("encoding");
- System.out.println("******* servlet内部初始化参数 encoding = "+encoding+"******");
- }
复制代码 3.3.3 全局servlet初始化参数
- <context-param>
- <param-name> key </param-name>
- <param-value> value </param-value>
- </context-param>
复制代码 3.3.4 获取全局servlet初始化参数
- //获取全局servelt初始化参数
- //通过ServletContext 对象获取
- String encodingContext = config.getServletContext().getInitParameter("encoding");
- System.out.println("**** servlet全局初始化参数 encodingContext = "+encodingContext+"*****");
复制代码 3.3.5 servlet 的启动优先级
默认情况下,启动是不会创建实例和初始化;
配置了load-on-startup,servlet应用程序就会在服务器启动时,创建实例并初始化 ;
允许值为正整数(可以为0)负数不可以,一般为1,值的作用是指定servlet应用程序的创建时机,值越小优先级,越高,越早创建实例并初始化;- <load-on-startup>1</load-on-startup>
复制代码 3.3.6 欢迎页面
- <welcome-file-list>
- <welcome-file>login.html</welcome-file>
- </welcome-file-list>
复制代码 3.3.7错误页面
- <error-page>
- <error-code>404</error-code>
- <location>/404.jsp</location>
- </error-page>
复制代码 4、相对路径和绝对路径
通过servlet的跳转使用相对路径,容易出错,会导致缺少部分路径,而找不到资源;
一般使用绝对路径,进行跳转;- //获取项目跟路径
- <%=request.getContextPath()%> //获取跟路径后再根据实际情况进行路径拼接
复制代码 5、filter
5.1 创建过滤器
实现Filter的应用就是过滤器;- public class MyFirstFilter implements Filter{
- public MyFirstFilter() {
- System.out.println("-----MyFirstFilter 空参构造 ------");
- }
- @Override
- public void destroy() {
- System.out.println("-----MyFirstFilter destroy ------");
- }
- @Override
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {
- System.out.println("-----MyFirstFilter doFilter ------");
- //FilterChain 是决定请i去是否放行的操作对象,如果请求放行,必须要调用FilterChain的请求过滤方法doFilter
- chain.doFilter(request, response);
- }
- @Override
- public void init(FilterConfig filterConfig) throws ServletException {
- System.out.println("-----MyFirstFilter init ------");
- }
- }
复制代码 5.2 filter 注册与映射
- <filter>
- <filter-name>myFirstFilter</filter-name>
- <filter-class>com.kgc.filter.MyFirstFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>myFirstFilter</filter-name>
- <url-pattern>/filter01.jsp</url-pattern>
-
- </filter-mapping>
复制代码 5.3 filter 的初始化参数
- <init-param>
- <param-name>encoding</param-name>
- <param-value>utf-8</param-value>
- </init-param>
复制代码 获取参数:- //一些配置的初始化参数可以通过 filterConfig.getInitParameter(key) 获取
- @Override
- public void init(FilterConfig filterConfig) throws ServletException {
- this.encoding = filterConfig.getInitParameter("encoding");
- System.out.println("获取字符集过滤器中的初始化编码:"+this.encoding);
- }
复制代码 5.4 filter 的执行顺序
web.xml中映射顺序,越上面的越先执行;
MySecondFilter- public class MySecondFilter implements Filter {
- @Override
- public void destroy() {
- }
- @Override
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {
- System.out.println("-----1.MySecondFilter doFilter before ------");
- chain.doFilter(request, response);
- System.out.println("-----2.MySecondFilter doFilter after ------");
- }
- @Override
- public void init(FilterConfig filterConfig) throws ServletException {
- }
- }
复制代码 MyThridFilter- public class MyThridFilter implements Filter {
- @Override
- public void destroy() {
- }
- @Override
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {
- System.out.println("-----3.MyThridFilter doFilter before ------");
- chain.doFilter(request, response);
- System.out.println("-----4.MyThridFilter doFilter after ------");
- }
- @Override
- public void init(FilterConfig filterConfig) throws ServletException {
- }
- }
复制代码 filterTarget.jsp- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>Insert title here</title>
- </head>
- <body>
- <%
- System.out.println("-----5.Filter Target Page-----");
- %>
- <h2>Filter Target Page</h2>
- </body>
- </html>
复制代码 web.xml- <filter>
- <filter-name>mySecondFilter</filter-name>
- <filter-class>com.kgc.filter.MySecondFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>mySecondFilter</filter-name>
- <url-pattern>/web3filter01/filterTarget.jsp</url-pattern>
- </filter-mapping>
- <filter>
- <filter-name>myThridFilter</filter-name>
- <filter-class>com.kgc.filter.MyThridFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>myThridFilter</filter-name>
- <url-pattern>/web3filter01/filterTarget.jsp</url-pattern>
- </filter-mapping>
复制代码 运行结果顺序:- //执行顺序
- -----1.MySecondFilter doFilter before ----
- -----3.MyThridFilter doFilter before ------
- -----5.Filter Target Page-----
- -----4.MyThridFilter doFilter after -------
- -----2.MySecondFilter doFilter after ------
复制代码 5.5 编码过滤器
- @Override
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
- throws IOException, ServletException {
- //this.encoding 编码名可以存放在过滤器初始化参数中,通过filterConfig.getInitParameter("encoding");获取
- //poet请求乱码处理
- request.setCharacterEncoding(this.encoding);
- //响应编码
- response.setContentType("text/html; charset=UTF-8");
- response.setCharacterEncoding(this.encoding);
- //请求放行
- chain.doFilter(request, response);
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |