21.Servlet 技术

news2024/11/25 1:00:20

JavaWeb应用的概念

在Sun的Java Servlet规范中,对Java Web应用作了这样定义:“Java Web应用由一组Servlet、HTML页、类、以及其它可以被绑定的资源构成。它可以在各种供应商提供的实现Servlet规范的 Servlet容器 中运行。”
Java Web应用中可以包含如下内容:
• Servlet
• JSP
• 实用类
• 静态文档如HTML、图片等
• 描述Web应用的信息(web.xml)

Servelt 与 Servlet 容器

在这里插入图片描述

Servlet容器的概念

Servlet容器为JavaWeb应用提供运行时环境,它负责管理Servlet和JSP的生命周期,以及管理它们的共享数据。Servlet容器也称为JavaWeb应用容器,或者Servlet/JSP容器。
目前最流行的Servlet容器软件括:
• Tomcat
• Resin
• J2EE服务器(如Weblogic)中也提供了内置的Servlet容器

Servlet 简介

Java Servlet是和平台无关的服务器端组件,它运行在Servlet容器中。Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户的通信采用“请求/响应”的模式。
Servlet可完成如下功能:
• 处理请求;
• 发出响应

Servlet容器响应客户请求的过程

在这里插入图片描述

ServletAPI

在这里插入图片描述

Servlet 创建的三种方式

实现 Servlet 接口
在这里插入图片描述

继承 HttpServlet 类
在这里插入图片描述

继承 GenericServlet 类(几乎不用)
在这里插入图片描述

Servlet的注册与运行

• Servlet程序必须通过Servlet容器来启动运行,并且储存目录有特殊要求,通需要存储在<WEB应用程序目录>\WEB-INF\classes\目录中。
• Servlet程序必须在WEB应用程序的web.xml文件中进行注册和映射其访问路径,才可以被Servlet引擎加载和被外界访问。
• 一个元素用于注册一个Servlet,它包含有两个主要的子元素:和,分别用于设置Servlet的注册名称和Servlet的完整类名。
• 一个元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素:和,分别用于指定Servlet的注册名称和Servlet的对外访问路径。
在这里插入图片描述

Servlet映射的细节

• 同一个Servlet可以被映射到多个URL上,即多个元素的子元素的设置值可以是同一个Servlet的注册名。
• 在Servlet映射到的URL中也可以使用通配符,但是只能有两种固定的格式:一种格式是“.扩展名”,另一种格式是以正斜杠(/)开头并以“/*”结尾。

Servlet容器响应客户请求的过程

• ①Servlet引擎检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。
• ②装载并创建该Servlet的一个实例对象:调用该 Servlet 的构造器
• ③调用Servlet实例对象的init()方法。
• ④创建一个用于封装请求的ServletRequest对象和一个代表响应消息的ServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
• ⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。

Servlet对象生命周期

Servlet对象什么时候生,什么时候死.
生命周期相关的三个方法, init,service,destroy
• init(ServletConfig config)Servlet对象的初始化方法,对象被创建的时候调用
• service(request,response)客户端访问一次,执行一次
• destory()Servlet对象销毁之前调用
• Servlet对象什么时候被创建

  • Servlet默认第一次访问的时候,对象被创建
  • Tomcat服务器启动的时候创建对象,需要修改web.xml (一般不配置)(5)

• Servlet对象什么时候被销毁

  • 停止Tomcat服务器
  • WEB项目从服务器移除

ServletConfig 接口

• Servlet在有些情况下可能需要访问Servlet容器或借助Servlet容器访问外部的资源,所以,Serlvet引擎需要将表示Servlet容器的对象传递给Servlet。另外,在web.xml文件中为某个Servlet设置的友好名称和初始化参数等信息也需要传递给该Servlet
• Servlet引擎将代表Servlet容器的对象(ServletContext)和Servlet的配置参数信息一并封装到一个称为ServletConfig的对象中,并在初始化Servlet实例对象时传递给该Servlet。ServletConfig接口则用于定义ServletConfig对象需要对外提供的方法,以便在Servlet程序中可以调用这些方法来获取有关信息。
• Servlet引擎调用Servlet的实例对象的init(ServletConfig config)方法将ServletConfig对象传递给Servlet。Servlet.getServletConfig()方法必须返回init(ServletConfig config)方法传递进来的这个ServletConfig对象的引用。

配置 Serlvet 的初始化参数
<servlet>
		<servlet-name>helloServlet</servlet-name>
		<servlet-class>com.javaweb.HelloServlet</servlet-class>
		<!-- 配置 Serlvet 的初始化参数。 且节点必须在 load-on-startup 节点的前面 -->
		<init-param>
			<!-- 参数名 -->
			<param-name>user</param-name>
			<!-- 参数值 -->
			<param-value>root</param-value>
		</init-param>	
		<init-param>
			<param-name>password</param-name>
			<param-value>1230</param-value>
		</init-param>	
		<load-on-startup>-1</load-on-startup>	
	</servlet>

ServletConfig接口的方法

• getInitParameterNames() 获取某servlet中所有参数名字,返回值为Enumeration 对象
• getInitParameter(String name) 根据某参数名字获取对应的值
• getServletName(): 获取servlet名字
• getServletContext: 获取ServletContext对象

获取初始化参数
	String user = servletConfig.getInitParameter("user");
	System.out.println("user: " + user);
	
	Enumeration<String> names = servletConfig.getInitParameterNames();
	while(names.hasMoreElements()){
		String name = names.nextElement();
		String value = servletConfig.getInitParameter(name);
		System.out.println(name + ": " + value);
	}

ServletContext接口

• Servlet引擎为每个WEB应用程序都创建一个对应的ServletContext对象,ServletContext对象被包含在ServletConfig对象中,调用ServletConfig.getServletContext方法可以返回ServletContext对象的引用。
• 由于一个WEB应用程序中的所有Servlet都共享同一个ServletContext对象,所以,ServletContext对象被称之为 application 对象(Web应用程序对象)。
• 可以认为 SerlvetContext 是当前 WEB 应用的一个大管家. 可以从中获取到当前 WEB 应用的各个方面的信息.
• 功能:

  • 获取WEB应用程序的初始化参数
  • 记录日志
  • application域范围的属性
  • 访问资源文件
  • 获取虚拟路径所映射的本地路径
  • WEB应用程序之间的访问
  • ServletContext的其他方法
配置WEB应用程序的初始化参数

在web.xml文件的根元素中增加子元素,如下所示:

<context-param>
	<param-name>driver</param-name>
	<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
获取WEB应用程序的初始化参数
	//getInitParameter
	//getInitParameterNames
ServletContext servletContext = servletConfig.getServletContext();
		
String driver = servletContext.getInitParameter("driver");
System.out.println("driver:" + driver);

Enumeration<String> names2 = servletContext.getInitParameterNames();
while(names2.hasMoreElements()){
	String name = names2.nextElement();
	System.out.println("-->" + name); 
}
ServletContext接口其他方法

获取当前 WEB 应用的某一个文件在服务器上的绝对路径, 而不是部署前的路径:
String realPath = servletContext.getRealPath(“/note.txt”);
System.out.println(realPath);
获取当前 WEB 应用的名称:
String contextPath = servletContext.getContextPath();
ServletContext对象是一个容器,可以存储数据.
对象有个作用域问题,ServletContext作用域是整个WEB应用程序。
• 向域对象存储数据: setAttribute(String key, Object value)
• 取出域对象数据: Object getAttribute(String key)
• 移除域对象数据: removeAttribute(String key)
ServletContext context =servletConfig.getServletContext();
//域对象存储数据,键值对
context.setAttribute(“hello”,“java”);
//取出域对象存储的键值对
Object value = context.getAttribute(“hello”);

统计访问的次数

• 练习域对象ServletContext的使用
• 第一次访问Servlet的时候,数据1存储到域对象
• 第二次访问,从域中取出数据++,存储回去

	public void init() throws ServletException {
    	ServletContext context = getServletContext();
    	context.setAttribute("count",1);
	}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    ServletContext context = getServletContext();
    Integer count = (Integer) context.getAttribute("count");
    response.getWriter().print("welcome "+count);
    count++;
    context.setAttribute("count",count);
}
注解开发取代web.xml

@WebServlet,注解添加到自己定义的Servlet中的类声明上即可
注解的属性 urlPatterns,属性值就是浏览器的访问地址.
@WebServlet(urlPatterns = “/test”)

Request对象概述

Request对象获取客户端的请求数据, 接口ServletRequest,子接口HttpServletRequest继承ServletRequest.
HttpServletRequest接口的实现类是Tomcat引擎提供.

servlet请求方式GET/POST
Request对象获取请求行

• String getMethod() 获取提交的方式 (GET,POST)
• String getRequestURI() 获取请求的参数,请求服务器路径
• StringBuffer getRequestURL() 获取请求的参数,请求服务器路径
• String getQueryString()获取请求行 问号后面的参数 (GET)
• String getContextPath() 获取WEB应用名称

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //request对象方法 getMethod()获取客户端的请求方式
    String method = request.getMethod();
    System.out.println(method);
    //方法 String getRequestURI() 获取请求服务器路径
    //方法 StringBuffer getRequestURL() 获取请求服务器路径
    String URI = request.getRequestURI();
    StringBuffer URL = request.getRequestURL();
    System.out.println("URI=="+URI); 
    System.out.println("URL=="+URL);

    //方法 String getQueryString()获取请求行,?后面的所有参数
    String query = request.getQueryString();
    System.out.println(query);

    //获取WEB应用名称  String getContextPath()
    String path = request.getContextPath();
    System.out.println(path);
}
Request对象获取请求头

请求头数据格式键值对, k:v
指导性信息,指导服务器
• String getHeader(String key)返回对应键的值
• Enumeration getHeaderNames()

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    /*
     * request获取请求头
     */
     //方法  String getHeader(String key)
    String key = request.getHeader("Referer");
    System.out.println(key);
    /*
     * Enumeration getHeaderNames() 获取所有的请求头的键
     * 返回值Enumeration接口 (向量枚举)
     * 集合:1.0-1.1 Enumeration    集合1.2  迭代器
     * Iterator迭代器接口:  hasNext()   next()
     * Enumeration接口:  hasMoreElement()  nextElement()
     */
    Enumeration<String> enums  = request.getHeaderNames();
    while (enums.hasMoreElements()){
         key = enums.nextElement();
         String value = request.getHeader(key);
        System.out.println(key+"=="+value);
    }
}
Request获取请求参数

• String getParameter(“表单中的name值”)获取指定的请求参数
• String[] getParameterValues(“表单中的name值”)获取参数中的一键多值
• Map<String,String[]> getParameterMap()获取提交的所有参数

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    /*
     * request 获取客户端提交数据
     */
    //方法getParameter(String key)指定表单中的参数
    String username = request.getParameter("username");
    String password = request.getParameter("pass");
    System.out.println(username+"=="+password);

    //方法getParameterValues()获取一键多值  checkbox  radio
    String[] hobby = request.getParameterValues("hobby");
    System.out.println(Arrays.toString(hobby));
    System.out.println("=============");
    //方法 getParameterMap()获取提交的所有参数
    Map<String,String[]> map = request.getParameterMap();
    for (String key : map.keySet()){
        String[] value = map.get(key);
        System.out.println(key+"="+Arrays.toString(value));
    }
}
Request域对象

作用域: Request域对象的作用域比较小,范围是一次请求有效.
• 域对象存储数据: setArratibute(String key, Object value)
• 取出域对象数据: Object getAttribute(String key)
• 移除域对象数据: removeAttribute(String key)

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //向域对象 ,request 存储数据
    request.setAttribute("hello","java");
    //取出域对象数据
    Object value = request.getAttribute("hello");
    System.out.println("servlet1="+value);
}
Response对象概述

• 负责对浏览器进行响应的对象
• ServletResponse接口,HttpServletResponse接口继承自ServletResponse
• 使用的是子接口HttpServletResponse,此接口对象由Tomcat引擎提供
• 可以实现对客户端的响应, 响应行,响应头,响应体

Response设置响应行

• 设置状态码: setStatus(int 状态码)
response.setStatus(500);

Response设置响应头

HTTP协议的响应头,数据格式键值对 k:v
包含指导性信息,指导客户端
• addHeader(String key,String value)
• addIntHeader(String key,int value)
• addDateHeader(String key,long l)
• setHeader(String key,String value)
• setIntHeader(String key,int value)
• setDateHeader(String key,long l)

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    /*
     * response对象设置响应头
     */
    response.addHeader("hello","java");
  /*  response.addIntHeader("good",5);
    response.addDateHeader("date",System.currentTimeMillis());*/
    /*
     * addHeader() 添加,实现一个键对应多个值
     * setHeader() 设置,原来的键覆盖
     */
    response.setHeader("hello","java2222");
}
Response设置响应体

HTTP的响应体,就是页面的正文部分.
• getWriter() 返回值是打印流PrintWrite.

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      /*
       * response对象方法getWriter()
       * 打印流的响应体
       * write() 使用字符串数据,没有差别, 输出是整数,查询编码表
       * print() 无论是什么,原样打印
       */
       PrintWriter pw =  response.getWriter();
       pw.write(100);
       pw.print(100);
  }
响应中的中文乱码问题

产生乱码原因: 编码和解码不一致.
response.setContentType(“text/html;charset=UTF-8”);

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

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

相关文章

lua语法

lua语法 1.lua数据类型 lua 脚本输出乱码&#xff0c;将lua脚本改为UTF-8编码&#xff0c;并且需要DOS下修改代码页&#xff1a;CHCP 65001 即可。 基本语法 注释 print("script lua win")-- 单行注释--[[多行注释]]--标识符 类似于&#xff1a;java当中 变量、…

ASP.NET MVC+EntityFramework图片头像上传

1&#xff0c;先展示一下整体的效果 2&#xff0c;接下来展示用户添加以及上传头像代码、添加用户界面 前端代码如下&#xff1a; <div class"form-group">Html.LabelFor(model > model.img, "头像&#xff1a;", htmlAttributes: new { class &…

网络协议小记

一、TCP/IP协议 作为一个小萌新&#xff0c;当然我无法将tcp/ip协议的大部分江山和盘托出&#xff0c;但是其中很多面试可能问到的知识&#xff0c;我觉得有必要总结一下&#xff01; 首先&#xff0c;在学习tcp/ip协议之前&#xff0c;我们必须搞明白什么是tcp/ip协议。 1、…

IND-CCA DEM:AE AEAD

参考文献&#xff1a; [BN00] Bellare M, Namprempre C. Authenticated encryption: Relations among notions and analysis of the generic composition paradigm[C]//International Conference on the Theory and Application of Cryptology and Information Security. Berl…

网络安全之Linux环境配置及Linux基础知识讲解<三>

目录 一.下载安装Vmware二.下载安装Kali三.Linux目录结构四.Linux文件属性五.文件目录管理六.vim编辑器 一.下载安装Vmware Vmware官网&#xff1a;https://www.vmware.com 二.下载安装Kali Kali包含数百种工具&#xff0c;可用于各种信息安全任务&#xff0c;例如渗透测试、…

静态路由及动态路由

文章目录 静态路由及动态路由一、静态路由基础1. 静态路由配置2. 负载分担3. 路由备份4. 缺省路由5. 静态路由实操 二、RIP 动态路由协议1. RIP 协议概述2. RIP 协议版本对比2.1 有类路由及无类路由 3. RIP 路由协议原理4. RIP 计时器5. 度量值6. 收敛7. 示例 静态路由及动态路…

ADB:获取坐标

命令&#xff1a; adb shell getevent | grep -e "0035" -e "0036" adb shell getevent -l | grep -e "0035" -e "0036" 这一条正确&#xff0c;但是&#xff0c;grep给过滤了&#xff0c;导致没有输出 getevent -c 10 //输出10条信息…

【Apache-StreamPark】Flink 开发利器 StreamPark 的介绍、安装、使用

【Apache-StreamPark】Flink 开发利器 StreamPark 的介绍、安装、使用 1&#xff09;框架介绍与引入1.1.&#x1f680; 什么是 StreamPark1.2.&#x1f389; Features1.3.&#x1f3f3;‍&#x1f308; 组成部分1.4.引入 StreamPark 2&#xff09;安装部署2.1.环境要求2.2.Hado…

electron与cesium组件入门应用功能

electron与cesium组件入门应用功能 运行应用效果图&#xff1a; electron应用目录&#xff0c;需要包括三个文件: index.html main.js package.json (一)、创建一个新项目 目录名称&#xff1a;project_helloWolrd (二)、生成package.json文件 npm init --yes(三&#x…

Glycosaminoglycans Assay Kit(糖胺聚糖检测试剂盒)--Chondrex

糖胺聚糖&#xff08;glycosaminoglycans&#xff0c;GAGs&#xff09;是一种携带负电荷的多糖链&#xff0c;位于大多数结缔组织和许多不同类型细胞的细胞外基质&#xff08;extracellular matrices, ECM&#xff09;中以及细胞表面上。由重复双糖单位复合构成的糖胺聚糖可分为…

crash实战:手把手教你使用crash分析内核dump

Kdump是Linux的一种内核崩溃捕获机制&#xff0c;Linux内核遇到致命错误崩溃时会触发Kdump机制将崩溃时的现场保存下来&#xff0c;以便后续分析和故障排查。目前市面上有很多分析Kdump的工具&#xff0c;例如trace32, crash tool&#xff0c;本文介绍crash tool在手机领域的应…

mac电脑html文件 局域网访问

windows html文件 局域网访问 参考 https://blog.csdn.net/qq_38935512/article/details/103271291mac电脑html文件 局域网访问 开发工具vscode 安装vscode插件 Live Server 完成后打开项目的html 右键使用Live Server打开页面 效果如下&#xff0c;使用本地ip替换http://12…

Kafka发送流程

首先我们要将外部数据导入到集群&#xff0c;首先在main线程中创建producer 对象&#xff0c;调用send方法发送数据&#xff0c;拦截器为可选项&#xff0c;通过序列化器对数据序列化&#xff0c;因为需要跨节点通讯&#xff0c;分区器会对每个数据进行分区&#xff0c;发送到指…

深入浅出RPC:选取适合自己的RPC

文章目录 1、RPC概念&&背景1.1、RPC背景 1.2、RPC是什么&#xff0c;什么时候需要用到&#xff1f;2、进程间的通信 - IPC与RPC2.1、什么是IPC2.2、IPC与RPC联系 3、RPC的实现3.1、RPC实现的基本思路3.2、RPC实现的扩展方向 4、RPC的选择 1、RPC概念&&背景 1.…

基于ssm大学学术交流论坛论文

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于大学学术交流论坛当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了大学学术交流论坛的发展&#xff0c;它彻底改…

爬虫国密加密案例:某医保服务

声明&#xff1a; 该文章为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;违者后果自负&#xff0c;由此产生的一切后果均与作者无关 一、找出需要加密的参数 js运行 atob(‘aHR0cHM6Ly9mdXd1Lm5oc2EuZ292LmNuL25hdGlvbmFsSGFsbFN0LyMvc2VhcmNoL21lZGljYWw/Y29…

无框架Java转go语言写http与tcp请求

项目地址 https://github.com/cmdch2017/http_tcpServer 项目结构 如何快速上手 http篇 1、controller包就相当于RestController&#xff0c;这里返回了一个Person对象&#xff0c;当你需要新建一个接口时&#xff0c;再新写一个func仿照下面的方法就行了 package control…

送奶APP开发:终极指南

您是否有兴趣使用新鲜牛奶和乳制品&#xff0c;但不想每天早上去乳制品店或最近的商店&#xff1f;借助技术&#xff0c;订购日常用品&#xff08;例如杂货和牛奶&#xff09;变得更加简单。 DailyMoo 是最受欢迎的送奶应用&#xff0c;收入达数百万人民币。因此&#xff0c;投…

vue门户设计器实现技术方案

一、什么是门户设计器 门户设计器是一种用于创建和设计门户网站或者应用系统首页的工具。它通常是一个软件应用程序&#xff0c;可以帮助用户快速、轻松地设计和构建自己的门户网站或者应用系统的首页。门户设计器通常提供在线拖拉拽设计器&#xff0c;以及各种模板、主题和组…

多项目同时跑多个node版本-比nvm好用的volta

开发环境中多个项目需要node版本不同&#xff0c;且同时不止是一个项目在开发中&#xff0c;用了nvm进行node版本管理和切换&#xff0c;但是太麻烦了。新的解决方案volta可以比较好的处理这种情况 Volta 官网先挂出来&#xff1a;https://volta.sh/ 1、volta是什么&#xff…