Servlet 上
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 上的更多相关文章
- servlet上传下载(任何格式的都可以)
jar不能低于此版本,JDK1.6以上,否则户报错 <dependency> <groupId>commons-fileupload</groupId> <a ...
- 使用Servlet上传文件
使用浏览器向服务器上传文件其本质是打开了一个长连接并通过TCP方式传输数据.而需要的动作是客户端在表单中使用file域,并指定该file域的name值,然后在form中设定enctype的值为mult ...
- Servlet上传文件
Servlet上传文件 1.准备工作 (1)利用FileUpload组件上传文件,须要到apache上下载commons-fileupload-1.3.1.jar 下载地址:http://common ...
- servlet上传与下载
上传页面 上传学生信息 学号 姓名 密码 性别 男 女 年龄 身高 学院 计算机学院 软件学院 照片 简历 <!DOCTYPE html> <html lang=&qu ...
- 原生Servlet 上传文件
依赖jar <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons ...
- jsp+servlet上传excel并将数据导入到数据库表的实现方法
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- java servlet上传centos服务器
前面一篇随笔说了Centos上架设javaWeb运行环境的方法,这篇主要讲打包上传服务器. 一.数据库连接文件.propeties 为了数据库安全,mysql3306端口访问我做了ip访问限制,由于m ...
- Servlet上
JavaWeb应用的概念 Java Web应用由一组Servlet.HTML页.类.以及其它可以被绑定的资源构成.它可以在各种供应商提供的实现Servlet规范的 Servlet容器 中运行. Jav ...
- java servlet上传文件并把文件内容显示在网页中
servlet3.0(JDK1.6)自带的API即可实现本地文件的上传,Servlet3.0新增了Part接口,HttpServletRequest的getPart()方法取得Part实现对象.下面我 ...
- servlet上传文件报错(三)
1.具体报错如下 null null Exception in thread "http-apr-8686-exec-5" java.lang.OutOfMemoryError: ...
随机推荐
- 微信小程序setData()异常
近来开发一个小程序的项目,遇到使用setData()始终报错的情况,其问题奇特难解- 一.操作错误截图 如上图,只要将setData放置在回调函数中就会出现异常,如果不放在回调中就正常: 好郁闷,wh ...
- JavaSE线程基础
1.线程概念 2.线程创建方式 1.继承thread 2.实现runnable runnable使用最多 3.线程的生命周期及线程的状态 新建状态 就绪状态的线程(已获得所有资源,栈堆内存空间),即s ...
- 顶级生物信息学 RSS 订阅源
早在 2018 年的时候我在"生信草堂"的公众号上写过一篇关于 RSS 的文章<使用 RSS 打造你的科研资讯头条>,介绍了关于 RSS 的一些内容和如何使用 inor ...
- 六大云端 Jupyter Notebook 平台测评
有许多方法可以与其他人共享静态 Jupyter 笔记本,例如把它发布在 GitHub 上或通过 nbviewer 链接进行分享. 但是,如果接收人已经安装了 Jupyter Notebook 环境,那 ...
- 文本识别分类系统python,基于深度学习的CNN卷积神经网络算法
一.介绍 文本分类系统,使用Python作为主要开发语言,通过TensorFlow搭建CNN卷积神经网络对十余种不同种类的文本数据集进行训练,最后得到一个h5格式的本地模型文件,然后采用Django开 ...
- 驱动开发:内核远程线程实现DLL注入
在笔者上一篇文章<内核RIP劫持实现DLL注入>介绍了通过劫持RIP指针控制程序执行流实现插入DLL的目的,本章将继续探索全新的注入方式,通过NtCreateThreadEx这个内核函数实 ...
- 深入Python网络编程:从基础到实践
Python,作为一种被广泛使用的高级编程语言,拥有许多优势,其中之一就是它的网络编程能力.Python的强大网络库如socket, requests, urllib, asyncio,等等,让它在网 ...
- 使用Ajax进行数据请求
一.Ajax开源库有很多选择,大家可以根据需求自己选择 jQuery:jQuery是一个广泛应用的JavaScript库,它提供了简洁而强大的API来处理Ajax请求.通过$.ajax()方法或其 ...
- 搭建Vue脚手架(vue-cli)
windows下环境安装前置环境 node.js安装 https://nodejs.org/en/download/ 安装成功后打开cmd 输入如下,如果能看到node和npm的版本号了,说明已经安装 ...
- Spring的Bean标签配置(一)
Bean标签基本配置 由于配置对象交由Spring来创建 默认情况下它调用的的是类中的无参构造函数,如果没有无参构造函数则不会创建成功 id:唯一标识符号,反射是通过无参构造创建对象的. class: ...