java自学之路-----servlet_response、request
2014-11-13 20:09
513 查看
Web服务器收到客户端的http请求,会为每次请求分别创建一个request和response对象。想要获取客户端提交的数据只需要使用request对象;想要向客户端输出数据就需要使用response对象。
通过字节流
通过字符流
注意:
1.getOutputStream和getWriter分别得到用于输出二进制数据和字符的ServletOutputStream和PrintStream对象
2.getOutputStream和getWriter两个方法是互斥的,调用其中一个方法就不能调用另一个方法,否则会抛出IllegalStateException:...has been called for thisresponse
3.Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将会被Servlet引擎(web服务器)从response获取。然后将这些数据和响应消息组合输出到客户端
4.Servlet的service方法结束后,Servlet引擎(web服务器)将检查返回的输出流对象是否已经调用过close方法,如果没有Servlet引擎(web服务器)会调用close方法,进行关闭流对象
}
以下载的方式显示数据
自动刷新
response的请求重定向:一个web资源收到客户端的请求后,通知客户端去访问另一个web资源
特点:用户登陆和显示购物车(转发的话,刷新一次就执行一次刚刚的操作)会使用重定向技术
1.浏览器会向web发送两次请求。意味着有两次response和request
2.用重定向技术地址栏会改变
}
uri(通用资源标识符):/news/1.html,标识某一个资源
url(统一资源定位器):http://www.baidu.com/news/1.html,标识互联网上的一个资源,是uri的孩子。
获得客户机信息
getRequestURL方法返回客户端发出请求时的完整URL。
getRequestURI方法返回请求行中的资源名部分。
getQueryString 方法返回请求行中的参数部分。
getPathInfo方法返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。
getRemoteAddr方法返回发出请求的客户机的IP地址
getRemoteHost方法返回发出请求的客户机的完整主机名
getRemotePort方法返回客户机所使用的网络端口号
getLocalAddr方法返回WEB服务器的IP地址。
getLocalName方法返回WEB服务器的主机名
获得客户机请求头
getHeader方法
getHeaders方法
getHeaderNames方法
获得客户机请求参数(客户端提交的数据),获取值的时候先检查值是否为空
getParameter方法
getParameterValues(String name)方法
getParameterNames方法
getParameterMap方法
解决浏览器提交数据的乱码问题:(浏览器以什么码表打开就是用什么码表提交数据)
转发:
request对象实现请求转发,指一个web资源收到客户端的请求后,通知服务器区调用另一个web资源
注意:
1.forward方法用于将请求封装转发到RequestDispatcher对象封装的资源
2.如果在调用forward的方法之前,在Servlet程序中已经将部分内容发送给客户端,那么forward的方法就会抛出一个IllegalStateException异常。(在forward之前调用了输出流写数据或者有可能是之前也调用了一次forward程序没有停止方法)即:
3.如果在调用forward的方法之前,向request写入内容,只要写入的内容还没真正输出到客户端(这些资源都是先写到response对象中,等到服务器执行完service方法之后才会将缓冲中的数据写到浏览器中,因为执行完之后才会关闭流对象),forward方法就可以被正常执行,原来写到缓冲区(response)的内容将被清空。但已写入HttpServletResponse对象中的响应头字段信息保持有效。
}
Response{
将数据写到页面{通过字节流
<pre name="code" class="java">// 设置响应头,告诉浏览器响应回送的数据类型,Content要大写开头,否则会提示下载 response.setHeader("Content-type", "text/html;charset=UTF-8"); // 获得将数据写到页面的字节流对象 OutputStream out = response.getOutputStream(); // 使用meta标签模拟一个响应头,告诉浏览器以什么形式打开数据 // out.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'>".getBytes()); // 使用write方法,将数据写出。需要将数据转换为字节 out.write("中国".getBytes("UTF-8"));//指定码表
通过字符流
// 如果不指定response的码表就会出现乱码。因为数据是先写到response数据中。 // 再从response转成字节写到页面 response.setCharacterEncoding("GB2312");//指定response的码表 response.setHeader("Content-type", "text/html;charset=GB2312");//指定浏览器以什么码表打开 // 获得字符流 PrintWriter out = response.getWriter(); out.write("中国");
注意:
1.getOutputStream和getWriter分别得到用于输出二进制数据和字符的ServletOutputStream和PrintStream对象
2.getOutputStream和getWriter两个方法是互斥的,调用其中一个方法就不能调用另一个方法,否则会抛出IllegalStateException:...has been called for thisresponse
3.Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将会被Servlet引擎(web服务器)从response获取。然后将这些数据和响应消息组合输出到客户端
4.Servlet的service方法结束后,Servlet引擎(web服务器)将检查返回的输出流对象是否已经调用过close方法,如果没有Servlet引擎(web服务器)会调用close方法,进行关闭流对象
}
以下载的方式显示数据
// 1.获得文件在服务器的位置 String filepath = this.getServletContext().getRealPath("/download/1.jpg"); // 2.获得该文件名 String filename = filepath.substring(filepath.lastIndexOf("\\")+1); // 3.控制浏览器以下载模式打开数据.如果文件名是中文乱码,就需要进行url编码 response.setHeader("Content-disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8")); // 4.设置读取流,获取输出流。边读边写。写到浏览器 InputStream in = null; OutputStream out = null; try { in = new FileInputStream(filepath); out = response.getOutputStream(); int len = 0; byte buffer[] = new byte[1024]; while((len=in.read(buffer))>0){ out.write(buffer, 0, len); } } finally{ if(in != null){ try { in.close(); } catch (IOException e) { e.printStackTrace(); } } if(out != null){ try { out.close(); } catch (IOException e) { e.printStackTrace(); } } }
自动刷新
// 如果想要使用jsp页面进行显示数据。可以通过转发技术,然后将自动刷新定义在模拟头内<meta> // 设置刷新头 response.setHeader("Refresh", "3;url='/web/index.jsp'"); // 修改码表 response.setCharacterEncoding("UTF-8"); response.setHeader("Content-type", "text/html;charset=UTF-8"); response.getWriter().write("3秒后自动刷新到另一个网页");
response的请求重定向:一个web资源收到客户端的请求后,通知客户端去访问另一个web资源
特点:用户登陆和显示购物车(转发的话,刷新一次就执行一次刚刚的操作)会使用重定向技术
1.浏览器会向web发送两次请求。意味着有两次response和request
2.用重定向技术地址栏会改变
/*// 使用响应头来实现,设置状态码和location response.setStatus(302); response.setHeader("location", "/web/index.jsp"); */ // 使用重定向来实现, response.sendRedirect("/web/index.jsp");
}
uri(通用资源标识符):/news/1.html,标识某一个资源
url(统一资源定位器):http://www.baidu.com/news/1.html,标识互联网上的一个资源,是uri的孩子。
request{
常用方法:获得客户机信息
getRequestURL方法返回客户端发出请求时的完整URL。
getRequestURI方法返回请求行中的资源名部分。
getQueryString 方法返回请求行中的参数部分。
getPathInfo方法返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。
getRemoteAddr方法返回发出请求的客户机的IP地址
getRemoteHost方法返回发出请求的客户机的完整主机名
getRemotePort方法返回客户机所使用的网络端口号
getLocalAddr方法返回WEB服务器的IP地址。
getLocalName方法返回WEB服务器的主机名
获得客户机请求头
getHeader方法
getHeaders方法
getHeaderNames方法
获得客户机请求参数(客户端提交的数据),获取值的时候先检查值是否为空
getParameter方法
getParameterValues(String name)方法
getParameterNames方法
getParameterMap方法
解决浏览器提交数据的乱码问题:(浏览器以什么码表打开就是用什么码表提交数据)
// 只能解决post提交方式的乱码问题 request.setCharacterEncoding("UTF-8 4000 "); String value = request.getParameter("username");
// 解决get提交方式的乱码问题(还有几种方式修改配置文件,查看tomcat文档,不建议使用) String value = request.getParameter("username"); value = new String(value.getBytes("iso8859-1"),"UTF-8");
转发:
request对象实现请求转发,指一个web资源收到客户端的请求后,通知服务器区调用另一个web资源
// 通过request域(1.容器 2.作用范围)来进行请求转发传递数据 String data = "aaaa"; // 将数据封装到request中 request.setAttribute("data", data); // 将request转发给message。jsp request.getRequestDispatcher("/message.jsp").forward(request, response);
注意:
1.forward方法用于将请求封装转发到RequestDispatcher对象封装的资源
2.如果在调用forward的方法之前,在Servlet程序中已经将部分内容发送给客户端,那么forward的方法就会抛出一个IllegalStateException异常。(在forward之前调用了输出流写数据或者有可能是之前也调用了一次forward程序没有停止方法)即:
OutputStream out = response.getOutputStream(); out.write("aaa".getBytes()); // 将流关闭就以为这数据写到了客户端 out.close(); // 第一次forward request.getRequestDispatcher("/message.jsp").forward(request, response); // 第二次forward request.getRequestDispatcher("/message.jsp").forward(request, response);
3.如果在调用forward的方法之前,向request写入内容,只要写入的内容还没真正输出到客户端(这些资源都是先写到response对象中,等到服务器执行完service方法之后才会将缓冲中的数据写到浏览器中,因为执行完之后才会关闭流对象),forward方法就可以被正常执行,原来写到缓冲区(response)的内容将被清空。但已写入HttpServletResponse对象中的响应头字段信息保持有效。
}
相关文章推荐
- javaweb09.2_ServletRequest/ServletResponse
- [Java] HttpServletResponse.sendRedirect()与RequestDispatcher.forward()的区别
- JAVAWEB开发之HttpServletResponse和HttpServletRequest详解(下)(各种乱码、验证码、重定向和转发)
- (9)http请求与响应(两部分:HttpServletRequest,HttpServletResponse,java文件读入写出需掌握)
- javaWeb-Servlet的继承体系和HttpServletRequest中常用的方法+HttpServletResponse对中文乱码的处理
- 不二极端编程之JavaWeb详解(HttpServletRequest,HttpServletResponse)
- javaweb_day10(servlet&request&response)之乱码解决遍
- java自学之路-----Servlet_基础
- JavaWeb:HttpServletResponse和HttpServletRequest
- Java Web(二) Servlet中response、request乱码问题解决
- java自学之路-----Servlet_过滤器Filter
- [JavaWeb]Servlet,Request,Response知识点补充
- JavaWeb_Servlet_Request_Response
- JavaWeb开发知识总结(HttpServletRequest,HttpServletResponse)
- JavaWeb -- 服务器传递给Servlet的对象 -- ServletConfig, ServletContext,Request, Response
- java自学之路-----Servlet_监听器
- Java____Servlet(调用servlet初始化request、response与webclient进行通信服务)学习整理
- [Java拾遗四]JavaWeb基础之Servlet_Request&&Response
- 在java中如何在非servlet的普通类中获取request、response、session
- JAVAWEB开发之HttpServletResponse和HttpServletRequest详解(上)(各种乱码、验证码、重定向和转发)