servlet开发

news2024/11/24 15:38:45

一、Servelet

(一)Servelet概述

1.概念:Severlet是一门动态web资源开发技术。

2.本质:Severlet本质是一段Java程序,但和Java程序不同的是,Severlet程序无法独立运行,需要放服务器中,

3.程序作用:运行在服务器端的Severlet程序作用是对服务器接收的请求进行处理。

(二)开发Servelet程序

1.主要开发步骤:

第一步:自定义类,继承HttpServlet从而继承GenericServelet类。

  • 重点是:重写抽象父类中doPost()和doGet()两个方法,对应处理浏览器的Post提交和Get提交。

第二步:配置web.xml文件,具体配置方式如下方。

2.开发细节:

  • Servelet在web.xml中的配置(Serverlet3.0以前):
    • 配置信息语法:

<servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>MyServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/hl</url-pattern>
</servlet-mapping>

    • 配置说明:两组标签中的severlet-name必须一致。
      • <Servelet></Servelet>标签中配置的是一个severlet程序本身的信息。(服务器端的信息)
        • Servelet-name:指定虚拟服务器名。
        • Servelet-class:指定访问的虚拟服务器处理请求的程序。(即处理方法类名)
      • <Servelet-mapping><Servelet-mapping>标签中配置的访问Servelet程序的方法。(客户端的信息)
        • Servelet-name:指定要访问的虚拟服务器名。
        • url-pattern:指定要访问虚拟服务器的虚拟路径。(hl前必须有/:代表标签中内容是一个路径,而不是一个文件)。
      • 每一个Servelet都需要单独一组<Servelet></Servelet>和<Servelet-mapping><Servelet-mapping>标签。不能使用一组该标签同时配置多个servelet。
  • Servelet注解配置(Serverlet3.0以后):
    • 配置语法:@WebServlet(name="className", [value=]"decName")
    • 配置字段:
      • name字段:用于指定servelet处理请求的类名。相当于web.xml中的servlet-name标签。
      • value字段:用于指定浏览器访问路径。相当于web.xml中的url-pattern标签。
        • value字段本质是一个字符串数组,因此可以在value字段中以初始化字符串数组的方式,配置多个访问路径。
        • 可以使用urlPattern字段代替value字段:urlPattern=[{]"decName1"[,...,"decNameN"][}]。
  • 配置说明:
    • 配置web.xml就不用配置@WebServle()注解,配置注解就不用配置web.xml;
    • 二者同时配置时,web.xml与注解同时起作用。(待验证)

二、Servelet程序调用过程(即在服务器端执行过程):

  • 具体过程:
    • 服务器接收浏览器发出的请求->创建request对象和response对象。
      • 通过Host:请求头获取到虚拟主机名
      • 通过请求行获取要访问的web应用
      • 通过资源路径获取访问资源相对路径
      • 与web.xml文件中的url-pattern标签比较,如果存在,则查找处理类并通过反射构造该类对象RefObj。如果不存在则返回404。
      • tomcat将请求行、请求头、请求内容封装成请求对象request;通过反射类doGet()/doPost()方法,服务器响应封装成响应对象response。
    • ->调用RefObj.service(request,response);将response中获取要发送给浏览器的数据按照Http协议规定方式组成响应消息,再发送给浏览器形成http响应。
    • ->浏览器得到响应内容并解析至浏览器中。
  • request对象和response对象
    • request对象代表Http请求信息的对象。
    • response对象代表Http响应信息的对象。
    • 创建和销毁过程:
      • 当浏览器发请求服务器中的某个servelet时,tomcat会创建出request和response对象,之后将会调用Servelet中的service方法处理请求。
      • 其中request对象中封装浏览器发送给服务器的请求信息,包括:请求行、请求头和请求实体等。response对象将封装服务器要发送给浏览器的响应信息,包括:响应行、响应头和响应实体。
      • 在service方法执行完后,tomcat再将response中的数据取出,按照Http协议的格式发送给浏览器。
      • 每次浏览器访问tomcat,tomcat在调用service方法处理请求之前都会创建request和response对象。在请求处理完毕,响应结束时,tomcat会销毁request和response对象。

三、request对象

  • 作用:Servelet通过request对象获取浏览器提交的请求信息。

1.常用操作一:获取请求参数

(1)请求参数:

  • 概念:浏览器发送给服务器的数据称为请求参数。
  • 常见请求参数:通过表单向服务器提交数据或在浏览器地址栏url地址后面拼接的参数。
  • severlet处理方式:将浏览器提交的数据以key-value的方式存储在map中。

(2)获取请求参数:

  • request.getParameter(String ParamName);
    • 说明:
      • 针对单值参数,根据请求参数的名字,只会返回对应的value值。
      • 如果获取的参数有多个值,咐返回第一个值。
      • 如果获取一个不存在的参数,返回值为null.
  • request.getParameterValues(String ParamName);

(3)解决获取请求参数的乱码问题

  • 乱码产生的原因:
    • 如果是Get提交:
      • tomcat服务器版本为8.0及以上,Get提交不存在乱码问题。
      • tomcat服务器版本为7.0及以下,Get提交存在乱码问题。
        • 解决方式:在[tomcat安装目录]/conf/server.xml文件中的Connector标签上,添加一个URIEncoding="utf-8"属性。如下:<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="utf-8" />。
        • 如果eclipse开发时,需要在[eclipse]/Servers/[当前tomcat服务器对应的配置目录]、server.xml文件中的Connector标签添加URIEncoding="utf-8"属性。
    • 如果是Post提交:不管是tomcat哪个版本,都会出现乱码。
      • 原因:tomcat底层在接收Post请求提交的参数时,默认使用iso8859-1字符集,该字符集中不包含中文字符。当接收中文参数时,必将出现乱码。
      • 解决乱码:通知服务器在接收Post提交参数时,使用utf-8编码来接收。
        • 方法:request.setCharacterEncoding("utf-8");
        • 作用范围:该方法只对Post提交有效,不会影响Get提交。
        • 使用位置:该行代码一定要放在任何获取参数代码之前。

2.常用操作二:实现请求转发

(1)请求转发的概念:

  • 当浏览器访问服务器中的某一资源(A),资源(A)没有进行处理请求,而将请求转交给另外一个资源(B),由资源(B)对请求进行响应的过程叫做请求转发。

(2)请求转发的特点:

  • 一次请求,一次响应
  • 请求转发前后,地址栏不会发生变化。(A->B时,从访问A开始,到B响应结束,地址栏的地址一直指向A)。
  • 请求转发只能是同一个web应用内部的资源跳转(A->B时,A和B必须属于同一个Web应用)。
  • 和域对象配合,在转发时,可以带数据到目的地(A->时,A可以带数据给B,此时通常A为severlet,B为.jsp文件)。

(3)实现请求转发:

  • request.getRequestDispatcher(String url).forward(req,res);
  • 实现细节:
    • url必须是web.xml文件中要转发的servelet的servelet-mapping标签中url-pattern标签的内容。否则则会返回404。

3.常用操作三:配合作用域对象实现带数据转发

(1)作用域对象:如果一个对象具备可以被访问的范围,通过这个对象上的map集合可以在整个范围内实现数据的共享,这样的对象就叫做作用域对象。

(2)request域对象:request在实现转发时,通过request对象中的map集合共享数据,该request对象上map集合民及request对象所在的范围称为域对象。

(3)使用方法:request对象提供了往域对象中存储和获取数据的方法。

  • 存储的数据
    • 语法:
      • request.setAttribute(String keyName, Object value);
    • 说明:
      • 参数:
        • String keyName:指往request域中要存放的属性名。
        • Object value:指要存储的属性值。
  • 获取数据
    • 语法:request.getAttribute(Sting keyName);
    • 说明:
      • 参数:String keyName:指要获取request域中存放属性的属性名。

(4)request域对象的三大特征

  • 生命周期:伴随着request创建开始,直到request销毁而结束。
  • 作用范围:在一次请求范围内,都可以获取到同一个request对象。
  • 主要功能:和请求转发配合使用,从Servelet带数据到JSP(即数据目的地)。

(5)request对象getParameter方法与getAttribute方法的区别

  • 当获取请求参数时:
    • 参数是被封装成request对象的某个成员,需要通过request的getParameter()方法获取。参数的封装是由tomcat在封装request对象时完成。
    • 参数将被封装成request的域map集合的某个元素,需要通过request的getAttibute()方法获取。参数的封装是由程序员在doGet()方法完成的。参数值是由程序员自定义的。

(6)转发实现

  • 实现条件:只能在Get请求处理中使用。
  • 实现步骤:
    • 第一步:在处理请求的Servelet类中的doGet()方法中通过setAttribute()方法完成数据封装。并通过request.getRequestDispatcher(String url).forward(req,res);完成转发。
    • 第二步:在数据目的地通过request.getAttibute()方法获取解析数据。

四、response对象

作用:Servelet通过response对象将响应信息发送给浏览器。

1.常用操作一:向浏览器发送信息。

  • 实现方式:实现并维护一个PrintWriter对象。
    • 作用:该对象本质上是一个流。可以将该对象当作一个html编译器。把在html标签及属性以按照html语法格式,封装成一个字符串写入一个.html/.jsp文件。
  • 实现过程:
    • 第一步:创建并维护PrintWriter对象:PrintWriter out = response.getWriter();
    • 第二步:封装实参并写入目标文件:out.Println("<h1>内容</h1>");
  • 存在问题:会出现中文乱码。
    • 原因:服务器在通过response获取的流在发送数据时,默认使用的是iso8859-1字符集。
    • 解决方式:在发送响应数据前,通知服务器使用utf-8字符集。
      • 具体方法:在第一步前加入代码:response.setContentType("utf-8");

2.常用操作二:实现重定向。

  • 重定向概念:
    • 当浏览器向服务器发请求访问某一资源A时,资源A无法处理响应,而是通知浏览器需要再进一步请求别的资源B才能获取对应的资源,浏览器再次请求服务器中的资源B,最终由资源B响应浏览器的过程就叫重定向。
  • 重定向的特点:
    • 重定向是两次请求,两次响应。
    • 重定向前后,浏览器的地址栏的url会发生变化。(因为两次请求都是通过浏览器发起,浏览器知道跳转过程,造成url变化。
    • 重定向前后的request对象不是同一个(因为浏览器每次发送请求时,都会重新创建request对象。因此不能通过request带数据到目的地)。
    • 重定向前后的两个资源可以是来自不同的web应用,甚至可以是来自不同的服务器(进行跳转的两个资源之间没有限制)。
  • 重定向的实现:
    • 代码:response.sendRedirect("重定向资源的url");
    • 关于重定向资源的url:
      • 可以是同一web应用下的其它文件,如:fileName.fileType。
      • 可以是同一虚拟主机的其它web应用的资源,如:/webAppName/[resourceDecName/]fileName.filetype。
      • 可以是其它虚拟主机,如:http://www.baidu.com.

五、请求转发与请求重定向

(一)两者区别:

1.转发是一次请求,一次响应;重定向是两次转发,两次响应。

2.转发前后地址栏不会发生变化;重定向前后地址栏会发生变化。

3.转发前后request对象是同一个,可以使用域对象带数据至目标资源;重定向前后则不是,不能结合域对象带数据至目标文件。

4.转发要求两个资源必须属于同一个web应用;重定向则对两个资源无限制。

(二)两者选择:

1.希望对跳转资源无限制时,使用重定向。

2.希望在资源跳转间带数据时,使用转发。

3.如果仅仅是做一次跳转,没有其他要求时,推荐使用转发(可以减少对服务器的访问次数,减小服务器访问压力)。

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

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

相关文章

opencv - py_imgproc - py_houghlines and py_houghcircles 霍夫线和圆变换

文章目录 1.霍夫线变换目标理论 OpenCV 中的霍夫变换概率霍夫变换其他资源 2.霍夫圆变换目标理论 1.霍夫线变换 目标 在本章中&#xff0c; 我们将了解霍夫变换的概念。我们将了解如何使用它来检测图像中的线条。我们将看到以下函数&#xff1a;cv.HoughLines()、cv.HoughLi…

数据结构 ——— 用堆解决TOP-K问题

目录 何为TOP-K问题 用堆解决TOP-K问题 代码实现 何为TOP-K问题 比如&#xff1a;整个专业的前10名&#xff0c;世界500强&#xff0c;富豪榜&#xff0c;游戏中前100的活跃玩家等 对于 TOP-K 问题&#xff0c;能想到的最简单直接的方式就是排序 但是&#xff0c;如果数据…

开发之翼:划时代的原生鸿蒙应用市场开发者服务

前言 随着"纯血鸿蒙" HarmonyOS NEXT在原生鸿蒙之夜的正式发布&#xff0c;鸿蒙生态正以前所未有的速度蓬勃发展。据知已有超过15000个鸿蒙原生应用和元服务上架&#xff0c;覆盖18个行业&#xff0c;通用办公应用覆盖全国3800万多家企业。原生鸿蒙操作系统降低了接…

WAF+AI结合,雷池社区版的强大防守能力

网上攻击无处不不在&#xff0c;为了保护我自己的网站&#xff0c;搜索安装了一个开源免费的WAF 刚安装完成就收到了海外的攻击&#xff0c;看到是海外的自动化攻击工具做的 雷池刚好也有AI分析&#xff0c;于是就尝试使用这个功能&#xff0c;看看这个ai能力到底怎么样 以下…

Elasticsearch —— ES 环境搭建、概念、基本操作、文档操作、SpringBoot继承ES

文章中会用到的文件&#xff0c;如果官网下不了可以在这下 链接: https://pan.baidu.com/s/1SeRdqLo0E0CmaVJdoZs_nQ?pwdxr76 提取码: xr76 一、 ES 环境搭建 注&#xff1a;环境搭建过程中的命令窗口不能关闭&#xff0c;关闭了服务就会关闭&#xff08;除了修改设置后重启的…

CSP2024 游记

又是一年 CSP。。。 10 月 5 日&#xff0c;终于过 S 初赛了。。。 然后开始漫长的备战。。 在考试开始前 1 day&#xff0c;我还在兢兢业业地学习图论。然后发现没有考。。。 10 月 25 日下午 15:30&#xff0c;来到 CQBS 试机。我想&#xff0c;怎么测试性能呢&#xff1…

opencv - py_imgproc - py_grabcut GrabCut 算法提取前景

文章目录 使用 GrabCut 算法进行交互式前景提取目标理论演示 使用 GrabCut 算法进行交互式前景提取 目标 在本章中 我们将了解 GrabCut 算法如何提取图像中的前景我们将为此创建一个交互式应用程序。 理论 GrabCut 算法由英国剑桥微软研究院的 Carsten Rother、Vladimir K…

视频制作软件新手必备:8款剪辑工具剪辑思路分享!

随着视频的高度发展&#xff0c;视频已成为一种重要的工具&#xff0c;用以学习娱乐、记录生活点滴以及传递各类信息。不论是制作个人MV、进行企业宣传&#xff0c;还是创作短视频内容&#xff0c;拥有一款功能恰当的视频剪辑软件都显得至关重要。对于初学者而言&#xff0c;选…

无人机避障——路径规划篇(一) JPS跳点搜索算法A*算法对比

JSP 跳点搜索算法与改进 A*算法对比 一、算法概述: 跳点搜索(Jump Point Search,JPS)算法:一种用于路径规划的启发式搜索算法。它主要用于在网格地图(如游戏地图、机器人运动规划地图等)中快速找到从起点到终点的最短路径。该算法在改进 A*算法的基础上进行了优化,通过跳过一…

解决Linux安装Anaconda后出现的conda: command not found问题

参考链接&#xff1a;解决Linux安装Anaconda后出现的conda: command not found问题-百度开发者中心

AI直播带货场景切换模块的搭建!

AI直播带货&#xff0c;作为电商领域的新宠&#xff0c;正以其独特的魅力和高效的营销手段&#xff0c;引领着销售模式的新变革。 在AI直播带货中&#xff0c;场景切换模块是不可或缺的一部分&#xff0c;它不仅能够提升观众的观看体验&#xff0c;还能更好地展示商品&#xf…

15 Docker容器存储架构:docker存储驱动简介

文章目录 一、Docker 存储驱动探索1.1 存储驱动1.2 存储驱动方式1.3 非持久化存储1.4 持久化存储一、Docker 存储驱动探索 1.1 存储驱动 Storage driver处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户提供了多层数据合并后的统一视图。 [superman@docker ~]$…

Aicbo:一键生成高质量画作,适合初学者的AI绘画助手

越来越多的智能工具开始进入人们的视野&#xff0c;它们不仅简化了创作流程&#xff0c;还极大地提高了作品的质量。在这一背景下&#xff0c;Aicbo作为一款新兴的AI绘画工具&#xff0c;以其独特的优势和免费试用的政策&#xff0c;迅速获得了广泛的关注和好评。本文将从多个角…

STM32 从0开始系统学习5

目录 STM32 GPIO输入的四种模式 Practice And Usage 练习与封装 Detailed And Reference 更加具体的说明 输入浮空模式 输入上拉模式 输入下拉模式 模拟功能 我们下面聊一聊输入的事情&#xff0c;输入指的是我们的处理器从外部端口接受外设发过来的信号。在我们没有接…

使用Git进行版本控制的最佳实践

文章目录 Git简介基本概念仓库&#xff08;Repository&#xff09;提交&#xff08;Commit&#xff09;分支&#xff08;Branching&#xff09; 常用命令初始化仓库添加文件提交修改查看状态克隆仓库分支操作合并分支推送更改 最佳实践使用有意义的提交信息定期推送至远程仓库使…

冒泡排序和二分查找--go

冒泡排序的逻辑 二分查找的逻辑 func bubbleSort(arr *[5]int){//冒泡排序fmt.Println(*arr)temp : 0for j : len(*arr); j > 0; j-- {for i : 0; i < j-1; i {temp (*arr)[i]if((*arr)[i] > (*arr)[i1]){(*arr)[i] (*arr)[i1](*arr)[i1] temp}}} }func binaryF…

flutter区别于vue的写法

View.dart 页面渲染&#xff1a; 类似于vue里面使用 <template> <div> <span> <textarea>等标签绘制页面, flutter 里面则是使用不同的控件来绘制页面 样式 与传统vue不同的是 flutter里面没有css/scss样式表&#xff0c; Flutter的理念是万物皆…

电影《焚城》全国上映 王丹妮诠释新时代女性力量

今日&#xff0c;电影《焚城》全国上映&#xff0c;该片由刘德华、白宇、莫文蔚和王丹妮主演&#xff0c;以一场由高强度放射性物质铯137泄漏引发的城市灾难为背景&#xff0c;深刻描绘了人们在生死存亡关头的抉择与抗争。 王丹妮在片中饰演飒爽独立、智慧勇敢的消防队长Madam …

uniapp:启动界面关闭时长控制

代码控制关闭启动界面 App启动后不会自动关闭启动界面&#xff0c;需要在代码中调用plus.navigator.closeSplashscreen关闭启动界面。"app-plus" : {"splashscreen" : {"alwaysShowBeforeRender" : false,"autoclose" : false,}, }很多…

Three.js 快速入门构建你的第一个 3D 应用

![ 开发领域&#xff1a;前端开发 | AI 应用 | Web3D | 元宇宙 技术栈&#xff1a;JavaScript、React、Three.js、WebGL、Go 经验经验&#xff1a;6年 前端开发经验&#xff0c;专注于图形渲染和AI技术 开源项目&#xff1a;github 晓智元宇宙、数字孪生引擎、前端面试题 大家好…