2011-12-09 42 views
2

我正在自学JSP/Servlet。而且我面临着一个我能解决的问题。 我正在创建一个简单的表单来请求一个servlet。问题是,当我将web.xml中的url-pattern更改为我想要的url时,Tomcat给我一个错误404。但是,当我将url-pattern更改为与其工作的servlet相同的名称时。我注意到的另一件事是当我手动键入我想要的URL的模式,它的URL。 看来我并没有被重定向到正确的地方。我检查过很多次web.xml,我找不到任何错误。下面是servlet代码:url-pattern Servlet Tomcat 7.0

package email; 

import java.io.*; 
import javax.servlet.*; 
import javax.servlet.http.*; 

import business.User; 
import data.UserIO; 

/** 
* @author Joel Murach 
*/ 
public class AddToEmailListServlet extends HttpServlet 
{  
    int globalCount; 

    public void init() throws ServletException{ 
     globalCount = 0; 
    } 
    protected void doPost(
     HttpServletRequest request, 
     HttpServletResponse response) 
     throws ServletException, IOException 
    { 
     //Global variable 
     globalCount++; 

     // get parameters from the request 
     String firstName = request.getParameter("firstName"); 
     String lastName = request.getParameter("lastName"); 
     String emailAddress = request.getParameter("emailAddress"); 

     // get a relative file name 
     ServletContext sc = getServletContext(); 
     String path = sc.getRealPath("/WEB-INF/EmailList.txt"); 

     // use regular Java objects to write the data to a file 
     User user = new User(firstName, lastName, emailAddress); 
     UserIO.add(user, path); 

     // send response to browser 
     response.setContentType("text/html;charset=UTF-8"); 
     PrintWriter out = response.getWriter();   
     out.println(
      "<!doctype html public \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n" 
     + "<html>\n" 
     + "<head>\n" 
     + " <title>Murach's Java Servlets and JSP</title>\n" 
     + "</head>\n" 
     + "<body>\n" 
     + "<h1>Thanks for joining our email list</h1>\n" 
     + "<p>Here is the information that you entered:</p>\n" 
     + " <table cellspacing=\"5\" cellpadding=\"5\" border=\"1\">\n" 
     + " <tr><td align=\"right\">First name:</td>\n" 
     + "  <td>" + firstName + "</td>\n" 
     + " </tr>\n" 
     + " <tr><td align=\"right\">Last name:</td>\n" 
     + "  <td>" + lastName + "</td>\n" 
     + " </tr>\n" 
     + " <tr><td align=\"right\">Email address:</td>\n" 
     + "  <td>" + emailAddress + "</td>\n" 
     + " </tr>\n" 
     + " </table>\n" 
     + "<p>To enter another email address, click on the Back <br>\n" 
     + "button in your browser or the Return button shown <br>\n" 
     + "below.</p>\n" 
     + "<form action=\"join_email_list.html\" " 
     + "  method=\"post\">\n" 
     + " <input type=\"submit\" value=\"Return\">\n" 
     + "</form>\n" 
     + "<p>This page has been accessed " 
     + globalCount + " times.</p>" 
     + "</body>\n" 
     + "</html>\n"); 
     System.out.println(globalCount); 
     log("Global variable" +globalCount); 
     out.close(); 
    }  

    protected void doGet(
     HttpServletRequest request, 
     HttpServletResponse response) 
     throws ServletException, IOException 
    { 
     doPost(request, response); 
    } 

} 

这里是web.xml文件:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" 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"> 
    <!-- the definitions for the servlets --> 
    <!-- the mapping for the servlets --> 
    <servlet> 
     <servlet-name>DisplayMusicChoicesServlet</servlet-name> 
     <servlet-class>email.DisplayMusicChoicesServlet</servlet-class> 
    </servlet> 
    <servlet> 
     <servlet-name>AddToEmailListServlet</servlet-name> 
     <servlet-class>email.AddToEmailListServlet</servlet-class> 
    </servlet> 

    <!-- other configuration settings for the application --> 
    <servlet-mapping> 
     <servlet-name>DisplayMusicChoicesServlet</servlet-name> 
     <url-pattern>/displayMusicChoices</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>AddToEmailListServlet</servlet-name> 
     <url-pattern>/addToEmailList</url-pattern> 
    </servlet-mapping> 
    <session-config> 
     <session-timeout>30</session-timeout> 
    </session-config> 
    <welcome-file-list> 
     <welcome-file>join_email_list.html</welcome-file> 
    </welcome-file-list> 
</web-app> 
+0

为了避免明显的:你重建/重新部署web应用程序并在'web.xml'中进行更改后重新启动Tomcat? – BalusC

+0

谢谢你,但我做到了 – Camus

+0

好吧,你的问题可能太本地化了。 – BalusC

回答

1

很多你在做什么批评,但我把自己限制在你的问题。

如果你部署应用程序到Tomcat 7/webapps目录中的WAR文件名为foo.war,那么URL调用你AddToEmailListServlet并显示在浏览器的HTML页面将是:

http://host:8080/foo/AddToEmailListServlet 

我假设您在表单中发布这三个请求参数,因为您必须在发送之前将电子邮件地址中的at-code编码。

+0

这是一个我正在做的简单练习。我不检查电子邮件是否有@。我对映射的理解是,我可以选择一个名称来显示在URL上,对吗?例如,出于安全原因,我想通过映射更改要显示的URL。我使用netbeans,所以我认为我不需要手动部署war文件。我错了吗?欢呼 – Camus

+1

这是一本十年前的简单练习;我对吗?你应该知道他们要求你做的事情被认为是反模式;没有人会将HTML嵌入到servlet中并将其写入输出流中。我的意思是,你不能在查询字符串中传递该电子邮件而不逃避它。 – duffymo

+0

好吧,我没有找到任何最近学习servlet的书。我知道最好的编程方式是将html,jsp和servlet结合起来,这是我将在下一章中学习的内容。 2个问题。你是否知道一本适合初学者的书(新版本),以及你是否知道如何解决这个问题。 – Camus

0

不要给像admin.xhtml这样的特定文件的url,而是在“WebContent”目录下创建一个新文件夹。在这种情况下,可以说,文件夹名称是“安全”,地方admin.xhtml该文件夹中,然后 <url-pattern>/secured/*</url-pattern>

为我工作,我希望这有助于