Java Web之路(二)Servlet之HttpServletResponse和HttpServletRequest
HttpServletResponse
1.告诉服务器应用使用UTF-8解析文本的两种方式,告诉客户端要使用什么编码
response.setHeader("content-type", "text/html;charset=UTF-8"); response.setContentType("text/html; charset=UTF-8");
2.getWriter
PrintWriter out = response.getWriter();//得到一个字符输出流 out.write("你好!");//向客户端响应文本内容
3.getOutputStream
response.setContentType("text/html;charset=UTF-8"); ServletOutputStream sos = response.getOutputStream(); sos.write("你好123".getBytes("UTF-8"));//getBytes默认编码为本地编码(即:gbk)
4.下载文件
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(); }
5.告诉客户端不使用缓存
response.setHeader("pragma", "no-cache"); response.setHeader("cache-control", "no-cache"); response.setIntHeader("expires", 0);
6.跳转
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); /*response.setIntHeader("refresh", 1);//设置1秒钟刷新一次 Random r = new Random(); response.getWriter().write(r.nextInt()+"");*/ response.getWriter().write("注册成功!3秒钟跳到主页"); //设置3秒钟跳转 response.setHeader("refresh", "3;url=/day09_reques_response/demo6"); }
7.重定向
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("A:我要借钱!"); System.out.println("B:我不有,但是我可以告诉你谁有"); /*//告诉客户端要重新定向新的资源 response.setStatus(302); //告诉浏览器要去访问哪个URL response.setHeader("location", "/day09_00_HttpServletResponse/servlet/demo8");*/ //请求重定向 response.sendRedirect("/day09_reques_response/demo8"); System.out.println("A: 我去了"); }
8.response细节
getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。
getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。 会抛异常。
Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态
行和各响应头组合后输出到客户端。
Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关
闭该输出流对象。
HttpServletRequest
1.request常用方法
获得客户机信息 getRequestURL方法返回客户端发出请求时的完整URL。 getRequestURI方法返回请求行中的资源名部分。 getQueryString 方法返回请求行中的参数部分。 getRemoteAddr方法返回发出请求的客户机的IP地址 getRemoteHost方法返回发出请求的客户机的完整主机名 getRemotePort方法返回客户机所使用的网络端口号 getLocalAddr方法返回WEB服务器的IP地址。 getLocalName方法返回WEB服务器的主机名 getMethod得到客户机请求方式 获得客户机请求头 getHead(name)方法 getHeaders(String name)方法 getHeaderNames方法 获得客户机请求参数(客户端提交的数据) getParameter(name)方法 getParameterValues(String name)方法 getParameterNames方法 getParameterMap方法 //做框架用,非常实用 getInputStream
代码示例
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //test1(request); //test2(request); //获得相关name的消息头 Enumeration headers = request.getHeaders("accept-language"); while(headers.hasMoreElements()){ String e = (String) headers.nextElement(); System.out.println(e+":"+request.getHeader(e)); } } private void test2(HttpServletRequest request) { //获得所有请求消息头的name Enumeration names = request.getHeaderNames(); while(names.hasMoreElements()){ String e = (String) names.nextElement(); System.out.println(e+":"+request.getHeader(e)); } } private void test1(HttpServletRequest request) { //获得请求消息头的信息 String header = request.getHeader("User-Agent"); System.out.println(header); if(header.toLowerCase().contains("msie")){ System.out.println("你使用的是IE浏览器"); }else if(header.toLowerCase().contains("firefox")){ System.out.println("你使用的是火狐浏览器"); }else if(header.toLowerCase().contains("chrome")){ System.out.println("你使用的是谷歌浏览器"); }else{ System.out.println("你使用的是其它浏览器"); } }
2.获得参数
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); }
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 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(); } }
依赖包commons-beanutils-1.8.3.jar和commons-logging-1.1.1.jar
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(); } }
3.请求转发(请求一次)
request.getRequestDispatcher("/demo6").include(request, response);
写入需要传递的值
//将非表单的数据添加到request的域中 request.setAttribute("s", str);
获取传过来的值
//将request对象中的移除 //request.removeAttribute("s"); //从request对象中获取s的值 String s = (String) request.getAttribute("s");
4.重定向(请求两次)
//将请求转发到demo6中 //request.getRequestDispatcher("/servlet/demo6").forward(request, response); //注:请求转发不能跳转到其它应用 //request.getRequestDispatcher("http://www.baidu.com").forward(request, response); //使用重定向 //response.sendRedirect(request.getContextPath()+"/servlet/demo6"); //可以跳转到其它应用 //response.sendRedirect("http://www.baidu.com");
5.请求包含
//请求包含 request.getRequestDispatcher("/demo6").include(request, response);
6.解决乱码
request.setCharacterEncoding("UTF-8");//只能解决post方式的乱码 userName = new String(userName.getBytes("iso-8859-1"),"UTF-8");//解决get乱码