每天学一点之Servlet

news/2024/5/5 3:59:10/文章来源:https://blog.csdn.net/qq_52370789/article/details/129800999

一、web资源

1、web资源的概念

将web应用部署到tomcat中,web应用中所有的内容都是服务器中的资源

2、web资源的分类

web资源的分类:web应用中src中编写的动态资源,web应用中web中编写的静态资源

静态资源:每次访问时,内容不会发生变化,例如html、css、js、图片、音频、视频。。。

动态资源:每次访问时,条件不同、情况不同访问结果不一样,例如:Servlet、jsp、Thymeleaf。。。

二、Servlet

1、Servlet的概念

Servlet 是运行在服务端(tomcat)的Java小程序,是sun公司提供一套定义动态资源规范

从代码层面上来讲Servlet就是一个接口,同时所有实现了Servlet接口的实现类都是一个Servlet

2、Servlet的作用

Servlet的作用:处理请求和响应

3、Servlet的入门案例

a>创建一个类,实现Servlet接口,并重写其中所有的抽象方法

public class FirstServlet implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {//初始化}@Overridepublic ServletConfig getServletConfig() {//返回一个Servlet的配置对象return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("hello,Servlet");servletResponse.getWriter().println("success");}@Overridepublic String getServletInfo() {//返回一个Servlet的信息return null;}@Overridepublic void destroy() {//销毁}
}

b>在web.xml中注册Servlet

<servlet><servlet-name>FirstServlet</servlet-name><servlet-class>com.xy.servlet.FirstServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>FirstServlet</servlet-name><url-pattern>/firstServlet</url-pattern>
</servlet-mapping>

注意:

1、注册Servlet时,servlet标签和servlet-mapping标签中的servlet-name的值保持一致,建议使用类名

2、url-pattern设置Servlet的虚拟路径,必须以/开头,/表示localhost:8080/上下文路径

3、url-pattern设置Servlet的虚拟路径的规则:

url-pattern可以设置多个

url-pattern可以设置多种格式的路径:/test/abc、/test.html、*.do

c>访问Servlet

在页面中通过Servlet的虚拟路径,访问Servlet,此时Servlet中相对应的方法就会被调用

d>src中资源的部署路径

当web应用部署到tomcat中,src下的资源会被存放到WEB-INF下的classes文件夹中

三、Servlet的生命周期

tomcat是一个Servlet容器,可以管理Servlet的生命周期,即Servlet重实例化、初始化到服务再到销毁都由tomcat管理,那Servlet的生命周期的过程是什么呢?

1、初始化,在服务器启动之后,第一次访问Servlet,会执行init(),且在服务器运行的整个过程中,只执行一次

注意:可以在注册Servlet时,在servlet标签中添加子标签load-on-startup,此时就可以将Servlet的初始化时间提前到服务器启动时,且其中的值越小优先级越高

<servlet><servlet-name>SecondServlet</servlet-name><servlet-class>com.xy.servlet.SecondServlet</servlet-class><load-on-startup>1</load-on-startup>
</servlet>

2、服务,每一次访问Servlet,都会执行service(),在服务器运行的整个过程中,会执行多次

3、销毁,在服务器关闭时执行destroy(),在服务器运行的整个过程中,只执行一次

四、ServletConfig和ServletContext

4.1、ServletConfig

ServletConfig表示Servlet的配置对象,因此可以通过该对象获取Servlet的配置信息

/*** ServletConfig表示Servlet的配置对象,因此可以通过该对象获取Servlet的配置信息* 1、获取Servlet的友好名称,即注册时servlet-name标签的值* 2、获取Servlet的初始化参数* 3、获取ServletContext*/
//获取Servlet的友好名称,即注册时servlet-name标签的值
String servletName = servletConfig.getServletName();
System.out.println("Servlet的友好名称:"+servletName);
//获取Servlet的初始化参数
String testInitParam = servletConfig.getInitParameter("testInitParam");
System.out.println("Servlet的初始化参数:" + testInitParam);
//获取ServletContext
ServletContext servletContext = servletConfig.getServletContext();

4.2、ServletContext

ServletContext表示的是整个web应用,因此可以通过该对象获取web应用的相关内容

ServletContext在服务器启动时创建,在服务器关闭时销毁,在服务器运行的整个过程中,只会被创建一次,即在当前服务器运行的整个过程中,所获取的ServletContext都是同一个

/*** ServletContext表示的是整个web应用,因此可以通过该对象获取web应用的相关内容* 1、获取当前web应用的上下文路径* 2、获取当前web应用的部署路径(真实路径)* 3、获取当前web应用的上下文参数* 4、作为一个域对象,在整个web应用中共享数据*/
//获取当前web应用的上下文路径
String contextPath = servletContext.getContextPath();
System.out.println("当前web应用的上下文路径:"+contextPath);
/*** 获取当前web应用的部署路径(真实路径)* servletContext.getRealPath(""):获取服务器上web应用的路径* D:\IDEA\workspace\java_web\out\artifacts\Servlet_war_exploded\* servletContext.getRealPath("test"):获取服务器上web应用中某个文件的路径,不会判断该文件是否存在,只是一个拼接的效果* D:\IDEA\workspace\java_web\out\artifacts\Servlet_war_exploded\test*/
String realPath = servletContext.getRealPath("test");
System.out.println("当前web应用的部署路径(真实路径):"+realPath);
//获取当前工程的上下文参数
String testContextParam = servletContext.getInitParameter("testContextParam");
System.out.println("当前web应用的上下文参数:"+testContextParam);
/*** ServletContext是一个域对象,可以在整个web应用中共享数据* 域对象即区域对象、范围对象,指定的范围中,所使用的对象都是同一个* 域对象:请求域(HttpServletRequest),会话域(HttpSession),应用域(ServletContext)* 因为在指定的范围值,所获取的域对象都是同一个,因此可以在这个范围内,使用域对象共享数据* 操作共享数据的方法:* void setAttribute(String name, Object value):设置共享的数据* Object getAttribute(String name):获取共享的数据* void removeAttribute(String name):删除共享的数据*/
servletContext.setAttribute("testServletContext", "hello,ServletContext");

五、Servlet接口的扩展实现类

在这里插入图片描述

5.1、GenericServlet

GenericServlet实现了Servlet接口,将不经常使用的方法进行了重写,例如init()、destroy(),而将真正需要重写的方法service()设置为了抽象方法

因此在创建Servlet时就可以继承GenericServlet,此时只需要重写service()即可

5.2、HttpServlet

HttpServlet继承了GenericServlet,重写了service()方法,在方法的内部,将ServletRequest转换为HttpServletRequest,将ServletResponse转换为HttpServletResponse,并调用了有HttpServletRequest和HttpServletResponse作为参数的service(),并在此方法中,根据请求方式的不同,调用了不同的方法,GET–>doGet(),POST–>doPost()

因此在创建Servlet时就可以继承HttpServlet,此时只需要重写doGet()和doPost()即可

5.3、使用idea直接创建Servlet

  1. 为当前模块或项目添加Tomcat或者servlet的依赖
    在这里插入图片描述
  2. 在相应的包下创建Servlet
    在这里插入图片描述
  3. 创建Servlet
    在这里插入图片描述

六、HttpServletRequest

HttpServletRequest对请求报文进行了封装,因此可以通过该对象获取请求报文相关信息,例如可以获取请求方式、请求参数、请求头信息、请求转发等

1、获取请求相关信息

//获取当前请求的请求方式
String method = request.getMethod();
System.out.println("当前请求的请求方式:" + method);
//获取当前请求的上下文路径
String contextPath = request.getContextPath();//重要
System.out.println("当前请求的上下文路径:"+contextPath);
//获取当前所请求的服务器的ip、端口号、协议
String serverName = request.getServerName();
int serverPort = request.getServerPort();
String scheme = request.getScheme();
System.out.println("ip:"+serverName+",端口号:"+serverPort+",协议:"+scheme);
//获取当前请求的url和uri
StringBuffer requestURL = request.getRequestURL();
System.out.println("requestURL = " + requestURL);
String requestURI = request.getRequestURI();
System.out.println("requestURI = " + requestURI);

uri的写法是/项目部署名/资源路径
在这里插入图片描述

2、获取请求头信息

//获取请求头信息
String referer = request.getHeader("referer");
System.out.println("referer = " + referer);

3、获取请求参数

//获取单个的请求参数
String username = request.getParameter("username");
String password = request.getParameter("password");
//获取多个同名的请求参数
String[] hobbies = request.getParameterValues("hobby");
System.out.println("username:"+username+",password:"+password+",hobby:"+ Arrays.toString(hobbies));

注意:

tomcat7中get请求和post请求在获取请求参数时都有乱码问题

tomcat7中get请求的乱码问题的解决方案:

在配置文件server.xml中,在设置端口号的标签中添加属性URIEncoding=“UTF-8”

tomcat8中只有post请求在获取请求参数时有乱码问题

tomcat7和tomcat8中post请求的乱码问题的解决方案:

在获取请求参数之前设置编码:request.setCharacterEncoding(“UTF-8”);

注意:设置编码的代码之前一定不能获取任何的请求参数,否则无效

4、请求转发

请求转发是将当前的请求发送到下一个资源继续进行处理,一般转发到某一个页面,此时就可以将这个页面响应到浏览器

由于请求转发是发生在服务器内部的跳转,因此浏览器的地址栏中地址不会发生变化

//请求转发
request.getRequestDispatcher("/success.html").forward(request, response);

七、HttpServletResponse

HttpServletResponse表示的是响应报文,因此可以通过该对象设置响应报文的信息

1、响应浏览器数据

//解决响应的数据在页面中显示乱码的问题
response.setContentType("text/html;charset=UTF-8");
//response.setHeader("content-type", "text/html;charset=UTF-8");
//响应浏览器数据
PrintWriter writer = response.getWriter();
//writer.write("helloworld");
writer.print("<h1>你好</h1>");

2、重定向

重定向会通知浏览器再次发送请求,访问重定向的地址,因此浏览器的地址栏中地址会发生变化

response.sendRedirect("success.html");

3、服务器响应浏览器的方式

a>请求转发

b>响应浏览器数据

c>重定向

4、转发和重定向的区别

在这里插入图片描述

a>请求转发是发生在服务器内部,对于浏览器来说只发送了一次请求,因此浏览器的地址栏中的地址不会发生变化

重定向是由服务器通知浏览器再次发送请求,请求重定向的地址,对于浏览器来说发送了两次请求,因此浏览器的地址栏中的地址会发生变化

b>转发可以获取请求域中的数据,但是重定向不可以

c>重定向可以跨域访问,但是转发不可以,因为转发是发生在服务器内部的跳转,因此能够访问的资源也必须是服务器内部的资源

d>WEB-INF下的资源无法通过浏览器直接访问,只能通过服务器访问

因此请求转发可以访问WEB-INF下的资源,但是重定向不可以

总结:若业务逻辑处理成功使用重定向,若业务逻辑处理失败则使用转发,例如登陆成功使用重定向跳转到成功页面,登录失败使用转发跳转到登录页面

八、web应用的路径问题

1、路径分为相对路径和绝对路径

相对路径:目标资源相当于当前位置的路径

绝对路径:

静态web:绝对路径表示资源在磁盘上的路径,以盘符开头

web应用:绝对路径表示资源在服务器上的路径,以/开头

2、相对路径

相对路径路径不靠谱,以后主要使用绝对路径

1、相对路径和目标资源的位置以及当前的位置有关,当前位置不一样,访问目标资源的相对路径不一样,即同一个资源没有统一的相对路径

2、相对路径和目标资源的位置以及当前的位置有关,而通过转发跳转到某个页面时,地址栏中的地址和页面中的内容不匹配,因此会导致页面中的相对路径失效

3、绝对路径

静态web:绝对路径表示资源在磁盘上的路径,以盘符开头

web应用:绝对路径表示资源在服务器上的路径,以/开头

web应用中的绝对路径又分为浏览器解析的绝对路径和服务器解析的绝对路径

浏览器解析的绝对路径,/被解析为localhost:8080,例如html页面中,标签中设置的绝对路径、重定向到的绝对路径

服务器解析的绝对路径,/被解析为localhost:8080/上下文路径,例如web.xml中的路径、转发到的资源的路径

4、项目中绝对路径的使用

1、html页面中,标签中设置的绝对路径

a>在页面标签中设置绝对路径时,手动添加上下文路径

<a href="/Servlet/success.html">测试/</a>

b>使用base标签

在head标签中,设置base标签,设置了base标签的页面,使用标签中的路径都会以base标签的路径为基础,即标签的真正路径base+标签的路径

注意:base标签无法作用于以/、…/、./开头的路径

<base href="/Servlet/"><!--此时超链接真正的路径为/Servlet/testRequestServlet-->
<a href="testRequestServlet">TestRequestServlet</a><br>

2、重定向到的绝对路径

response.sendRedirect(request.getContextPath() + "/success.html");

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

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

相关文章

复杂链表的复制-剑指Offer35-java

一、题目描述 请实现 copyRandomList 函数&#xff0c;复制一个复杂链表。在复杂链表中&#xff0c;每个节点除了有一个 next 指针指向下一个节点&#xff0c;还有一个 random 指针指向链表中的任意节点或者 null。 示例 1&#xff1a; 输入&#xff1a;head [[7,null],[13,…

ChartGPT多重插补法 填充缺失点

问题描述已知时间戳与对应的值&#xff0c;需要根据时间戳找到缺失的点&#xff0c;然后进行值的填充。例如&#xff1a;源码<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-math3 --><dependency><groupId>org.apache.commons</gr…

flink执行任务运行10h以后挂掉并且报错

问题描述flink运行jar包任务&#xff0c;运行几个小时或者1天以后&#xff0c;任务就会挂掉&#xff01;&#xff01;&#xff01;第一个错误是2023-02-01 23:43:08,083 INFO org.apache.flink.runtime.executiongraph.ExecutionGraph [] - Window(TumblingEventTimeWindows(60…

【Unity】创建一个自己的AR安卓程序

目录1 环境配置2 下载官方提供的AR Starter工程3 AR Starter工程中的包以及打包设置3.1 Package Manager3.2 Player Settings4 创建一个新的AR场景5 AR场景中的物体6 在unity中运行AR场景7 在AR场景的基础上添加自己的想法7.1 修改Cube的旋转速度/方向7.2 将Cube替换为其他物体…

今年面试好激烈!

金三银四过去一半&#xff0c;市场火热&#xff0c;但是大家就业压力却没有缓解多少。 很多粉丝后台留言&#xff0c;Java程序员面临的竞争太激烈了…… 我自己也有实感&#xff0c;多年身处一线互联网公司&#xff0c;虽没有直面过求职跳槽的残酷&#xff0c;但经常担任技术面…

【开发实践】在线考试系统(一) 生成错题知识点的思维导图

一、需求分析设计 笔者开发了一个在线考试系统&#xff0c;导师提出一个需求&#xff1a;添加对考试错题相关知识点的总结。 在question表中关联知识点的编号&#xff0c;题目可能关联多个知识点。这里笔者的设计是&#xff0c;只关联一个知识点&#xff0c;便于维护。 下面是知…

【python实操】马上毕业了,你还不懂什么是守护线程、线程、进程?(附12306抢票程序-源代码)

作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&#xff0c;目前于海外某世界知名高校就读计算机相关专业。荣誉&#xff1a;阿里云博客专家认证、腾讯开发者社区优质创作者&#xff0c;在CTF省赛校赛多次取得好成绩。…

预训练语言模型(GPT,BERT)

文章目录GPT 模型预训练语言模型模型和学习BERT 模型去噪自编码器模型和学习模型特点References在自然语言处理中事先使用大规模语料学习基于 Transformer 等的语言模型&#xff0c;之后用于各种任务的学习和预测&#xff0c;称这种模型为预训练语言模型。代表性的模型有 BERT …

LCX端口转发之远程桌面端口双重映射多主机转发

1.下载LCX端口转发工具源码及程序: git clone https://github.com/UndefinedIdentifier/LCX lcx1 2.复制到目标机: winxp win2003 win7

上海亚商投顾:创业板指低开高走ChatGPT概念股再爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪大小指数今日走势分化&#xff0c;沪指盘中一度跌超1%&#xff0c;午后震荡回升跌幅收窄&#xff0c;创业板指则低开…

iOS多线程——GCD学习总结

文章目录多线程编程进程线程线程与进程的关系CPU核GCD简介为什么我们要使用GCD任务同步执行&#xff08;sync&#xff09;&#xff1a;异步执行&#xff08;async&#xff09;&#xff1a;队列&#xff08;Dispatch Queue&#xff09;串行队列&#xff08;Serial Dispatch Queu…

Tensor高阶用法:快速掌握Tensor切分、变形等方法

要想在实际的应用中更灵活地用好 Tensor&#xff0c;Tensor 的连接、切分等操作也是必不可少的。我们就通过一些例子和图片来一块学习下。虽然这几个操作比较有难度&#xff0c;但只要耐心分析&#xff0c;然后上手练习&#xff0c;还是可以拿下的。 Tensor 的连接操作 在项目…

SQL语法基础

简介 SQL (Structured Query Language) 是具有数据操纵和数据定义等多种功能的数据库语言&#xff0c;这种语言具有交互性特点&#xff0c;能为用户提供极大的便利&#xff0c;数据库管理系统应充分利用SQL语言提高计算机应用系统的工作质量与效率。 以下介绍postgresql语法&am…

ChatGPT的多种用法(持续更新中。。。)

指南 写小说 “写一本拥有出人意料结局的推理小说。” “写一个让读者参与其中的交互小说。” “为孩子们写一本激励他们勇敢面对挑战的小说。” “编写一个有关科技创新的未来世界的小说。” “创造一个让读者感到沉浸其中的幻想故事。” 充当 Linux 终端 我想让你充当…

数据结构绪论

​ 文章目录1 知识结构2 数据结构的基本概念2.1 算法的基本概念2.2 数据结构三要素2.2.1 数据的逻辑结构线性结构非线性结构2.2.2 数据的存储&#xff08;物理&#xff09;结构数据结构的四种存储结构2.2.3 数据的运算3 算法的基本概念3.1 基本概念3.1.1 算法&#xff08;Algor…

MIPI D-PHYv2.5笔记(5) -- 不同的PHY配置方式

声明&#xff1a;作者是做嵌入式软件开发的&#xff0c;并非专业的硬件设计人员&#xff0c;笔记内容根据自己的经验和对协议的理解输出&#xff0c;肯定存在有些理解和翻译不到位的地方&#xff0c;有疑问请参考原始规范看 规范5.7章节列举了一些常见的PHY配置&#xff0c;但实…

jsp+ssm在线考试系统+错题集Spring+SpringMVC+Mybatis编写实现的项目

本系统设计了三种角色&#xff1a;管理员&#xff0c;用户和教师。通过此系统&#xff0c;教师可以在线课程信息、考试内容、在线考试、考试管理进行发布。以及在线对试卷进行批阅和批量删除&#xff0c;用户可以对自己任课老师布置的课程信息进行下载&#xff0c;对老师已经批…

TryHackMe-Willow(boot2root)

Willow 柳树下有什么&#xff1f; 端口扫描 循例 nmap NFS枚举 直接挂载进来 存在一个rsa_key 暂时不知道有啥用&#xff0c;先去看80 Web枚举 进入80 看起来像是16进制&#xff0c;使用xxd转换 得到了用户名和rsa密文 在线计算器解密一下得到ssh的私钥 需要密码 ssh2johnj…

现在转行IT还有机会吗?

其实大部分所谓的机会都是建立在我们准备好的基础上的&#xff0c;因为大多数的企业并不会启用一个零基础毫无经验&#xff0c;或者没有企业所需要特质的人员。作为普通人而言&#xff0c;只有当你准备好之后&#xff0c;你才会看到机会&#xff0c;在这之前&#xff0c;你只会…

Web自动化测试入门

1.Web自动化测试的价值&#xff08;为什么要做web自动化测试&#xff09; 我们可以使用脚本语言代替人来进行测试 2.Web自动化测试相关技术&#xff1a; Selenium:支持多语言&#xff0c;行业内最火最主流Pytest/JUnit5:最好用最全面的单元测试框架Allure:测试报告3.Web自动化…