Http的请求和响应

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.1

getMethod(); 获得请求方式

***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();
	}

猜你喜欢

转载自my.oschina.net/u/3511143/blog/1603416