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中存在的以下方法获得。
