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数据。

回到首页☞

发布了164 篇原创文章 · 获赞 11 · 访问量 8273

猜你喜欢

转载自blog.csdn.net/weixin_38280568/article/details/104240817
今日推荐