您的位置:首页 > 产品设计 > UI/UE

Web 开发笔记 #03# Read context parameter/web.xml values in a non-servlet java file

2018-03-14 15:40 399 查看
HTTP Status 500 ※ jsp 放在 WEB-INF 外面 ※ 使用 JDBC 时需要 close 什么 ※ execute 和 executeUpdate ※ How can I read context parameter/web.xml values in a non-servlet java file?

1、明明写了 servlet 却抛出这个,环境:IntelliJ IDEA

HTTP Status 500 - Error instantiating servlet class com.example.web.BeerSelect





临时解决方案:手动把编译出来的 .class 复制到 web/WEB-INF/classes 目录下。

持续化解决方案:IntelliJ IDEA 2017 配置Tomcat 运行Web项目

总之是要在 Project Structure --> Modules 中把 compiler output 和 WEB-INF/classes 以及 依赖包和 WEB-INF/lib 相对应起来,具体操作看上面教程。

后来发现,classes 是不需要自己建立的(lib 最好自建一下), compiler output 和 WEB-INF/classes 也不需要手动去关联,开发环境帮你做好了。保持默认设置比较不容易出错。。



2、把 jsp 放在 WEB-INF 外面并直接访问会发生什么


可能是这样的。

所以 最好 尽量 把 jsp 放 在 WEB-INF 内, WEB-INF 外放 无状态(没有先决条件)的入口 .html


像这样。

3、使用 JDBC 时需要 close 什么?

http://blog.csdn.net/wc0077/article/details/51083374

总之 PreparedStatement 和 resultset 最好都放在 finally 里关掉。

4、PreparedStatement 的 execute方法和executeUpdate方法有性能方面的区别吗

通常我们没有必要使用execute方法来执行SQL语句,而是使用executeQuery或executeUpdate更适合,但如果在不清楚SQL语句的类型时则只能使用execute方法来执行该SQL语句了


5、How can I read context parameter/web.xml values in a non-servlet java file? -- from stackoverflow

我的动机和提问者相同,打算从 web.xml 读数据库的配置(用户名、密码什么的)。

本来是采用方案一(
<env-entry> 那个
),后来发现对代码结构影响很不良就放弃了

Context env = (Context)new InitialContext().lookup("java:comp/env");

于是就用方案二,增设一个 ServletContextListener,步骤如下:

package com.example.model;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class DbConfig implements ServletContextListener {

public static String JDBC_DRIVER;
public static String DB_URL;
public static String USER;
public static String PASS;

@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
ServletContext context = servletContextEvent.getServletContext();

JDBC_DRIVER = context.getInitParameter("JDBC_DRIVER");
DB_URL = context.getInitParameter("DB_URL");
USER = context.getInitParameter("USER");
PASS = context.getInitParameter("PASS");
// 之后在其它类里临时创建该对象拿数据
}

@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {

}
}


/

web.xml

<context-param>
<param-name>JDBC_DRIVER</param-name>
<param-value>org.gjt.mm.mysql.Driver</param-value>
</context-param>

<context-param>
<param-name>DB_URL</param-name>
<param-value>jdbc:mysql://localhost:3306/mangast</param-value>
</context-param>

<context-param>
<param-name>USER</param-name>
<param-value>root</param-value>
</context-param>

<context-param>
<param-name>PASS</param-name>
<param-value></param-value>
</context-param>

    <listener>
<listener-class>
com.example.model.DbConfig
</listener-class>
</listener>


/

private static Connection conn = null;

/*
加载数据库驱动
*/
static {
DbConfig dbConfig = new DbConfig();
try {
Class.forName(dbConfig.JDBC_DRIVER);
conn = DriverManager.getConnection(dbConfig.DB_URL, dbConfig.USER, dbConfig.PASS);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}


算是一种冷门的读取方式 :p
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: