javaWeb---response与request

bs架构的应用,是基于浏览器与服务器的模式,它的基础是http协议。简单来说就是:Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。在此简单描述下使用java的实现方式。

一、HttpServletResponse

1、响应行  HTTP/1.1  200 OK

setStatus(int sc) 设置响应状态码

2、响应头

 sendRedirect(String location) 请求重定向

 setHeader(String name, String value) 设置响应头信息

 Referesh刷新

 response.setIntHeader("refresh", 1);//设置1秒钟刷新一次

 response.setHeader("refresh", "3;url=postid=8143349"); //设置3秒钟跳转

 //告知浏览器使用什么编码

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

 //告知客户端不缓存

 response.setHeader("pragma", "no-cache");

 response.setHeader("cache-control", "no-cache");

 response.setDateHeader("expires", 0);

3、响应正文(主体)

 getWrite(); //字符输出流

 getOutputStream(); //字节输出流

 response.getWriter().write("注册成功!");   //把数据响应到客户端,ajax时可以用它来局部刷新。

 response.getOutputStream().write("你好!".getBytes("UTF-8"));

 

 setCharacterEncoding(String charset)  //告诉服务器使用什么编码 

 response.setContentType("text/html; charset=UTF-8");//告诉服务器应用使用UTF-8解析文本,同时告诉客户端要使用什么编码

 

重定向:浏览器向服务器发送一个请求,服务器setStatus(302),setHeader(“location”,”url”);(或者response.sendRedirect("URL");)返回客户端302与url地址,客户端再次向服务器申请URL地址。

转发:是服务器端的操作,可以带参数的。客户端向服务器1发送一个请求,服务器1把请求地址转发给后端服务器2,待服务器2返回服务器1,再发给客户端。

 

 

二、HttpServletRequest

1、请求行 

Get  http://localhost:8080/servlet/req1?username=zs  http/1.1

getMethod(); 获得请求方式

getRequestURL();返回客户端发出请求时的完整URL。

getRequestURI(); 返回请求行中的资源名部分。

getContextPath(); 当前应用的虚拟目录 

getQueryString() ; 返回请求行中的参数部分。

2、请求消息头

 String   getHeader(String name)  根据头名称得到头信息值

 Enumeration   getHeaderNames()  得到所有请求消息头的name,再循环根据name取每name的值

 Enumeration   getHeaders(String name)  根据头名称得到相同名称头信息值

 

  request.getHeaders("accept-language"); //多个循环取值

  request.getHeader("User-Agent");//通过它的值可判断浏览器类型

 

 

3、请求正文

与获取表单数据相关的方法

<input type="text" name="username" />

getParameter(name) 根据表单中name属性的名,获取value属性的值方法

getParameterValues(String name)专业为复选框取取提供的方法

getParameterNames() 得到表单提交的所有name的方法

getParameterMap 到表单提交的所有值的方法   //做框架用,非常实用

getInputStream  以字节流的方式得到所有表单数据

 

//获取所有的表单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]);
  }
}

 

与操作非表单数据相关的方法(request也是一个域对象)

void setAttribute(String name, Object value);

Object getAttribute(String name);

Void removeAttribute(String name);

 

与请求转发相关的方法

//得到请求转发或请求包含的协助对象

RequestDispatcher getRequestDispatcher(String path)

forward(ServletRequest request, ServletResponse response) //转发的方法

include(ServletRequest request, ServletResponse response) //请求包含

 

与请求编码相关的方法:

//解决post方式编码

request.setCharacterEncoding("UTF-8"); //告诉服务器客户端什么编码,只能处理post请求方式

 

//解决get方式编码

String name = new String(name.getBytes(“iso-8859-1”),”UTF-8”);   //getBytes默认编码为本地编码(即:gbk)

 

 因为各个位置默认的编码不同经常会出现乱码现象。

 对于post请求而言:

 对于get请求而言,直接使用post的方式处理,处理无效:

  一个完整的流程大概是这样的,

  浏览器(post请求)---》服务器(request.setCharacterEncoding("UTF- 8"); response.setContentType("text/html;charset=UTF-8"); )---》浏览器

 

String id = request.getParameter("id"); //获取表单id的值

request.setAttribute("book", book); 将book放到request对象中,前置简写:Book book = findBookID(id);

request.setAttribute("books", list); 前置简写: List<Book> list = findAllBooks();

request.getRequestDispatcher("/products/list.jsp").forward(request, response);  //转发请求

 

posted @ 2018-01-16 09:51  milkty  阅读(144)  评论(0编辑  收藏  举报