2012-10-28 48 views
0

我的目標:訪問.htm文件,並將用戶輸入傳遞給調用的servlet並顯示內容。如何設置Servlet路徑使HTML正確調用servlet文件?

我做了什麼:我用eclipse Juno創建了一個動態項目:ServeletTest。該項目的結構如下:

enter image description here

該servlet文件MyServlet.java和相關的代碼是:

package ylai.Servlet.test; 

import java.io.IOException; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import java.io.PrintWriter; 
/** 
* Servlet implementation class MyServlet 
*/ 
@WebServlet(description = "test servlet", urlPatterns = { "/MyServlet" }) 
public class MyServlet extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    /** 
    * @see HttpServlet#HttpServlet() 
    */ 
    public MyServlet() { 
     super(); 
     // TODO Auto-generated constructor stub 
    } 

    /** 
    * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
    */ 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     // TODO Auto-generated method stub 
     String info = request.getParameter("info") ;  
     PrintWriter out = response.getWriter() ; 
     out.println("<html>") ; 
     out.println("<head><title>Hello Servlet</title></head>") ; 
     out.println("<body>") ; 
     out.println("<h1>" + info + "</h1>") ; 
     out.println("</body>") ; 
     out.println("</html>") ; 
     out.close() ; 

    } 

    /** 
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
    */ 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     // TODO Auto-generated method stub 
      this.doGet(request, response); 
    } 


} 

HTML文件是input.htm。和細節代碼:

<html> 
<head><title>This is html file</title></head> 
<body> 
<form action="myservlet" method="post"> 
    Type something:<input type="text" name="info"> 
    <input type="submit" value="submit"> 
</form> 
</body> 
</html> 

和web.xml文件中定義爲:當我運行使用內置的Tomcat在Eclipse中的input.htm

<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    version="2.5"> 

    <display-name>Welcome to Tomcat</display-name> 
    <description> 
    Welcome to Tomcat 
    </description>  
    <servlet> 
     <servlet-name>myservlet</servlet-name> 
     <servlet-class>ylai.Servlet.test.MyServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>myservlet</servlet-name> 
     <url-pattern>/myservlet</url-pattern> 
    </servlet-mapping> 
    </web-app> 

,它工作正常,並input.htm中的輸入內容可以由MyServlet.java顯示。的屏幕快照如下:

enter image description here

enter image description here

似乎工作正常。

我的問題

如果我想修改的值在web.xml作爲

<servlet-mapping> 
     <servlet-name>myservlet</servlet-name> 
     <url-pattern>/myservletURL</url-pattern> 
    </servlet-mapping> 

我所期待的是,一旦Input.htm位於提交,它會調用serlvet和網頁地址應該是:

http://localhost:8080/ServeletTest/myservletURL 

但顯示頁面a地址仍然不變:

http://localhost:8080/ServeletTest/myservlet帶有HTTP狀態404錯誤。

它看起來很奇怪!該機制應該是:當我提交input.htm頁面時,它將通過web.xml中的servlet-name調用servlet。在這種情況下,servlet-name是myservlet。 Tomcat將使用servlet-name來查找servlet文件的實際位置:MyServlet.java並執行它。重定向頁面地址取決於你定義的內容。在這種情況下,它應該/ ServeletTest/myservletURL 但現在。 Servlet文件不能被調用,並且頁面地址不是我所期望的。

我對servlet調用機制或其他方面有錯誤的理解嗎?如果你改變了URLPATTERN

回答

2

到myservletURL,您還需要更新表格動作以定位此新網址。

+0

你確定表單操作應該與url-pattern匹配嗎?不是web.xml中的Servelt名稱?我累了,但問題仍在這裏。 –

+0

是的,因爲瀏覽器會打電話給你的網頁打電話。它不知道web.xml文件中的內容,web.xml告訴服務器哪些URL映射到哪個servlet類。 – nitind

+0

您的意思是說html文件會根據web.xml中的的值而不是servlet-name的值來找到重定向頁面?如果是的話,HTML如何知道它需要提交哪個servlet? mapping-url是自定義的,與實際調用servlet信息沒有關係。 –

1
[email protected]("/LifeCycleServlet") 
[email protected](description = "test servlet", urlPatterns = { "/MyServlet" }) 

刪除這些行,因爲在這裏你所提到的網址爲MyServlet

更改此URLPATTERN { 「/ MyServlet」}也

+0

賴在eclipse中去服務器資源管理器,右鍵單擊選擇乾淨的tomcat工作目錄並再次運行,讓我知道這個問題。 – sunleo

+0

如果你可以發送整個項目給我,我會測試,會給出結果。我的郵件([email protected])。將主題設置爲STACKOVERFLOW。 – sunleo

+0

我會在我的Eclipse中執行此操作,並讓您知道。如果可以,請刪除以前的評論。 – sunleo