Servlet之间的跳转
这块只是简单了解下,因为现在主流开发模式,几乎用不到Servlet,或者说只有框架自带的,封装好了。
Servlet之间可以相互跳转,这样就可以用多个Servlet做模块化。
MVC(Model-View-Control)框架中都使用了Servlet跳转。MVC框架把程序分成三个独立模块:
- 业务处理模块
- 视图模块
- 控制模块
例如:Struts框架中这三个部分分别为3个Servlet,程序在3个Servlet之间跳转。
1、转向forward
转向forward是通过RequestDispatcher对象的forward方法来实现的。
req.setAttribute("errorResult", "文件不存在下载失败");
RequestDispatcher dispatcher = req.getRequestDispatcher("/servlet/AServlet");
dispatcher.forward(req, resp);
/表示Web应用程序的根目录
Forward是MVC框架中常见的一种技术。Forword不仅可以跳转到本应用的另一个Servlet,JSP页面,也可以跳转到另外一个文件,甚至WEB-INF文件下的文件。
不再举例,如果有序有用到在看。
这种跳转对于客户端来说是透明的,因为它在服务器端完成,携带或者加工了req, resp。
forward是最常用的方式,在Struts、WebWork等MVC框架中,都是用Servlet来处理用户请求,把结果通过request.setAttribute()放到request中,然后forward到JSP中显示。
在使用forward前不能有任何输入到客户端,也就是不能使用out.println(),否则会抛出异常IllegalStateException
2、重定向Redirect
重定向是通过服务器返回的状态码来实现的。
客户端浏览器请求服务器的时候,服务器会返回一个状态码,服务器通过HTTPServletResponse的SetStatus方法设置状态码。
如果服务器返回301或302,则浏览器会到新的网址重新请求该资源。
计算个税的改一下
protected void doPost(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp) throws javax.servlet.ServletException, IOException {
this.log("执行 doPost() 方法..................");
if(true){
resp.setStatus(301);
resp.setHeader("Location","/FirstWeb/Test.html");
return;
}
Location这个也可以指向一个具体网址,例如:
https://www.baidu.com/
protected void doPost(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp) throws javax.servlet.ServletException, IOException {
this.log("执行 doPost() 方法..................");
if(true){
// resp.setStatus(301);
// resp.setHeader("Location","/FirstWeb/Test.html");
resp.sendRedirect("/FirstWeb/Test.html");
}
其实就是用上面封装的这个方法,sendRedirect 设置301和目标地址,进行跳转。
F12可以看到,这个请求是服务器端发起的,跳转能看到两次请求。
3、自动刷新
protected void doPost(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp) throws javax.servlet.ServletException, IOException {
this.log("执行 doPost() 方法..................");
resp.setHeader("Refresh","3;url=http://localhost:10024/FirstWeb/Test.html");
resp.setCharacterEncoding("UTF-8");
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
Refresh的单位是秒,这个可以用于一些股票软件,右键,代办等页面。
其实就是设置Refresh属性,f12可以看到。
除了后台设置,前台页面也可以通过属性设置。
不过真是项目已经不这么玩了,都是通过js+ajax,定时调用后台rest服务获取json数据。
上一篇: servlet注册登录页面之间的跳转