【问题标题】:javax.servlet.ServletException: Error instantiating servlet class java.UserScoresServletjavax.servlet.ServletException:实例化 servlet 类 java.UserScoresServlet 时出错
【发布时间】:2018-04-16 20:40:30
【问题描述】:

我一直在研究与此类似的主题,但没有一个解决方案有效。我正在尝试使用 Eclipse 在 Web 应用程序中映射一个简单的 HttpServlet,但是当从调用 servlet 的 html 页面提交表单时出现以下错误。

HTTP Status 500 - Error instantiating servlet class java.UserScoresServlet

type Exception report

message Error instantiating servlet class java.UserScoresServlet

description The server encountered an internal error that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Error instantiating servlet class java.UserScoresServlet
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    java.lang.Thread.run(Thread.java:748)
root cause

java.lang.ClassNotFoundException: java.UserScoresServlet
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    java.lang.Thread.run(Thread.java:748)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.34 logs.

我尝试使用 @WebServlet 注释和 Web.xml 文件进行映射,但无济于事。我试图使用其中一个,而不是同时使用两者。当使用 JSP 和 HTML 页面时,我的映射工作正常。我的xml文件映射如下,位于WEB-INF目录下。

<display-name>GetUserScores</display-name>
  <servlet>
    <servlet-name>GetUserScores</servlet-name>
    <servlet-class>java.UserScoresServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>GetUserScores</servlet-name>
    <url-pattern>/GetUserScores</url-pattern>
  </servlet-mapping>
</web-app>

服务器类如下。正如我上面提到的,我一直在做注释,或者 web.xml,而不是两者。两者都抛出相同的异常。

package java;

import java.io.IOException;
import java.score.jpa.Score;
import java.score.jpa.ScoreService;
import java.user.jpa.User;
import java.user.jpa.UserService;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class UserScoresServlet
 */
@WebServlet(name = "GetUserScores", urlPatterns = "/GetUserScores")
public class UserScoresServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private UserService userService;
    private ScoreService scoreService;
    /**
     * @see HttpServlet#HttpServlet()
     */
    public UserScoresServlet() {
    super();
    userService = new UserService();
    scoreService = new ScoreService();
}

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String firstName = (String)request.getParameter("firstName");
    String lastName = (String)request.getParameter("firstName");
    User user = userService.findUserByFirstAndLastName(firstName, lastName);
    if (user != null){
        List<Score> scoreList = scoreService.findAllScoresByUser(user);
        request.setAttribute("scoreList", scoreList);
    }
    gotoPage("/scores", request, response);
}

private void gotoPage(String address, HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(address);
    dispatcher.forward(request, response);
}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
}

}

文件结构见照片:File Structure Image

任何人都可以提供的帮助将是很大的帮助。我已经彻底搜索了这个网站,并尝试了类似问题的每一个建议,但无济于事。感谢您的帮助。

【问题讨论】:

  • 请将您的异常堆栈跟踪作为格式化文本发布在您的问题中,而不是图像。
  • 已更正。原谅第一个帖子,希望我现在格式正确。

标签: java servlets tomcat7 servlet-3.0


【解决方案1】:

正如JLS 中所述,您不应使用java 作为开发包的名称:

仅供本地使用的包的名称应该有一个以小写字母开头的第一个标识符,但第一个标识符特别不应该是标识符java;以 java 标识符开头的包名是为 Java SE 平台的包保留的

在您的代码中注明:

package java;

import java.io.IOException;
import java.score.jpa.Score;
import java.score.jpa.ScoreService;
import java.user.jpa.User;
import java.user.jpa.UserService;
import java.util.List;

//rest of code...

把你的包名改成别的。

【讨论】:

    猜你喜欢
    • 2014-07-03
    • 2015-01-02
    • 2016-06-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多