我正在为学校做一个项目,我感到非常沮丧。该项目是为了在我们的个人网站上运行一个简单的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。
有没有人有任何建议,为什么也不能做到这一点?
答案 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中对其进行更改)。