zoukankan      html  css  js  c++  java
  • 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]+"	");
    		}
    		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+"	"+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乱码
    

      

  • 相关阅读:
    http://www.oschina.net/translate/elasticsearch-getting-started?cmp
    http://www.mxchip.com/talk/news/jishuwenzhang/2014-09-11/67.html
    深入理解JVM—性能监控工具
    Windows7查看本地Java安装是否成功和路径的方法
    Eclipse 编译错误 Access restriction:The type *** is not accessible due to restriction on... 解决方案
    PSYoungGen /PSOldGen/PSPermGen区别
    深入浅出Java并发包—锁机制(三)
    深入浅出Java并发包—锁机制(二)
    【转】Spring 注解学习手札(超好的springmvc注解教程)
    解决java.lang.NoClassDefFoundError: org.jdom.Content
  • 原文地址:https://www.cnblogs.com/cnki/p/5879491.html
Copyright © 2011-2022 走看看