Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javaservlet部署Tomcat_Java_Eclipse_Jsp_Tomcat_Servlets - Fatal编程技术网

javaservlet部署Tomcat

javaservlet部署Tomcat,java,eclipse,jsp,tomcat,servlets,Java,Eclipse,Jsp,Tomcat,Servlets,以下问题:由于JavaEE6,web.xml部署文件是可选的。我目前正在使用JavaEE7、Eclipse(开普勒)和apache-tomcat-7.0.47 WinX64。我在Eclipse中创建了一个动态web项目和一个服务器项目。两个项目都有部署文件(web.xml、context.xml) 在web项目中编辑web.xml并在服务器上下文中运行servlet后,当尝试访问web.xml中定义的任何参数时,将抛出NullPointerException 这些项目具有以下目录结构: 是否应

以下问题:由于JavaEE6,web.xml部署文件是可选的。我目前正在使用JavaEE7、Eclipse(开普勒)和apache-tomcat-7.0.47 WinX64。我在Eclipse中创建了一个动态web项目和一个服务器项目。两个项目都有部署文件(web.xml、context.xml)

在web项目中编辑web.xml并在服务器上下文中运行servlet后,当尝试访问web.xml中定义的任何参数时,将抛出
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>
注释中定义的参数似乎也会引发相同的异常

编辑#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
我必须手动编辑URL以:

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");
}

但是,我仍然无法访问批注中定义的参数。

如果您需要Servlet的init参数,您应该使用传递给
init
方法(
ServletConfig#getInitParameter(String)
)的
ServletConfig
对象,并按照以下方式配置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>

MyServlet
MyServlet
dbURL
jdbc:mysql://localhost/mysql_db
数据库用户
mysql\u用户
dbUserPwd
米丘普瓦德

您正在抛出这样的异常
抛出ServletException
为什么不将
try
包含在
捕获(异常e){e.printStackTrace();}

您试图访问的参数是什么?你能发布你的web.xml文件吗?我很好奇为什么Tomcat7下还有一个
web.xml
文件。也许这与问题有关?该文件是与项目一起创建的。我已尝试编辑这两个项目(从两个项目中),以便每个项目都有相同的条目,但问题仍然存在。jdbc:mysql://localhost:PORT_NO/mysql_db ,您没有添加mysql的端口号。可能是有问题。我已经添加了端口号(3306),但是没有解析参数,每个参数都会从以下行开始引发空指针异常:System.out.println(“检查字符串getServletContext().getInitParameter(\“dbURL\””)=“+getServletContext().getInitParameter(“dbURL”);这不是答案,你应该把它作为评论。什么?这是我的反对票。。。我也在考虑将其标记为垃圾邮件。请再读一遍这个问题,看看OP在问什么。但我必须承认这不是答案。OP的代码应该也能正常工作。可能存在一些不一致的部署问题,这在Eclipse中非常常见。不,
GenericServlet:125
(即调用
getServletContext
)尝试调用空值的。。。不是;)
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");
}
<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>