Tomcat/jsp/servlet /web.xml issue



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

首先是代码。该任务由两个servlet类、两个jsp和一个web.xml文件组成。

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

 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>

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

有没有人有任何建议,为什么和不能使这种情况发生?

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

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

我不明白你是怎么让它在当地环境下工作的。也许这个包最初根本不存在,或者您从servlet类声明中删除了这个包,或者您在默认包和test包中都有两个servlet类。


更新:根据目前给出的代码(并假设您在web.xml中修复了servlet声明),文件夹结构应该是这样的:

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

你说的几件事让我对你的问题有点紧张。

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

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

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

你的web应用程序应该包含如下内容:

~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

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

index.jsp通常是web应用程序的默认登录页面(您可以在web.xml中更改此设置)

最新更新