【问题标题】:Servlet with JDBC [duplicate]带有 JDBC 的 Servlet [重复]
【发布时间】:2016-06-19 09:22:20
【问题描述】:

我的项目有问题。项目文件:

House.class

 public class House implements Serializable {

    //properties -------------------------------------------------------------
    private String price;
    private String square;
    private String RoomNumbers;
    //------------------------------------------------------------------------

    //getters - settersm Object overriding.... -----------------------------

HouseDAO.class

public class HouseDAO {

    Connection connection;
    final String DB_CONNECTION = "jdbc:mysql://localhost:3306/mydb2";
    final String DB_USER = "root";
    final String DB_PASSWORD = "root";

    public HouseDAO(Connection connection) {
        this.connection = connection;
    }

    public List<House> getList() {
       List<House> houses = new ArrayList<>();
        try {

            connection = DriverManager.getConnection(DB_CONNECTION, DB_USER, DB_PASSWORD);
            System.out.println("Connection available");
            PreparedStatement ps = connection.prepareStatement("SELECT Square, RoomNumbers, Price FROM houses  WHERE  District = 'Dnepr'");
            ResultSet rs = ps.executeQuery();
              while (rs.next()){
                 House house = new House();
                  house.setSquare(rs.getString("Square"));
                  house.setRoomNumbers(rs.getString("RoomNumbers"));
                  house.setPrice(rs.getString("Price"));
                    houses.add(house);
              }

        }catch (Exception ex){
            System.out.println("SQL exceprion");
            ex.printStackTrace();

        }
           return houses;
    }
}

和 Servlet: HousesBaseServlet

@WebServlet("/post")
public class HosesBaseServlet extends HttpServlet {
    Connection conn;

    private HouseDAO houseDAO;
    @Override
    public void init(){
        houseDAO = new HouseDAO(conn);
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{
        //choice from html form
      //  String choice = request.getParameter("district");
        try {
            List<House> houses = houseDAO.getList();

            request.setAttribute("houses", houses);
            request.getRequestDispatcher("/houses.jsp").forward(request,response);


        }catch (Exception ex ) {
            System.out.println("Fail to connect with base");
             ex.printStackTrace();
        }
    }
}

我阅读了一些解决方案,但没有帮助。两个例外的问题:

SQL 异常 java.sql.SQLException: 找不到合适的驱动程序 jdbc:mysql://localhost:3306/mydb2

我尝试添加:

Class.forName("com.mysql.jdbc.Driver");

添加到我的代码中,并将mysql连接器jar添加到我的项目中,但它会引发异常:

SQL 异常 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

第二个例外:

JasperException:绝对 uri:http://java.sun.com/jsp/jstl/core 无法在 web.xml 或部署的 jar 文件中解析 此应用无法与基地连接

这是我的 pom.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.35</version>
        </dependency>

        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>


    </dependencies>

JSP 标签库:

%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %

和项目结构: [项目结构][1]

Project structure - artifacts

在项目结构中 -> 库我有所有的罐子。

【问题讨论】:

  • 你的 WEB-INF 没有任何 lib 文件夹来放置 mysql jar
  • @Override public void init(){ houseDAO = new HouseDAO(conn); } 有点奇怪 conn 在这个 servlet 中有什么意义。关于您的问题,我认为 Idea 没有“看到”这是一个 Maven 项目,请尝试重新导入它
  • 没有帮助。仅在使用 tomcat 时出现问题,在具有 MAIN 类的标准项目中所有工作
  • 检查 MySQL jar 是否存在 - 这就是错误。您可以将其设为&lt;scope&gt;runtime&lt;/scope&gt;,因为 JDBC 不会针对供应商的 API/jar 进行编译。对于当前的 JDBC 4,将不再需要 Class.forName 自己动态加载驱动程序。最后的补救措施将 jar 放在 WEB-INF/lib/ 中。

标签: java mysql jsp servlets jdbc


【解决方案1】:

由于您使用的是 IntelliJ,我相信您可能需要将库添加到工件中,因为根据我的经验,Intellij 将 maven 依赖项添加到类路径而不是工件中。

确保您转到文件 -> 项目结构 -> 工件,然后将可用端的所有库添加到工件。

但是你需要在获得连接之前注册驱动程序,否则它不起作用:

Class.forName("com.mysql.jdbc.Driver");     
connection = DriverManager.getConnection(DB_CONNECTION, DB_USER, DB_PASSWORD);

希望这会有所帮助。

【讨论】:

  • 我刚刚开始学习 JavaEE,然后才将 jars 添加到项目结构中的“库”中。什么是神器? Artifacts 窗口出现错误,提示缺少 jdbc 驱动程序。我单击“修复它”按钮,但没有错过异常。之后,我在 Artifacts -> available elements 中双击 jars,我的第二个例外是错过。但不是驱动程序:没有找到适合 jdbc:mysql://localhost:3306/mydb2 的驱动程序
  • 我更新了问题,添加了带有工件结构的图片
  • WEB-INF里面有jdbc驱动吗?当tomcat启动时,您是否作为数据源连接?尝试将 jdbc 驱动程序 jar 复制到 tomcat 的 lib 目录,如果您将其作为数据源运行,则应该类似于 tomcat/lib/,tomcat 连接到数据库并在部署应用程序之前创建一个池。 PS:抱歉不准确,只有tomcat项目在工作
  • 哇,在我从工件中删除 jar 并注册驱动程序 Class.forName("com.mysql.jdbc.Driver") 项目后开始工作。我现在不知道)谢谢你
  • 好吧,如果它工作它工作,你有它在 tomcat lib 文件夹中吗?
猜你喜欢
  • 2016-06-17
  • 2020-07-27
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 2017-01-12
  • 2015-02-15
相关资源
最近更新 更多