当前位置: 首页 > news >正文

【Servlet】Servlet API

目录

1.什么是Servlet

2.Servlet怎么和相应的请求进行绑定

3.Servlet的常用方法

4. Servlet的生命周期

5. Servlet的继承结构

6. 组件之间跳转的方式

7. 保存作用域

8. 在保存作用域中获取参数时的注意点


1.什么是Servlet

        Servlet是用来处理客户端向服务器端发送请求时根据请求内容来做出相对应行为的组件。

2.Servlet怎么和相应的请求进行绑定

        Servlet和请求进行绑定的方式有两种

①通过在web.xml文件中进行配置。在web.xml文件中加入如下代码即可将Servlet和请求进行绑定。

<servlet>

        <servlet-name>标识名</servlet-name>

        <servlet-class>Servlet子类的全类名</servlet-class>

</servlet>

<servlet-mapping>

        <servlet-name>标识名</servlet-mapping>

        <url-pattern>访问地址</url-pattern>

</servlet-mapping>

        通过这种方式来将Servlet和请求绑定时,当浏览器向服务器发送相应请求时,Tomcat容器会到<servlet-mapping>标签中寻找访问地址和请求地址相同的servlet-mapping并获取其标识名,之后再到<servlet>标签中寻找和该标识名对应的Servlet的子类的全类名,之后进行绑定。

②在Tomcat3.0之后,支持使用注解配置的方式。

        在需要绑定的组件上方使用@WebServlet(“请求地址”)的方式可以代替方式①,实现同样的效果。

3.Servlet的常用方法

init():初始化方法

init(Servletconfig config){this.config=config;init();}:带参数的初始化方法

Service(Request request,Response response):服务方法,当浏览器向服务器端发送请求时,客户端会执行相对应组件的service()方法。

Distory():销毁方法,当Servlet销毁时会自动调用。

①其中,我们可以重写子类中的init()方法来对Servlet初始化时进行一些操作。如果需要传入一些参数,我们可以通过在配置该组件时在其<servlet>标签下添加如下代码:

<init-param>

<param-name>参数名</param-name>

<param-value>参数值</param-value>

</init-param>

来设置初始化参数,也可以在使用@WebServlet注解时加上initParams属性来设置初始化参数,之后在初始化时调用如下代码来获取配置的初始化参数:

ServletConfig config=getConfig();

String configValue=config.getInitParameter(“参数名”);

②service()方法主要用来处理不同的请求,需要在每个子类中进行重写。

③distory()方法不需要我们进行调用,但可以重写该方法来在销毁Servlet对象时干一些事。

4. Servlet的生命周期

        servlet会在服务器启动时或是客户端第一次向服务器发送请求时自动调用其构造方法,并在之后调用init(ServletConfig config)方法来进行初始化。之后将一直存在,如果有请求发送过来时会调用相应的service()方法来对不同的请求做出相应的处理。直到服务器关闭时会调用其distory()方法来将其进行销毁。

        Servlet的初始化时机可以由程序员控制,默认是在第一次接收请求时进行初始化。设置初始化时机的方式有两种:①在配置<servlet>标签时,加上<load-on-startup>标签,标签中间写数字,数字越小,该Servlet初始化越靠前。②通过使用@WebServlet注释来配置Servlet时,可以为其设置属性loadOnStartUp的值,同样,值越小其初始化越靠前。

        Servlet初始化的两种方式各有特点:①在Tomcat服务器启动时初始化,这样能够提高用户的响应速度,能提高用户的体验效果,但是由于在启动Tomcat时需要进行大量的Servlet初始化,这样会导致服务器启动时间很久。②在服务器第一次接收请求时进行初始化,这样在启动服务器时,不需要初始化Servlet,能够减少服务器启动时间,但是第一个发请求的客户需要等待Servlet初始化才能得到响应,降低了客户的体验效果。

        需要注意的是,虽然可能有许多不同的浏览器给服务器端发送请求,但是在Tomcat容器中却只会存在一份Servlet实例,所有的处理都由同一个Servlet对象进行处理,也就是说Servlet是单例对象,所以我们不要在该子类中设置成员变量,即便是设置了也不要对他进行任何的修改和将其用于逻辑判断。

5. Servlet的继承结构

        Servlet是一个接口,其下面有GenericServlet抽象类,在下面还有HttpServlet抽象子类。在GenerivServlet抽象类中,其并没有重写service()方法。在HttpServlet抽象子类中,其将service(Request request,Response response)方法进行了重写,其变成service(HttpServletRequest request,HttpServletResponse),该方法内部会根据不同的请求方式调用不同的doXxx()方法,这些方法都是指向一个405错误页面,所以我们需要重写该方法。

6. 组件之间跳转的方式

        对于组件之间跳转,Servlet提供了两种方式

①服务器内部转发:使用如下代码进行服务器内部转发

request.getRequestDispatcher(“请求地址”).forward(request,response);

该方法能够在一次服务器内部将请求从一个组件转移到另一个组件,不需要客户端发送新请求。

②客户端重定向:使用如下代码进行客户端重定向

Response.sendRedirect(“请求地址”);

通过客户端重定向,在服务器内执行到该代码时会返回一个响应请求给客户端(浏览器),让它重新发送一个请求到新的请求地址。这个过程会涉及到原来请求的结束和一个新请求的创建和发送。

7. 保存作用域

        保存作用域的作用:由于在处理请求时,或者是在同一个浏览器发送不同请求时,我们需要传递一些公共的数据,同时考虑到Http是无状态的,不能识别两个请求是否由同一个浏览器发送,我们有如下四种保存作用域,可以根据不同的需求将数据保存在不同的保存作用域中来实现数据的流动。

保存作用域分为四种:page(页面)、request(请求)、session(会话)、application(应用)

request对应Request对象,是在同一个请求中有效。session对应Session对象,是在同一次会话中有效。application对应ServletContext对象(Servlet上下文),是在同一个应用中有效。

作用域保存和获取以及移除数据的方法:setAttribute(String key,Object value)、getAttribute(String key)、removeAttribute(String key)。

获取Session对象方法:Session session=request.getSession();

其中,ServletContext不仅可以通过setAttribute的方式来设置参数,其还可以在web.xml文件中通过如下代码设置一些初始化参数:

<context-param>

        <param-name>参数名</param-name>

        <param-value>参数值</param-value>

</context-param>

之后可以使用如下代码来获取初始化参数的值:context.getInitParamter(“参数名”);

获取ServletCon的方式有很多:①在初始化方法中通过调用

ServletContext servletContext=getServletContext();

②在service方法中通过request或session调用getServletContext()。

8. 在保存作用域中获取参数时的注意点

        在request作用域中获取参数值时,因为Servlet的默认字符集不是GBK或UTF-8,所以需要进行字符集的设置。设置字符集的方式如下:

对于get方式,在Tomcat3.0之后不需要进行设置,直接获取即可。

对于post方式,需要在获取第一个参数值之前调用如下代码:request.setCharacterEncoding(“utf-8”)

相关文章:

  • 关于makefile
  • C语言 变量的存储和引用,内部和外部函数
  • 仿真1 - takeoff_land
  • 基于C语言的图论汇编
  • 非自交任意多边形与矩形框的交集面积计算方法
  • 软件测试项目实战,Web测试常用测试点,即拿即用宝典
  • i.MX 6ULL 驱动开发 九:中断
  • typename 的用法
  • java题2
  • 【Python深度学习】深度学习框架搭建模版
  • 双绞线连接网卡和集线器时的制作步骤
  • vue实战-mockjs模拟数据
  • 深度学习优化算法之动量法[公式推导](MXNet)
  • tomcat面试和Spring的面试题
  • 网课查题公众号接口
  • 〔开发系列〕一次关于小程序开发的深度总结
  • CSS相对定位
  • Docker入门(二) - Dockerfile
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • iOS小技巧之UIImagePickerController实现头像选择
  • JavaScript创建对象的四种方式
  • javascript面向对象之创建对象
  • Redux系列x:源码分析
  • Swoft 源码剖析 - 代码自动更新机制
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • vue-loader 源码解析系列之 selector
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 排序算法之--选择排序
  • 前端之Sass/Scss实战笔记
  •  一套莫尔斯电报听写、翻译系统
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 【云吞铺子】性能抖动剖析(二)
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (Python) SOAP Web Service (HTTP POST)
  • (安卓)跳转应用市场APP详情页的方式
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (七)理解angular中的module和injector,即依赖注入
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • ./configure,make,make install的作用
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .net打印*三角形
  • .NET企业级应用架构设计系列之技术选型
  • .NET企业级应用架构设计系列之结尾篇
  • @Autowired多个相同类型bean装配问题
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [AIGC] 如何建立和优化你的工作流?
  • [android]-如何在向服务器发送request时附加已保存的cookie数据