javaweb之request&response详解

一、HttpServletResponse

1.1响应行  HTTP/1.1  200 OK

l setStatus(int sc) 设置响应状态码

1.2响应头

sendRedirect(String location) 请求重定向

l 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);

1.3响应正文(主体)

l getWrite(); 字符输出流

l getOutputStream(); 字节输出流

l setCharacterEncoding(String charset) 告知服务器使用什么编码

setContentType(String type) 告诉浏览器用什么编码,同时也规定了服务器端的编码方式

 

使用response

2.1 response界面输出文本

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
				
				/**
				 * 方式一
				 * 告诉服务器 应该使用utf-8解析文本 
				 * 告诉客户端 采用什么编码方式
				 */
				response.setCharacterEncoding("UTF-8");
				response.setHeader("content-type", 					"text/html;charset=utf-8");
				
				/**
				 * 方式二
				 * 告诉服务器 应该使用utf-8解析文本 
				 * 告诉客户端 采用什么编码方式
				 */
				response.setContentType("text/html;charset=GBK");
				
				/**
				 * 向客户端输出字符流
				 */
				PrintWriter writer = response.getWriter();
				writer.write("你好!");
	}

如上代码所示 我们可以通过setcharactorEcoding或者sethearder告诉客户端或者浏览器采用什么编码,也可以通过setContentType()来告诉客户端与浏览器采用什么编码方式。

response.setContentType("text/html;charset=GBK");
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write("你好!".getBytes());

也可以流的方式向界面做输出。

2.2 response界面输出图片

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String realPath = this.getServletContext().getRealPath("/WEB-INF/classes/a.png");
		FileInputStream fileInputStream=new FileInputStream(new File(realPath));
		ServletOutputStream outputStream = response.getOutputStream();
		BufferedOutputStream outputStream2=new BufferedOutputStream(outputStream);
		byte[] buf=new byte[1024];
		
		BufferedInputStream bufferedInputStream=new BufferedInputStream(fileInputStream);
		int len=0;
		while((len=bufferedInputStream.read(buf))!=-1){
			outputStream2.write(buf, 0, len);
		}
		outputStream2.close();
	}

2.3图片下载

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String realPath = this.getServletContext().getRealPath("/WEB-INF/classes/a.png");
		FileInputStream fileInputStream=new FileInputStream(new File(realPath));
		ServletOutputStream outputStream = response.getOutputStream();
		String filename = realPath.substring(realPath.lastIndexOf("\\"));
		//设置类型为图片类型  等待下载图片
		//将不安全的文件名改为UTF-8 就变成安全的文件名了
		String filename1 = URLEncoder.encode(filename,"utf-8");
		response.setHeader("content-disposition", "attachment;filename="+filename1);
		response.setHeader("content-type", "image/jpeg");
		
		BufferedOutputStream outputStream2=new BufferedOutputStream(outputStream);
		byte[] buf=new byte[1024];
		
		BufferedInputStream bufferedInputStream=new BufferedInputStream(fileInputStream);
		int len=0;
		while((len=bufferedInputStream.read(buf))!=-1){
			outputStream2.write(buf, 0, len);
		}
		outputStream2.close();
	}

如上图代码所示,原本不改变response.setheader的话是输出图片,要让输出图片变为图片下载是有一定机制的,比如要加上如下三要素,首先指定安全的文件名,其次分别是制定文件类型为附件,并指明是图片文件。

String filename1 = URLEncoder.encode(filename,"utf-8");
response.setHeader("content-disposition", "attachment;filename="+filename1);
response.setHeader("content-type", "image/jpeg");

2.4 重定向

response.setStatus(302);
response.setHeader("location", "/ser/servlet2");

如上图所示的语句可以重定向到指定的servlet,通过设置状态码302就可以进行重定向了。等价于下面这一句。

response.sendRedirect("/ser/servlet2");

response总结

getOutputStreamgetWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStreamPrintwriter对象。getOutputStreamgetWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。  会抛异常。

Servlet程序向ServletOutputStreamPrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。

Serlvetservice方法结束后,Servlet引擎将检查getWritergetOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。

httpServletRequest

HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。

4.1请求行  

Get  http://localhost:8080/day09/servlet/req1?username=zs  http/1.1

getMethod(); 获得请求方式

getRequestURL();返回客户端发出请求时的完整URL

http://localhost:8080/demo?username=xxx

getRequestURI(); 返回请求行中的资源名部分。

/demo?username=xxx

getContextPath(); 当前应用的虚拟目录

/demo

getQueryString() ; 返回请求行中的参数部分。

username=xxx

4.2 请求消息头

 String   getHeader(String name)  根据头名称得到头信息值

 Enumeration   getHeaderNames()  得到所有头信息name

 Enumeration   getHeaders(String name)  根据头名称得到相同名称头信息值

4.3 请求正文(重要)

4.3.1与获取表单数据相关的方法

<input type="text" name="username" />

getParameter(name) 根据表单中name属性的名,获取value属性的值方法

getParameterValuesString name)专业为复选框取取提供的方法

getParameterNames() 得到表单提交的所有name的方法

getParameterMap 到表单提交的所有值的方法   //做框架用,非常实用

getInputStream  以字节流的方式得到所有表单数据

//根据表单中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");
		for (int i = 0;hobbys!=null && i < hobbys.length; i++) {
			System.out.print(hobbys[i]+"\t");
		}

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);
				Method setter = pd.getWriteMethod();
				if(value.length==1){
					setter.invoke(u, value[0]);//给一个值的变量赋值
				}else{
					setter.invoke(u, (Object)value);//相关于给复选框赋值
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

4.3.2与操作非表单数据相关的方法(request也是一个域对象)

*** void setAttribute(String name, Object value);

*** Object getAttribute(String name);

Void removeAttribute(String name);

4.3.3与请求转发相关的方法

//得到请求转发或请求包含的协助对象

RequestDispatcher getRequestDispatcher(String path)

*** forward(ServletRequest request, ServletResponse response) //转发的方法

include(ServletRequest request, ServletResponse response) //请求包含

4.3.4与请求编码相关的方法

//解决post方式编码

*****request.setCharacterEncoding("UTF-8"); //告诉服务器客户端什么编码,只能处理post请求方式

//解决get方式编码

String name = new String(name.getBytes(“iso-8859-1”),”UTF-8”);

4.4 请求转发

request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
request.getRequestDispatcher("/de").forward(request,response);

请求转发与重定向










猜你喜欢

转载自blog.csdn.net/worn_xiao/article/details/80414197
今日推荐