Servlet学习笔记(二)

Request对象

1.request和response对象:

  • request和response对象由tomcat服务器来创建的,request将浏览器发来的请求封装好给我们使用,response对象是我们来设置相应内容返回给浏览器的

2.request对象继承体系结构:

(Tomcat帮我创建的是 org.apache.catalina.connector.RequestFacade类,我们在doGet,doPsot中一般用HttpServletRequest接口来获取request(多态))


3.什么是HttpServletRequest ?

HttpServletRequest 对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。简单来说,要得到浏览器发送过来的信息,就找HttpServletRequest对象


4.HttpServletRequest对象的常用方法:

  • 4.1 获取请求行的数据:

    • GET /test/demo?username=linzeliang&password=123456 HTTP/1.1
    • String getMethod():获取请求的方法GET
    • String getContextPath():获取虚拟目录/test
    • String getServletPath():获取资源路径/demo
    • String getQueryString():获取GET请求方法的请求参数username=linzeliang&password=123456
    • String getRequestURI():获取请求URI/test/demo(URI:统一资源标识符)
    • StringBuffer getRequestURL():获取请求URLhttp://localhost/test/demo(URL:统一资源定位符)
    • String getProtocol():获取HTTP的协议与版本HTTP/1.1
    • String getRemoteAddr():获取请求客户主机的IP地址127.0.0.1
  • 4.2 获取请求头的数据(请求首部字段):

    • String getHeader(String name):通过首部字段的名称获取对应的值
    • Enumeration getHeaderNames() :获取所有首部字段的名称,封装在Enumeration对象中,通过hasMoreElements()方法来判断是否还有下一个元素,nextElement()方法用来获取下一个元素名称
  • 4.3 获取请求体数据(报文主体):

    • 只有POST请求方式才有报文主题,GET请求方式没有报文主体,只有报文首部和空行(\r\n)

    • 分两个步骤:

      1. 先获取流对象
      • BufferedReader getReader():获取输入字符流,只能操作字符数据
      • ServletInputStream getInputStream():获取字节输入流,可以操作所有类型的数据(图片啥的只能用字节流来传输数据,而普通字符的话,都可以使用。在UTF-8编码中,一个中文字符占3个字节,在GBK中一个中文字符占2个字节,所以用字节流来传输数据要注意编码格式)
      1. 在从流中获取数据

        username=linzeliang&password=123456
  • 4.4 获取请求参数的通用方法

    • 如果是get请求方法,参数名及值存储在URI中,那么可以通过参数名获取值;如果是post方法,参数名及值是存储在报文主体中的,那么也可以通过参数名来获取值、
    • String getParameter(String name):通过参数名获取值
    • String[] getParameterValues(String name):通过参数名获取值组成的数组,通常是html中的checkbox复选框,一个参数名可以有多个值
    • Enumeration getParameterNames():获取所有的参数名,封装为Enumeration对象
    • Map<String, String[]> getParameterMap():获取所有的参数名称及其对应的值(一个参数名对应值可以是多个)的Map集合

5.Request对象接收的参数是乱码?

5.1先不设置编码看一下:

发现是乱码的,这是因为浏览器默认的编码与系统编码一样(GBK),然后我们Tomcat的默认编码是ISO-8859-1的,在将浏览器发来的请求解析封装为request对象时候是使用ISO-8859-1编码的,我们获取之后直接在IDEA(UTF-8)中打印出来肯定就乱码了。

5.2 自从Tomcat5以来,GET方式和POST方式提交的请求,tomcat会采用不同的方式来处理编码.在Tomcat8中,使用GET请求方法的乱码问题已经解决了,但是,如果你用的是POST请求方法来获取数据,那么会得到乱码,因为如果未设置编码的话,则默认采用ISO-8859-1编码。所以我们可以通过手动设置编码来解决这个问题:

在doPost方法内部行先写入这一个代码request.setCharacterEncoding("UTF-8"),同理,如果要输出到页面,也应该先设置一下response的编码response.setCharacterEncoding("UTF-8")

5.3 如果GET请求方式也出现乱码了怎么办呢?

GET方式不同,它的数据是从消息行带过去的,没有封装到request对象里面所以使用request设置编码是无效的。我们既然知道Tomcat默认的编码是ISO-8859-1,那么GET方式由消息体带过去给浏览器的时候肯定是用*ISO 8859-1编码了。

有两种方法:

  1. 我们一般可以通过new String(request.getParameter("username").getBytes("iso-8859-1"),"utf-8") 的形式来获取数据:
//此时得到的数据已经是被ISO 8859-1编码后的字符串了,这个是乱码
String name = request.getParameter("username"); //乱码通过反向查ISO 8859-1得到原始的数据
byte[] bytes = name.getBytes("iso-8859-1"); //通过原始的数据,设置正确的码表,构建字符串
String value = new String(bytes, "utf-8");

然后成功过打印出中文了

  1. 我们在Tomcat服务器的配置下改成UTF-8的编码,那么就解决服务器在解析数据的时候造成乱码问题了,在8080端口的Connector上加入URIEncoding="UTF-8",设置Tomcat的访问该端口时的编码为UTF-8,从而解决乱码,这种改法是固定使用UTF-8编码的,不过这种方法不建议!!!

    <Connector port="8080" protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443"
    URIEncoding="utf-8"/>

6.请求转发:

请求转发:一种在服务器内部的资源跳转方式

转发和重定向区别:转发是服务器只能去当前web站点的资源,重定向是服务器响应304,给客户端一个新地址,然后让客户端自己再去跳转到这个新资源

  • 通过request.getRequestDsipatcher(String path) 获取请求转发对象

  • RequestDispatcher对象有两个方法:

    1. forward:是指转发,只包含一次请求,将当前request和response对象保存,只能转发到服务器当前内部资源种(其他的Servlet对象),地址栏的地址不会发生改变。

    2. include:即包含url中的内容,进一步理解为,将url中的内容包含进当前的servlet当中来,并用当前servlet的request和respose来执行url中的内容处理业务.所以不会发生页面的跳转,地址栏地址不会发生改变。


7. 共享数据

  • 域对象:一个拥有作用范围的对象,可以在范围内共享数据
  • request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
  • 方法:
    • void setAttribute(String name,Object obj):存储数据
    • Object getAttitude(String name):通过键获取值
    • void removeAttribute(String name):通过键移除键值对

Servlet学习笔记(二)的更多相关文章

  1. servlet学习笔记二

    Servlet主要内容: 1)表单处理 2)乱码问题 3)页面跳转 4)生命周期 一.表单处理 Servlet获取表单数据 request.getParameter():通过表单参数名获取参数值 re ...

  2. Servlet学习笔记(三)

    目录 Servlet学习笔记(三) 一.HTTP协议 1.请求:客户端发送欸服务器端的数据 2.响应:服务器端发送给客户端的数据 3.响应状态码 二.Response对象 1.Response设置响应 ...

  3. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  4. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  5. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  6. JMX学习笔记(二)-Notification

    Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...

  7. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

  8. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

  9. 《SQL必知必会》学习笔记二)

    <SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...

随机推荐

  1. 硬核测试:Pulsar 与 Kafka 在金融场景下的性能分析

    背景 Apache Pulsar 是下一代分布式消息流平台,采用计算存储分层架构,具备多租户.高一致.高性能.百万 topic.数据平滑迁移等诸多优势.越来越多的企业正在使用 Pulsar 或者尝试将 ...

  2. 【音乐爬虫】Python爬虫-selenium+browsermob-proxy 解决动态网页 js渲染问题

    1.一般的python爬虫很简单,直接请求对应网址,解析返回的数据即可,但是有很多网站的数据的js动态渲染的,你直接请求是得不到对应的数据的 这时就需要其它手段来处理了. 2.以一个例子来说明,整个过 ...

  3. Java知识系统回顾整理01基础03变量05变量命名规则

    一.命名规则 变量命名只能使用字母 .数字. $. _ 变量第一个字符 只能使用: 字母. $. _ 变量第一个字符 不能使用数字 注:_ 是下划线,不是-减号或者-- 破折号 int a= 5; i ...

  4. P2034 选择数字 / P2627 [USACO11OPEN]Mowing the Lawn G

    Link 题目描述 给定一行 \(n\) 个非负整数 \(a[1]..a[n]\) .现在你可以选择其中若干个数,但不能有超过 \(k\) 个连续的数字被选择.你的任务是使得选出的数字的和最大. 输入 ...

  5. 【学习笔记/题解】分层图/[JLOI2011]飞行路线

    题目戳我 \(\text{Solution:}\) 关于分层图: 一般用于处理:给你\(k\)次机会对边权进行修改的最短路问题. 算法流程: 建立出\(k\)层图,对应进行\(k\)次操作后的局面. ...

  6. Flutter 1.22 正式发布

    支持iOS 14和Android 11,新的i18n和l10n支持,可用于生产的Google Maps和WebView插件,新的App Size工具等等! 作者:Chris Sells 原文:http ...

  7. Hadoop理论基础

    Hadoop是 Apache 旗下的一个用 java 语言实现开源软件框架,是一个开发和运行处理大规模数据的软件平台.允许使用简单的编程模型在大量计算机集群上对大型数据集进行分布式处理.   特性:扩 ...

  8. 多测师讲解python_模块间的调用_高级讲师肖sir

    案例1: 在aaa.py  文件A类中定义一个函数sadp: 在bbb.py文件中导入aaa模块,导入类 ,调用函数 案例2: aaa模块中定义一个A类, 在定义一个sadp的函数, 在bbb模块中导 ...

  9. 扫描仪扫描文件处理-ABBYY自动矫正图像歪斜

    修改界面语言: 设置为不识别图片文字(因为我们只需要把图片歪斜校正): 保存无损彩色格式:

  10. swoft运行流程

    启动命令 php bin/swoft http:start 或者  swoftctl run -c http:start 1 入口文件 bin/swoft.php #!/usr/bin/env php ...