Servlet

1.什么是Servlet

Servlet即Server Applet是运行在Web服务器端的小程序

2.创建Servlet的三种方式

注意:从Tomcat10.0以后,我们统一用 jakarta.servlet包

  • 实现Servlet接口
public class Test implements Servlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { } @Override
public void init(ServletConfig config) throws ServletException {
} @Override
public ServletConfig getServletConfig() {
return null;
} @Override
public String getServletInfo() {
return null;
} @Override
public void destroy() { }
}
  • 继承GenericServlet类
public class Test extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { }
}
  • 继承HttpServlet类
public class Test extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}

这里只简单的介绍创建Servlet的三种方式,接下来会详细介绍

3.注册Servlet

在注册Servlet后,我们需要将Servlet与web.xml配置

以下为web.xml中的配置信息,我们将请求路径与每个Servlet类关联起来

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app>
<display-name>Archetype Created Web Application</display-name> <servlet>
<!--Servlet名字-->
<servlet-name>Demo</servlet-name>
<!--servlet的文件路径,有包名必须带包名-->
<servlet-class>com.Red.servlet.Demo</servlet-class>
</servlet> <!--servlet镜像-->
<servlet-mapping>
<!--Servlet名字-->
<servlet-name>Demo</servlet-name>
<!--url访问地址,这个Servlet在浏览器中地址应为 http://localhost:8080/Servlet_war/Demo -->
<url-pattern>/Demo</url-pattern>
</servlet-mapping> </web-app>

4.Servlet的接口方法与生命周期

1.接口方法

(1)init()方法可以进行一些前置加载

void init(ServletConfig var1)

(2)service()方法可以在Web服务器发送请求时执行,可以添加请求和回复

void service(ServletRequest var1, ServletResponse var2)

(3)dstroy()方法会在Web服务器关闭时执行,并在随后销毁Servlet对象

void destroy()

(4)getServletConfig()方法会获取一个ServletConfig对象,此对象是由init方法执行而自动被new出来的

ServletConfig getServletConfig()

(5)getServletInfo()方法会返回Servlet信息,如版本号,作者,版本信息等等……

String getServletInfo()

2.Servlet在WebServer中的储存

首先以Tomcat为例,我们通常叫Tomcat为Web容器,更是一个运行Servlet的平台。Servlet对象被容器管理。

我们自己new的Servlet是不受容器管理的,且此对象与容器的Servlet对象是不同的,前者仅仅是一个普通对象。Web容器会将ta创建的Servlet对象放进一个集合(HashMap)之中,只有在集合里的对象才能被Web容器管理(自己new的不在容器内)。

  • Web容器底层应有一个HashMap这样的集合,ta会储存Servlet对象和请求路径之间的关系

3.Servlet的生命周期

  • 在WebServer启动时,容器为了节省资源并不会实例化Servlet对象。当我们要使用某个Servlet对象时并且向服务器发送请求,容器会根据请求的路径Key去容器底层的集合中按照Key来获取Value(Servlet对象),此时Servlet对象被创建。
  • 同时Servlet对象会自动调用init方法完成一些前置
  • 随后Service()方法会调用,处理请求与响应
  • 最后服务器关闭时,Servlet对象会调用Destroy()方法,然后Servlet对象会自动销毁

综上所述:我们也可以看到Servlet是一个单例。


4.提前让Servlet对象被创建出来

我们可以让Servlet对象在服务器启动时就被创建出来

  <servlet>
<servlet-name>Demo</servlet-name>
<servlet-class>com.Red.servlet.Demo</servlet-class> <!--在Servlet标签中使用<load-on-startup>让Servlet对象提前创建出来-->
<load-on-startup>1</load-on-startup> </servlet>

5.Generic用适配器改造Servlet(adapter)

避免重复的实现方法,我们只需要重要的方法。

如我们只需要重写Service方法:

public class Demo extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Hello World!!");
}
}

关于Servlet中关于init()方法在适配器中的重写。

    //成员变量
private ServletConfig servletConfig; //实例方法 /**
* Servlet初始化操作,我们将此方法设为final,不允许任何人重写。
* @param servletConfig Tomcat自动传入一个ServletConfig对象,我们将传入的ServletConfig对象赋值给成员变量
* @throws ServletException Servlet异常
*/
@Override
public final void init(ServletConfig servletConfig) throws ServletException {
this.servletConfig = servletConfig;
this.init();
} /**
* 如果我们的确有重写init()方法的需求,我们可以重写无参的init().我们将无参的init()方法加入有参的init(ServletConfig servletConfig)中
* 无需担心,我们不会在init()方法中使用ServletConfig,ServletConfig在此无使用场景
*/
public void init(){ } /**
* 通过此方法我们将拿到私有成员变量
* @return 将私有的成员变量当作返回值返回
*/
@Override
public ServletConfig getServletConfig() {
return this.servletConfig;
}

6.ServletConfig对象

ServletConfig对象为Servlet对象的配置信息对象,在WebServer启动之初,服务器会将web.xml文件中Servlet标签的配置信息封装进ServerConfig对象中。

因此每个Servlet对象都有各自的ServletConfig对象,每个ServletConfig对象会把ta的Servlet标签包装

1.<init-param>标签

我们可以在web.xml中使用标签配置一些初始化信息如:我们可以配置一些JDBC信息

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app>
<display-name>Archetype Created Web Application</display-name> <!--Servlet标签-->
<servlet>
<servlet-name>Demo</servlet-name>
<servlet-class>com.Servlet.Demo</servlet-class> <!--Servlet初始化信息 <init-param>来连接数据库 -->
<init-param>
<param-name>Driver</param-name>
<param-value>com.mysql.cj.jdbc.Driver</param-value>
</init-param> <init-param>
<param-name>Url</param-name>
<param-value>jdbc:mysql://127.0.0.1:3306/wex</param-value>
</init-param> <init-param>
<param-name>User</param-name>
<param-value>Root</param-value>
</init-param> <init-param>
<param-name>Password</param-name>
<param-value>123456</param-value>
</init-param>
</servlet> <servlet-mapping>
<servlet-name>Demo</servlet-name>
<url-pattern>/Demo</url-pattern>
</servlet-mapping>
</web-app>

2.ServletConfig接口方法

获取Servlet配置信息的Name

String getServletName();

获得一个ServletContext对象

ServletContext getServletContext()

获取Servlet配置信息 ,通过name获取value

String getInitParameter(String var1)

获取Servlet配置信息 中的所有name,并返回一个Enumeration集合

Enumeration<String> getInitParameterNames()

7.ServletContext对象

ServletContext对象对应着整个Web.xml配置信息,对于一个Webapps来说ServletContext对象只有一个,ta是Servet对象上下文/环境对象

所以放在ServletContext对象中的数据,所有Servlet对象是共享的。ta在服务器启动时产生,关闭时销毁。

上下文的ServletContext的配置

<!--配置ServletContext-->
<context-param>
<param-name>page-size</param-name>
<param-value>20</param-value>
</context-param>

1.ServletContext接口方法

获取Web.xml里的value

String   getInitParameter(String var1)

获取Web.xml里的所有name集合

Enumeration<String>   getInitParameterNames()

获取应用的根路径

String	getContextPath()

获取我们传入文件在系统的绝对路径

String	getRealPath(String  path)

记录日志,同时日志也会越来越大,服务器调优很重要

void log(String message, Throwable t)

void log(String msg)

ServletContext应用域:在其中存入所有用户共享的少量数据,基本不可修改。(当作缓存)

往ServletContext应用域存数据

void	setAttribute(String  name,Object  obj)

获取ServletContext应用域数据

Object	getAttribute(String  name)

删除ServletContext应用域中的数据

void	removeAttribute(String  name)

Servlet 上的更多相关文章

  1. servlet上传下载(任何格式的都可以)

    jar不能低于此版本,JDK1.6以上,否则户报错 <dependency> <groupId>commons-fileupload</groupId> <a ...

  2. 使用Servlet上传文件

    使用浏览器向服务器上传文件其本质是打开了一个长连接并通过TCP方式传输数据.而需要的动作是客户端在表单中使用file域,并指定该file域的name值,然后在form中设定enctype的值为mult ...

  3. Servlet上传文件

    Servlet上传文件 1.准备工作 (1)利用FileUpload组件上传文件,须要到apache上下载commons-fileupload-1.3.1.jar 下载地址:http://common ...

  4. servlet上传与下载

    上传页面 上传学生信息 学号  姓名  密码  性别 男 女 年龄  身高  学院  计算机学院 软件学院 照片  简历 <!DOCTYPE html> <html lang=&qu ...

  5. 原生Servlet 上传文件

    依赖jar <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons ...

  6. jsp+servlet上传excel并将数据导入到数据库表的实现方法

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  7. java servlet上传centos服务器

    前面一篇随笔说了Centos上架设javaWeb运行环境的方法,这篇主要讲打包上传服务器. 一.数据库连接文件.propeties 为了数据库安全,mysql3306端口访问我做了ip访问限制,由于m ...

  8. Servlet上

    JavaWeb应用的概念 Java Web应用由一组Servlet.HTML页.类.以及其它可以被绑定的资源构成.它可以在各种供应商提供的实现Servlet规范的 Servlet容器 中运行. Jav ...

  9. java servlet上传文件并把文件内容显示在网页中

    servlet3.0(JDK1.6)自带的API即可实现本地文件的上传,Servlet3.0新增了Part接口,HttpServletRequest的getPart()方法取得Part实现对象.下面我 ...

  10. servlet上传文件报错(三)

    1.具体报错如下 null null Exception in thread "http-apr-8686-exec-5" java.lang.OutOfMemoryError: ...

随机推荐

  1. GPT-4多态大模型研究

    1.概述 GPT-4是OpenAI最新的系统,能够产生更安全和更有用的回应.它是一个大型的多模态模型(接受图像和文本输入,输出文本),在各种专业和学术的基准测试中展现了人类水平的表现.例如,它在模拟的 ...

  2. 更换Mysql数据库-----基于Abo.io 的书籍管理Web应用程序

    之前公司一直使用的是ASP.NET Boilerplate (ABP),但是当解决方案变得很大时,项目启动就变得非常慢,虽然也想了一些办法,将一些基础模块做成Nuget包的形式,让整个解决方案去引用. ...

  3. hvv蓝初面试常见漏洞问题(下)

    hvv蓝初面试常见漏洞问题(上) 6.ssrf 服务端伪造请求 原理 服务端提供了向其他服务器应用获取数据的功能,而没有对目标地址做任何过滤和限制.攻击者进而利用其对内部资源进行攻击.(通俗来说:就是 ...

  4. C++面试八股文:C和C++有哪些区别?

    某日小二参加XXX科技公司的C++高级工程师开发岗位1面: 面试官:请问C和C++的区别有哪些? 小二:C++是C的超集. 面试官:还有吗? 小二:... 面试官:面试结束,回去等消息吧. 小二:淦. ...

  5. spring-boot集成mybatis真的很简单吗?

    在日常的后端开发中,使用mybatis作为DAO层的持久框架已经是惯例.但很多时候都是在别人搭好的框架中进行开发,对怎么搭建环境是一知半解,今天就来实践下. 一.集成分哪些步骤 来看下集成mybati ...

  6. Dapr在Java中的实践 之 状态管理

    状态管理 状态管理(State Management)使用键值对作为存储机制,可以轻松的使长时运行.高可用的有状态服务和无状态服务共同运行在我们的服务中. 我们的服务可以利用Dapr的状态管理API在 ...

  7. JUC同步锁原理源码解析二--ReentrantReadWriteLock

    JUC同步锁原理源码解析二----ReentrantReadWriteLock 1.读写锁的来源 ​ 在开发场景下,对于写操作我们为了保证原子性所以需要上锁,但是对于读操作,由于其不改变数据,只是单纯 ...

  8. 深度解读 Linux 内核级通用内存池 —— kmalloc 体系

    本文是笔者 slab 系列的最后一篇文章,为了方便大家快速检索,先将相关的文章列举出来: <细节拉满,80 张图带你一步一步推演 slab 内存池的设计与实现> <从内核源码看 sl ...

  9. ArcPy批量对大量遥感影像相减做差

      本文介绍基于Python中ArcPy模块,对大量栅格遥感影像文件批量进行相减做差的方法.   首先,我们来明确一下本文的具体需求.现有一个存储有多张.tif格式遥感影像的文件夹,其中每一个遥感影像 ...

  10. ERP开发流程

    一.使用Xshell连线执行r.r adzi140 或 助记码r.t 都可以打开数据表设计器 表格建完后,DBA前三个需要点一下,如果表格显示需要表格重建,点最后一个,表格新建完成后,记得点击执行异动 ...