1.response

代表响应, 可以理解为一个空的箱子,我们在里面填入要发送到浏览器的内容. 服务器会把这些内容组装成http响应.

1.1 响应首行 协议/版本号 状态码 状态码描述

添加状态码 和 描述

    void setStatus(int sc)  只设置状态码
void setStatus(int sc, String sm) 设置状态码和描述
void sendError(int sc) 只设置状态码,错误的
void sendError(int sc, String msg) 设置状态码和描述

1.2 响应头

添加响应头

void setHeader(String name, String value) 设置响应头,如果key一样会覆盖
setIntHeader(String name, int value)
setDateHeader(String name, long date)
void addHeader(String name, String value) 设置响应头,无论如何都新增.
void addIntHeader(String name, int value)
void addDateHeader(String name, long date)

1.3 响应空行

1.4 响应正文

发送字节流

getOutputStream

发送字符流

getWriter

1.5 应用

例一: 手动向浏览器发送404

 package day10_1;

 import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class AServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.sendError(404,"你访问的页面存在,就是不给你看!");
}
}

例二: 重定向

1

 package day10_1;

 import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class BServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("BServlet");
/*
* 重定向
* 1,设置Location
* 2.发送302状态码
*/
response.setHeader("Location", "/day10_1/servlet/CServlet");
response.setStatus(302);
}
}
 package day10_1;

 import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 浏览器会重定向来这
*/
public class CServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("CServelt");
}
}

2

 package day10_1;

 import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class IServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 快捷重定向
*/
response.sendRedirect("http:/wwww.baidu.com");
}
}

例三: Refresh头.刷新

 package day10_1;

 import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class DServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("GBK");//解决乱码
response.setContentType("text/html;charset=GBK");//解决乱码
PrintWriter out=response.getWriter();
out.print("5秒后跳转!");
response.setHeader("Refresh", "5;URL=/day10_1/servlet/EServlet");
}
}
 package day10_1;

 import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class EServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("GBK");//解决乱码
response.setContentType("text/html;charset=GBK");//解决乱码
PrintWriter out = response.getWriter();
out.print("你刷新了页面! ");
}
}

例四: 发送字节流. 发送中文.

 package day10_1;

 import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class GServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String s="Hello outputStream";
byte[] bytes=s.getBytes();
response.getOutputStream().write(bytes);
}
}

例五: 发送字符流. 发送中文.

字符流和字节流要注意的一个问题: 
字节流和字符流一定不能同时使用.

例六:使用字节流发送图片

 package day10_1;

 import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.IOUtils; public class HServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String path="/F:/背景.jpg";
FileInputStream in=new FileInputStream(path);
byte[] bytes=IOUtils.toByteArray(in);//读取输入流内容的字节到字节数组中
response.getOutputStream().write(bytes);;
}
}

2.request对象

封装了浏览器发送来的请求信息。

回忆一下http协议,请求协议中的数据都可以通过request对象来获取!

*获取常用信息

  》获取客户端IP, 案例: 封IP。 request.getRemoteAddr()

  》请求方式,request.getMethod() , 可能是post也可能是get

*获取HTTP请求头

  》*****String getHearder(String name),适用于单值头

  》int  getIntHeader(String name) ,适用于单值int类型的请求头

  》long getDateHeader(String name) ,适用于单值毫秒类型的请求头

  》Enumeration<String> getHeaders(String name) ,适用于多值请求头

案例:

  》通过user-Agent识别用户浏览器类型

  》防盗链:如果请求不是通过本站的超链接发出的,发送错误状态码404。REferer这个请求头,表示请求的来源!

*获取请求URL

  http://localhost:8080/day10_2/Aservlet?username=xxx&password=yyy

  》String getScheme() : 获取协议,http

  》String getServerName(): 获取服务器名,localhost

  》String getServerPort(): 获取服务器端口,8080

  》String getContextPath(): 获取项目名,/day10_2

  》String getServerPath(): 获取Servlet路径,/AServlet

  》String getQuesryString : 获取参数部分,即问号后面的部分。username=xxx&password=yyy

  》String getRequestURL() : 获取请求URL,等于项目名+Servlet路径。/day10_2/AServlet

  》String getRequestURL(): 获取请求URL,等于不包含参数的整个请求路径。http://localhost:8080/day10_2/Aservlet

*获取请求参数

  》String getParameter(String name):获取指定名称的请求参数值,适用于单值请求参数

  》String[] getPartmeterValues(String name): 获取指定名称的请求参数值,适用于多值请求参数

  》Enumeration<String> getParameterNames():获取所有请求参数名称

  》Map<String, String [ ]> getParameterMap(): 获取所有请求参数,其中key为参数名,value为参数值

  案例:超链接参数

  案例:表单数据

*请求转发和请求包含

  RequestDispatcher rd = request.getRequestDispatcher("/MyServlet");

  请求转发: rd.forward(request,response);

  请求包含: rd.include(request,response);

  有时一个请求需要多个Servlet协作才能完成,所以需要在一个Servlet跳到另一个Servlet

  》一个请求跨多个Servlet,需要使用转发和包含

  》请求转发:由下一个Servlet完成响应体!当前Servlet可以设置响应头!(留头不留体)

  》请求包含:由两个Servlet共同未完成响应体!(都留)

  》无论是请求转发还是请求包含,都在一个请求范围内!使用同一个request和response!

*request域

  void setAttribute(String name,Object value)

  Object getAttribute(String name)

  》同一个请求范围内使用request.setAttribute()、request.getAttribute()来传值!前一个Servlet 调用setAttribute()保存值,后一个调用getAttribute来使用值

*请求转发和请求包含的区别

  》请求转发是一个请求一次响应,而重定向是两次请求两次响应

  》请求转发地址栏不变化,面重定向会显示后一个请求的地址

  》请求转发只能转发到本项目其他Servlet,而重定向不只能重定向到本项目的其他Servlet,还能定向到其他项目

  》请求转发是服务器端行为,只需给出转发的Servlet路径,而重定向需要给出requestURL,即包含项目名!

URL编码

  表单的类型:Content-Type:aplication/x-www-form-urlencoded,就是把中文转换成%后面跟随两位的16进制。

  为什么要用它:在客户端和服务器之间传递中文时需要把它转换成网络适合的方式。

  

  *它不是字符编码!

  *它是用来在客户端与服务器之间传递参数用的一种方式!

  *URL编码需要先指定一种字符编码,把字符串解码后,得到byte[],然后把小于0的字节+256,再转换成16进制。前面加一个%。

  *POST请求默认就使用URL编码!tomcat会自动使用URL解码!

  *URL解码:String username = URLEncoder.encode(username,"utf - 8");

  *URL解码:String username = URLEncoder.encode(username,"utf - 8");

-----------------------------------------

路径

  *web.xml中<url-pattern>路径

    》要么以”*“开头,要么以”/“开头

  *转发和包含路径

    》以”/“开头:相对当前项目路径,例如: http://localhost:8080/mypro/

    》不以”/“开头:相对当前Servlet路径。

  *重定向路径(客户端路径)

    》以”/“开头:相对当前主机,例如: http://localhost:8080/,  所以不需要自己手动添加项目名

  ·*页面中上超链接和表单路径

    》与重定向相同,都是客户端路径!需要添加项目名

  *ServletContext 获取资源路径

    》相对当前目录,即当前index.jsp所在目录

  *ClassLoader 获取资源目录

    》相对classes目录

  *Class获取资源目录

    》以”/“开头相对classes目录

    》不以”/“开关相对当前 .class 文件所在目录

  

Java Web----------response&&request的更多相关文章

  1. java web(四):request、response一些用法和文件的上传和下载

    上一篇讲了ServletContent.ServletCOnfig.HTTPSession.request.response几个对象的生命周期.作用范围和一些用法.今天通过一个小项目运用这些知识.简单 ...

  2. java web response提供文件下载功能

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  3. java WEB Response重定向和缓存控制

    package cn.com; import java.io.IOException; import javax.servlet.ServletException; import javax.serv ...

  4. day10(java web之request&respone&访问路径&编码问题)

    day10 请求响应流程图 response response概述 response是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletR ...

  5. [Java][Web]Response学习.缓存

    response.setHeader("expires", String.valueOf(System.currentTimeMillis() + 1000 * 3600)); S ...

  6. [Java][Web]解决 Request 的乱码

    解决 get 提交的乱码 (手工处理) String username = request.getParameter("username"); username = new Str ...

  7. [Java][Web]Response学习

    // 在 http 中,meta 标签可以模拟响应头 response.setHeader("Content-type", "text/html;charset=UTF- ...

  8. java web开发需要注意的地方

    java需要注意的 1.字符串值相等比较 c#用双等号(==)来进行 字符串值相等比较.如下: string a="3"; string b="3"; if(a ...

  9. Java Web之Servlet中response、request乱码问题解决

    Java Web之Servlet中response.request乱码问题解决   一.request请求参数出现的乱码问题 get请求: get请求的参数是在url后面提交过来的,也就是在请求行中, ...

  10. java中获取request与response对象的方法

    Java 获取Request,Response对象方法   第一种.参数 @RequestMapping("/test") @ResponseBody public void sa ...

随机推荐

  1. Java如何计数字串中的一组词组?

    在Java编程中,如何计数字串中的一组词组? 以下示例演示如何使用regex.Matcher类的matcher.groupCount()方法来计算字符串中的一组词组. package com.yiib ...

  2. linux选择sdb sdb4 fat32 还是sda分区

    fat32是怎么混到它们中的sda,sdb,sdc是你的第一块,第二块,第三块硬盘sda1,sda2,sda5是你第一块硬盘中的第一块分区,2块,5块分区fat32,ext2,ext3,ext4是你的 ...

  3. Entity Framework 5中遇到的 mysql tinyint(1) 转换为 bool 的问题 (我用的是VS2013中的EF5版本)

    数据有一个字段,用的是 tinyint 长度是1  默认值为0 , 当用vs2013中的 EF5来生成 实体模型之后,看到这个列被标识为 bool 类型   Mysql官方参考文档关于布尔类型的说明: ...

  4. MySQL5.7.19 服务挂掉 自动关闭 mysqld got exception 0xc000001d win 2008R2

    在mysql 官网看到mysqld got exception 0xc000001dThis error message occurs because you are also using a CPU ...

  5. Java8学习笔记(八)--方法引入的补充

    在Java8学习笔记(三)--方法引入中,简要总结了方法引入时的使用规则,但不够完善.这里补充下几种情况: 从形参到实例方法的实参 示例 public class Example { static L ...

  6. 树莓GPIO &&python

      from http://www.cnblogs.com/xiaobo-Linux/p/8969324.html 命令行控制LED灯  echo 12 > /sys/class/gpio/ex ...

  7. 一个整型数组里除了一个数字之外,其他的数字都出现了两次。要求时间复杂度是O(n),空间复杂度是O(1),如何找出数组中只出现一次的数字

    思路分析:任何一个数字异或它自己都等于0,根据这一特性,如果从头到尾依次异或数组中的每一个数字,因为那些出现两次的数字全部在异或中抵消掉了,所以最终的结果刚好是那些只出现一次的数字. 代码如下: #i ...

  8. Kubernetes部署SpringCloud(三) 使用 Ingress-nginx 暴露服务

    之前部署的zuul以及basic-info-api 都仅仅在于flannel 网络内可以访问. 现在来使用Ingress-nginx 对外暴露服务 以下用到的一些docker镜像,是存在我私有仓库的, ...

  9. Python变量访问权限控制

    oop1.py文件代码 # user/bin/python class Foo: def bar(self): print('ok') def hello(self, name): print(&qu ...

  10. day_4.28 py

    2018-4-28 15:13:39 ''' 在方法名字加入两个 __则为私有方法 类似于private 方法 ''' class Dog: #私有方法 def __send_msg(self): p ...