Tomcat / jsp / servlet /web.xml问题

时间:2011-09-23 22:52:41

标签: jsp servlets web.xml tomcat5.5

我正在为学校做一个项目,我感到非常沮丧。该项目是为了在我们的个人网站上运行一个简单的JSP / Servlet演示,经过20多个小时的工作后,我仍然没有成功完成这项任务。令我非常沮丧的是,我已经获得了所有代码,仍然无法真正实现这一点。嗯,这不完全正确。我已经让它在我的本地tomcat服务器上工作,但我无法在我的个人网站上复制这种魔法。所以,这就是我所拥有的。

首先是代码。该赋值包括两个servlet类和两个jsps以及一个web.xml文件。

这是第一个名为ControllerServlet.java的servlet

 package test;

    // Import the servlet classes
    import javax.servlet.*;
    import javax.servlet.http.*;

    // Import the standard Java classes
    import java.io.*;
    import java.util.*;

     /**
    * Controller Servlet
    */
    public class ControllerServlet extends HttpServlet
    {
      private static String HELLO_JSP = "hello.jsp";
    private static String GOODBYE_JSP = "goodbye.jsp";
    private static String OTHER_JSP = "main.jsp";

     public void init() throws ServletException
    {
      // Typically initialize your request to page mappings here
    }

    public void service( HttpServletRequest req, HttpServletResponse res ) throws     ServletException
    {
    try
     {
      // Get the path - this is our key to our Request map
      String pathInfo = req.getPathInfo();

      // Find out what the user is requesting 
      String jsp = null; 
      if( pathInfo.equalsIgnoreCase( "/hello" ) )
      { 
        String name = req.getParameter( "name" );
        PersonBean person = new PersonBean( name );
        HttpSession session = req.getSession();
        session.setAttribute( "person", person );
        jsp = HELLO_JSP;
      }
      else if( pathInfo.equalsIgnoreCase( "/goodbye" ) )
      {
        HttpSession session = req.getSession();
        PersonBean person = ( PersonBean )session.getAttribute( "person" );
        req.setAttribute( "person", person );
        session.removeAttribute( "person" );
        jsp = GOODBYE_JSP;
      }
      else
      {
        jsp = OTHER_JSP;
      }

      // Foward the request to the jsp
      RequestDispatcher dispatcher = req.getRequestDispatcher( "/" + jsp );
      dispatcher.forward( req, res );
    }
    catch( IOException ioe )
    {
      throw new ServletException( ioe );
    }
    }
    }

现在是PersonBean.java:

package test;

 public class PersonBean implements java.io.Serializable
 {
 private String name;

public PersonBean()
{
}

public PersonBean( String name )
{
  this.name = name;
}

public String getName()
{
  return this.name;
}

public void setName( String name )
 {
  this.name = name;
}
}

现在是hello.jsp:

<jsp:useBean id="person" class="test.PersonBean" scope="session" />


<HTML>
  <HEAD>
  <TITLE>Hello, <jsp:getProperty name="person" property="name" /></TITLE>
 </HEAD>
 <BODY>
  <P>Hello, <jsp:getProperty name="person" property="name" /></P>
  <A HREF="goodbye">Goodbye</A>
</BODY>
</HTML>

和goodbye.jsp

 <jsp:useBean id="person" class="test.PersonBean" scope="session" />

   <HTML>
     <HEAD>
      <TITLE>Good bye, <jsp:getProperty name="person" property="name" /></TITLE>
    </HEAD>
    <BODY>
      <P>Good bye, <jsp:getProperty name="person" property="name" /></P>
    </BODY>
    </HTML>

最后是我的web xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>deploy</display-name>
    <servlet>
        <description>
        </description>
        <display-name>ControllerServlet</display-name>
        <servlet-name>ControllerServlet</servlet-name>
        <servlet-class>test.ControllerServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ControllerServlet</servlet-name>
        <url-pattern>/testing/*</url-pattern>
    </servlet-mapping>

</web-app>

我的网络服务器的文件管理器在public_html部分下有一个名为WEB-INF的文件夹,因此在该文件夹中我放置了两个jsps和web xml文件。在那之下是一个名为classes的预先存在的文件夹,我在名为test的文件夹中创建了一个新文件夹,并在该文件夹中放置了两个类文件。我认为去mysite.com/testing/hello?name=Bradley会导致正确的事情发生,但不幸的是我收到404错误,说没有找到url testing / hello。

有没有人有任何建议,为什么也不能做到这一点?

2 个答案:

答案 0 :(得分:2)

web.xml中的servlet类声明是错误的。您已将ControllerServlet放入包test中。所以正确的servlet类声明应该是:

<servlet-class>test.ControllerServlet</servlet-class>

如何让它在当地环境中工作超出我的范围。也许这个包最初根本不存在,或者你可能从servlet类声明中删除了包,或者你可能在默认和test包中都有2个servlet类。


更新:基于到目前为止给出的代码(假设你修复了web.xml中的servlet声明),这里是文件夹结构的样子:

public_html 
 |-- WEB-INF
 |    |-- classes
 |    |    `-- test
 |    |         |-- ControllerServlet.class
 |    |         `-- PersonBean.class
 |    `-- web.xml
 |-- goodbye.jsp
 |-- hello.jsp
 `-- main.jsp

答案 1 :(得分:0)

你说的几件事让我对你的问题感到有些紧张。

  • 使用构建工具(例如Ant或Maven)很常见。您没有提到您正在使用的构建工具。

  • 通常会创建一个WAR文件并将其部署到您的应用程序服务器(例如Tomcat)。虽然可能,但是手动将类文件复制到应用程序服务器上是不常见的(如果你这样做,我认为你需要重新启动Tomcat以识别这个新的应用程序。)

  • public_html 听起来不像Tomcat,听起来更像是Apache。通常,Tomcat Web应用程序位于名为 webapps 的目录下。

您的网络应用程序应包含以下内容:

~webapps/deploy/WEB-INF/web.xml
~webapps/deploy/WEB-INF/classes/test/ControllerServlet.class
~webapps/deploy/WEB-INF/classes/test/PersonBean.class
~webapps/deploy/hello.jsp
~webapps/deploy/goodbye.jsp
~webapps/deploy/main.jsp
~webapps/deploy/index.jsp

通常你的战争让我们称之为 deploy.war (以web.xml中的display-name命名)将包含上面部署目录中的所有内容。此WAR文件将部署到Tomcat。可以通过将WAR文件复制到Tomcat的webapps目录中或使用Tomcat Manager App来完成部署。

index.jsp 通常是Web应用程序的默认登录页面(您可以在web.xml中对其进行更改)。