Tomcat / jsp / servlet /web.xml проблема - PullRequest
       26

Tomcat / jsp / servlet /web.xml проблема

2 голосов
/ 24 сентября 2011

Я работаю над проектом для школы и полностью разочарован.Проект состоит в том, чтобы получить простую демонстрацию JSP / Servlet, работающую на наших личных веб-сайтах, и, возможно, после 20 с лишним часов работы мне все еще не удается это сделать.Действительно разочаровывающая вещь, которую мне дали весь код, и до сих пор не могу заставить это работать.Ну, это не совсем так.Я получил его для работы на моем локальном сервере Tomcat, но я не могу воспроизвести эту магию на моем личном веб-сайте.Итак, вот что у меня есть.

Сначала код.Это назначение состоит из двух классов для сервлетов и двух jsps и файла web.xml.

Вот первый сервлет с именем 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>

Наконец, мой веб-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-INF в разделе public_html, поэтомув эту папку я поместил два файла jsps и веб-XML.Под этим была уже существующая папка с именем classes, в которой я создал новую папку под названием test и в этой папке разместил два файла классов.Я думаю, что переход на mysite.com/testing/hello?name=Bradley приведет к правильной ситуации, но, к сожалению, я получаю ошибку 404, в которой говорится, что URL-адрес / hello не найден.

Есть ли у кого-нибудь предложения относительно того, почему, и не может этого добиться?

Ответы [ 2 ]

2 голосов
/ 24 сентября 2011

Объявление класса сервлета в web.xml неверно.Вы положили ControllerServlet в пакет test.Поэтому правильное объявление класса сервлета должно быть:

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

То, как вы заставили его работать в локальной среде, мне не подходит.Возможно, пакета изначально не было вообще, или вы удалили пакет из объявления класса сервлета, или, возможно, у вас есть 2 класса сервлета в пакете по умолчанию и в пакете test.


Обновление : на основе приведенного кода (и при условии, что вы исправили объявление сервлета в web.xml), вот как должна выглядеть структура папок:

public_html 
 |-- WEB-INF
 |    |-- classes
 |    |    `-- test
 |    |         |-- ControllerServlet.class
 |    |         `-- PersonBean.class
 |    `-- web.xml
 |-- goodbye.jsp
 |-- hello.jsp
 `-- main.jsp
0 голосов
/ 24 сентября 2011

Несколько вещей, которые вы говорите, заставляют меня немного нервничать по поводу ваших вопросов.

  • Обычно используется инструмент сборки (например, Ant или Maven). Вы не упоминаете, какой инструмент сборки вы используете.

  • Обычно файл WAR создается и развертывается на сервере приложений (например, Tomcat). Хотя это возможно, необычно копировать файлы классов на сервер приложений вручную (если вы сделали это, я думаю, вам нужно будет перезапустить Tomcat, чтобы распознать это новое приложение).

  • public_html не похоже на Tomcat, это больше похоже на Apache. Обычно веб-приложения Tomcat находятся в каталоге 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) будет содержать все в каталоге развертывания выше. Этот WAR-файл будет развернут в Tomcat. Развертывание можно выполнить, скопировав файл WAR в каталог веб-приложений Tomcat или с помощью приложения Tomcat Manager.

index.jsp обычно является целевой страницей по умолчанию для веб-приложений (вы можете изменить это в своем файле web.xml).

...