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

Servlet之间的跳转

程序员文章站 2024-03-15 10:47:47
...

回到首页☞

这块只是简单了解下,因为现在主流开发模式,几乎用不到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,则浏览器会到新的网址重新请求该资源。

Servlet之间的跳转
计算个税的改一下

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

回到首页☞