2015-05-31 45 views
0

我已經創建了一個使用Eclipse第一次使用servlet和jsp的Dynamic Web Projectservlet容器如何處理這個http請求?

下面是servlet代碼,

package com.example.tutorial; 

import java.io.IOException; 
import java.io.PrintWriter; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 


public class ServletExample extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     PrintWriter out = response.getWriter(); 
     String firstName = request.getParameter("firstname"); 
     String lastName = request.getParameter("lastname"); 

     out.println(firstName + " " + lastName); 
    } 

} 

和相應的web.xml,

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 
    <display-name>ServletsJSPExample</display-name> 
    <welcome-file-list> 
    <welcome-file>index.html</welcome-file> 
    <welcome-file>index.htm</welcome-file> 
    <welcome-file>index.jsp</welcome-file> 
    <welcome-file>default.html</welcome-file> 
    <welcome-file>default.htm</welcome-file> 
    <welcome-file>default.jsp</welcome-file> 
    </welcome-file-list> 
    <servlet> 
    <description></description> 
    <display-name>ServletExample</display-name> 
    <servlet-name>ServletExample</servlet-name> 
    <servlet-class>com.example.tutorial.ServletExample</servlet-class> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>ServletExample</servlet-name> 
    <url-pattern>/servletexample</url-pattern> 
    </servlet-mapping> 
</web-app> 

我也寫index.jsp它有以下形式:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> 
<title>Insert title here</title> 
</head> 
<body> 
    <form action="servletexample" method="post" > 
     <table border="0"> 
     <tr> 
      <td>First Name:</td> <td><input type="text" name="firstname" /></td> 
     </tr> 
     <tr> 
      <td>Last Name:</td> <td><input type="text" name="lastname" /></td> 
     </tr> 
     <tr> 
      <td colspan="2"> <input type="submit" value="Submit" /></td> 
     </tr> 
     </table> 
    </form> 
</body> 
</html> 

在我的第一情況,在eclipse中,如果我選擇Run As -> Run On Server,瀏覽器在eclipse中與URI的index.jsp怎麼樣了表示代碼:http://localhost:8081/ServletsJSPExample/

我以後添加下面的servlet代碼行,

this.getServletContext().getRequestDispatcher("/index.jsp").forward(request, response); 
如下所示

public class ServletExample extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     PrintWriter out = response.getWriter(); 

     this.getServletContext().getRequestDispatcher("/index.jsp").forward(request, response); 

     String firstName = request.getParameter("firstname"); 
     String lastName = request.getParameter("lastname"); 

     out.println(firstName + " " + lastName); 
    } 

} 

在第二種情況下,在Eclipse中,如果我選擇Run As -> Run On Server,eclipse中的瀏覽器顯示演示代碼index.jsp,並附URI:http://localhost:8081/ServletsJSPExample/servletexample

因此,

對於這兩種情況,該URI如何更改? 如何控制從servlet容器流向我的應用程序ServletsJSPExample添加此行代碼之前和之後this.getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);

請幫我理解這一點!

注:ServletsJSPExample是 「動態Web項目」 的名稱在Eclipse

回答

1

首先,忘掉Eclipse以及如何在其中啓動程序。這是關於Servlets,它們的url映射以及你打的url。

在第一個樣品,你打

http://localhost:8081/ServletsJSPExample/ 

假設ServletsJSPExample是您的上下文根,你達到了你的應用程序的根目錄。由於你有一個welcome-file註冊(這是一個JSP)

<welcome-file>index.jsp</welcome-file> 

Servlet容器將直接服務它。

在第二種情況下,你把你的要求

http://localhost:8081/ServletsJSPExample/servletexample 

其中有/servletexample的路徑。你有你的servlet ServletExample映射到

<url-pattern>/servletexample</url-pattern> 

所以Servlet容器選擇這個ServletExample servlet來處理請求。處理請求裝置調用其service方法,該方法繼續到調用

this.getServletContext().getRequestDispatcher("/index.jsp").forward(request, response); 

隨着呼叫向getRequestDispatcher容器

返回RequestDispatcher對象充當位於給定資源的包裝路徑。

位於給定路徑的資源(在本例中爲JSP)(另一個Servlet)。在您撥打forward後,您就可以在JSP servlet上調用service。這會呈現您的JSP內容並將其作爲響應主體發送。

+0

我明白你的第一個答案。當你說:'你發送請求到',我沒有明確發送,而是我說'運行在服務器上'那麼,爲什麼servlet容器在第二種情況下選擇servlet'http:// localhost:8081/ServletsJSPExample/servletexample'但不是'index.jsp', – overexchange

+0

@overxchange我不知道Eclipse如何選擇它的URL。這並不重要。如果您更改url並將您的請求發送到'http:// localhost:8081/ServletsJSPExample /',則JSP將直接提供,就像您的第一種情況一樣。您的servlet根本不會涉及。 –

+0

您可以添加更多關於這個'this.getServletContext()'的信息嗎?我們爲什麼用它? – overexchange

1

的URI不會改變。答覆內容有哪些變化。

當使用這樣的:

PrintWriter out = response.getWriter(); 

這意味着你將手工寫請求的響應的內容。您在out中編寫的所有內容都將成爲回覆的一部分。這就是爲什麼,如果你只寫:

out.println(firstName + " " + lastName); 

在響應中唯一的文字是這樣的文字,沒有HTML可言。當調用http://localhost:8081/ServletsJSPExample/servletexample瀏覽器將顯示這個純文本,就這些。

當使用這樣的:

getServletContext().getRequestDispatcher("/index.jsp").forward(request, response); 

這意味着index.jsp內容將被用作響應的一部分。 index.jsp的內容將通過使用HttpServletRequest request中的屬性(因此代替表達式語言的內容,這些表達式包含在${}中)解析。

+0

當你編寫servlets和jsp的東西時,One會重新引入servlet,使得不應該訪問URL中的jsp頁面。爲什麼推薦? – overexchange

+0

由於Servlet將充當控制器,因此執行(可重用的)Java代碼並調用視圖(JSP)來響應是其職責。 JSP不是編寫Java代碼(通過腳本)的適當位置,而是應該用於放置與視圖相關的邏輯。 –

+0

是不是指控制器的url-mapping應該是瀏覽器中URLgiven的一部分?但沒有url映射的視圖(這是jsp這裏) – overexchange