动态资源Servlet接口

1.Servlet接口的作用

Servlet是运行在Web服务器上的应用程序。Servlet本身是一个Java接口,它定义了浏览器访问服务器程序的规则,我们写服务器程序只需要按照需求复写Servlet方法即可

2.Servlet的体系结构

<1>直接继承实现类结构
在这里插入图片描述
<2>其他相关类视图
在这里插入图片描述

<1>实现Servlet接口
重写Servlet生命周期的所有方法

public class ServletDemo1 implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {//第一次访问的时候创建Servlet调用System.out.println("init初始化执行1次");}@Overridepublic ServletConfig getServletConfig() {//每一个Servlet对象创建时,会自动创建一个ServletCong对象return null;}//所有的客户端请求都会经过service方法@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("servlet实现响应");}//获取Servlet信息@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {System.out.println("销毁servlet执行1次");}
}

<2>继承GenericServlet抽象类
每次写一个Servlet都要复写生命周期的所有方法,比较麻烦。 Servlet提供了一个实现类GenericServlet,它把其他方法已经复写了,我们继承GenericServlet只需要复写service就可以了

public class ServletDemo2 extends GenericServlet {
//不知道是get请求还是post请求@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("GenericServlet实现响应");}
}

<3>继承GenericServlet抽象类【最简便也最常用】
如果每次都是继承GenericServlet类,在servlce方法中,不能区分直接是Get请求还是Post请求。需要我们自己求请求方法进行处理,也比较麻烦,所以又提供了一个子类HttpServlet类。
HttpServlet类中会根据不同的请求方式,提供不同的方法,我们只需要复写对应的方法即可

public class ServletDemo3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("HttpServlet实现响应");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}
3.Servlet的映射配置

<1>针对上面三种Servlet具体类进行配置
注意:每一个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"><!--    修改默认主页 /代表根目录Web--><welcome-file-list><welcome-file>/html/index.html</welcome-file></welcome-file-list><!--    servlet声明--><servlet><servlet-name>ServletDemo1</servlet-name><servlet-class>com.itheima.servlet.ServletDemo1</servlet-class></servlet><servlet><servlet-name>ServletDemo2</servlet-name><servlet-class>com.itheima.servlet.ServletDemo2</servlet-class></servlet><servlet><servlet-name>ServletDemo3</servlet-name><servlet-class>com.itheima.servlet.ServletDemo3</servlet-class></servlet><!--servlet映射 --><servlet-mapping><servlet-name>ServletDemo1</servlet-name><url-pattern>/Servlet</url-pattern></servlet-mapping><servlet-mapping><servlet-name>ServletDemo2</servlet-name><url-pattern>/GenericServlet</url-pattern></servlet-mapping><servlet-mapping><servlet-name>ServletDemo3</servlet-name><url-pattern>/HttpServlet</url-pattern></servlet-mapping>
</web-app>

<2>同一个Servlet多映射处理
针对用户种类对进行多种映射配置

<!--   方式1 --><!--具体名称的方式。访问的资源路径必须和映射配置完全相同--><servlet-mapping><servlet-name>ServletDemo5</servlet-name><url-pattern>/ServletDemo5</url-pattern></servlet-mapping><!--   方式2 --><!--/开头+通配符的方式 不用考虑结尾是什么 --><servlet-mapping><servlet-name>ServletDemo5</servlet-name><url-pattern>/ServletDemo5/*</url-pattern></servlet-mapping><!--   方式3 --><!--通配符+固定格式结尾的方式。只要符合固定结尾格式即可,不用考虑前面的路径--><servlet-mapping><servlet-name>ServletDemo5</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>

【注:优先级问题。越是具体的优先级越高,越是模糊通用的优先级越低。第一种->第二种->第三种–>】

<3>从浏览器地址栏,到访问Servlet的过程

Servlet是Web项目中的动态资源(Servlet字节码),访问过程如下
第一步:通过浏览器的ip地址找服务端主机
第二步:通过8080端口号找到tomcat服务器软件
第三步:通过虚拟机路径找到tomcat服务器上发布的web项目包
第四步:通过web.xml<url-pattern>找到Servlet对应的字节码
第五步:Tomcat会根据Servlet的字节码,自动的执行servcie方法

在这里插入图片描述

4.Servlet的加载时机
 <servlet><servlet-name>ServletDemo1</servlet-name><servlet-class>com.itheima.servlet.ServletDemo1</servlet-class><!--Servlet的加载时机配置每个Servlet默认是在第一次访问的时候被创建,默认为-1但是也可以通过web.xml配置让其在服务器启动的时候创建。数字越小,优先级越高--><load-on-startup>1</load-on-startup>  </servlet>

<1>第一次访问的时候被创建
优势:减少对服务器内存的浪费。提高了服务器启动的效率。
弊端︰如果有一些要在应用加载时就做的初始化操作,无法完成。
<2>服务器加载时创建
优势∶提前创建好对象,提高了首次执行的效率。可 以完成一些应用加载时要做的初始化操作
弊端∶对服务器内存占用较多,影响了服务器启动的效率

5.Servlet的线程安全问题

<1>问题出现:一个浏览器代表一个线程,多个浏览器代表多个线程。按理说我们期望的应该是每个浏览器查看的都应该是自己的用户名。而现在的结果是浏览器中数据混乱。因此,我们可以认为Servlet是线程不安全的!
<2>分析:多线程使用同一个共享数据
<3>解决:定义类成员要谨慎。如果是共用的,并且只会在初始化时赋值,其他时间都是获取的话,那么是没问题的。如果不是共用的,或者每次使用都有可能对其赋值,那就要考虑线程安全问题了,可以将其定义到doGet 或 doPost方法内或者使用同步功能即可。
a.同步代码块
b…将可能需要重新赋值的值定义在自己的方法体内[推荐]

<4>代码实现

//servlet线程安全问题
public class ServletDemo4 extends HttpServlet {private String username;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//2.将可能需要重新赋值的值定义在自己的方法体内[推荐]//String username =null;//1.同步代码块synchronized (this){//获取用户名username = req.getParameter("username");try {Thread.sleep(3000);} catch (Exception e) {e.printStackTrace();}//将用户名响应给浏览器PrintWriter pw = resp.getWriter();pw.println("welcome:" + username);pw.close();}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
6.默认Servlet

<1>含义;默认Servlet是由服务器提供的一个Servlet。它配置在Tomcat的conf目录中的web.xml中;
它的映射路径是/,我们在发送请求时,首先会在我们项目中的web.xml中查找映射配置,找到则执行。但是当找不到对应的Servlet路径时,就去找默认的Servlet,由默认Servlet处理。所以,一切都是Servlet。

    <servlet><servlet-name>default</servlet-name><servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class><init-param><param-name>debug</param-name><param-value>0</param-value></init-param><init-param><param-name>listings</param-name><param-value>false</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>default</servlet-name><url-pattern>/</url-pattern></servlet-mapping>

<3>如一些报错信息,如404都是默认Servlet给我们的提示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

thinking-in-java(14)类型信息

【0】开场白 1&#xff09;运行时类型信息使得你可以在程序运行时发现和使用类型信息&#xff1b;2&#xff09;java是如何在运行时识别对象和类信息的&#xff1f;两种方式&#xff1a; 方式1&#xff09;传统的RTTI&#xff08;RunTime Type Identification 运行时类型定义&a…

服务降级的概念及应用手段

转载自 服务降级的概念及应用手段什么是服务降级 服务降级&#xff0c;就是对不怎么重要的服务进行低优先级的处理。说白了&#xff0c;就是尽可能的把系统资源让给优先级高的服务。资源有限&#xff0c;而请求是无限的。如果在并发高峰期&#xff0c;不做服务降级处理&#xf…

Servlet其他关联类---ServletConfig类

1.ServletConfig介绍 a.ServletConfig是Servlet的配置参数对象&#xff0c;在Servlet的规范中&#xff0c;允许为每一个Servlet都提供一些初始化的配置。所以&#xff0c;每个Servlet都有一个自己的ServletConfig b.作用:在Servlet的初始化时&#xff0c;把一些配置信息传递给…

thinking-in-java(19)枚举类型

【0】开场白 1&#xff09;关键字 enum 可以将一组具名的值的有限集合创建为一种新的类型&#xff0c;而这些具名的值可以作为常规的程序组件使用&#xff1b;2&#xff09;所有的枚举类都继承自 Enum&#xff0c;通过 enumClass.getSuperclass() class java.lang.Enum 得知。…

8条关于Web前端性能的优化建议

转载自 8条关于Web前端性能的优化建议 一般网站优化都是优化后台&#xff0c;如接口的响应时间、SQL优化、后台代码性能优化、服务器优化等。高并发情况下&#xff0c;对前端web优化也是非常重要的。 下面说说几种常见的优化措施。 1、HTML CSS JS位置 一般需要将CSS放页面最上…

Servlet其他关联类---ServletContext类

1.ServletContext介绍 <1>域对象 域对象指的是对象有作用域。也就是有作用范围。域对象可以实现数据的共享。不同作用范围的域对象&#xff0c;共享数据的能力也不一样。在Servlet规范中&#xff0c;一共有4个域对象。ServletContext就是其中的一个。它也是web应用中最…

分布式Session共享解决方案

转载自 分布式Session共享解决方案 Session是服务器用来保存用户操作的一系列会话信息&#xff0c;由Web容器进行管理。单机情况下&#xff0c;不存在Session共享的情况&#xff0c;分布式情况下&#xff0c;如果不进行Session共享会出现请求落到不同机器要重复登录的情况&…

thinking-in-java(20)注解

【1】注解介绍 1&#xff09;注解是什么&#xff1f; 注解&#xff08;元数据&#xff09;是 java提供的一种对程序元素&#xff08;如类&#xff0c;方法&#xff0c;变量&#xff09;打标记的方法&#xff1b;以便运行程序或编译器可以识别这些元素进行特殊处理&#xff1b…

Servlet---注解开发

1.引入 在Servlet3.0以后的版本提供了Servlet注解配置&#xff0c;大大简化了代码编写。它可以替代xml文件的配置 2.代码实现 <1>注解开发代码如下&#xff1a; WebServlet(value "/servlet1", initParams {WebInitParam(name "charset", val…

Git操作常用的命令都在这里了

转载自 Git操作常用的命令都在这里了 创建仓库 git init 在当前目录执行&#xff0c;会生成 .git目录文件&#xff0c;这个和SVN一致。 提交到仓库 git commit -m "first commit" -m&#xff1a;表示提交描述&#xff0c;必须要填。 添加到远端仓库 git remote …

DevExperience(1801)

【1】 关于路径和文件名命名规范&#xff1a;1&#xff09;window 操作系统 的路径名和文件名是不区分大小写的&#xff0c;Linux等其他操作系统都区分大小写的&#xff1b;2&#xff09;某些部署在 Linux系统的项目&#xff0c;其路径名和文件名建议均用小写&#xff1b;不然一…

web项目的创建和发布

1.Web项目的目录结构 2.Web项目的创建 <1>首先创建一个空的java项目 <2>选择模块,创建一个新模块 <3>选择javaq企业开发块,先勾选javaEE版本再勾选下方的Web Application才会出现对应的版本 <4>一路next之后给模块取名点击finish,再点击Apply后ok则…

telnet实现本地回显

下面以访问 localhost:8080 站点为荔枝说明如何设置 telnet的回显&#xff1b;1&#xff09;操作系统命令行输入 telnet localhost 8080 回车&#xff1b;2&#xff09;同时键入 ctrl 和 ] 键&#xff0c;进入 telnet 命令行&#xff1b;3&#xff09;记不住 telnet 命令的童鞋…

DevOps到底是什么鬼?DevOps介绍及工具推荐

转载自 DevOps到底是什么鬼&#xff1f;DevOps介绍及工具推荐 什么是DevOps DevOps是Development和Operations的组合&#xff0c;是一组过程、方法与系统的统称&#xff0c;用于促进开发&#xff08;应用程序/软件工程&#xff09;、技术运营和质量保障&#xff08;QA&#xf…

请求对象Request

1.概念 <1>请求&#xff1a;请求:获取资源。在BS架构中&#xff0c;就是客户端浏览器向服务器端发出询问。 <2>请求对象&#xff1a;就是在项目当中用于发送请求的对象。 <3>对象创建&#xff1a;需要实现ServletRequest和HttpservletRequest接口&#xff0…

Oracle-26-内连接(等值、不等值连接、自然连接)外连接(左外、右外、全连接)using子句

转自&#xff1a; http://blog.csdn.net/wy_0928/article/details/51155498 【总结】连接分类 【0】什么是数据库连接&#xff1f; 1&#xff09;当一次查询涉及到两个表时&#xff1a;就要使用连接查询了&#xff0c;其中join如果不带有其他标识&#xff0c;则默认是内连接 …

百度分布式配置管理平台-Disconf

转载自 【推荐】百度分布式配置管理平台-DisconfDisconf介绍 全称&#xff1a;Distributed Configuration Management Platform&#xff0c;即分布式配置管理平台。 Disconf专注于各种分布式系统配置管理的通用组件和通用平台, 提供统一的配置管理服务。主要目标&#xff1a; 部…

运算符优先级的问题

注意&#xff1a;逻辑非>逻辑与>逻辑或

数据库表连接总结:等值连接, 自然连接,左外连接,右外连接,内连接,全外连接;

【1】等值连接1&#xff09;连接&#xff1a;凡是查询涉及到两个以上的表&#xff0c;就需要将表连接&#xff1b;2&#xff09;就是用where子句做的连接查询&#xff1b;连接查询的列名可以不同&#xff1b;【2】自然连接&#xff1a;select * from a_tbl natual join b_tbl这…

网站性能测试指标(QPS,TPS,吞吐量,响应时间)详解

转载自 网站性能测试指标&#xff08;QPS&#xff0c;TPS&#xff0c;吞吐量&#xff0c;响应时间&#xff09;详解常用的网站性能测试指标有&#xff1a;吞吐量、并发数、响应时间、性能计数器等。 并发数 并发数是指系统同时能处理的请求数量&#xff0c;这个也是反应了系统的…