当前位置: 首页 > 知识库问答 >
问题:

Tomcat中的Java Servlet部署

仉俊能
2023-03-14

在这个问题之后,自Java EE 6以来,web.xml部署文件是可选的。我目前正在使用Java EE 7,Eclipse(kepler)和apache-tomcat-7.0.47 win x64。我在Eclipse中创建了一个动态Web项目和一个服务器项目。两个项目都有部署文件(web.xml,上下文.xml)。

在web项目中编辑web.xml并在服务器上下文中运行servlet后,当尝试访问web.xml中定义的任何参数时,会引发< code > NullPointerException

这些项目具有以下目录结构:

是否应在服务器部署文件中定义参数?

编辑#1:

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>LoginExample</display-name>
  <welcome-file-list>
    <welcome-file>login.html</welcome-file>
  </welcome-file-list>

  <context-param>
    <param-name>dbURL</param-name>
    <param-value>jdbc:mysql://localhost/mysql_db</param-value>
  </context-param>
  <context-param>
    <param-name>dbUser</param-name>
    <param-value>mysql_user</param-value>
  </context-param>
  <context-param>
    <param-name>dbUserPwd</param-name>
    <param-value>mysql_pwd</param-value>
  </context-param>
</web-app>

可在此处访问参数:

package sebi.first;

import java.io.IOException;
import java.io.PrintWriter;

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

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet(
    description = "Login Servlet",
    urlPatterns = { "/LoginServlet" },
    initParams = {
            @WebInitParam(name = "user", value = "myuser"),
            @WebInitParam(name = "password", value = "mypass")
    })
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

public void init(ServletConfig config) throws ServletException {
    super.init(config);
    //we can create DB connection resource here and set it to Servlet context
    System.out.println("BEFORE OUTPUT"); // <== This is displayed in the console
    System.out.println("Check the string getServletContext().getInitParameter(\"dbURL\") = " + getServletContext().getInitParameter("dbURL")); // <== NULL pointer exception thrown
    if(getServletContext().getInitParameter("dbURL").equals("jdbc:mysql://localhost/mysql_db") &&
            getServletContext().getInitParameter("dbUser").equals("mysql_user") &&
            getServletContext().getInitParameter("dbUserPwd").equals("mysql_pwd"))
    getServletContext().setAttribute("DB_Success", "True");
    else throw new ServletException("DB Connection error");
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    //get request parameters for userID and password
    String user = request.getParameter("user");
    String pwd = request.getParameter("pwd");

    //get servlet config init params
    String userID = getServletConfig().getInitParameter("user");
    String password = getServletConfig().getInitParameter("password");
    //logging example
    log("User="+user+"::password="+pwd);

    if(userID.equals(user) && password.equals(pwd)){
        response.sendRedirect("LoginSuccess.jsp");
    }else{
        RequestDispatcher rd = getServletContext().getRequestDispatcher("/login.html");
        PrintWriter out= response.getWriter();
        out.println("<font color=red>Either user name or password is wrong.</font>");
        rd.include(request, response);

    }

}

我尝试使用< code>getServletConfig()访问的任何参数。getInitParameter(" param name ");引发< code > NullPointerException 。

编辑#2:

抛出的堆栈跟踪如下所示:

type Exception report

message Servlet.init() for servlet sebi.first.LoginServlet threw exception

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

exception 

javax.servlet.ServletException: Servlet.init() for servlet sebi.first.LoginServlet threw exception
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2430)
    org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2419)
    java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    java.lang.Thread.run(Unknown Source)


root cause 

java.lang.NullPointerException
    javax.servlet.GenericServlet.getServletContext(GenericServlet.java:125)
    sebi.first.LoginServlet.init(LoginServlet.java:33)
    javax.servlet.GenericServlet.init(GenericServlet.java:160)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2430)
    org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2419)
    java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    java.lang.Thread.run(Unknown Source)

注释中定义的参数似乎也会引发相同的异常。

编辑#3:

我写了一个简短的建议:

@WebServlet(description = "Test Parameters", urlPatterns = { "/TestParam",
        "/TestParam.do" }, initParams = {
        @WebInitParam(name = "first", value = "FIRST"),
        @WebInitParam(name = "second", value = "SECOND") })
public class TestParam extends HttpServlet {
private static final long serialVersionUID = 1L;

public void init(ServletConfig config) throws ServletException {
    super.init(config);
    // we can create DB connection resource here and set it to Servlet
    // context
    System.out.println("BEFORE OUTPUT");
    System.out.println("First parameter = "
            + config.getServletContext().getInitParameter("first"));
    System.out.println("Second parameter = "
            + config.getServletContext().getInitParameter("second"));
}

protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    response.getOutputStream().println("No");
}
}

现在没有抛出异常,但是参数值都是null,这表明super(config);不初始化批注中的参数。

编辑#4:

我已经成功运行了servlet并检索了dbURL参数值。但是,现在,当启动应用程序时,它会尝试打开并显示404 Not Found错误:

http://localhost:8080/DynamicWebProject1/servlet/sebi.first.LoginServlet

我必须手动编辑网址:

http://localhost:8080/DynamicWebProject1/LoginServlet

为了运行 servlet。

init()方法现在是:

public void init(ServletConfig config) throws ServletException {
    super.init(config);
    //we can create DB connection resource here and set it to Servlet context
    System.out.println("BEFORE OUTPUT");
    System.out.println("Check the string getServletContext().getInitParameter(\"dbURL\") = " + config.getServletContext().getInitParameter("dbURL"));

    if(config.getServletContext().getInitParameter("dbURL").equals("jdbc:mysql://localhost:3306/mysql_db") &&
            config.getServletContext().getInitParameter("dbUser").equals("mysql_user") &&
            config.getServletContext().getInitParameter("dbUserPwd").equals("mysql_pwd"))
    config.getServletContext().setAttribute("DB_Success", "True");
    else throw new ServletException("DB Connection error");
}

尽管如此,我还是无法访问注释中定义的参数。

共有2个答案

田嘉澍
2023-03-14

您正在抛出这样的异常抛出ServletException为什么不将trycatch(Exception e){e.printStackTrace ();}

邵阳
2023-03-14

如果你需要 Servlet 的 init 参数,你应该使用传递给 init 方法的 ServletConfig 对象(ServletConfig#getInitParameter(String)),并像这样配置 Servlet:

<servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>MyServlet</servlet-class>
    <init-param>
        <param-name>dbURL</param-name>
        <param-value>jdbc:mysql://localhost/mysql_db</param-value>
    </init-param>
    <init-param>
        <param-name>dbUser</param-name>
        <param-value>mysql_user</param-value>
    </init-param>
    <init-param>
        <param-name>dbUserPwd</param-name>
        <param-value>mysql_pwd</param-value>
    </init-param>
</servlet>
 类似资料:
  • 当我尝试部署一个war(Apache airavata-registry . war)时,我得到如下所示的错误。能是什么原因呢? 2013年11月14日下午7:41:19 org . Apache . catalina . core . application context日志信息:HTMLManager: list:列出虚拟主机“localhost”的上下文2013年11月14日下午7:41:

  • 我已经在archlinux上安装了tomcat,我尝试了tomcat7和Tomcat8。根据包括官方文档在内的多个来源,部署WAR文件就像将其放入webapps文件夹(在我的示例中是/var/lib/tomcat7/webapps)一样容易。WAR文件被分解。但我不知道如何访问我的web应用程序。在localhost:8080上有一个tomcat网页。我还尝试了localhost:8080/nam

  • 我正在为员工管理系统创建一个web应用程序,使用ApacheTomcat作为HTTP服务器,Oracle作为数据库,applet用于客户端编程,servlet用于服务器端编程。我还想使用DBCP来管理与数据库的连接。 我希望执行查询的servlet使用客户端为连接输入的用户名和密码。但是到目前为止,我看到在中配置资源时必须设置连接池的用户名和密码。 有没有什么方法可以实现这一点并且仍然使用DBCP

  • 我在eclipse IDE中有一个ant项目。Ant build在dist文件夹中创建一个war。我将war复制到Tomcat webapps文件夹并成功部署它。现在,我将Tomcat添加到eclipse中,并尝试在这里部署war,它会忽略war文件。它没有给出任何例外bu也没有做任何有用的事情。下面是完整的Tomcat日志- 它是一个动态的Web模块项目。在Eclipse中设置Tomcat时是否

  • 我用命令运行了一个spring boot web应用程序。但是,当将打包字段更改为war(在pom.xml中)并将其构建为war时,它未能在tomcat 7中运行。 我把我pom.xml的父母变成: 而且: 我的错误是: 我的问题是: 这里发生了什么,如何克服? 使用Spring-start真的安全吗?因为嵌入式服务器库似乎影响了它部署到j2ee容器中的可靠性。我知道,它仍然是Milestone版

  • 我试图在独立的Tomcat服务器中部署我的Spring Boot应用程序(war),但每次我都得到一个关于Logger的错误。你对这个案子有什么想法吗? 正如您所看到的,我使用的是tomcat 8.0.24、Spring Boot 1.2.5.Release和java.Version1.7。 我的项目非常简单(它作为一个jar工作): 1.主APP: 2.控制器