Servlet详细教程

1. Servlet 快速入门

1.0Servlet介绍

servlet就是一个java应用程序,实现了servletAPI规范的java应用程序就是一个servlet,主要是用来处理来自web浏览器或者其他HTTP客户端的请求,常常跟我们的业务程序或者我们的数据对接,相当于一个中间层的作用,动态地生成内容给服务器;要部署和运行servlet,需要使用web容器(servlet容器),web容器本质上就是与servlet交互的web服务器组件,web容器负责管理servlet的生命周期,将URL映射到特定的servlet(具体在web.xml中配置)并确保URL请求者具有正确的权限。

1.1创建项目导入依赖

Servlet快速入门只需要四部就可以轻松入门,下面是步骤的一些说明,具体代码详见下面四步

①创建web项目,导入Servlet依赖坐标;

②定义一个类实现Servlet接口,并重写接口中所有方法,并在service方法中输入一句话

③在类上使用@WebServlet注解,配置Servlet访问路径

④启动tomcat,浏览器出入URL访问Servlet

image-20220826121244056

在maven项目pom.xml文件中导入javax.servlet-api坐标依赖

  <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>

1.2定义类实现Servlet接口

创建ServletDemo1类并实现Servlet接口

public class ServletDemo1 implements Servlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("helloWord1");
    }
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

1.3配置:在类上使用注解

image-20220826121013978

1.4启动tomcat访问程序

在浏览器输入以下网址,在控制台输出helloWorld即入门成功

http://localhost:8080/servlet_demo_war_exploded/demo1

控制台输出信息:

image-20220826121153662


注意:

​ 不会创建maven项目可以详见tomcat从入门到入坑这篇文章,手把手教你如何创建maven项目,

链接:https://blog.csdn.net/qq_52699757/article/details/126532387?spm=1001.2014.3001.5501

2. Servlet 执行流程

image-20220826125115135

3. Servlet 生命周期

3.1生命周期概念

对象的生命周期指一个对象从被创建到销毁的过程。

3.2生命周期具体流程

​ Servlet运行在Servlet容器(web服务器)中,其生命周期由容器来管理,分为四个阶段

1.加载和实例化

​ 默认情况下,当servlet第一次被访问时,由容器创建Servlet对象,当然也可以自己修改默认配置,如果想让服务器在启动时就创建Servlet对象,只需要在注解里面加入loadOnStartup=0或正整数即可,数字越小优先级越高,即**@WebServlet(urlPatterns=“/demo”,loadOnStartup=1)**

2.初始化

​ 在Servlet实例化后,容器将调用Servlet的init()方法初始化这个对象,完成一些如加载配置文件,创建连接等初始化的工作,该方法只调用一次。

3.请求处理

​ 每次请求Servlet时,Servlet容器都会调用Servlet的service方法对请求进行处理

4.服务终止

​ 当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法完成资源的释放,在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后就会被Java的垃圾收集器所回收

3.3代码演示

**
 * 测试Servlet生命周期
 */
@WebServlet("/demo2")
public class ServletDemo2 implements Servlet {

    /**
     * 初始化方法
     * 1.调用时机:默认情况下,Servlet被第一次访问。
     * 2.调用次数:1次
     * @param servletConfig
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init.....");
    }
    /**
     * 提供服务
     * 1.调用时机:每一次Servlet被访问的时候
     * 2.调用次数:多次
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("helloWord1");
    }
    /**
     * 销毁
     * 1.调用时机:内存释放或者服务器关闭的时候,Servlet对象会被销毁
     * 2.调用次数:1次
     */
    @Override
    public void destroy() {

    }
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    @Override
    public String getServletInfo() {
        return null;
    }
}

4. Servlet 体系结构

image-20220826131017248

由于直接继承Servlet需要实现里面的所有方法,每次写代码都需要判断服务器是get请求还是post请求,使得程序繁琐,所以我们在写程序的时候不再实现Servlet方法,直接继承HttpServlet类,来重写里面的doGet方法和doPost方法

代码如下:

image-20220826182411685


/**
 * 测试HttpServlet生命周期
 */
@WebServlet("/demo3")
public class ServletDemo3 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet.........");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

5. Servlet urlPattern配置

Servlet要想被访问,必须配置其访问路径(urlPattern)

5.1配置多个访问路径

@WebServlet(urlPattern={“/demo1”,“/demo2”})


5.2配置规则

image-20220826154126553

注意: /和/*区别:

​ 当我们的项目中Servlet配置了"/",会覆盖tomcat中的默认DefaultServlet,当其他的url-pattern都匹配不上时都会走这个Servlet,静态网页就不会显示

​ 当我们的项目中配置了"/*",意味着匹配任意访问路径

5.3代码演示

5.3.1配置多个访问路径

/**
 *  Servlet urlPattern配置
 *  1.配置多个访问路径
 *  在浏览器访问
 *      http://localhost:8080/servlet_demo_war_exploded/demo4 或
 *      http://localhost:8080/servlet_demo_war_exploded/demo5 都能访问成功
 *  2.配置规则(在后面讲)
 *      ①精准匹配
 *      ②目录匹配
 *      ③扩展名匹配
 *      ④任意匹配
 */
//
@WebServlet(urlPatterns = {"/demo4","/demo5"})
public class ServletDemo4 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("demo4AndDemo5");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

5.3.2配置规则

①精准匹配

/**
 *  2.配置规则
 *      ①精准匹配
 *          配置路径:@WebServlet("/user/select")
 *          访问路径:http://localhost:8080/servlet_demo_war_exploded/user/select
 *      ②目录匹配
 *      ③扩展名匹配
 *      ④任意匹配
 */

@WebServlet("/user/select")
public class ServletDemo5 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("精准匹配.......");
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

②目录匹配

/**
 *  2.配置规则
 *      ①精准匹配
 *          配置路径:@WebServlet("/user/select")
 *          访问路径:http://localhost:8080/servlet_demo_war_exploded/user/select
 *      ②目录匹配
 *          配置路径:@WebServlet("/user/*")
 *  *       访问路径:http://localhost:8080/servlet_demo_war_exploded/user/aaa
 *                 http://localhost:8080/servlet_demo_war_exploded/user/bbb
 *                 *表示可以是任意字符
 *          思考:当精准匹配和目录匹配路径一样的时候,例如:当我们输入http://localhost:8080/servlet_demo_war_exploded/user/select这个网址的时候他会匹配哪一个Servlet
 *          答案:会匹配精准匹配的Servlet,因为精准匹配的优先级高
 *      ③扩展名匹配
 *          配置路径:@WebServlet("*.do")
 *          访问路径:http://localhost:8080/servlet_demo_war_exploded/aaa.do
 *                 http://localhost:8080/servlet_demo_war_exploded/bbb.do
 *          注意:*前面不可以有/,否则会报错
 *      ④任意匹配
 */

@WebServlet("*.do")
public class ServletDemo7 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("扩展名匹配........");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

④任意匹配

/**
 *  2.配置规则
 *      ①精准匹配
 *          配置路径:@WebServlet("/user/select")
 *          访问路径:http://localhost:8080/servlet_demo_war_exploded/user/select
 *      ②目录匹配
 *          配置路径:@WebServlet("/user/*")
 *  *       访问路径:http://localhost:8080/servlet_demo_war_exploded/user/aaa
 *                 http://localhost:8080/servlet_demo_war_exploded/user/bbb
 *                 *表示可以是任意字符
 *          思考:当精准匹配和目录匹配路径一样的时候,例如:当我们输入http://localhost:8080/servlet_demo_war_exploded/user/select这个网址的时候他会匹配哪一个Servlet
 *          答案:会匹配精准匹配的Servlet,因为精准匹配的优先级高
 *      ③扩展名匹配
 *          配置路径:@WebServlet("*.do")
 *          访问路径:http://localhost:8080/servlet_demo_war_exploded/aaa.do
 *                 http://localhost:8080/servlet_demo_war_exploded/bbb.do
 *          注意:*前面不可以有/,否则会报错
 *      ④任意匹配
 *          配置路径: @WebServlet("/")
 *                  @WebServlet("/*")
 *          访问路径:http://localhost:8080/servlet_demo_war_exploded/hehe
 *                  http://localhost:8080/servlet_demo_war_exploded/haha
 *          注意:在写程序的时候尽量不要使用任意匹配路径,”/*“优先级大于”/“
 */

@WebServlet("/")
public class ServletDemo8 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("任意匹配........");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

6. Xml 配置方式编写Servlet

Servlet从3.0版本后开始支持使用注解配置,3.0版本只支持XML配置文件的配置防护,具体实现步骤也不复杂,首先是编写Servlet类,然后在web.xml中配置该Servlet就可完成Servlet的XML配置,具体演示见下方代码

6.1编写Servlet类


/**
 * 基于web.xml配置该Servlet
 */

public class ServletDemo9 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("demo9.......");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

6.2在web.xml配置该Servlet

web.xml配置文件

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>demo9</servlet-name>
    <servlet-class>com.tz.servlet.ServletDemo9</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>demo9</servlet-name>
    <url-pattern>/demo9</url-pattern>
  </servlet-mapping>
</web-app>

7.总结

在编写程序的时候直接实现HttpServlet类,然后重写doGet和doPost方法,然后在类上使用注解@WebServlet(urlPatterns="/",loadOnStartup=-1)

模板如下:

@WebServlet(urlPatterns="/demo",loadOnStartup=-1)
public class ServletDemo3 extends HttpServlet {
	//重写doGet方法
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //写实现方法
    }
	//重写doPost方法
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//写实现方法
    }
}

注意:源代码已经上传到码云上,需要的自行下载

地址: https://gitee.com/tzmoxi/project-collection.git

image-20220826193226511

  • 10
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]和\[2\]提供了两种不同的web.xml配置文件示例,用于实现Java Servlet。在编写程序时,可以直接实现HttpServlet类,并重写doGet和doPost方法。然后在类上使用注解@WebServlet(urlPatterns="/",loadOnStartup=-1)。\[1\] 另外,还可以通过实现javax.servlet.Servlet接口、javax.servlet.GenericServlet类或继承javax.servlet.http.HttpServlet类来实现Servlet。\[3\] 因此,实现Java Servlet的步骤可以总结如下: 1. 创建一个类,直接实现HttpServlet类或者实现Servlet接口、GenericServlet类、HttpServlet类。 2. 在类中重写doGet和doPost方法,根据需要处理GET和POST请求。 3. 使用@WebServlet注解或在web.xml配置文件中配置servlet的名称、类名和URL映射关系。 4. 部署和启动Web应用程序,确保Servlet容器能够加载和调用Servlet。 请注意,具体的实现步骤可能会根据不同的开发框架或工具有所不同。以上步骤是一般的实现Java Servlet的基本流程。 #### 引用[.reference_title] - *1* [Servlet详细教程](https://blog.csdn.net/qq_52699757/article/details/126549347)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [JavaWeb之【Servlet开发步骤】](https://blog.csdn.net/weixin_48485216/article/details/124361115)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Java Servlet](https://blog.csdn.net/ww981580010/article/details/123171761)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值