3 回答

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個(gè)贊
一個(gè)servlet直接調(diào)用另一個(gè)servlet的doget 或 dopost方法不行嗎? 將所有參數(shù)都傳過(guò)去。
forware(String url)和include() 是RequestDispatcher接口定義的方法,前者是直接轉(zhuǎn)到另一個(gè)url的。后者是將另一個(gè)url的處理過(guò)程包含在內(nèi)

TA貢獻(xiàn)1943條經(jīng)驗(yàn) 獲得超7個(gè)贊
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String operation = request.getParameter("operation");
if (operation == null) {
operation = "unknown";
}
String address;
if (operation.equals("order")) {
address = "/WEB-INF/Order.jsp";
} else if (operation.equals("cancel")) {
address = "/WEB-INF/Cancel.jsp";
} else {
address = "/WEB-INF/UnknownOperation.jsp";
}
RequestDispatcher dispatcher =
request.getRequestDispatcher(address);
dispatcher.forward(request, response);
}
差別:使用sendRedirect時(shí)
– 用戶可以看到JSP的URL(使用
RequestDispatcher.forward時(shí)用戶只能看到servlet的
URL)
– 客戶程序要經(jīng)過(guò)兩次往返(而forward只需一次)
? sendRedirect的優(yōu)點(diǎn)
– 用戶可以單獨(dú)訪問(wèn)JSP頁(yè)面
? 用戶能夠保存JSP頁(yè)面的地址
? sendRedirect的缺點(diǎn)
– 由于用戶可以在不首先經(jīng)過(guò)servlet的情況下訪問(wèn)JSP頁(yè)
面,所以,JSP頁(yè)面所需的數(shù)據(jù)有可能不存在。
? 因此,JSP頁(yè)面需要編寫代碼檢查這種情況。

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超5個(gè)贊
以下是幾種常調(diào)用的方法
Servlet to Servlet Communication
Listing 1: ServletBase
public class ServletBase extends HttpServlet{
static Connection databaseConnection = null;
public void init(ServletConfig _config) throws
ServletException{
super.init(_config);
if ( databaseConnection == null )
//- Open up the database connection
}
protected boolean isLoggedOn( String _username ){
return true;
}
protected boolean logUserOn( String _username ){
return true;
}
}
Listing 2: Using the NewSerletBase Class
public class logonServlet extends ServletBase{
public void service(HttpServletRequest _req, HttpServletRe-
sponse _res) throws ServletException{
if ( isLoggedOn( _req.getParameter(襏SERNAME? ){
//- Display a message indicating they are already logged on
}else{
logUserOn( _req.getParameter(襏SERNAME? );
}
}
}
Listing 3: Storing an Object
public class logonServlet extends HttpServlet{
public void service(HttpServletRequest _req, HttpServletRe-
sponse _res) throws ServletException{
ServletContext thisContext = getServletContext();
//-- Assume some method creates a new connection class
Connection newConnection = createConnection();
thisContext.setAttribute( database.connection? newConnection
);
//-- Return some output to the client
}
}
Listing 4: retrieving an Object
public class logoffServlet extends HttpServlet{
public void service(HttpServletRequest _req, HttpServletRe-
sponse _res) throws ServletException{
ServletContext thisContext = getServletContext();
//-- Assume some method creates a new connection class
Connection newConnection = thisContext.getAttribute(
database.connection?;
if ( newConnection == null )
//- Database has not been opened yet
//-- Return some output to the client
}
}
Listing 5: Looking at All the Objects
public class allServlet extends HttpServlet{
public void service(HttpServletRequest _req, HttpServletRe-
sponse _res) throws ServletException{
ServletContext thisContext = getServletContext();
//-- Assume some method creates a new Connection class
Enumeration E = thisContext.getAttributeNames();
while ( E.hasMoreElements() ){
String name = (String)E.nextElement();
System.out.println( "Object: " + name );
}
}
}
Listing 6: Retrieving Remote Contexts
public class otherServlet extends HttpServlet{
public void service(HttpServletRequest _req, HttpServletRe-
sponse _res) throws ServletException{
ServletContext otherContext =
getServletContext(http://<otherdomain>/servlet/allServlet?;
//-- Assume some method creates a new Connection class
Enumeration E = otherContext.getAttributeNames();
while ( E.hasMoreElements() ){
String name = (String)E.nextElement();
System.out.println( "Object: " + name );
}
}
}
Listing 7: Forwarding a Request
public class forwardServlet extends HttpServlet{
public void service(HttpServletRequest _req, HttpServletRe-
sponse _res) throws ServletException{
ServletContext xt = getServletContext();
RequestDispatcher xyzServlet =
xt.getRequestDispatcher(http://<domain>/servlet/xyzServlet?;
//- Do any preliminary processing
_req.setAttribute( database.results? new Results() );
xyzServlet.forward( _req, _res );
}
}
Listing 8: Inserting Content
public class insertServlet extends HttpServlet{
public void service(HttpServletRequest _req, HttpServletRe-
sponse _res) throws ServletException{
ServletContext xt = getServletContext();
RequestDispatcher xyzServlet =
xt.getRequestDispatcher(http://<domain>/servlet/xyzServlet?;
PrintWriter Out = _res.getWriter();
Out.println( this is from the insertServlet ?);
for(int x=0; x < 10; x++ )
xyzServlet.insert( _req, _res );
Out.println( this is the end of the print servlet ?);
}
}
/////////////////////////////////////////
forward方法是把請(qǐng)求的內(nèi)容轉(zhuǎn)發(fā)到另外的一個(gè)servlet.而include是把另一個(gè)servlet處理過(guò)后的內(nèi)容拿過(guò)來(lái).
舉例來(lái)說(shuō)比如在servlet1打一句out.print("1111"),servlet2打上out.print("22222"),在servlet1中用forward命令會(huì)轉(zhuǎn)到servlet2中,顯示22222.
而在servlet1中使用include方法會(huì)依然在servlet1的頁(yè)面中,但是在1111后打出22222
添加回答
舉報(bào)