HttpServletResponse

1.告诉服务器应用使用UTF-8解析文本的两种方式,告诉客户端要使用什么编码

response.setHeader("content-type", "text/html;charset=UTF-8");
response.setContentType("text/html; charset=UTF-8");

2.getWriter

PrintWriter out = response.getWriter();//得到一个字符输出流
out.write("你好!");//向客户端响应文本内容

3.getOutputStream

response.setContentType("text/html;charset=UTF-8");
ServletOutputStream sos = response.getOutputStream();
sos.write("你好123".getBytes("UTF-8"));//getBytes默认编码为本地编码(即:gbk)

4.下载文件

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//通过路径得到一个输入流
String path = this.getServletContext().getRealPath("/WEB-INF/classes/美女.jpg");
FileInputStream fis = new FileInputStream(path);
//创建字节输出流
ServletOutputStream sos = response.getOutputStream();
//得到要下载的文件名
String filename = path.substring(path.lastIndexOf("\\")+1);
//设置文件名的编码
filename = URLEncoder.encode(filename, "UTF-8");//将不安全的文件名改为UTF-8格式
//告知客户端要下载文件
response.setHeader("content-disposition", "attachment;filename="+filename);
response.setHeader("content-type", "image/jpeg");
//执行输出操作
int len = 1;
byte[] b = new byte[1024];
while((len=fis.read(b))!=-1){
sos.write(b,0,len);
}
sos.close();
fis.close();
}

5.告诉客户端不使用缓存

response.setHeader("pragma", "no-cache");
response.setHeader("cache-control", "no-cache");
response.setIntHeader("expires", 0);

6.跳转

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
/*response.setIntHeader("refresh", 1);//设置1秒钟刷新一次
Random r = new Random();
response.getWriter().write(r.nextInt()+"");*/
response.getWriter().write("注册成功!3秒钟跳到主页");
//设置3秒钟跳转
response.setHeader("refresh", "3;url=/day09_reques_response/demo6");
}

7.重定向

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("A:我要借钱!");
System.out.println("B:我不有,但是我可以告诉你谁有");
/*//告诉客户端要重新定向新的资源
response.setStatus(302);
//告诉浏览器要去访问哪个URL
response.setHeader("location", "/day09_00_HttpServletResponse/servlet/demo8");*/ //请求重定向
response.sendRedirect("/day09_reques_response/demo8"); System.out.println("A: 我去了"); }

8.response细节  

getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。

getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。 会抛异常。

Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态

行和各响应头组合后输出到客户端。

Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关

闭该输出流对象。

HttpServletRequest

1.request常用方法

获得客户机信息
getRequestURL方法返回客户端发出请求时的完整URL。
getRequestURI方法返回请求行中的资源名部分。
getQueryString 方法返回请求行中的参数部分。
getRemoteAddr方法返回发出请求的客户机的IP地址
getRemoteHost方法返回发出请求的客户机的完整主机名
getRemotePort方法返回客户机所使用的网络端口号
getLocalAddr方法返回WEB服务器的IP地址。
getLocalName方法返回WEB服务器的主机名
getMethod得到客户机请求方式
获得客户机请求头
getHead(name)方法
getHeaders(String name)方法
getHeaderNames方法
获得客户机请求参数(客户端提交的数据)
getParameter(name)方法
getParameterValues(String name)方法
getParameterNames方法
getParameterMap方法 //做框架用,非常实用
getInputStream

代码示例

	public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//test1(request);
//test2(request);
//获得相关name的消息头
Enumeration headers = request.getHeaders("accept-language");
while(headers.hasMoreElements()){
String e = (String) headers.nextElement();
System.out.println(e+":"+request.getHeader(e));
}
} private void test2(HttpServletRequest request) {
//获得所有请求消息头的name
Enumeration names = request.getHeaderNames();
while(names.hasMoreElements()){
String e = (String) names.nextElement();
System.out.println(e+":"+request.getHeader(e));
}
} private void test1(HttpServletRequest request) {
//获得请求消息头的信息
String header = request.getHeader("User-Agent");
System.out.println(header);
if(header.toLowerCase().contains("msie")){
System.out.println("你使用的是IE浏览器");
}else if(header.toLowerCase().contains("firefox")){
System.out.println("你使用的是火狐浏览器");
}else if(header.toLowerCase().contains("chrome")){
System.out.println("你使用的是谷歌浏览器");
}else{
System.out.println("你使用的是其它浏览器");
}
}

2.获得参数

private void test1(HttpServletRequest request) throws UnsupportedEncodingException {
//获取表单数据
//根据表单中name属性的名,获取value属性的值方法
String userName = request.getParameter("userName");
String pwd = request.getParameter("pwd");
String sex = request.getParameter("sex");
String[] hobbys = request.getParameterValues("hobby");
String city = request.getParameter("city");
userName = new String(userName.getBytes("iso-8859-1"),"UTF-8");
System.out.println(userName);
System.out.println(pwd);
System.out.println(sex); for (int i = 0;hobbys!=null && i < hobbys.length; i++) {
System.out.print(hobbys[i]+"\t");
}
System.out.println();
System.out.println(city);
}
private void test2(HttpServletRequest request) {
//获取所有的表单name的名子
Enumeration names = request.getParameterNames();
while(names.hasMoreElements()){
String name = (String) names.nextElement();//得到每一个name名
String[] values = request.getParameterValues(name);//根据name名,得到value值
for (int i = 0;values!=null && i < values.length; i++) {
System.out.println(name+"\t"+values[i]);
}
}
}
private void test3(HttpServletRequest request) {
try {
User u = new User();
System.out.println("封装数据前:"+u);
//获取表单数据
Map<String,String[]> map = request.getParameterMap();
for (Map.Entry<String, String[]> m : map.entrySet()) {
String name = m.getKey();
String[] value = m.getValue();
//创建一属性描述器
PropertyDescriptor pd = new PropertyDescriptor(name, User.class);
//得到setter属性
Method setter = pd.getWriteMethod();
if(value.length==1){
setter.invoke(u, value[0]);//给一个值的变量赋值
}else{
setter.invoke(u, (Object)value);//相关于给复选框赋值
}
}
System.out.println("封装数据后:"+u);
} catch (Exception e) {
e.printStackTrace();
}
}

依赖包commons-beanutils-1.8.3.jar和commons-logging-1.1.1.jar

private void test4(HttpServletRequest request) {
try {
User u = new User();
System.out.println("封装数据前:"+u);
BeanUtils.populate(u, request.getParameterMap());
System.out.println("封装数据后:"+u);
} catch (Exception e) {
e.printStackTrace();
}
}

3.请求转发(请求一次)

request.getRequestDispatcher("/demo6").include(request, response);

写入需要传递的值

//将非表单的数据添加到request的域中
request.setAttribute("s", str);

获取传过来的值

//将request对象中的移除
//request.removeAttribute("s");
//从request对象中获取s的值
String s = (String) request.getAttribute("s");

4.重定向(请求两次)

//将请求转发到demo6中
//request.getRequestDispatcher("/servlet/demo6").forward(request, response);
//注:请求转发不能跳转到其它应用
//request.getRequestDispatcher("http://www.baidu.com").forward(request, response);
//使用重定向
//response.sendRedirect(request.getContextPath()+"/servlet/demo6");
//可以跳转到其它应用
//response.sendRedirect("http://www.baidu.com");

5.请求包含

//请求包含
request.getRequestDispatcher("/demo6").include(request, response);

6.解决乱码

request.setCharacterEncoding("UTF-8");//只能解决post方式的乱码
userName = new String(userName.getBytes("iso-8859-1"),"UTF-8");//解决get乱码

  

Java Web之路(二)Servlet之HttpServletResponse和HttpServletRequest的更多相关文章

  1. SpringMVC内容略多 有用 熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。

    熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构 ...

  2. Java web每天学之Servlet工作原理详情解析

    上篇文章中我们介绍了Servlet的实现方式以及Servlet的生命周期,我们这篇文章就来介绍一下常用对象. 点击回顾:<Java Web每天学之Servlet的工作原理解析>:<J ...

  3. Java Web高性能开发(二)

    今日要闻: 性价比是个骗局: 对某个产品学上三五天个把月,然后就要花最少的钱买最多最好的东西占最大的便宜. 感谢万能的互联网,他顺利得手,顺便享受了智商上的无上满足以及居高临下的优越感--你们一千块买 ...

  4. Java Web每天学之Servlet的原理解析

    Java Web每天学之Servlet的工作原理解析,上海尚学堂Java技术文章Java Web系列之二上一篇文章Java Web每天学之Servlet的工作原理解析是之一,欢迎点击阅读. Servl ...

  5. 【Java Web开发学习】Servlet、Filter、Listener

    [Java Web开发学习]Servlet 转发:https://www.cnblogs.com/yangchongxing/p/9274739.html 1.Servlet package cn.y ...

  6. java web学习总结(二十四) -------------------Servlet文件上传和下载的实现

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  7. java web学习总结(二十一) -------------------模拟Servlet3.0使用注解的方式配置Servlet

    一.Servlet的传统配置方式 在JavaWeb开发中, 每次编写一个Servlet都需要在web.xml文件中进行配置,如下所示: 1 <servlet> 2 <servlet- ...

  8. java web学习总结(六) -------------------servlet开发(二)

    一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...

  9. Java Web之路(一)Servlet

    前言 执行过程 Servlet 生命周期.工作原理:http://www.cnblogs.com/xuekyo/archive/2013/02/24/2924072.html Servlet的生命周期 ...

  10. Servlet视频-开发第一个java web(最简单的java web程序)(二)

    web项目有目录结构要求 WEB-INFO 文件夹 是一个Servlet规范,必须要这么命名,在换个文件夹里面如果创建一个jsp文件是不能直接访问的,在WEB-INfO文件夹之外创建的jsp可以直接访 ...

随机推荐

  1. 【转】浅谈php://filter的妙用

    php://filter是PHP中独有的协议,利用这个协议可以创造很多“妙用”,本文说几个有意思的点,剩下的大家自己下去体会. XXE中的使用 php://filter之前最常出镜的地方是XXE.由于 ...

  2. WebGL模型拾取——射线法

    今天要把WebGL中一个非常重要的算法记录下来——raycaster射线法拾取模型.首先我们来了解一下为什么要做模型拾取,我们在做webgl场景交互的时候经常要选中场景中的某个模型,比如鼠标拖拽旋转, ...

  3. ngnix的基本安装及配置 centos7

    1.centos7  挂载ngnix的源 rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7- ...

  4. ats反向代理和重定向

    作为反向代理缓存,ats代表源服务器提供的请求. ats的配置方式使客户端看起来像普通的原始服务器. 了解反向代理缓存通过转发代理缓存, ats代表请求内容的客户端队里对源服务器的web请求.反向代理 ...

  5. 【大数据实战】将普通文本文件导入ElasticSearch

    以<刑法>文本.txt为例. 一.格式化数据 1,首先,ElasticSearch只能接收格式化的数据,所以,我们需要将文本文件转换为格式化的数据---json. 下图为未处理的文本文件. ...

  6. PTA (Advanced Level) 1002 A+B for Polynomials

    1002 A+B for Polynomials This time, you are supposed to find A+B where A and B are two polynomials. ...

  7. Daily Scrum NO.1

    工作概况 符美潇(PM): 今日工作 1.根据开发进程分配第一步开发工作,对相应的成员提出今日的开发要求:要求成员自己所负责的线程池,动态爬取,去重,文件分类等部分进行资料的相关了解. 2.Daily ...

  8. “Linux内核分析”实验二报告

    张文俊 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.第二周学习内 ...

  9. 剑指offer:二叉树的镜像

    题目描述: 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / ...

  10. Daily Scrum - 11/19

    今天任烁帮忙更新了大家在Sprint 2中的Task,基本每人的Task都是细分到每天的,这样大家初期的工作应该会更有效率一点. 任烁今天表示“进度条背词法”应该是可以融合到原有算法中的,期待他的改进 ...