【Jsp】第二课 Servlet入门学习(二)

2024-05-11 17:18

本文主要是介绍【Jsp】第二课 Servlet入门学习(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本次课程内容是即【Jsp】第二课 Servlet入门学习(一) 文章之后编写。

url-pattern详解

} 1.完全匹配  必须以"/"开始 
例如:/hello    /a/b/c
} 2.目录匹配  必须以"/"开始  以"*"结束 
例如:/a/*    /*
} 3.后缀名匹配  以"*"开始      以字符结尾      
例如:*.jsp   *.do   *.action

优先级:完全匹配>目录匹配>后缀名匹配  

完全匹配

什么叫完全匹配?

我们使用之前的OneServlet做分析,在web.xml文件中注册了该Servlet的信息。

 那么,我们将该项目运行在tomcat服务器上访问一下看一下效果:

通过运行可以看到效果为,浏览器地址上输入与Servlet注册设置的访问的虚拟地址保持一致时,立即可以访问到OneServlet,那么假设在浏览器地址上改为/abc1访问OneServlet的话,效果如何:

 

通过运行效果可以看出,想要访问OneServlet那么必须要和设置的虚拟地址保持一致,不能多写也不能少些,不然会出现404  的网页错误信息,表示浏览器没有找到该访问地址,因此产生的错误。

这是需要记住,以后只要遇到404错误,那么一定是地址发生了错误或者的传递的参数发生的了错误

 即这里我们把这种设置的访问虚拟地址与浏览器访问的方式称为完全匹配,必须要一致。

目录匹配

设置访问地址的时候,以/开头,以*号结尾的地址称为目录匹配。

那么接下来看一下目录匹配的用法,这里我们还是使用OneServlet的注册信息,我们把/abc改一下,通过浏览器访问,查看访问效果:

通过运行的效果可以发现,我们把OneServlet的访问地址改为了/abc/*,但通过浏览器访问的时候,只输入了/abc,既然一样能访问OneServlet将信息打印出来,甚至是输入/abc/123,一样能访问该Servlet:

 

通过多种尝试访问,得出结论:这里的*代表0个或者若干个任意字符进行匹配。

后缀名匹配

什么叫后缀名匹配?设置的访问地址为以*开头,以某种后缀名结尾的格式称为后缀名匹配。

那么这里还是以修改OneServlet的虚拟地址来做演示:

 通过以上运行效果可以发现,只要浏览器上输入的地址与设置的虚拟地址的后缀名是一致的,无论后缀名之前输入任何字符都能被该虚拟地址进行匹配。这就是后缀名匹配的效果。

那么学习到这里,大家都有个疑问?

讲了这么多,设置这么多不同的访问虚拟地址有什么作用,何必搞这么复杂。

其实通过三种地址的访问设置,可以发现,使用浏览器访问OneServlet的时候可以让非法用户无法知道服务器的真实Servlet的类,以及无法判断当前该访问地址是准备执行服务器项目的什么操作,什么功能,这其实大大增加了服务器的安全性,减少了被外部非法用户的攻击服务器的可能性。

 接下来给个小练习给大家思考一下:

假设:有三个Servlet,

其中OneServlet类设置的虚拟地址为  /servlet.do

TwoServlet类设置的虚拟地址为 /*

ThreeServlet类设置的虚拟地址为 *.do     

当浏览器地址上输入 http://localhost:8080/Project/servlet.do的时候,那么会访问到哪一个Servlet,大家可以思考一下,同时也可以动手试试,看看效果是怎样的。

 

下面也给出了更多的练习供大家掌握这三种设置浏览器访问的虚拟地址方式:

} 有如下的一些映射关系:
}  Servlet1 映射到  /abc/*
}   Servlet2 映射到  /*
}   Servlet3 映射到  /abc
}   Servlet4 映射到  *.do
}  当请求URL为"/abc/a.html"时,哪个响应?
}  当请求URL为"/abc"时,哪个响应?
}  当请求URL为"/abc/a.do"时,哪个响应?
}  当请求URL为"/a.do"时,哪个响应?
}   当请求URL为"/xxx/yyy/a.do"时,哪个响应?

 

load-on-startup

定义:该标签是servlet标签中一个子标签  

作用:用来修改servlet的创建时机

在任何Servlet被定义后,默认都是在浏览器第一次访问该Servlet的时候才会创建对象并初始化数据,最后等待浏览器的继续访问,但可能在某种需求下,我们需要在浏览器访问Servlet之前就要提前将数据准备好,给用户更好的体验,那么就需要现在讲的这个知识点了。

取值:

1.它的值必须是一个整数,表示servlet被加载的先后顺序

2.如果值为正整数或者0时,表示在应用启动时就加载并初始化servlet

值越小,加载的优先级越高,就越先被加载,值相同时,容器就会自己选择加载顺序

那么我们开始操作代码,来演示一下这个标签的用法,这里我们在TwoServlet的注册上加上这个标签,看看效果:

 

即可发现,不需要浏览器通过虚拟地址去访问它,在控制台中已经打印了该Servlet的构造方法被执行之后的信息。这也就达到了我们想要的效果,如果需要多个Servlet都在项目运行的时候就创建,那么可以多个Servlet都定义该标签。这里就布置演示,初学者可以自行尝试,操作,观察其打印输出的信息并做出分析和总结,以便于达到掌握和学习这个知识点。

快速创建基于HttpServlet的用法

那么其实在最新的Servlet技术中,不会再手动的创建HttpServlet类,不再手动的配置Servlet的注册信息,那么我们来一起看看怎么操作:

选中包右键--》new---》Servlet进行创建

 

创建完成后,会发现与我们之前手动创建的ThreeServlet没有什么区别。

但仔细观察,会发现区别在于这里:

 

在创建的FourServlet这个类上面出现了一个Java注解的定义方式,那么这个就是用来简化替代Servlet在 Web.xml文件中注册的代码。这也大大降低了我们开发者在学习和使用Servlet的时间。

接着我们使用这个Servlet完成一个模拟QQ空间统计在线访问人数的功能。

那么我们在该类中定义一个全局变量,用于统计,在浏览器访问该Servlet的时候,是默认采用get请求的方式,因此我们在Servlet的doGet方法中对全局变量进行自增,并将自增后的次数显示在浏览器的页面上。其代码如下:

package com.servlet;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class FourServlet*/
@WebServlet("/FourServlet")
public class FourServlet extends HttpServlet {private static final long serialVersionUID = 1L;//定义全局变量,用于统计访问次数int count=0;/*** @see HttpServlet#HttpServlet()*/public FourServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubcount++;response.getWriter().append("Count: "+count);}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

接下来可以运行项目,根据虚拟地址来访问该Servlet,即可以打开不同的浏览器同时访问该Servlet,可以看到统计访问人数的效果。这里就不再演示,初学者可以自行创建代码,进行运行演示查看效果。

本次文章就分享到这里。

这篇关于【Jsp】第二课 Servlet入门学习(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/980158

相关文章

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Redis 配置文件使用建议redis.conf 从入门到实战

《Redis配置文件使用建议redis.conf从入门到实战》Redis配置方式包括配置文件、命令行参数、运行时CONFIG命令,支持动态修改参数及持久化,常用项涉及端口、绑定、内存策略等,版本8... 目录一、Redis.conf 是什么?二、命令行方式传参(适用于测试)三、运行时动态修改配置(不重启服务

MySQL DQL从入门到精通

《MySQLDQL从入门到精通》通过DQL,我们可以从数据库中检索出所需的数据,进行各种复杂的数据分析和处理,本文将深入探讨MySQLDQL的各个方面,帮助你全面掌握这一重要技能,感兴趣的朋友跟随小... 目录一、DQL 基础:SELECT 语句入门二、数据过滤:WHERE 子句的使用三、结果排序:ORDE

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示