Http的请求和响应
2018-01-06 00:00
260 查看
摘要: HttpServletResponse HttpServletRequest
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。
setHeader(String name, String value) 设置响应头信息
//告知浏览器使用什么码表 response.setHeader("content-type", "text/html;charset=UTF-8");
//告知客户端不缓存
response.setHeader("pragma", "no-cache");
response.setHeader("cache-control", "no-cache");
response.setDateHeader("expires", 0);
Referesh刷新
getOutputStream(); 字节输出流
setCharacterEncoding(String charset) 告知服务器使用什么编码
*****setContentType(String type)
getMethod(); 获得请求方式
***getRequestURL();返回客户端发出请求时的完整URL。
***getRequestURI(); 返回请求行中的资源名部分。
*****getContextPath(); 当前应用的虚拟目录 /day09_01_request
getQueryString() ; 返回请求行中的参数部分。
Enumeration getHeaderNames() 得到所有头信息name
Enumeration getHeaders(String name) 根据头名称得到相同名称头信息值
*** getParameter(name) 根据表单中name属性的名,获取value属性的值方法
*** getParameterValues(String name)专业为复选框取取提供的方法
getParameterNames() 得到表单提交的所有name的方法
*** getParameterMap 到表单提交的所有值的方法 //做框架用,非常实用
getInputStream 以字节流的方式得到所有表单数据
*** Object getAttribute(String name);
Void removeAttribute(String name);
RequestDispatcher getRequestDispatcher(String path)
*** forward(ServletRequest request, ServletResponse response) //转发的方法
include(ServletRequest request, ServletResponse response) //请求包含
*****request.setCharacterEncoding("UTF-8"); //告诉服务器客户端什么编码,只能处理post请求方式
//解决get方式编码
String name = new String(name.getBytes(“iso-8859-1”),”UTF-8”);
/*下载文件*/
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。
一、HttpServletResponse
1、响应行 HTTP/1.1 200 OK
setStatus(int sc) 设置响应状态码2、响应头
***** sendRedirect(String location) 请求重定向setHeader(String name, String value) 设置响应头信息
//告知浏览器使用什么码表 response.setHeader("content-type", "text/html;charset=UTF-8");
//告知客户端不缓存
response.setHeader("pragma", "no-cache");
response.setHeader("cache-control", "no-cache");
response.setDateHeader("expires", 0);
Referesh刷新
3、响应正文(主体)
*** getWrite(); 字符输出流getOutputStream(); 字节输出流
setCharacterEncoding(String charset) 告知服务器使用什么编码
*****setContentType(String type)
二、HttpServletRequest
1、请求行
Get http://localhost:8080/day09/servlet/req1?username=zs http/1.1getMethod(); 获得请求方式
***getRequestURL();返回客户端发出请求时的完整URL。
***getRequestURI(); 返回请求行中的资源名部分。
*****getContextPath(); 当前应用的虚拟目录 /day09_01_request
getQueryString() ; 返回请求行中的参数部分。
System.out.println(request.getMethod());// GET System.out.println(request.getRequestURL()); // http://localhost:8080/day09_01_HttpServletRequest/servlet/demo1 System.out.println(request.getRequestURI()); // /day09_01_HttpServletRequest/servlet/demo1 System.out.println(request.getContextPath()); // /day09_01_HttpServletRequest System.out.println(request.getQueryString()); // username=zs
2、请求消息头
* String getHeader(String name) 根据头名称得到头信息值Enumeration getHeaderNames() 得到所有头信息name
Enumeration getHeaders(String name) 根据头名称得到相同名称头信息值
3、请求正文(重要)
与获取表单数据相关的方法
<input type="text" name="username" />*** getParameter(name) 根据表单中name属性的名,获取value属性的值方法
*** getParameterValues(String name)专业为复选框取取提供的方法
getParameterNames() 得到表单提交的所有name的方法
*** getParameterMap 到表单提交的所有值的方法 //做框架用,非常实用
getInputStream 以字节流的方式得到所有表单数据
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(); } } 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(); } } 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 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); }
与操作非表单数据相关的方法(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”);
/*下载文件*/
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(); }
相关文章推荐
- http 请求响应码
- 【转帖】客户端通过 HTTP 请求和响应 的 Header 信息总结
- Charles_N:HTTP请求响应监听工具
- HTTP详解-请求、响应、缓存
- 什么叫以http形式传输?HTTP请求报文和HTTP响应报文(报文就是一串数据)
- nginx记录分析网站响应慢的请求(ngx_http_log_request_speed)
- HTTP请求报文和HTTP响应报文
- Http协议中关于请求与响应中文参数乱码问题详解
- http请求消息头与响应消息头
- Http响应和请求的编码问题
- 通俗易懂客户端与服务器端交互原理(HTTP数据请求与HTTP响应,包括Servlet部分)
- Http-009-通过请求和响应的交换达成通信
- node.js+android http请求响应
- Apache、IIS、Nginx等绝大多数web服务器,都不允许静态文件响应POST请求,否则会返回“HTTP/1.1 405 Method not allowed”错误。
- HTTP数据请求与响应
- HTTP响应头和请求头信息对照表
- HttpClient POST 请求每次响应延迟3秒问题
- HttpServlet容器响应Web客户请求流程
- HTTP请求报文和HTTP响应报文
- HTTP——请求和响应格式