Servlet框架

简介

        Servlet是运行在web服务器或应用服务器上的程序,他是作为来自web浏览器或其他http客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。

        使用Servlet可以手机来自网页表单的用户输入,呈现来自数据库或者其他源记录,还可以动态创建网页。

Servlet生命周期

Servlet生命周期可被定义为从创建到毁灭的整个过程。以下是Servlet遵循的过程:

servlet通过调用init()方法进行初始化

servlet通过service()方法来处理客户端的请求

servlet通过调用destroy()方法终止

最后,servlet是由JVM的垃圾回收器进行垃圾回收的

init()方法

        init方法被设计成只调用一次。他在第一次创建Servlet时被调用,在后续每次用户请求时不在调用。因此,它是用于一次性初始化。

        当用户调用一个Servlet时,就会创建一个Servlet实例,每个用户都会产生一个新的线程,适当的时候移交给doGet或doPost方法。init()方法简单地创建或加载一些数据,这些数据将被用于Servlet的整个生命周期。

init方法定义如下:

public void init() throws ServletException {// 初始化代码...
}

service()方法

        service()方法是执行实际任务的主要方法。Servlet容器调用service()方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。

        每次服务器接收到一个Servlet请求时,服务器会产生一个新的线程并调用服务。service()方法检查Http请求类型(GET、POST、PUT、DELETE等),并在适当的时候调用doGet、doPost、doPut、doDelete等方法。

下面是该方法的特征:

public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException{//......
}

        service()方法由容器调用,service方法在适当的时候调用doGet等方法,所以,可以不用对service()方法做任何动作,只需要根据来自客户端的请求类型来重载doGet()或doPost()即可。

doGet()方法

        GET请求来自于一个URL的正常请求,或者来自一个未指定METHOD的HTML表单,它由doGet()方法处理。

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// Servlet 代码
}

doPost()方法

POST请求来自于一个特定指定了METHOD为POST的HTML表单,它由doPost()方法处理。

public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// Servlet 代码
}

destroy()方法

        destroy()方法只会被调用一次,在Servlet生命周期结束时被调用。destroy()方法可以让Servlet关闭数据库连接、停止后台线程、把cookie列表或点击计数器写入到磁盘,并执行其他类似的清理活动。

在调用destroy()方法后,servlet对象被标记为垃圾回收。destroy方法定义如下:

  public void destroy() {// 终止化代码...}

Servlet实例

        Servlet是服务Http请求并实现Servlet接口的Java类,Web应用程序开发人员通常编写Servlet来拓展HttpServlet,并直线Servlet接口的抽象类专门来处理Http请求。

Hello World示例代码

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;// 扩展 HttpServlet 类
public class HelloWorld extends HttpServlet {private String message;public void init() throws ServletException{// 执行必需的初始化message = "Hello World";}public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException{// 设置响应内容类型response.setContentType("text/HTML");// 实际的逻辑是在这里PrintWriter out = response.getWriter();out.println("<h1>" + message + "</h1>");}public void destroy(){// 什么也不做}
}

其次,需要一个web目录,如下所示(如果没有就自己创建一个)

在web.xml文件中创建以下条目:

<servlet><servlet-name>HelloWorld</servlet-name><servlet-class>HelloWorld</servlet-class>
</servlet><servlet-mapping><servlet-name>HelloWorld</servlet-name><url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>

然后只需要在idea中配置并启动Tomcat,最后在浏览器的地址栏中输入http://localhost:8080/HelloWorld,会出现以下结果

Servlet表单数据

        当需要传递一些信息,从浏览器到web服务器最后到后台程序时,浏览器提供了两种方法实现传递,分别为GET方法和POST方法。

GET方法

        GET方法向页面请求发送已编码的用户信息。页面和已编码的信息中间用?字符分割,如下所示:

Http://www.test.com/hello?key1=value1&key2=value2

        GET方法是默认的从浏览器向web服务传递信息的方法,它会产生一个很长的字符串,出现在浏览器的地址栏中。如果要向服务器传递的时密码或其他敏感信息时,不要使用GET方法。GET方法有大小限制:请求字符串中最多只能有1024个字符。

        这些信息使用QUERY_STRING头传递,并可以通过QUERY_STRING环境变量访问,Servlet使用doGet()方法处理这种类型的请求。

POST方法

        另一个向后台程序传递信息的比较可靠的方法是POST方法。POST方法打包信息的方式于GET方法基本相同,但是POST方法不是把信息作为URL中?字符后的文本字符串进行发送,而是把这些信息作为一个单独的消息。消息以标准输出的形式传到后台程序,可以解析和使用这些标准输出。Servlet使用doPost()方法处理这种类型的请求。

使用Servlet读取表单数据

Servlet处理表单数据,这些数据会根据不同的情况使用不同的方法自动解析:

getParameter():可以调用request.getParameter()方法获取表单参数的值。

getParameterValues():如果参数出现一次以上,则调用该方法,并返回多个值,例如复选框。

getParameterNames():如果想要得到请求中的所有参数的完整列表,则调用该方法。

使用URL的GET方法实例

例如:使用GET方法向HelloForm程序传递两个值

http://localhost:8080/HelloForm?first_name=ZARA&last_name=ALI

下面是处理Web浏览器输入的HelloForm.java Servlet程序。使用getParameter()方法,可以很容易的访问传递的信息:

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;// 扩展 HttpServlet 类
public class HelloForm extends HttpServlet {public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException{// 设置响应内容类型response.setContentType("text/HTML");PrintWriter out = response.getWriter();String title = "使用 GET 方法读取表单数据";String docType ="<!doctype html public \"-//w3c//dtd html 4.0 " +       "transitional//en\">\n";out.println(docType +"<html>\n" +"<head><title>" + title + "</title></head>\n" +"<body bgcolor=\"#f0f0f0\">\n" +"<h1 align=\"center\">" + title + "</h1>\n" +"<ul>\n" +"  <li><b>名字</b>:"+ request.getParameter("first_name") + "\n" +"  <li><b>姓氏</b>:"+ request.getParameter("last_name") + "\n" +"</ul>\n" +"</body></html>");}
}

同时还要在web.xml中配置相应的信息

 <servlet><servlet-name>HelloForm</servlet-name><servlet-class>HelloForm</servlet-class>
</servlet><servlet-mapping><servlet-name>HelloForm</servlet-name><url-pattern>/HelloForm</url-pattern>
</servlet-mapping>

启动Tomcat服务器,再在浏览器的地址栏中输入

http://localhost:8080/HelloForm?first_name=ZARA&last_name=ALI。

使用表单的GET方法实例

定义hello.html来利用表单和提交按钮传递两个值,使用Servlet HelloForm来处理。

<html>
<body>
<form action="HelloForm" method="GET">
名字:<input type="text" name="first_name">
<br />
姓氏:<input type="text" name="last_name" />
<input type="submit" value="提交" />
</form>
</body>
</html>

访问http://localhost:8080/hello.html,会出现表单的实际输出。

输入姓名和姓氏,然后点击提交按钮,可以在本机上查看输出结果。

使用表单的POST方法实例

对上述Servlet做一些修改,使其可以处理GET和POST方法。

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;// 扩展 HttpServlet 类
public class HelloForm extends HttpServlet {// 处理 GET 方法请求的方法public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException{// 设置响应内容类型response.setContentType("text/html");PrintWriter out = response.getWriter();String title = "Using GET Method to Read Form Data";String docType ="<!doctype html public \"-//w3c//dtd html 4.0 " +       "transitional//en\">\n";out.println(docType +"<html>\n" +"<head><title>" + title + "</title></head>\n" +"<body bgcolor=\"#f0f0f0\">\n" +"<h1 align=\"center\">" + title + "</h1>\n" +"<ul>\n" +"  <li><b>名字</b>:"+ request.getParameter("first_name") + "\n" +"  <li><b>姓氏</b>:"+ request.getParameter("last_name") + "\n" +"</ul>\n" +"</body></html>");}// 处理 POST 方法请求的方法public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}

编写带有POST方法的Hello.html,进行测试。

<html>
<body>
<form action="HelloForm" method="POST">
名字:<input type="text" name="first_name">
<br />
姓氏:<input type="text" name="last_name" />
<input type="submit" value="提交" />
</form>
</body>
</html>

同样输入姓名和姓氏,点击提交后,可在本机上查看输出信息。

将复选框数据传递到Servlet程序

当需要选择一个以上的选项时,则使用复选框。

下面CheckBox.html是一个带有两个复选框的表单。

<html>
<body>
<form action="CheckBox" method="POST" target="_blank">
<input type="checkbox" name="maths" checked="checked" /> 数学
<input type="checkbox" name="physics"  /> 物理
<input type="checkbox" name="chemistry" checked="checked" /> 化学
<input type="submit" value="选择学科" />
</form>
</body>
</html>

下面是一个CheckBox.java Servlet程序,用来处理web浏览器给出的复选框输入。

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;// 扩展 HttpServlet 类
public class CheckBox extends HttpServlet {// 处理 GET 方法请求的方法public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException{// 设置响应内容类型response.setContentType("text/html");PrintWriter out = response.getWriter();String title = "读取复选框数据";String docType ="<!doctype html public \"-//w3c//dtd html 4.0 " +       "transitional//en\">\n";out.println(docType +"<html>\n" +"<head><title>" + title + "</title></head>\n" +"<body bgcolor=\"#f0f0f0\">\n" +"<h1 align=\"center\">" + title + "</h1>\n" +"<ul>\n" +"  <li><b>数学标识:</b>: "+ request.getParameter("maths") + "\n" +"  <li><b>物理标识:</b>: "+ request.getParameter("physics") + "\n" +"  <li><b>化学标识:</b>: "+ request.getParameter("chemistry") + "\n" +"</ul>\n" +"</body></html>");}// 处理 POST 方法请求的方法public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}

读取所有表单参数

        使用HttpServletRequest的getParameterNames()方法读取所有可用的表单参数。该方法返回一个枚举,其中包含未指定顺序的参数名。

        可以用标准方式循环枚举,使用hasMoreElements()方法来确定何时停止,使用nextElement()方法来获取每个参数的名称。

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;// 扩展 HttpServlet 类
public class ReadParams extends HttpServlet {// 处理 GET 方法请求的方法public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException{// 设置响应内容类型response.setContentType("text/html");PrintWriter out = response.getWriter();String title = "读取所有的表单数据";String docType ="<!doctype html public \"-//w3c//dtd html 4.0 " +       "transitional//en\">\n";out.println(docType +"<html>\n" +"<head><title>" + title + "</title></head>\n" +"<body bgcolor=\"#f0f0f0\">\n" +"<h1 align=\"center\">" + title + "</h1>\n" +"<table width=\"100%\" border=\"1\" align=\"center\">\n" +"<tr bgcolor=\"#949494\">\n" +"<th>参数名称</th><th>参数值</th>\n"+"</tr>\n");Enumeration paramNames = request.getParameterNames();while(paramNames.hasMoreElements()) {String paramName = (String)paramNames.nextElement();out.print("<tr><td>" + paramName + "</td>\n<td>");String[] paramValues =request.getParameterValues(paramName);// 读取单个值的数据if (paramValues.length == 1) {String paramValue = paramValues[0];if (paramValue.length() == 0)out.println("<i>No Value</i>");elseout.println(paramValue);} else {// 读取多个值的数据out.println("<ul>");for(int i=0; i < paramValues.length; i++) {                 out.println("<li>" + paramValues[i]);}out.println("</ul>");}}out.println("</tr>\n</table>\n</body></html>");}// 处理 POST 方法请求的方法public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}

通过以下表单尝试上面的Servlet:

<html>
<body>
<form action="ReadParams" method="POST" target="_blank">
<input type="checkbox" name="maths" checked="checked" /> 数学
<input type="checkbox" name="physics"  /> 物理
<input type="checkbox" name="chemistry" checked="checked" /> 化学
<input type="submit" value="选择学科" />
</form>
</body>
</html>

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

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

相关文章

解决网络ping不通问题

网络ping不通可能有多种原因&#xff0c;以下是一些常见的解决方法&#xff1a; 1. 检查IP地址和域名&#xff1a;确保你使用的是正确的IP地址或者域名来ping目标设备。如果IP地址或者域名错误&#xff0c;ping请求将无法到达目标设备。 2. 检查网络连接&#xff1a;首先确保…

【LeetCode刷题】153. 寻找旋转排序数组中的最小值

1. 题目链接2. 题目描述3. 解题方法4. 代码 1. 题目链接 153. 寻找旋转排序数组中的最小值 2. 题目描述 3. 解题方法 根据题目分析&#xff0c;可以明确一点&#xff0c;无论该数组如何旋转&#xff0c;都会有这样的一个性质&#xff0c;就是nums[0] > nums[n-1]&#xf…

RK3568 学习笔记 : u-boot 千兆网络无法 ping 通PC问题的解决方法二

参考 RK3568 学习笔记 : u-boot 千兆网络无法 ping 通PC问题的解决 前言 rk3568 rockchip 提供的 u-boot&#xff0c;默认的设备树需要读取 单独分区 resouce.img 镜像中的 设备树文件&#xff0c;也就是 Linux 内核的设备树 dtb 文件&#xff0c;gmac 网络才能正常的 ping 通…

STM32F1之FLASH闪存

目录 1. 简介 2. 闪存模块组织 3. FLASH基本结构 4. FLASH解锁 5. 使用指针访问存储器 6. 程序存储器全擦除 7. 程序存储器页擦除 8. 程序存储器编程 9. 选项字节 1. 简介 STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分&#xff0c;通过…

【Android】Android应用性能优化总结

AndroidApp应用性能优化总结 最近大半年的时间里&#xff0c;大部分投在了某国内新能源汽车的某款AndroidApp开发上。 由于该App是该款车上&#xff0c;常用重点应用。所以车厂对应用性能的要求比较高。 主要包括&#xff1a; 应用冷启动达到***ms。应用热(温)启动达到***ms应…

RK3568笔记二十四:基于Flask的网页监控系统

若该文为原创文章&#xff0c;转载请注明原文出处。 此实验参考 《鲁班猫监控检测》&#xff0c;原代码有点BUG&#xff0c;已经下载不了。2. 鲁班猫监控检测 — [野火]嵌入式AI应用开发实战指南—基于LubanCat-RK系列板卡 文档 (embedfire.com) 一、简介 记录简单的摄像头监…

易语言IDE界面美化支持库

易语言IDE界面美化支持库 下载下来可以看到&#xff0c;是一个压缩包。 那么&#xff0c;怎么安装到易语言中呢&#xff1f; 解压之后&#xff0c;得到这两个文件。 直接将clr和lib丢到易语言安装目录中&#xff0c;这样子就安装完成了。 打开易语言&#xff0c;在支持库配置…

在营销的世界,你一定要记住:营满,则销

营销的世界中,有一个非常重要的一件事,这几个字一定要记住: 营满,则销;营未满,则不销。 你有没有把握,这是一个没办法可以复杂的东西,真得看营销人的直觉,营跟销是独立的两件事,营在营势,销是自然而然的。这里, 什么样的客户,看到什么样的产品。会有什么样的抗…

HCIP的学习(11)

OSPF的LSA详解 LSA头部信息 ​ [r2]display ospf lsdb router 1.1.1.1----查看OSPF某一条LSA的详细信息&#xff0c;类型以及LS ID参数。 链路状态老化时间 指一条LSA的老化时间&#xff0c;即存在了多长时间。当一条LSA被始发路由器产生时&#xff0c;该参数值被设定为0之后…

32 OpenCV Harris角点检测

文章目录 cornerHarris 算子示例 角点检测 cornerHarris 算子 void cv::cornerHarris ( InputArray src,OutputArray dst,int blockSize,int ksize,double K,int borderType BORDER_DEFAULT) src:待检测Harris角点的输入图像&#xff0c;图像必须是CV 8U或者CV 32F的单通道…

Maven 在项目的 pom.xml 文件中 指定 阿里云的景象仓库

配置 在 项目的 pom.xml 文件中添加如下配置即可 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&…

【Unity】位图字体制作工具:蒲公英

一般来讲&#xff0c;如果需要制作位图字体&#xff0c;一般是使用 BMFont 这种第三方工具&#xff1a;BMFont - AngelCode.comhttp://www.angelcode.com/products/bmfont/ 然而这个工具对于非程序员来说&#xff0c;操作起来较为繁琐困难。每次美术修改了字体之后&…

【区块链】比特币架构

比特币架构 2009年1月&#xff0c;在比特币系统论文发表两个月之后&#xff0c;比特币系统正式运行并开放了源码&#xff0c;标志着比特币网络的正式诞生。通过其构建的一个公开透明、去中心化、防篡改的账本系统&#xff0c;比特币开展了一场规模空前的加密数字货币体验。在区…

C++手写协程项目(协程实现线程结构体、线程调度器定义,线程挂起、切换、恢复函数,模块测试)

协程结构体定义 之前我们使用linux下协程函数实现了线程切换&#xff0c;使用的是ucontext_t结构体&#xff0c;和基于这个结构体的四个函数。现在我们要用这些工具来实现我们自己的一个线程结构体&#xff0c;并实现线程调度和线程切换、挂起。 首先我们来实现以下线程结构体…

Linux常用软件安装(JDK、MySQL、Tomcat、Redis)

目录 一、上传与下载工具Filezilla1. filezilla官网 二、JDK安装1. 在opt中创建JDK目录2.上传JDK压缩文件到新建目录中3.卸载系统自代jdk4.安装JDK5.JDK环境变量配置6. 验证是否安装成功 三、安装MySQL1.创建mysql文件夹2.下载mysql安装压缩包3.上传到文件夹里面4. 卸载系统自带…

ThreeJS:光线投射与3D场景交互

光线投射Raycaster 光线投射详细介绍可参考&#xff1a;https://en.wikipedia.org/wiki/Ray_casting&#xff0c; ThreeJS中&#xff0c;提供了Raycaster类&#xff0c;用于进行鼠标拾取&#xff0c;即&#xff1a;当三维场景中鼠标移动时&#xff0c;利用光线投射&#xff0c;…

SpringCloudAlibaba:4.1云原生网关higress的搭建

概述 简介 Higress是基于阿里内部的Envoy Gateway实践沉淀、以开源Istio Envoy为核心构建的下一代云原生网关&#xff0c; 实现了流量网关 微服务网关 安全网关三合一的高集成能力&#xff0c;深度集成Dubbo、Nacos、Sentinel等微服务技术栈 定位 在虚拟化时期的微服务架构…

【DevOps】Jenkins 集成Docker

目录 1. 安装 Docker 和 Jenkins 2. 在 Jenkins 中安装 Docker 插件 3. 配置 Docker 连接 4. 创建 Jenkins Pipeline 5. 示例 Pipeline 脚本 6. 运行 Jenkins Job 7. 扩展功能 8、docker配置测试连接的时候报错处理 将 Docker 与 Jenkins 集成可以实现持续集成和持续交…

目标检测正负样本区分和平衡

1、正负样本定义 rpn和rcnn的正负样本定义都是基于MaxIoUAssigner&#xff0c;只不过定义阈值不一样而已。 MaxIoUAssigner的操作包括4个步骤&#xff1a; 首先初始化时候假设每个anchor的mask都是-1&#xff0c;表示都是忽略anchor 将每个anchor和所有gt的iou的最大Iou小于…

如何为 Nestjs 编写单元测试和 E2E 测试

前言 最近在给一个 nestjs 项目写单元测试&#xff08;Unit Testing&#xff09;和 e2e 测试&#xff08;End-to-End Testing&#xff0c;端到端测试&#xff0c;简称 e2e 测试&#xff09;&#xff0c;这是我第一次给后端项目写测试&#xff0c;发现和之前给前端项目写测试还…