首页 > 其他分享 >servlet对象

servlet对象

时间:2023-07-28 09:14:41浏览次数:28  
标签:请求 获取 对象 req request 响应 servlet

@

目录

requset对象

什么是request对象

request对象是由tomcat创建,用来获取浏览器发起请求时所发送的请求行,请求头,请求体的内容

获取请求行的内容

在请求行中可以获取request对象的相应请求方法, 获取到比如协议名、服务名、端口号、项目名称、请求方式、参数列表等信息。

/**
*getContextPath() 获取项目名称
*getMethod()  获取请求方式
*getRequestURL() 获取包含协议和端口的url地址 
*这三个比较重要
*还有些其他的在下面一块演示
*/
 public class MyServlet01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取协议
        System.out.println("协议名称为---" + req.getScheme());
        //获取服务名称
        System.out.println("服务器名称为---" + req.getServerName());
        //获取端口号
        System.out.println("服务器端口号为" + req.getServerPort());
        //获取项目名称
        String contextPath = req.getContextPath();
        System.out.println("项目名称为" + contextPath);
        //获取请求方式
        String method = req.getMethod();
        System.out.println("此次请求方式为" + method);
        //获取查询参数
        String queryString = req.getQueryString();
        System.out.println("此次查询参数为" + queryString);
        //获取请求地址
        String uri = req.getRequestURI();
        System.out.println("不包含协议和端口的地址:" + uri);
        //获取包含http协议的请求地址
        StringBuffer requestURL = req.getRequestURL();
        System.out.println("包含协议和端口的地址:" + requestURL);
    }
}

获取请求头的内容

请求头是当前对用户发送的数据的描述信息。
请求头信息在请求的时候不需要程序员手动添加,是浏览器发送的时候已经处理好的。
如果想查看请求头信息,也可以在Servlet中requeqt通过getHeader方法获取。

req.getHeader()
//括号里面写key

获取请求体的内容

需要注意的是,只有post请求才会有请求体,在请求体里面有form表单的请求参数

//获取请求体内容的三种方式
//在获取请求体内容的过程中,会产生乱码是因为浏览器编码方式为utf-8,而request采用的编码方式为ISO-8859-1
//设置编码方式
req.setCharacterEncoding("utf-8")
//第一种,根据请求题中的key获取值
String value = req.getParameter("key");//key为表单中的name属性的值
//第二种,表单中一个name属性可能会有多个value值,比如说复选框的内容,此时用到该种方式,把该属性的内容封装成一个数组
String [] strings = req.getParameterValues("key");
//第三种,把所有请求体里面的数据,封装成一个map集合对象要是想要拿数据,直接遍历map集合
Map<String,String[]> map = req,getParameterMap();

request请求域对象(域对象的一种)

域对象就是实现不同servlet之间的数据共享。
通过request作用域设置域对象的时候,该作用域可以在一次请求内被访问,当该请求结束时,该request作用域对象自动被销毁

//在作用域里面存如一个域对象,名字为key,值为value
req.serAttribute("key","value");
//拿到作用域里面名字为key的值
req.getAttribute("key")
//移除作用域里面名字为key的作用域对象
req.removeAttribute("key")

请求转发

该行为发生在服务器内部,当浏览器请求servletA的时候,servletA资源不足或者无法满足该请求时,可以使用请求转发请求其他的servlet,然后响应给浏览器

//别忘了加"  /   "
req.setResponseDispatcher("/另一个servelet的名字").forword(req,resp)

请求转发的特点

  1. 地址栏不会发生变化
  2. 一次请求一次响应
  3. 可以实现request作用域的数据共享
  4. 不能访问外网
  5. 路径里面不能携带项目名称(浏览器会自动拼接上项目名称)

response对象

什么是response对象

response对象也是tomcat创建的用来设置响应信息,响应信息有响应行,响应头,响应体

设置响应行

响应行里面有协议和协议版本,以及响应状态码

常见的状态码

  • 200 表示响应成功
  • 302 资源重定向
  • 401 未授权
  • 404
    出现的原因:
    浏览器访问路径错误
    tomcat服务未开启,项目没有部署到tomcat服务器中
    你要访问的页面资源在WEB-INF文件夹中,无法访问
  • 500
    表示服务器端代码出错,可以通过控制台查看异常消息。

可以通过response.sendError(sc, msg)来设置状态信息,但一般不会手动设置,仅用来做测试。

//给页面响应错误信息
resp.sendError(状态码,"状态码信息")

设置响应头

常见的响应头

1、refresh:完成定时跳转 ***
2、Content-Type: 响应内容的MIME类型 (text/html;charset=utf-8)   mime类型可以通过servletContext获取
3、Content-Length: 响应体的长度(在UTF-8的编码格式下,一个汉字对应3个字节)
4、Date: 发送响应的开始时间
5、Content-Disposition:告诉浏览器以下载方式打开数据(做文件下载时使用)
resp.setHeader("key","value")
resp.setHeader("refresh","5;url=http://www.baidu.com")//5秒后跳转到百度
resp.setHeader("Content-Type","text/html;charset=utf-8")
resp.setHeader("Content-Disposition","attachment;filename="+filename);

设置响应体

响应体就是要响应的数据。响应对象response在返回数据、响应数据的时候,会将一些HTML、text、流数据等信息通过响应主体返回给页面,而响应体绝大多数都是文本类型

响应的数据需要流来传递
response自带的流有两个
response.getWriter() ==> PrintWriter  输出文本信息
	print()  write()
response.getOutputStream ==> ServletOutputStream 输出字节信息,比如图片、音频、视频
 需要注意:
这两个流不能同时存在。
 如果在响应体中包含了中文、此时网页中会出现乱码
乱码产生的原因:编码和解码不一致造成的、response默认编码方式iso-8859-1 页面解码方式 uft-8
 解决方式
    resp.setContenType("text/html;charset=utf-8")  一定放在返回响应内容最前面

重定向

重定向是了服务器行为,它是浏览器在向服务器发送请求时,服务器向浏览器发送指令去访问一个新的URL地址,这个指令就是重定向

resp.sendRedirect("/项目名/servlet名");

重定向特点

  1. 多次请求多次响应
  2. 浏览器地址栏会发生变化
  3. 允许访问外网(重定向到其他项目)
  4. 请求的地址必须加上项目名称
  5. 不可以共享request作用域的数据(他是多次请求)

这里解释下多次请求多次响应

比如当客户端浏览器向AServlet发送一个请求,经过处理后向客户端做出响应,这个响应就是向服务器再次发送新的请求,去请求BServlet,而这个新请求的地址将为浏览器做出第二次响应,此时浏览器地址栏会发生改变,由于一次请求/响应结束后,request对象会自动销毁,所以两次请求的request对象并非同一个,所以两次请求域中的数据信息不会共享。由此可见,重定向是做了两次请求和响应

servletContext对象

什么是servletContext对象

ServletContext是应用域对象、在应用域创建的域对象,只要服务器不重新启动或者是关闭,都可以进行访问。
当我们服务器启动时候、服务器会为部署在webapps里面每一个web项目都创建一个ServletContext对象来表示该项目的上下文环境。当服务器关闭的时候ServletContext对象销毁

ServletContext的获取

	1. request.getServletContext(); 推荐
	2. getServletContext();

ServletContext的作用

  1. 获取MIME类型
String filename = "带后缀的文件名"
ServletContext context = req.getServletContext();
String type = context.getMimeType(fileName);
  1. 域对象共享数据
Servlet创建的域对象是一个全局域对象,
当服务器启动的时候,服务器会为每一个web项目创建一个ServletContext对象,
它创建的域对象只有在服务器关闭时才会被销毁
ServletContext context = req.getServletContext();
context.setAttribute("msg","阉人张飞在此");
//设置好对象后,无论哪次请求都可以通过getAttribute("msg")获取到该条信息
  1. 获取文件的真实路径
使用getRealPath()方法
ServletContext context = req.getServletContext()
//获取src路径下的文件  会把编译好的字节码文件放到WEB—INF下面
context.getRealPath("/WEB-INF/classes/文件名")
//获取与WEB-INF同级目录下的文件  比如说同级目录是img
context.getRealPath("/img/文件名")
//获取与WEB-INF同级的文件
context.getRealPath("文件名")

请求转发和重定向的区别

请求转发使用方式是req.getRequestDispatcher("/rb3").forward(req,resp);,是服务器的行为,它是request对象发起的,他是一次请求一次响应,他所传的参数是servlet的名字,不能写项目名,不能访问其他的项目,在请求转发时会在浏览器地址栏不会发生变化,可以共享域对象的数据
重定向是使用方式是resp.sendRedirect("/day16/rb3");,是浏览器的行为,它是response对象发起的,里面可能会有多次请求多次响应,所传的参数项目名/servlet名,该路径必须加上项目名,它可以在请求时重定向到其他项目,由于是多次请求,所以它不会共享域对象中的数据

标签:请求,获取,对象,req,request,响应,servlet
From: https://www.cnblogs.com/liuxing12138/p/17586688.html

相关文章

  • Delphi中的Sender:TObject对象解析
     Delphi中的Sender:TObject1、Sender介绍Sender的类型是Tobject,是Tobject的派生类。Sender是一个TObject类型的参数,它告诉Delphi哪个控件接收这个事件并调用相应的处理过程。例如:procedureTForm1.Button1Click(Sender:TObject);begin//end;当点击BUTTON1时,会......
  • Java 使用数组给对象赋值
    Java使用数组给对象赋值在Java中,我们可以使用数组来给对象赋值。这是一种常见的操作,特别是在处理大量数据时非常有用。在本篇文章中,我将教会你如何使用数组给对象赋值,以及每一步需要做什么。流程概述在开始之前,让我们先来了解一下整个操作的流程。下表展示了用于给对象赋值的步......
  • 创建对象的几种方式
    1.使用对象字面量的方式varcat={}vat.name="kity"cat.name=2cat.shyHello=function(){ alert('你好')}2.使用工厂方式创建vardog=newObjectvat.name="kity"cat.name=2cat.shyHello=function(){ alert('汪汪汪')}3.用函数模拟functio......
  • Cache(十):面向对象基础 Cache(十一):面向对象开发
    常规概念都是一些基础概念,在学校学过很多遍了              事务 Cache面向对象的crud  cache110.40.52......
  • JavaScript中的MAP对象
    MAP对象,存储格式为键值对。和普通对象无异,不过它的方法要特殊一些。constmap=newMap();//createdmap.set(key,value);//赋值map.get(key);//读取map.delete(key);//删除指定键值map.clear();//删除所有键值对MAP对象主要用于频繁进行赋值删除时,会有更好的性能,同......
  • 配置文件的介绍,静态文件的配置,request对象请求方法,pycharm连接数据库,Django连接My
    配置文件的介绍#注册应用的INSTALLED_APPS=['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.c......
  • OpenCV4之特征提取与对象检测
    1、图像特征概述图像特征的定义与表示图像特征表示是该图像唯一的表述,是图像的DNA图像特征提取概述传统图像特征提取-主要基于纹理、角点、颜色分布、梯度、边缘等深度卷积神经网络特征提取-基于监督学习、自动提取特征特征数据/特征属性尺度空间不变性像素迁移不......
  • 面向对象的设计模式
    SOLID设计原则(面向对象)一句话归纳目的单一职责一个类或模块应该只有一个引起它变化的原因。一个类或模块应该只有一个主要职责,这样可以使代码更加清晰、易于理解和维护。开闭原则软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。强调在添加新功能时不需要修......
  • 羊 老虎 饲养员 animal=random.choice([Tiger,Sheep]) 该animal类型是对象
    #羊老虎饲养员importrandom#基类classAnimal():#属性def__init__(self,animal,w,call,food,room_num):self._animal=animalself._w=wself._call=callself._food=foodself._room_num=room_num#动作......
  • 带你详细刨析JavaScript 对象数组的深浅拷贝
    深浅拷贝●深浅拷贝指的是一种复制对象或者数组的行为●也就是把一个对象或者数组中的数据完完整整的复制一份放到另一个数组或者对象中●并且相互之间没有联系●说道深浅拷贝这个我们不考虑基本数据类型●因为基本数据类型没有引用地址一说●说到复制这个事儿有三个级别○赋值......