在web
應用之間轉發請求
- 步驟
- 由於每個
web
應用都配備了一個大管家—-ServletContext
,我們可以獲得這個web應用的管家來轉發請求到這個web應用的某個Servlet
、JSP
、HTML
文檔。 - 由於從一個
web
應用訪問另一個web
應用資源存在安全問題,所以默認是不能訪問的。我們可以在web
應用的目錄META-INF
下創建一個context.xml
文件,指定crossContext
的值爲true,即可訪問。它的值默認是false。 - 具體到代碼,要獲得一個
web
應用的ServletContext
,可以使用ServletContext
對象的getContext(String uripath)
方法,uripath
指定其他web
應用的URL
入口。
- 由於每個
代碼
使用
eclipse
新建兩個Dynamin Web Project
項目,名稱是TestServlet
、Dispatcher
,分別新建兩個類CrossServlet
、OutputServlet
,都繼承HttpServlet
前者將用戶請求轉發到Dispatcher
應用下的outputServlet
。類代碼如下:CrossServlet類:
package com.lovo.visitother; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CrossServlet extends HttpServlet { private static final long serialVersionUID = 1L; public CrossServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = request.getParameter("username"); response.setContentType("text/plain;charset=utf-8"); if (name == null) { name = "Please Input Username!"; } else { name = "Hello! " + name; } PrintWriter out = response.getWriter(); request.setAttribute("username", name); ServletContext context = this.getServletContext(); //獲取web應用Dispatcher的ServletContext ServletContext crossContext = context.getContext("/Dispatcher"); //獲取請求轉發的對象 RequestDispatcher patcher = crossContext.getRequestDispatcher("/OutputServlet"); patcher.forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
OutputServlet類:
package com.lovo.dispatcher; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class OutputServlet extends HttpServlet { private static final long serialVersionUID = 1L; public OutputServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); String msg = (String) request.getAttribute("username"); PrintWriter out = response.getWriter(); out.println(msg); out.write("==================="); out.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
- 兩個
Servlet
的web.xml
文件
CrossServlet類的web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>TestServlet</display-name> <servlet> <servlet-name>CrossServlet</servlet-name> <servlet-class>com.lovo.visitother.CrossServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>CrossServlet</servlet-name> <url-pattern>/TestServlet/CrossServlet</url-pattern> </servlet-mapping> </web-app>
OutputServlet類的web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>Dispatcher</display-name> <servlet> <servlet-name>OutputServlet</servlet-name> <servlet-class>com.lovo.dispatcher.OutputServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>OutputServlet</servlet-name> <url-pattern>/Dispatcher/OutputServlet</url-pattern> </servlet-mapping> </web-app>
配置
CrossServlet
的context.xml
文件- 在
web
應用TestServlet
的webContent
下的META_INF
目錄創建context.xml
文件,文件內容如下:
<?xml version="1.0" encoding="UTF-8"?> <context reloadable="true" crossContext="true"></context>
- 在
reloadable="true"
的意思是讓Tomcat
監測文件是否改動,如果有改動,自動重新加載。crossContext="true"
表示可以訪問另一個web
資源- 所有弄好之後,項目的文件如下圖所示:
- 運行
- 在
eclipse
運行Tomcat
在瀏覽器輸入localhost:8080/TestServlet/CrossServlet
,即可訪.
- 在