2012-10-28 46 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