欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaWeb---Servlet的请求和响应

程序员文章站 2022-05-07 08:21:07
...

Request 和Response 对象都是由服务器创建,管理,销毁.  由我们来使用.

继承体系结构:

ServletRequest(接口)<--------继承<-------HttpServletRequest(接口)<--------实现 [email protected]
ServletResponse(接口)<---------继承---  HttpServletResponse(接口)<-------------实现[email protected]

1.请求对象:获取请求的消息

1)为了防止编码格式的错误,首先应该设置请求编码和响应编码.

//设置请求编码和响应编码
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");

2)/获取请求头

String name = request.getHeader("username");//获取请求头的值
		long date  = request.getDateHeader(name);//获取日期头
		int i = request.getIntHeader(name);//获取数字头

3)获取请求行

String method = request.getMethod();//获取请求的方式:get/post
		String uri = request.getRequestURI();//获取Uri
		StringBuffer url = request.getRequestURL();//获取URL
		String addr = request.getRemoteAddr();//获取IP地址
		String queryString = request.getQueryString();//获取请求的参数
		String protocol = request.getProtocol();//获取访问的版本,浏览器的信息
4)获取请求体:封装post请求的请求参数
//获取请求体:封装post请求的请求参数
		BufferedReader reader = request.getReader();
		String line = reader.readLine();

5)获取请求的参数

//获取请求参数的不同方式
		String na = request.getParameter("username");//通过参数名称获取值
		String[] strings = request.getParameterValues("hobby");//通常用于复选框
		Map<String,String[]> map = request.getParameterMap();
		//遍历map集合
		Set<String> keySet = map.keySet();
		for(String key:keySet){
			System.out.println(key);//遍历参数名
			String[] ss = map.get(key);//获取参数的值
			for(String v:ss){
				System.out.println(key+"="+v);
			}
		}
		Enumeration names = request.getParameterNames();//通过枚举的方式获取
		
6)中文乱码的解决:post请求

//处理post请求中文乱码的问题
		String n = request.getParameter("name");//服务器使用ISO-8859-1 的方式解码
		byte[] bys = n.getBytes("ISO-8859-1");
		n = new String(bys,"utf-8");

7)重定向和请求转发

重定向特点:两次请求,两次转发;既可以访问内部资源,也可以访问外部资源,地址栏内的地址发生变化

请求转发:一次请求,一次响应;只可以访问项目内部的资源;地址栏的地址不发生改变.

//重定向
		//1.设置302状态
		response.setStatus(302);
		response.setHeader("location", "http:baidu.com");
		//重定向:合二为一
		response.sendRedirect("http:baidu.com");
		//请求转发
		request.getRequestDispatcher("/demo1").forward(request, response);

重定向和请求转发的区别:

1.一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理,称之为请求转发。

2.一个web资源收到客户端请求后,通知浏览器去访问另外一个web资源,称之为请求重定向。

3.RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect 方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。
如果传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于整个WEB站点的根目
录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。
调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改
变,由初始的URL地址变成重定向的目标URL;调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。

4.HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。

 5.RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。

2.响应对象:封装响应的数据,当真正的响应之前,取出里面的数据,给浏览器响应.

1)为了防止编码格式的错误,首先应该设置请求编码和响应编码.

//设置请求编码和响应编码
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");

2)响应字符串:

//响应一个字符串'
		PrintWriter writer = response.getWriter();
		writer.write("正在请求");

3)响应一个图片

//响应一个图片
		String path = this.getServletContext().getRealPath("xxx.jpg");//获取图片的真是路径
		//读取文件
		FileInputStream  fis=new FileInputStream(new File(path));
		//获取要读的文件
		ServletOutputStream fos = response.getOutputStream();
		byte[]  by=new byte[1024];
		int len=0;
		while((len=fis.read(by))!=-1){
			fos.write(by,0,len);
			fos.flush();
		}
		//关闭资源
		fis.close();
		fos.close();