Web开发相关笔记 #03#

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

原文地址:https://www.cnblogs.com/xkxf/p/8543222.html