【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

相关文章

SpringBoot如何访问jsp页面

《SpringBoot如何访问jsp页面》本文介绍了如何在SpringBoot项目中进行Web开发,包括创建项目、配置文件、添加依赖、控制层修改、测试效果以及在IDEA中进行配置的详细步骤... 目录SpringBoot如何访问JSP页python面简介实现步骤1. 首先创建的项目一定要是web项目2. 在

Servlet中配置和使用过滤器的步骤记录

《Servlet中配置和使用过滤器的步骤记录》:本文主要介绍在Servlet中配置和使用过滤器的方法,包括创建过滤器类、配置过滤器以及在Web应用中使用过滤器等步骤,文中通过代码介绍的非常详细,需... 目录创建过滤器类配置过滤器使用过滤器总结在Servlet中配置和使用过滤器主要包括创建过滤器类、配置过滤

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题: