Servlet链示例

web.xml:

<web-app>
    <servlet>
        <servlet-name>abc</servlet-name>
        <servlet-class>Serv1</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>pqr</servlet-name>
        <servlet-class>Serv2</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>abc</servlet-name>
        <url-pattern>/s1</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>pqr</servlet-name>
        <url-pattern>/s2</url-pattern>
    </servlet-mapping>
</web-app>

serv1.java:

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class Serv1 extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        res.setContentType("text/html");
        PrintWriter pw = res.getWriter();
        pw.println("<h2>I AM FROM Serv1 BEGINNING</h2>");
        ServletContext ctx = getServletContext();
        RequestDispatcher rd = ctx.getRequestDispatcher("/s2");
        rd.include(req, res);
        pw.println("<h2>I AM FROM Serv1 ENDING</h2>");
    }
    public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        doGet(req, res);
    }
};

serv2.java:

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class Serv2 extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        res.setContentType("text/html");
        PrintWriter pw = res.getWriter();
        pw.println("<h2>I AM FROM Serv2</h2>");
    }
    public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        doGet(req, res);
    }
};
Servlet链(Chaining)

Servlet链:

如果一个客户端请求是由一组servlet处理的,那么这个servlet称为servlet链,或者如果一组servlet处理一个客户端请求,那么这些servlet称为servlet链。
为了处理多个servlet的客户机请求,我们有两个模型,它们是前向模型和包含模型。

Forward模型:

在这个模型中,当我们将一个请求转发给一组servlet时,最终得到的是目标servlet的结果作为响应,而不是中间servlet的结果。

Include模型:

如果一个客户机请求被传递到一个servlet,并且该servlet通过将servlet组包含到一个servlet中来使用其他servlet组来处理请求。
在上图中,客户机请求进入servlet s1,s1内部包括s2、s3和s4 servlet,最后是源servlet s1提供给客户机的所有这些servlet的结果。
注意:一个servlet可以包含任意数量的servlet,其中一个servlet一次只能转发到一个servlet。

开发Servlet链的步骤:

-通过以下任一方式使用获取ServletContext的对象:

ServletContext ctx1=getServletContext (); [GenericServlet method] 
ServletContext ctx2=config.getServletContext (); [ServletConfig method] 
ServletContext ctx3=req.getServletContext (); [HttpServletRequest method]
  • 获取RequestDispatcher的对象。 RequestDispatcher是javax.Servlet中存在的界面。*包,它用于将源Servlet的请求和响应对象转发到目标servlet或者将目标servlet包含到源servlet中。要获取RequestDispatcher的对象,ServletContext包含以下方法:
RequestDispatcher rd=ctx.getRequestDispatcher ("./s2");
  • 使用转发或者包含模型以发送请求和响应对象。 RequestDispatcher包含以下方法用于转发或者包括请求和响应对象。

例如:

rd.forward (req, res) throws ServletException, IOException 
rd.include (req, res) throws ServletException, IOException

getRequestdispatcher(string)和getnamedrequestdispatcher(String)之间有什么区别?

getRequestdispatcher(String)方法采用Web.xml的URL模式或者Public-URL,其中GetNamedRequestDispatcher(String)方法采用Web.xml的servlet或者部署名称的名称

为了实现转发或者包括一个Web应用程序的请求和响应对象到另一个Web应用程序,必须确保Web应用程序都必须在同一servlet容器中运行。

  • 获取当前Web应用程序的ServletContext对象。

例如:

ServletContext cctx=getServletContext ();
  • 通过使用ServletContext接口中存在的以下方法获取另一个Web应用程序的SerletContext对象。

例如:

ServletContext octx=cctx.getContext ("./webapp2");
  • 使用另一个Web应用程序的ServletContext对象获取RequestDispatcher对象。

例如:

RequestDispatcher rd=octx.getRequestDispatcher ("/s2");
  • 使用或者向前传递到当前Web应用程序的请求和响应对象。

例如:

rd. include (req, res); 
rd.forward (req, res);

在同一服务器中部署,但从不同的Web应用程序部署:

例如:

Web.xml(webapp1):

<web-app>
    <servlet>
        <servlet-name>abc</servlet-name>
        <servlet-class>Serv1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>abc</servlet-name>
        <url-pattern>/s1</url-pattern>
    </servlet-mapping>
</web-app>

serv1.java(webapp1):

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class Serv1 extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        res.setContentType("text/html");
        PrintWriter pw = res.getWriter();
        pw.println("<h2>I AM FROM Serv1 BEGINNING OF webapp1</h2>");
        ServletContext cctx = getServletContext();
        ServletContext octx = cctx.getContext("/webapp2");
        RequestDispatcher rd = octx.getRequestDispatcher("/s2");
        rd.include(req, res); //rd.forward (req, res);
        pw.println("<h2>I AM FROM Serv2 ENDING OF webapp1</h2>");
    }
    public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        doGet(req, res);
    }
};

web.xml(webapp2):

<web-app>
    <servlet>
        <servlet-name>pqr</servlet-name>
        <servlet-class>Serv2</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>pqr</servlet-name>
        <url-pattern>/s2</url-pattern>
    </servlet-mapping>
</web-app>

serv2.java(webapp2):

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class Serv2 extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        res.setContentType("text/html");
        PrintWriter pw = res.getWriter();
        pw.println("<h6>I AM FROM Serv2 OF webapp2</h6>");
    }
    public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        doGet(req, res);
    }
};

将一个Web应用程序转发到另一个Web应用程序的请求和响应对象以及Web应用程序在不同的servlet容器中运行:

为了发送一个Web应用程序的一个Web应用程序的请求和响应对象,该Web应用程序在servlet容器上运行到另一个在另一个servlet容器中运行的另一个Web应用程序,我们不能使用前进并包括方法。

为了实现上面,必须使用称为SendreDirect的方法(String URL)方法,其原型是上述方法存在于httpservletResponse接口中,参数字符串URL表示在某些其他Servlet容器中运行的另一个Web应用程序的URL。

  • 对servlet或者jsp进行一个请求,该jsp在一个容器的Web应用程序中运行http://localhost:2008/webapp1/s1上下文路径或者文档根目录的一个web应用程序。
  • Tomcat的Web应用程序的Servlet将通过使用以下语句将客户端的请求重定向到WebLogic的另一个Web应用程序:Res.SendreDirect("http://localhost:7001/webapp2/s2");必须用webapp1的serv1编写
  • 浏览器将向另一个servlet容器的另一个Web应用程序发送请求。

例如:

http://localhost:7001/webapp2/s2,由webapp1的serv1重定向。

  • WebApp1仅提供Serv2的响应但不是Serv1 Servlet。

在不同的服务器中部署:

例如:

Web.xml(webapp1):

<web-app>
    <servlet>
        <servlet-name>abc</servlet-name>
        <servlet-class>Serv1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>abc</servlet-name>
        <url-pattern>/s1</url-pattern>
    </servlet-mapping>
</web-app>

serv1.java(webapp1):

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class Serv1 extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        res.setContentType("text/html");
        PrintWriter pw = res.getWriter();
        pw.println("<h2>I AM FROM Serv1 OF webapp1</h2>");
        res.sendRedirect("http://localhost:7001/webapp2/s2");
    }
    public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        doGet(req, res);
    }
};

注意:必须在Tomcat服务器中部署WebApp1.

web.xml(webapp2):

<web-app>
    <servlet>
        <servlet-name>pqr</servlet-name>
        <servlet-class>Serv2</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>pqr</servlet-name>
        <url-pattern>/s2</url-pattern>
    </servlet-mapping>
</web-app>

serv2.java(webapp2):

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class Serv2 extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        res.setContentType("text/html");
        PrintWriter pw = res.getWriter();
        pw.println("<h6>I AM FROM Serv2 OF webapp2</h6>");
    }
    public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        doGet(req, res);
    }
};

注意:必须在WebLogic Server中部署WebApp2.

使用前进和包含方法,在请求调度程序的帮助下开发以下应用程序?

回答:

web.xml:

<web-app>
    <servlet>
        <servlet-name>abc</servlet-name>
        <servlet-class>RecvServ</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>pqr</servlet-name>
        <servlet-class>DispServ</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>abc</servlet-name>
        <url-pattern>/receive</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>pqr</servlet-name>
        <url-pattern>/display</url-pattern>
    </servlet-mapping>
</web-app>

header.html:

<html>
    <title>Header</title>
    <body bgcolor="#D8BFD8">
    <center><hr>
        <font color="#990033" size="7">AshaKrishna Technologies<hr>
        </font>
    </center>
    </body>
</html>

login.html:

<html>
    <title>Login Page</title>
    <body bgcolor="#D87093">
    <center>
        <form name="header" action="./receive" method="post">
            <table bgcolor="#AFEEEE" border="1">
                <tr>
                    <th>Enter user name : </th>
                    <td><input type="text" name="header_euname" value=""></td>
                </tr>
                <tr>
                    <th>Enter password : </th>
                    <td><input type="password" name="header_epwd" value=""></td>
                </tr>
                <tr>
                    <td align="center"><input type="submit" name="header_login" value="Login"></td>
                    <td align="center"><input type="reset" name="header_reset" value="Reset"></td>
                </tr>
            </table>
        </form>
    </center>
    </body>
</html>

Footer.html:

<html>
    <title>Footer</title>
    <body bgcolor="#D8BFD8">
    <center><hr>
        <font color="#990033" size="3">All copy rights &copy; reserved to BudDinu</hr>
        </font>
    </center>
    </body>
</html>

recvserv.java:

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class RecvServ extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        res.setContentType("text/html");
        PrintWriter pw = res.getWriter();
        RequestDispatcher rd = req.getRequestDispatcher("/display");
        rd.forward(req, res);
    }
    public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        doGet(req, res);
    }
};

dispserv.java:

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class DispServ extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        res.setContentType("text/html");
        PrintWriter pw = res.getWriter();
        String uname = req.getParameter("header_euname");
        String pwd = req.getParameter("header_epwd");
        RequestDispatcher rd1 = req.getRequestDispatcher("header.html");
        rd1.include(req, res);
        pw.println("<br><br>");
        if (uname.equals("kvr") && pwd.equals("advanced")) {
            pw.println("<center><font color=#ffff66><h3>VALID CREDENTIALS</h3></center>");
        } else {
            pw.println("<center><font color=#ffff66><h3>INVALID CREDENTIALS</h3></center>");
        }
        pw.println("</font></br></br></br>");
        RequestDispatcher rd2 = req.getRequestDispatcher("footer.html");
        rd2.include(req, res);
    }
    public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        doGet(req, res);
    }
};

说明:

  • 每当我们将HTML程序传递为GetRequestDispatcher方法时,将通过客户端的浏览器执行HTML程序,在那里我们通过Servlet程序或者JSP,该浏览器或者将由Servlet容器或者服务器执行的JSP。
  • RequestDispatcher接口对象也可以通过使用HttpservletRequest中存在的以下方法获得。
日期:2020-04-11 23:04:23 来源:oir作者:oir