一、Response和Request的生态环境

二、HttpServletResponse---代表响应对象

1.设置状态码

void setStatus(int sc)

状态码:

200:一切正常 正常返回数据

302:重定向

304:拿缓存

404:找不到资源

500:服务器端报错(一般情况,代码有异常)

2.设置响应头

(1)设置响应头的API

(2)案例-重定向

重定向:

实现重定向:302+Location

servlet1:

response.setStatus(302);

response.setHeader(“Location”,”url地址”);

servlet2:

response.getWriter().write(“hello”);

重定向的特点:

1)客户端访问两次

2)客户端的地址栏的地址发生了变化

response中便捷的重定向的方法:

void sendRedirect(String location)

(3)案例-定时跳转

refresh头代表定时跳转

头对应的值的写法:秒值;url=url地址

response.setHeader("refresh","5;url=/response2");

(4)304状态码的原理

3.设置响应体

(1)写给客户端字符

PrintWriter writer = response.getWriter();

writer.write(字符);

原因:write方法在写的时候 其实是将内容写到response的缓冲区,response的缓 冲区本有默认的编码格式 iso-8859-1问题:写给客户端的中文乱码

解决:手动的设置response的缓冲区编码

void setCharacterEncoding(String Charset)

问题:设置response的编码为UTF-8之后 发现页面显示


解决:通过代码去指定页面解析时的编码原因:页面默认解析的编码是GBK

通过Content-Type头去指导浏览器使用哪种编码进行页面的解析

response.setHeader(“Content-Type”,”text/html;charset=UTF-8”);

response.setContentType("text/html;charset=UTF-8");

注意:设置Content-Type的方法内部有两个功能

1)自行设置response的缓冲区的编码是UTF-8;

2)指导浏览器的解析页面时的编码是UTF-8;

记住:解决response发中文乱码

response.setContentType("text/html;charset=UTF-8");

(2)写给客户端字节

1)获得字节流

ServletOutputStram  response.getOutputStream();

2)需求:输出验证码图片

3)需求:文件下载

两个流:

输入流:读取文件

输出流:写给客户端---写到response缓冲区

两个头:

//显示的告诉客户端文件的mime类型

response.setContentType("audio/mpeg");

//告知客户端回写的文件要以附件的形式打开(下载)

response.setHeader("Content-Disposition","attachment;filename=1.mp3");

4.Response的一些细节

1)getWriter和getOutputSteam在一个Servlet中不能同时调用

2)通过response获得的流不用手动关闭

web容器在service方法结束后会检查response获得的流是否关闭,没有关闭容器会关闭这个流。

3)response缓冲区的大小是8k  可以设置大小 只能向更大的范围设置

三、HttpServletRequest

1.获取请求行

1)获取请求方式

String method = request.getMethod(); //GET  POST

2)获得请求的资源

request.getRequestURI()

request.getRequestURL()

request.getContextPath():web应用的名称

         //1、请求方式
String method = request.getMethod();
System.out.println(method);//GET
//2、获得请求资源
String requestURI = request.getRequestURI();
StringBuffer requestURL = request.getRequestURL();
System.out.println(requestURI);
System.out.println(requestURL.toString());
String contextPath = request.getContextPath();
System.out.println(contextPath);

3)获取get提交的数据的字符串形式

         //3、获取get提交的字符串形式的 参数
String queryStr = request.getQueryString();
System.out.println(queryStr);

4)获取客户机的参数

         //4、获得客户机的ip
String remoteAddr = request.getRemoteAddr();
System.out.println(remoteAddr);

2.获取请求头

         //1、获取一个指定的头
String header = request.getHeader("User-Agent");
System.out.println(header);
//2、判断客户端的浏览器的类型
if(header.contains("MSIE")){
System.out.println("这是IE");
}else if(header.contains("Firefox")){
System.out.println("这是火狐");
}else{
System.out.println("这是其他");
}
//3、获得所有的头的名称
System.out.println("-------------------------------------------");
Enumeration headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()){
String headerName = (String) headerNames.nextElement();
System.out.println(headerName+":"+request.getHeader(headerName));
}

3.获得请求体(获得post提交的参数)

请求体的格式:

username=zhangsan&password=123&hobby=zq&hobby=pq

1)String getParamter(name)

获得zhangsan:request.getParameter(“username”);

2)String[] getParameterValues(name)

获得爱好hobby:request.getParamterValues(“hobby”);

3)Map<String,String[]>  getParameterMap()

获取上述的请求体:

username:{zhangsan}

password:{12345}

hobby:{zq,pq}

4)getParameterNames():获得所有的请求参数的名称

获取上述的请求体:

[ username,password,hobby ]

         //1、获取username---????
String username = request.getParameter("username");
//get方式
//编码---字节数组
byte[] bytes = username.getBytes("iso8859-1");
//解码---utf-8
username = new String(bytes, "UTF-8"); System.out.println(username);
//2、password
String password = request.getParameter("password");
System.out.println(password);
//3、获取hobby
String[] hobby = request.getParameterValues("hobby");
System.out.println(hobby.length);
//4、获取所有的参数的map形式
Map<String,String[]> parameterMap = request.getParameterMap();
System.out.println(parameterMap);

问题:页面在提交中文时 到服务器端获取后乱码

原因:request对象默认的编码是iso-8859-1

解决方案:将request的编码设置成UTF-8(只适合post提交)

request.setCharacterEncoding(“UTF-8”);

注意:get怎样解决中文乱码

客户端的编码是(编码)UTF-8---->服务器端request编码是(解码)iso8859-1--->????????--->用iso8859-1编码---->UTF-8进行解码

4.Request是一个域对象和请求转发

转发的语法:

request.getRequestDispatcher(“要转发的地址”).forward(request,response);

 request.getRequestDispatcher("/request2").forward(request, response);

request域可见范围:在一次请求链中

5.请求包含

语法:

request.getRequestDispatcher(“要包含的资源的地址”).include(request,response);

Java实战之04JavaWeb-02Request和Response的更多相关文章

  1. java.lang.IllegalStateException: Cannot forward after response has been committed的一个情况解决方法

    java.lang.IllegalStateException: Cannot forward after response has been committed xxx.xxx.doPost(upd ...

  2. java.io.IOException: Server returned HTTP response code: 411 for URL

    今日调用一post方式提交的http接口,此接口在测试环境ip调用时无问题,但在生产环境通过域名调用时一直报如下错误: java.io.IOException: Server returned HTT ...

  3. 通过设置代理,解决服务器禁止抓取,报“java.io.IOException: Server returned HTTP response code: 403 for URL”错误的方法

    java.io.IOException: Server returned HTTP response code: 403 for URL: http:// 这个是什么异常呢? 当你使用java程序检索 ...

  4. nested exception is java.lang.IllegalStateException: Cannot forward after response has been committed

    org.springframework.web.util.NestedServletException: Request processing failed; nested exception is ...

  5. 「小程序JAVA实战」springboot的后台搭建(31)

    转自:https://idig8.com/2018/08/29/xiaochengxujavashizhanspringbootdehoutaidajian31/ 根据下面的图,我们来建立下对应的sp ...

  6. 记录解决java.io.IOException: Server returned HTTP response code: 500 for URL:xxxxxxxx

    踩坑经历 因为项目需要去对接别的接口,使用URLConnection POST请求https接口,发送json数组时遇到java.io.IOException: Server returned HTT ...

  7. Java实战:教你如何进行数据库分库分表

    摘要:本文通过实际案例,说明如何按日期来对订单数据进行水平分库和分表,实现数据的分布式查询和操作. 本文分享自华为云社区<数据库分库分表Java实战经验总结 丨[绽放吧!数据库]>,作者: ...

  8. Java归去来第4集:java实战之Eclipse中创建Maven类型的SSM项目

    一.前言 如果还不了解剧情,请返回第3集的剧情          Java归去来第3集:Eclipse中给动态模块升级 二.在Eclipse中创建Maven类型的SSM项目 2.1:SSM简介 SSM ...

  9. java实战之解析xml

    在java中解析xml有现成的包提供方法,常用的有四类:Dom,JDom,Sax以及Dom4j.其中前者是java中自带的,后三者需要大家从开源诸如sourceforge这样的网站下载jar包,然后在 ...

随机推荐

  1. MYSQL- 存储过程示例

    最近需要用到MYSQL,没耐心从头到尾,慢慢了解了,需要什么直接百度,直接了解,从实战中学习. 看一下MYSQL存储过程的示例: CREATE PROCEDURE plogin ( p_usernam ...

  2. 剑指OFFER之从二叉搜索树的后序遍历序列(九度OJ1367)

    题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 输入: 每个测试案例包括2行: 第一行为1个整数 ...

  3. Oracle 监听器无法启动(TNS-12537,TNS-12560,TNS-00507)

    Oracle启动监听报错,提示 连接中断 [oracle@localhost ~]$ lsnrctl start LSNRCTL for Linux: Version 11.2.0.1.0 - Pro ...

  4. 把pgboucer做成postgresql服务

    把pgbouncer启动命令加入到postgresql服务配置里面.这样方便操作 vi /etc/init.d/postgresql 加入如下红色命令.路径换成你的pgbouncer安装目录 in s ...

  5. ECshop模板机制

    ECshop模板机制整理 模板机制 近期新项目涉及到ECshop的二次开发,趁此良机正好可以对闻名已久的ECshop系统进行深入了解.要了解一个系统,那么该系统的模板机制就是最重要的一环.相关整理如下 ...

  6. Linux curl命令详解

    用途说明 curl命令是一个功能强大的网络工具,它能够通过http.ftp等方式下载文件,也能够上传文件.其实curl远不止前面所说的那些功能,大家可以通过man curl阅读手册页获取更多的信息.类 ...

  7. c++简单的ATL COM开发和调用实例(转)

    c++简单的ATL COM开发和调用实例 1.打开VS2010,新建ATL COM 项目,步骤:“文件” -->“新建” -->“项目”,选择“Visual C++” -->“ATL ...

  8. PHP中$_POST,$_GET,$_REQUEST,$_FILES全局变量的全局指什么

    我一直担心,同一个表单,同时提交2次会发生什么事?在服务器端表单变量会不会彼此覆盖呢?也就是说假如我们在PHP中用$_REQUEST["name"]访问某个表单变量,会不会因为别人 ...

  9. c++内联函数与静态函数

    不能是虚函数的成员函数有:静态成员函数,内联成员函数,构造函数.没有什么函数需要硬性规定为虚函数,一般析构函数会被定义为虚函数其他就是在继承类中可能需要override的类成员函数应该定义为虚函数 h ...

  10. UTF-8编码与Unicode CS2的转换

    /* Convert a UTF-8 string into a UCS-2 array. */ void tcstrutftoucs(const char *str, uint16_t *ary, ...