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