request $ response

Posted bbs1234

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了request $ response相关的知识,希望对你有一定的参考价值。

两个对象  request response 指的是实现了 ServletResponse接口的

HttpServletResponse

功能1 response对象的概述

 

 

  1. response  代表 服务器对浏览器的响应  通过HTTP响应协议

 

2.response中 存在的方法 响应给客户端

 

 

 

应用RESPONSE

1. 响应首行手动向浏览器 发送404 状态码

a) 如果一个方法过时了 一般源码有提示信息

 

 

 

 

 

 

2重定向

 

 

效果图 输入www.localhost:80/jw08resq&req/Bservlet  错误

 

 

 

2.1开发中重定向

傻瓜式重定向不用明白原理

使用response的一个方法

 

 

 

 

 

 

 

 

3浏览器和服务器的访问流程

 

 

4. web项目结构

 

 

 

 

 

 

5. refresh头,刷新 五秒后跳转

 

 

 

 

 

 

 

6. 浏览器和服务器通信监视器Fidder

 

 

7. 相应正文

7.1发送字节流 发送中文 制造并且解决乱码问题

 

 

 

 

 

  字节流乱码   utf-------gbk

7.2使用字符流发送字符

 

 

 IS5 9  编码集中不存在中文

 

 

 

 

 

 

 

字节流 发文本  字符流 发图片或者多媒体信息

7.3字节流和字符流不能同时使用

 

8服务器错误

 

7.4使用字节流发送图片

 

告诉浏览器 服务器输入的文件类型 text/html是关于字符内容类型

imgae/jpeg” 告诉浏览器 服务器发送过去的是一个图片

 

 

 

 

 

告诉浏览器 你发送的字节流 0101 是什么格式的  浏览器去解析  这个文件的是什么类型 image/jpeg

 

 

7.4使用字节流发送文件(就是文件下载)

 

服务器把文件发送个浏览器

 

  1. 直接访问该文件 下载

 

  1. 把文件放在 WEB-INF外界访问不到 控制下载权限

 

 

 

//0 告诉浏览器是什么东西(不用手动去类型查文件对象那个是什么)

//getServletContext().getMimeType(".jar") Context对象根据 后缀名去             

                  web.xml查找mime类型.

response.setContentType(getServletContext().getMimeType(".avi"));

//告诉浏览器推荐用户使用什么名称下载 一般选择英文类型

response.setHeader("Content-Disposition", "attachment;filename=java.avi");

//1 获得图片的输入流

InputStream  in =   

                  getServletContext().getResourceAsStream("/WEB-INF/03225.avi");

//2 通过response获得输出字节流

OutputStream out = response.getOutputStream();

//3 两个对接

byte[] buffer = new byte[1024];

int len = 0;

while((len=in.read(buffer))>0){

out.write(buffer, 0, len);

out.flush();

}

in.close();

out.close();

 

 

 

功能2 request对象的概述

 

1.request对象 封装了 浏览器发过来的信息

Request对象

1. 获取浏览器请求首行请求头

 

 

请求首行  请求方式 请求路径  协议/版本号

request.getMethod(): GET

request.getRequestURI(): /Day08-request/AServlet

request.getServletPath(): /AServlet

request.getContextPath(): /Day08-request 获得应用路径 /jw08rr02

request.getScheme(): http

请求头

          //--原始方式获得请求头 比较繁琐有key  得到value

String getHeader(String name)   

long getDateHeader(String name)

int getIntHeader(String name)

Enumeration getHeaders(String name)

Enumeration getHeaderNames()

 

           //---javaee封装好的方法.

request.getContentLength(): -1

request.getContentType(): null

request.getLocale(): zh_CN zh 中文

request.getQueryString(): name=tom&age=18

request.getRequestURL(): http://localhost:8080/Day08-request/AServlet 绝对路径 网络上的任何资源

request.getRequestURI(): /Day08-request/AServlet  相对路径

 

request.getRemoteAddr(): 0:0:0:0:0:0:0:1

request.getRemoteHost(): 0:0:0:0:0:0:0:1

request.getRemotePort(): 52074 获得远端 浏览器的

request.getServerName(): localhost

request.getServerPort(): 8080

请求空行

 

请求正文 表单传送过来的键值对

 

2.获得请求正文 获得表单提交的参数. 乱码问题

2.1乱码:只要确保编码和解码一致,就绝对没有问题.

 

 

1. GET方式 
  1.  http://localhost:8080/jw08rr02/BBServlet?name=tom&age=18

1.浏览器负责编码.浏览器使用的码表就是表单所在页面的码表.

 

2.服务器负责解码.服务器默认使用ISO-8859-1解码. 但如果你的服务器使用的是utf-8就不用配置了 如下配 置的URIEncoding来决定   

              解码码表

 <Connector port="8080" protocol="HTTP/1.1"  URIEncoding="UTF-8"

connectionTimeout="20000"

redirectPort="8443" /> tomcat  servlet .xml

如上配置会影响整个服务器不推荐.

我们使用如下代码解决:

//获得参数

String name = request.getParameter("name");

//因为服务器使用了错误的码表,那么我们按照错误的码表原路返回

byte[] nameByte = name.getBytes("ISO-8859-1");

//用正确的码表重新解码

String newName = new String(nameByte,"UTF-8");

 

System.out.println("解决之后的:"+newName);

 

2.POST方式

因为Post解码是在调用getParameter同时进行解码,那么解决乱码只需要在调用该方法之前设置服务器解码方式

request.setCharacterEncoding("UTF-8");

 

String name = request.getParameter("name");

 

System.out.println(name);

 

涉及到获得表单参数的方法还有哪些呢?

String getParameter() 根据键获得值

 

Map getParameterMap()  获得服务器保存表单参数的容器

           就是map<String,String[]>. 泛型: habit=chi&habit=shui&habit=la

            for(Entry<String, String[]> en : map.entrySet()){

    String key = en.getKey();

    String[] value = en.getValue();

    System.out.println(key+"==>" +Arrays.toString(value));

    }

Enumeration getParameterNames()  获得提交的所有键  列举

            while(en.hasMoreElements()){

String key = en.nextElement();

System.out.println("提交上来的键==>"+key);

}

String[] getParameterValues(String name)  根据键获得值.

              获得一键对应多 个值的情况的.

              System.out.println(Arrays.toString(habits));

 

 

 

//---------------------------------------------------------------------------------------------------------------------

2. request的请求转发和包含功能.

 

 

转发:

一个Servlet处理完毕交给下面的servlet(JSP)继续处理.

作用:

在现实开发中,没有servlet转发给servlet的情况.都是由servlet转发给JSP.

这样可以达到分工的作用:

servlet: 比较适合处理业务.

JSP: 比较适合显示功能

注意问题:

//servlet中不要做 输出正文的动作,没有结果的

//如果放到前面会出现乱码.  解决 response.serCharacterEncoding(“utf-8”);  

                          字符串 通过 utf-8编码 变为 二进制字节 传输

                                         网页 通过  utf-8编码集  把二进制字节解码

   

逻辑处理

 

//1 获得表单提交的用户名密码

String name = request.getParameter("name");

String password = request.getParameter("password");

 

//2 判断是否正确 tom 1234 才算成功

 

if(name!=null && name.trim().length()>0 && name.equals("tom")&&

password!=null && password.trim().length()>0 &&   

                password.equals("1234")){

//成功 ==>  转发到成功页面

request.getRequestDispatcher("/login/success.jsp").forward(request,

                                         response);

 

//自己来做,很多弊端,不要这样

/* AServlet a = new AServlet();

a.service(request, response);*/

}else{

//失败 ==>  转发到失败页面

request.getRequestDispatcher("/login/error.jsp").forward(request, response);

}

//但是响应头是可以设置的.

 

请求包含:

 

两个servlet(jsp)共同向浏览器输出内容.

作用:

在现实开发中,多个页面含有相同的内容,我们把相同的内容抽取到一个jsp,在需要显示这个段内容的jsp,包含抽取的jsp.可以达到

统一管理相同的内容.

正文部分和页脚分开显示

 

 

 

 

两个jsp页面 success包含 error页面  访问一个 success页面就行

 

 

 

有不严谨的地方   使用jsp标签来实现

 

 

3.request域的应用.

原理:

request对象中含有一个map.这个map就是request.

作用:

在将来开发中. 使用请求转发时,servlet处理完数据, 处理结果要交给jsp显示. 可以使用request域将处理结果有servlet带给jsp显示. 共享数据

 

操作:

1.setAttribute(key,value)  存入一个键值对

2.getAttribute(key)  通过键取出值

3.getAttributeNames() 获得域中所有键

4.removeAttribute(key) 跟据键移除一个键值对

 

request的范围:

一个request对象对应一个request(map).

系统当前有多少个request就有多少request.

 

 

 

//1 获得表单提交的用户名密码

String name = request.getParameter("name");

String password = request.getParameter("password");

 

//

Map<String,String> error = new HashMap<String, String>();

 

//2 验证

if(!(name!=null && name.trim().length()>0 && name.equals("tom"))){

error.put("name", "用户名有误!");

}

if(!(password!=null && password.trim().length()>0 && password.equals("1234"))){

error.put("password", "密码错误!");

}

 

 

//将错误信息通过request域带到错误页面

request.setAttribute("error",error );

if(error.size() > 0){

//失败==> 回到登录页面,并显示错误信息

request.getRequestDispatcher("/login2/login.jsp").forward(request, response);

}else{

//成功==> 成功页面

request.getRequestDispatcher("/login2/success.jsp").forward(request, response);

}

 

  <body>

  <h1>用户登录</h1>

  <form action="/Day08-request/HServlet" method="POST">

  用户名:<input type="text" name="name" /> <br>

  密码:<input type="password" name="password" /><br>

  <input type="submit" >

  </form>

  <%

  Map<String,String> error = (Map<String,String>)request.getAttribute("error");

 

  if(error!=null && error.size()>0){

  for(Entry<String,String> en : error.entrySet()){

  out.print("<font color=‘red‘>");

  out.print(en.getValue()+"<br>");

  out.print("</font>");

  }

  }

 

  %>

  </body>

 

//=================================================================================================================

路径总结:

路径分为两种情况:

1.客户端路径 ==> 给浏览器用的路径/相对于主机

<form action="/Day08-request/AServlet" >

<a href="/Day08-request/AServlet" >

<img src="/Day08-request/AServlet" >

response.sendRedirect("/Day08-request/AServlet")

Refresh:3;url=/Day08-request/AServlet

路径写法:

"/" :  "/" ==> 相对于 主机.

例如: 表单所在页面路径为==>

         http://localhost:8080/Day08-request/login.jsp ==> "/" 代表http://localhost:8080/

 

不带"/":(开发中一定不要出现不带"/"的情况).代表从当前目录找.

例如: 表单所在页面路径为==>     

         http://localhost:8080/Day08-request/info/login.jsp ==> 代表  

         http://localhost:8080/Day08-request/info/

 

 

2.服务器端路径/相对于项目

<url-pattern> /AServlet  ==> http://localhost:8080/Day08-request/AServlet

request.getRequestDispatcher("/AServlet") ==>  

                           http://localhost:8080/Day08-request/AServlet

路径写法:

"/": 相对于项目.  "/"==>http://localhost:8080/Day08-request/

 

 

 

 

 

 

 

 

 

 

两个对象  request response 指的是实现了 ServletResponse接口的

HttpServletResponse

功能1 response对象的概述

 

 

  1. response  代表 服务器对浏览器的响应  通过HTTP响应协议

 

2.response中 存在的方法 响应给客户端

 

 

 

应用RESPONSE

1. 响应首行手动向浏览器 发送404 状态码

a) 如果一个方法过时了 一般源码有提示信息

 

 

 

 

 

 

2重定向

 

 

效果图 输入www.localhost:80/jw08resq&req/Bservlet  错误

 

 

 

2.1开发中重定向

傻瓜式重定向不用明白原理

使用response的一个方法

 

 

 

 

 

 

 

 

3浏览器和服务器的访问流程

 

 

4. web项目结构

 

 

 

 

 

 

5. refresh头,刷新 五秒后跳转

 

 

 

 

 

 

 

6. 浏览器和服务器通信监视器Fidder

 

 

7. 相应正文

7.1发送字节流 发送中文 制造并且解决乱码问题

 

 

 

 

 

  字节流乱码   utf-------gbk

7.2使用字符流发送字符

 

 

 IS5 9  编码集中不存在中文

 

 

 

 

 

 

 

字节流 发文本  字符流 发图片或者多媒体信息

7.3字节流和字符流不能同时使用

 

8服务器错误

 

7.4使用字节流发送图片

 

告诉浏览器 服务器输入的文件类型 text/html是关于字符内容类型

imgae/jpeg” 告诉浏览器 服务器发送过去的是一个图片

 

 

 

 

 

告诉浏览器 你发送的字节流 0101 是什么格式的  浏览器去解析  这个文件的是什么类型 image/jpeg

 

 

7.4使用字节流发送文件(就是文件下载)

 

服务器把文件发送个浏览器

 

  1. 直接访问该文件 下载

 

  1. 把文件放在 WEB-INF外界访问不到 控制下载权限

 

 

 

//0 告诉浏览器是什么东西(不用手动去类型查文件对象那个是什么)

//getServletContext().getMimeType(".jar") Context对象根据 后缀名去             

                  web.xml查找mime类型.

response.setContentType(getServletContext().getMimeType(".avi"));

//告诉浏览器推荐用户使用什么名称下载 一般选择英文类型

response.setHeader("Content-Disposition", "attachment;filename=java.avi");

//1 获得图片的输入流

InputStream  in =   

                  getServletContext().getResourceAsStream("/WEB-INF/03225.avi");

//2 通过response获得输出字节流

OutputStream out = response.getOutputStream();

//3 两个对接

byte[] buffer = new byte[1024];

int len = 0;

while((len=in.read(buffer))>0){

out.write(buffer, 0, len);

out.flush();

}

in.close();

out.close();

 

 

 

功能2 request对象的概述

 

1.request对象 封装了 浏览器发过来的信息

Request对象

1. 获取浏览器请求首行请求头

 

 

请求首行  请求方式 请求路径  协议/版本号

request.getMethod(): GET

request.getRequestURI(): /Day08-request/AServlet

request.getServletPath(): /AServlet

request.getContextPath(): /Day08-request 获得应用路径 /jw08rr02

request.getScheme(): http

请求头

          //--原始方式获得请求头 比较繁琐有key  得到value

String getHeader(String name)   

long getDateHeader(String name)

int getIntHeader(String name)

Enumeration getHeaders(String name)

Enumeration getHeaderNames()

 

           //---javaee封装好的方法.

request.getContentLength(): -1

request.getContentType(): null

request.getLocale(): zh_CN zh 中文

request.getQueryString(): name=tom&age=18

request.getRequestURL(): http://localhost:8080/Day08-request/AServlet 绝对路径 网络上的任何资源

request.getRequestURI(): /Day08-request/AServlet  相对路径

 

request.getRemoteAddr(): 0:0:0:0:0:0:0:1

request.getRemoteHost(): 0:0:0:0:0:0:0:1

request.getRemotePort(): 52074 获得远端 浏览器的

request.getServerName(): localhost

request.getServerPort(): 8080

请求空行

 

请求正文 表单传送过来的键值对

 

2.获得请求正文 获得表单提交的参数. 乱码问题

2.1乱码:只要确保编码和解码一致,就绝对没有问题.

 

 

1. GET方式 
  1.  http://localhost:8080/jw08rr02/BBServlet?name=tom&age=18

1.浏览器负责编码.浏览器使用的码表就是表单所在页面的码表.

 

2.服务器负责解码.服务器默认使用ISO-8859-1解码. 但如果你的服务器使用的是utf-8就不用配置了 如下配 置的URIEncoding来决定   

              解码码表

 <Connector port="8080" protocol="HTTP/1.1"  URIEncoding="UTF-8"

connectionTimeout="20000"

redirectPort="8443" /> tomcat  servlet .xml

如上配置会影响整个服务器不推荐.

我们使用如下代码解决:

//获得参数

String name = request.getParameter("name");

//因为服务器使用了错误的码表,那么我们按照错误的码表原路返回

byte[] nameByte = name.getBytes("ISO-8859-1");

//用正确的码表重新解码

String newName = new String(nameByte,"UTF-8");

 

System.out.println("解决之后的:"+newName);

 

2.POST方式

因为Post解码是在调用getParameter同时进行解码,那么解决乱码只需要在调用该方法之前设置服务器解码方式

request.setCharacterEncoding("UTF-8");

 

String name = request.getParameter("name");

 

System.out.println(name);

 

涉及到获得表单参数的方法还有哪些呢?

String getParameter() 根据键获得值

 

Map getParameterMap()  获得服务器保存表单参数的容器

           就是map<String,String[]>. 泛型: habit=chi&habit=shui&habit=la

            for(Entry<String, String[]> en : map.entrySet()){

    String key = en.getKey();

    String[] value = en.getValue();

    System.out.println(key+"==>" +Arrays.toString(value));

    }

Enumeration getParameterNames()  获得提交的所有键  列举

            while(en.hasMoreElements()){

String key = en.nextElement();

System.out.println("提交上来的键==>"+key);

}

String[] getParameterValues(String name)  根据键获得值.

              获得一键对应多 个值的情况的.

              System.out.println(Arrays.toString(habits));

 

 

 

//---------------------------------------------------------------------------------------------------------------------

2. request的请求转发和包含功能.

 

 

转发:

一个Servlet处理完毕交给下面的servlet(JSP)继续处理.

作用:

在现实开发中,没有servlet转发给servlet的情况.都是由servlet转发给JSP.

这样可以达到分工的作用:

servlet: 比较适合处理业务.

JSP: 比较适合显示功能

注意问题:

//servlet中不要做 输出正文的动作,没有结果的

//如果放到前面会出现乱码.  解决 response.serCharacterEncoding(“utf-8”);  

                          字符串 通过 utf-8编码 变为 二进制字节 传输

                                         网页 通过  utf-8编码集  把二进制字节解码

   

逻辑处理

 

//1 获得表单提交的用户名密码

String name = request.getParameter("name");

String password = request.getParameter("password");

 

//2 判断是否正确 tom 1234 才算成功

 

if(name!=null && name.trim().length()>0 && name.equals("tom")&&

password!=null && password.trim().length()>0 &&   

                password.equals("1234")){

//成功 ==>  转发到成功页面

request.getRequestDispatcher("/login/success.jsp").forward(request,

                                         response);

 

//自己来做,很多弊端,不要这样

/* AServlet a = new AServlet();

a.service(request, response);*/

}else{

//失败 ==>  转发到失败页面

request.getRequestDispatcher("/login/error.jsp").forward(request, response);

}

//但是响应头是可以设置的.

 

请求包含:

 

两个servlet(jsp)共同向浏览器输出内容.

作用:

在现实开发中,多个页面含有相同的内容,我们把相同的内容抽取到一个jsp,在需要显示这个段内容的jsp,包含抽取的jsp.可以达到

统一管理相同的内容.

正文部分和页脚分开显示

 

 

 

 

两个jsp页面 success包含 error页面  访问一个 success页面就行

 

 

 

有不严谨的地方   使用jsp标签来实现

 

 

3.request域的应用.

原理:

request对象中含有一个map.这个map就是request.

作用:

在将来开发中. 使用请求转发时,servlet处理完数据, 处理结果要交给jsp显示. 可以使用request域将处理结果有servlet带给jsp显示. 共享数据

 

操作:

1.setAttribute(key,value)  存入一个键值对

2.getAttribute(key)  通过键取出值

3.getAttributeNames() 获得域中所有键

4.removeAttribute(key) 跟据键移除一个键值对

 

request的范围:

一个request对象对应一个request(map).

系统当前有多少个request就有多少request.

 

 

 

//1 获得表单提交的用户名密码

String name = request.getParameter("name");

String password = request.getParameter("password");

 

//

Map<String,String> error = new HashMap<String, String>();

 

//2 验证

if(!(name!=null && name.trim().length()>0 && name.equals("tom"))){

error.put("name", "用户名有误!");

}

if(!(password!=null && password.trim().length()>0 && password.equals("1234"))){

error.put("password", "密码错误!");

}

 

 

//将错误信息通过request域带到错误页面

request.setAttribute("error",error );

if(error.size() > 0){

//失败==> 回到登录页面,并显示错误信息

request.getRequestDispatcher("/login2/login.jsp").forward(request, response);

}else{

//成功==> 成功页面

request.getRequestDispatcher("/login2/success.jsp").forward(request, response);

}

 

  <body>

  <h1>用户登录</h1>

  <form action="/Day08-request/HServlet" method="POST">

  用户名:<input type="text" name="name" /> <br>

  密码:<input type="password" name="password" /><br>

  <input type="submit" >

  </form>

  <%

  Map<String,String> error = (Map<String,String>)request.getAttribute("error");

 

  if(error!=null && error.size()>0){

  for(Entry<String,String> en : error.entrySet()){

  out.print("<font color=‘red‘>");

  out.print(en.getValue()+"<br>");

  out.print("</font>");

  }

  }

 

  %>

  </body>

 

//=================================================================================================================

路径总结:

路径分为两种情况:

1.客户端路径 ==> 给浏览器用的路径/相对于主机

<form action="/Day08-request/AServlet" >

<a href="/Day08-request/AServlet" >

<img src="/Day08-request/AServlet" >

response.sendRedirect("/Day08-request/AServlet")

Refresh:3;url=/Day08-request/AServlet

路径写法:

"/" :  "/" ==> 相对于 主机.

例如: 表单所在页面路径为==>

         http://localhost:8080/Day08-request/login.jsp ==> "/" 代表http://localhost:8080/

 

不带"/":(开发中一定不要出现不带"/"的情况).代表从当前目录找.

例如: 表单所在页面路径为==>     

         http://localhost:8080/Day08-request/info/login.jsp ==> 代表  

         http://localhost:8080/Day08-request/info/

 

 

2.服务器端路径/相对于项目

<url-pattern> /AServlet  ==> http://localhost:8080/Day08-request/AServlet

request.getRequestDispatcher("/AServlet") ==>  

                           http://localhost:8080/Day08-request/AServlet

路径写法:

"/": 相对于项目.  "/"==>http://localhost:8080/Day08-request/

 

 

 

 

 

 

 

 

 

 

以上是关于request $ response的主要内容,如果未能解决你的问题,请参考以下文章

如何显示从 API 响应中接收到的图像?

如何使用 Hibernate session.save() 插入/保存对象而不更新旧记录

Request,Request.QueryString,Request.Params,Request.Form,Request.ServerVariables之间的区别

request.getScheme() request.getServerName() request.getServerPort() request.getContextPath()(示例(代码

request.getParameter()request.getInputStream()和request.getReader()

request.getParameter() request.getInputStream()和request.getReader()三者的区别