码迷,mamicode.com
首页 > 其他好文 > 详细

request $ response

时间:2017-10-12 20:26:17      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:处理   密码   字符流   utf-8   方式   map   自己   版本   ora   

两个对象  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

标签:处理   密码   字符流   utf-8   方式   map   自己   版本   ora   

原文地址:http://www.cnblogs.com/nextgg/p/7657650.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!