您的位置:首页 > 汽车 > 时评 > Servlet

Servlet

2024/11/14 19:12:40 来源:https://blog.csdn.net/qq_64011014/article/details/139359240  浏览:    关键词:Servlet

一、Servlet概念

        1、Servlet是运行在 Java 服务器端的程序,用于接收和响应来自客户端基于 HTTP 协议的请求。

        2、Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。SUN公司提供

        3、核心方法:service(),任何客户端的请求都会经过该方法

二、Servlet快速入门

        1、创建一个web项目

        2、定义一个类实现Servlet接口

package com;import javax.servlet.*;
import java.io.IOException;
//tomcat下lib目录下的 servlet-api.jar引入项目中
/*** @author 86136*/
public class MyWeb01 implements Servlet {@Override//创建public void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("女孩");}@Overridepublic String getServletInfo() {return null;}@Override//销毁public void destroy() {}
}

        3、在web.xml中配置Servlet

<?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><!--com.MyWeb01类的别名 test01--><servlet-name>test01</servlet-name><!--com.MyWeb01 是类的全路径--><servlet-class>com.MyWeb01</servlet-class></servlet><servlet-mapping><!--MyWeb01类与请求的映射关系引用上面的别名--><servlet-name>test01</servlet-name><!--url-pattern是我们的路径请求--><url-pattern>/aa</url-pattern></servlet-mapping>
</web-app>

        4、点击运行

        5、通过浏览器测试

                在浏览器访问:http://localhost:8080/aa

三、Servlet执行原理

  1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径

  2. 查找web.xml文件,是否有对应的<url-pattern>标签体内容。

  3. 如果有,则在找到对应的<servlet-class>全类名

  4. tomcat会将字节码文件加载进内存,并且创建其对象

  5. 调用其service方法

        我们通过浏览器发送请求,请求首先到达Tomcat服务器,由服务器解析请求URL,然后在部署的应用列表中找到我们的应用。接下来,在我们的应用中找应用里的web.xml配置文件,在web.xml中找到Servlet的配置,找到后执行service方法,最后由Servlet响应客户浏览器。整个过程如下图所示:

        一句话总结执行过程:

        浏览器——>Tomcat服务器——>我们的应用——>应用中的web.xml——>Servlet类——>响应浏览器

四、Servlet体系结构

        在刚才的入门案例中,我们定义了自己的Servlet,实现的方式都是选择实现Servlet,在Servlet的API介绍中,它提出了我们除了实现Servlet还可以继承GenericServlet和继承HttpServlet,通过查阅servlet的类视图,我们看到Servlet下有一个抽象类GenericServlet,抽象类GenericServlet还有一个子类HttpServlet。同时,在service方法中还有参数ServletRequest和ServletResponse,

 

五、Servlet实现方式

   实现Servlet功能的三种方式:

     1、上面用过的:实现Servlet接口,接口中的方法必须全部实现

           使用此种方式,表示接口中的所有方法在需求方面都有重写的必要。此种方式支持最大程度的自定义

     2、继承GenericServlet,service方法必须重写,其他方可根据需求,选择性重写

            使用此种方式,表示只在接收和响应客户端请求这方面有重写的需求,而其他方法可根据实际需求选择性重写,使我们的开发Servlet变得简单。但是,此种方式是和HTTP协议无关的

package com;import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;/*** @author 86136*/
public class MyWeb02 extends GenericServlet {@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("我喜欢你");}
}

        web.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><servlet-name>test02</servlet-name><servlet-class>com.MyWeb02</servlet-class></servlet><servlet-mapping><servlet-name>test02</servlet-name><url-pattern>/bb</url-pattern></servlet-mapping>
</web-app>

      3、继承HttpServlet,它是javax.servlet.http包下的一个抽象类,是GenericServlet的子类。如果我们选择继承HttpServlet时,只需要重写doGet和doPost方法,不要覆盖service方法。

使用此种方式,表示我们的请求和响应需要和HTTP协议相关。也就是说,我们是通过HTTP协议来访问的。那么每次请求和响应都符合HTTP协议的规范。请求的方式就是HTTP协议所支持的方式(目前我们只知道GET和POST)

package com;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @author 86136*/
public class MyWeb03 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("我喜欢你苏沐橙");}
}

        web.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><servlet-name>test03</servlet-name><servlet-class>com.MyWeb03</servlet-class></servlet><servlet-mapping><servlet-name>test03</servlet-name><url-pattern>/cc</url-pattern></servlet-mapping>
</web-app>

六、 Servlet的生命周期

        1、Servlet的创建,存活及死亡

                1、创建:执行init方法,只执行一次

                2、存活:提供服务,执行service方法,执行多次

                3、销毁:执行destroy方法,只执行一次

        2 、Servlet什么时候被创建

                1、默认情况下,第一次被访问时,Servlet被创建

                2、可以手动配置执行Servlet的创建时机, 在web.xml的在<servlet>标签下配置

                      1、  <load-on-startup>的值为负数时, 第一次被访问时创建

                      2、<load-on-startup>的值为0或正整数时, 在服务器启动时创建

                

<?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><!--com.MyWeb01类的别名 test01--><servlet-name>test01</servlet-name><!--com.MyWeb01 是类的全路径--><servlet-class>com.MyWeb01</servlet-class><!--在服务器启动时创建--><load-on-startup>1</load-on-startup></servlet>
</web-app>

七、 Servlet的线程安全问题

        Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的

        1、多个用户同时访问时,可能存在线程安全问题

        2、解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对其修改值

八、Servlet3.0注释开发(重点)

        1、注解开发的优势

                简单便捷,不需要再操作繁琐的web.xml配置     

//基于注解配置Servlet
@WebServlet("/index")
public class MyWeb04 extends HttpServlet {}

        2、取代了web.xml中的配置

九、映射的相关配置

        1、Servlet的映射方式

                1、具体名称的方式。访问的资源路径必须和映射配置完全相同。==(常用)==

// 只有/test01请求能匹配   http://localhost:8080/test01 

@WebServlet("/test01")

                2、/ 开头 + 通配符的方式。只要符合目录结构即可,不用考虑结尾是什么

// *代表所有,任意
//只要请求符合这个目录结构/com/, 后面无论是什么都能匹配到这个

@WebServlet("/com/*")
// http://localhost:8080/com/haha   http://localhost:8080/com/jjj  http://localhost:8080/com
//极端一点, 匹配所有, 任何请求都能匹配到这个
@WebServlet("/*")

                3、通配符 + 固定格式结尾的方式。只要符合固定结尾格式即可,不用考虑前面的路径。

http://localhost:8080/mm.do
@WebServlet("*.do")

         2、Servlet的多路径映射

        我们可以给一个 Servlet 配置多个访问映射,从而可以让不同的请求路径来访问相同的Servlet

// @WebServlet里面可以写多个路径, 使用{}包裹,用逗号分隔
@WebServlet({"/vip","/vvip","/vvvip"}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com