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乱码

  

posted @ 2016-09-17 19:47  ~沐风  阅读(314)  评论(0编辑  收藏  举报