0
点赞
收藏
分享

微信扫一扫

Servlet的基本原理和映射

小禹说财 2022-04-17 阅读 22
javaweb

3、Servlet


Servlet就是Sun公司推出的一款开发动态Web的一个开源技术。Servlet运行在服务器中,由服务器调用。他是运行在服务器中的Java程序,其作用是接收客户端的请求,并响应数据给客户端,是浏览器的请求和服务器上的数据库之间的中间层。

sun公司提供了一个Servlet接口,实现了这个接口的程序,就是Servlet。

Servlet、Filter过滤器、Listener监听器是JavaWeb的三大组件。

  • 客户端发送请求至服务器
  • 服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器
  • 服务器将响应返回客户端

​ Servlet项目命名规范:

1、包名规范:com.***.servlet
2、类名规范:****Servlet
3、web.xml文件中的servlet-name等配置和类名保持一致
<!-- pom依赖-->
<dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>javax.servlet-api</artifactId>
     <version>4.0.1</version>
</dependency>
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>javax.servlet.jsp-api</artifactId>
    <version>2.3.3</version>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

3.1 实现方法

3.1.1 Servlet接口

Javax.servlet.Servlet接口,内有service方法,Tomcat服务器会调用此方法

public class DemoServlet implements Servlet {
	//servlet的初始化方法
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
	//Tomcat会找到service方法进行操作,主要进行请求和响应
    @Override
    public void service(ServletRequest request,ServletResponse response) throws ServletException,IOException {
		//设置编码
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        //获取请求的数据
        
        //响应数据
        PrintWriter out = response.getWriter();		//获取输出的流
        out.print("");
    }

    @Override
    public String getServletInfo() {
        return null;
    }
	//销毁方法
    @Override
    public void destroy() {

    }
}

3.1.2 抽象类

GenericServlet抽象类实现了Servlet接口的4个方法,所以继承了GenericServlet后只需要重写service方法就可以了。其他操作和直接实现serlvet接口类似

package com.cy.demo.servlet

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public class Demo2Servlet extends GenericServlet {
    //其他四个方法抽象类GenericServlet已实现,只需要重写service即可
    @Override
    public void service(ServletRequest request,ServletResponse response) throws ServletException,IOException {

    }
}

3.1.3 HttpServlet

正常使用的时候最多的数通过继承 javax.servlet.http.HttpServlet来实现Servlet程序。这种方式重写了Servlet的五个方法,并且添加了doGet和doPost方法,内部没有抽象方法。HttpServlet内部分析了Http的传输协议,提供了更多的使用方法。

自动创建Servlet类:

在这里插入图片描述

在这里插入图片描述

继承关系:创建的类继承→HttpServlet继承→GenericServlet实现→Servlet接口

由Servlet的接口定义好访问的规范,GenericServlet实现Servlet接口,对其中的方法空实现,并对ServletConfig类做一些使用方法,HttpServlet继承了GenericServlet了,实现了service方法,并对请求进行分发处理增加了post和get方法。我们只需要跟需求重新doGet和doPost即可。

//继承HttpServlet类
public class Demo3Servlet extends HttpServlet {
    //重写doGet,doPost方法
   @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置编码
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf=8");
        //获得响应的流
         PrintWriter out = response.getWriter();
         out.print("Hello Servlet");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);  //調用doPost,可以不用區分post和get隨便使用兩個該方法
    }
}

在这里插入图片描述

3.2 映射路径

Java需要配置映射路径才能查找到相应的Servlet,在java中有两个配置可以获取到映射路径,分别是通过XML文件和注解的方式。

3.2.1 XML文件

Java需要在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-name必须一样才能找到,每一个servlet类就会生成一个 -->
   		<!-- servlet会根据配置找到相应的servlet类 -->
		<servlet>
				<servlet-name>和类名保持一致</servlet-name>	<!--3、根据相同的servlet-name找到这里-->
				<servlet-class>com.****.类名</servlet-class>	  <!--4、根据路径找到相应的类-->
		</servlet>
		<servlet-mapping>
				<servlet-name>和类名保持一致</servlet-name>	<!--2、根据url-pattern找到这里-->
				<url-pattern>/和类名一致</url-pattern>	<!--1、根据浏览器输入的路径,服务器找到这里-->
		</servlet-mapping>
   		 <!--映射路径,每个servlet可以指定多个映射路径,
			/*是一个通配符表示所有的路径都访问这个 
			*.yu:自定义后缀,*代表任意字符,前不能加其他东西
		-->
</web-app>

在这里插入图片描述

mapping映射优先级:指定的映射路径>默认的通配符

3.2.2 注解

通过在Servlet类上直接添加@WebServlet的注解一样可以找到相应的Servlet

通过请求路径查找urlPatterns,就能找到相应的name,从而找到和name符合的servlet类

@WebServlet(name = "Demo2Servlet",urlPatterns = "/Demo2Servlet")
public class Demo2Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf=8");
        //获得相应流
        PrintWriter out = response.getWriter();
        out.print("Hello Servlet2");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

3.3 原理

在这里插入图片描述

3.4 生命周期

当浏览器访问时,servlet的执行顺序如下,1和2会在浏览器第一次访问的时候执行,后续再访问不会执行,3每次页面访问都会执行一次,4关闭服务器时执行销毁对象。

​ 1、执行构造方法创建对象:服务器启动后的第一次访问时执行,后续不会执行

​ 2、执行init方法,进行初始化:服务器启动后的第一次访问时执行,后续不会执行

​ 3、执行service方法操作数据:每次访问都会执行

​ 4、调用destroy方法销毁对象:服务器关闭时执行

举报

相关推荐

0 条评论