Java-请求转发和重定向及Request和Response对象

第一节 页面跳转

 

Java Web服务端控制页面跳转主要有两种:重定向和转发

1.1 重定向

重定向就是通过各种方法将网络请求重新定个方向转到其它位置。

实现原理:

客户浏览器发送http请求----》web服务器接受后发送302状态码响应及对应新的location给客户浏览器--》客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址----》服务器根据此请求寻找资源并发送给客户。在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。

特点:

特点:
1,重定向是客户端行为。
2,重定向是浏览器做了至少两次的访问请求。
3,重定向浏览器地址改变。
4,重定向两次跳转之间传输的信息会丢失(request范围)。
5,重定向可以指向任何的资源,包括当前应用程序中的其他资源,同一个站点上的其他应用程序中的资源,其他站点的资源。注意:传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录

1.2 实现重定向

         //重定向.可以跳转到指定的页面
        response.sendRedirect("index.html");    

1.3 请求转发

Servlet除了支持重定向之外还支持请求转发

转发的原理:

原理:
客户浏览器发送http请求----》web服务器接受此请求--》调用内部的一个方法在容器内部完成请求处理和转发动作----》将目标资源发送给客户。在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。

特点:

1,转发是服务器行为
2,转发是浏览器只做了一次访问请求
3,转发浏览器地址不变
4,转发两次跳转之间传输的信息不会丢失,所以可以通过request进行数据的传递
5,转发只能将请求转发给同一个WEB应用中的组件
注意:如果创建RequestDispatcher 对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。

1.4 实现请求转发

//请求转发
        request.getRequestDispatcher("/login.html").forward(request, response);

 

1.5 网络路径问题

路径分类 :

绝对路径: 用在不同网站之间的跳转,比如:http://www.baidu.com/aaa/1.jpg

相对路径:用在同一个网站中, aaa/1.jpg,仅限静态资源,如果页面比较多,并且使用框架,会出现混乱。

根路径:根指定就是主机名(服务器) /day12web1/loginservlet (/ 表示 http://localhost:8080/

/day12web1/loginservlet 如果在浏览器中使用 / 表示 http://localhost:8080/

/listservlet 如果是在服务器中使用 / 表示 /day12web1

第二节 response对象

在Servlet中可以使用的内置对象主要有:request、response、application、session、out(PrintWriter)。

2.1 ServletResponse简介

定义辅助 servlet 将响应发送到客户端的对象。servlet 容器创建 ServletResponse 对象,并将它作为参数传递给 servlet 的 service 方法。 要发送 MIME 正文响应中的二进制数据,请使用 getOutputStream 返回的 ServletOutputStream。要发送字符数据,请使用 getWriter 返回的 PrintWriter 对象。

2.2 HttpServletResponse介绍

扩展 ServletResponse 接口以提供特定于 HTTP 的发送响应功能。例如,该接口拥有访问 HTTP 头和 cookie 的方法。 客户端向服务器发起的都是HTTP协议操作,所以我们大部分使用HttpServletResponse对象作为直接操作对象!

 

案例:用户下载服务器图片

public class DownLoadServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		String path = getServletContext().getRealPath("/吃鸡.jpg");
		
		System.out.println(path);
		//文件输入流
		FileInputStream stream = new FileInputStream(path);
		//xx/xx/x/x/x/x/x/x/吃鸡.jpg
	    //获取文件的名字   /
		//File.separator  == /
		String filename = path.substring(path.lastIndexOf(File.separator)+1);
		//文件名编码
		 filename =  URLEncoder.encode(filename,"UTF-8");
		//设置响应头
		//content-disposition", "attachment;filename="+filename 
		//下载用的 attachment下载: filename下载文件的名字 
		response.setHeader("content-disposition", "attachment;filename="+filename);
		//根据文件名字的后缀名获取类型
		String mimetype = getServletContext().getMimeType(filename);
		response.setContentType(mimetype); //下载文件的类型
		ServletOutputStream outputStream = response.getOutputStream();
		byte [] buffer = new byte [8*1024];
		int len = 0;
		while((len=stream.read(buffer)) != -1){
			outputStream.write(buffer, 0, len);
		}
		stream.close();
	}
}

 

第三节 request对象

3.1 ServletRequest介绍

定义将客户端请求信息提供给某个 servlet 的对象。servlet 容器创建ServletRequest 对象,并将该对象作为参数传递给该 servlet 的service方法。

3.2 HttpServletRequest介绍

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

小结: 同响应相同,客户端请求协议都是基于HTTP所以我们选用HttpServletRequest来操作用户发送过来的请求的数据!

 

//获取请求路径相关参数
**
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方法 获取输入流

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的请求转发定向都是用于在不同的Servlet之间进行页面跳转的方式,但它们的实现方式和效果是不同的。 请求转发是指在当前Servlet中处理完请求后,将请求转发给另一个Servlet进行处理,转发后的请求由另一个Servlet来产生响应。请求转发的代码如下: ```java RequestDispatcher dispatcher = request.getRequestDispatcher("/b"); dispatcher.forward(request, response); ``` 其中,`/b`是要转发到的Servlet的路径,`request`和`response`是当前Servlet的请求和响应对象转发后的请求和响应对象也是这两个对象请求转发的特点是:转发后的请求和响应对象与原始请求和响应对象是同一个,因此它们可以共享请求和响应的信息,比如请求参数、请求属性等。此外,请求转发是在服务器端完成的,客户端并不知道发生了转发,因此地址栏中的URL不会改变。 定向是指在当前Servlet中处理完请求后,将请求定向到另一个Servlet进行处理,定向后的请求由浏览器新发起,由另一个Servlet来产生响应。定向的代码如下: ```java response.sendRedirect("/b"); ``` 其中,`/b`是要定向到的Servlet的路径,`response`是当前Servlet的响应对象定向的特点是:定向后的请求和响应对象与原始请求和响应对象是不同的,因此它们不能共享请求和响应的信息。此外,定向是在客户端完成的,因此地址栏中的URL会改变。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值