【问题标题】:Is it a good idea to put jdbc connection code in servlet class?将 jdbc 连接代码放在 servlet 类中是个好主意吗?
【发布时间】:2013-04-05 13:32:32
【问题描述】:

我是 servlet 和数据库的新手。我有一个 core.java 文件,其中有一个 JDBC 连接代码。在同一目录中,我有一个 coreServlet.java 文件,它从 HTML 页面获取表单值。我的问题是:

  1. 如何在两个 java 类之间进行交互,例如如何使用从 servlet(coreServlet.java) 中的 HTML 表单获得的变量到我的 core.java 文件,以便将其存储在我的数据库中?
  2. 将我的 jdbc 连接代码放在 coreServlet.java 中是不是更好?

我的项目结构是这样的:

  - aarya(project name)   
        |
         - WEB-INF
                 |
        |         -web.xml
        -src
           |
          -pkg
           |
            -CoreServlet.java(servlet to interact HTML form)
            -Main.java
            -Core.java(jdbc code is here to interact database)
        |
        -html
            |
            - core.html
        |
        - css
             |
             -core.css

        |
        -javascript
                  |
                   -core.js
        |
        - lib
        |
        -index.html

【问题讨论】:

  • 1) 你的包应该是反向 url 格式,例如com.techdon。 2)根据命名约定,您的课程应以大写字母开头。 3)这不是一个真正的问题,这个网站是针对具体问题而不是开放式问题。
  • @bmorris591 不是开放式问题。
  • @bmorris591,@Luiggi 我做了必要的更改,希望得到您的答复...

标签: java jsp servlets jdbc


【解决方案1】:

数据库连接数据应该在您的 JNDI 数据源中,如果您在类中使用连接池但从不会更好。由于您的是 Web 应用程序,请注意连接池配置在很大程度上取决于 Web 应用程序服务器。

作为示例,Tomcat 7 Database Connection Pool configurationJBoss 7 Database Connection Pool configuration 对此进行了很好的解释(在 GlassFish 和其他 Web 应用程序服务器上配置数据库连接池还有其他步骤,请注意每个服务器上的设置不同)。

从这两个示例中,您可以看到您将有一个 XML 文件,其中放置了连接属性:数据库 URL、用户、密码、最小和最大池连接大小(将打开多少个数据库连接)

  • Tomcat方式:

    <Resource name="jdbc/ProjectX" auth="Container"
        type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/projectx"
        username="user" password="password" maxActive="20" maxIdle="10" maxWait="-1"/>
    
  • JBoss方式:

    <datasource jndi-name="jdbc/ProjectX" pool-name="MySqlDS">
            <connection-url>jdbc:mysql://localhost:3306/projectx</connection-url>
            <driver>com.mysql</driver>
            <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
            <pool>
                <min-pool-size>10</min-pool-size>
                <max-pool-size>100</max-pool-size>
                <prefill>true</prefill>
            </pool>
            <security>
                <user-name>user</user-name>
                <password>password</password>
            </security>
            <statement>
                <prepared-statement-cache-size>32</prepared-statement-cache-size>
                <share-prepared-statements/>
            </statement>
    </datasource>
    <drivers>
        <driver name="com.mysql" module="com.mysql">
            <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
        </driver>
    </drivers>
    

最后,如果您已经配置了数据库连接池并且它工作正常,那么您在代码中恢复连接所需要做的就是调用InitialContext#lookup 以使用其 JNDI 资源名称恢复资源。

了解这一点后,在配置 JNDI 资源以连接到名为“jdbc/ProjectX”的 MySQL 数据库后,您可以拥有一个恢复 Connection 的类,如下所示:

public class DatabaseConnectivity {
    public static Connection getConnection() throws NamingException, SQLException {
        InitialContext cxt = new InitialContext();
        DataSource ds = (DataSource) cxt.lookup("java:/comp/env/jdbc/ProjectX" );
        return ds.getConnection();
    }
}

顺便说一下,我会使用不同的包名称来了解类的功能组。例如:

src
- edu.home.controller.servlet
  + CoreServlet.java
- edu.home.controller.filter
  + SessionFilter.java
- edu.home.model.entity
  + AnEntity.java
  + AnotherEntity.java
- edu.home.model.database
  + DatabaseConnectivity.java
- edu.home.model.service
  + AnEntityService.java
  + AnotherEntityService.java
(and on and on...)

【讨论】:

  • 我明白你的意思,但是我如何才能与类进行黑白交互,例如,如果我想在 DatabaseConeectivity.java 中使用 CoreServlet.java 变量,我们该怎么做?
  • @TechDon 这是一个完全不同的问题。我的回答涵盖了您问题标题中的问题。其他问题是阅读教程的结果。你可以从StackOverflow Servlets wikiStackOverflow JSP wiki开始学习
猜你喜欢
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多