请求转发和重定向

请求转发

对于浏览器的某个请求一个Servlet可能处理不完,必须转交由其它的Servlet进行处理,这就是所谓的请求转发。

注意:1、请求转发过程中没有创建新的请求,只是将上一个Servlet的req对象传递给下一个Servlet而已

   2、传递之前可以使用req.setAttribute(String arg0, String arg1)添加新的属性(第二个Servlet可以访问这个属性值)

eg:比如我们在登陆的时候,如果账号或者密码输入错误,这个时候就需要转发请求。

   Servlet1专门用来判断账号和密码是否匹配,Servlet2用来展示账号密码不匹配的页面,简单的不匹配页面实际上就是将登陆窗口再加载一遍以及显示密码不匹配的字样。

   这个时候Servlet1就必须将req传递给Servlet2,(Servlet1中req含有错误提示信息

示例代码:

Servlet1(新添加了一个check属性)

Servlet2

 

在Servlet2中判断为null是因为,你有可能是首次访问登陆界面,这个时候不应该显示check为null,如果check不为null说明是请求转发到登陆界面的,这个时候就应该显示错误信息。

没有创建新请求:

作用:解决了一次请求内的不同 Servlet 的数据(请求数据+其他数据)共享问题。

重定向

问题:

如果当前的请求,Servlet 无法进行处理怎么办?
如果使用请求转发,造成表单数据重复提交怎么办?
解决:
使用重定向
 
使用:
response.sendRedirect(“路径”).
本地路径为:uri
网络路径为:定向资源的 URL 信息
 

创建了新的请求:

遗留问题:

 在转发(同请求之间不同Servlet的数据共享)中因为没有新的请求Servlet1传递给Servlet2,这个过程只有一个request对象,所以在Servlet2中可以使用Servlet1中的request对象的属性值。

 重定位产生了一个新的请求即产生了一个新的request对象,这时Servlet2就无法使用Servlet1中的request对象的属性值。所以导致显示欢迎的是null。

这牵扯到不同请求之间的数据共享。(涉及到cookie)

 

不一样的烟火
原文地址:https://www.cnblogs.com/cstdio1/p/11655905.html