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链:
如果一个客户端请求是由一组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 © 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中存在的以下方法获得。