【备忘 - JSP课程设计】解决JDBC for SQL Server 7.2无法连接SQL Server Express 2017

【澄清】本文章仅用作备忘,文中提及的解决方案与相关操作均来自http://www.cnblogs.com/hoobey/p/5994393.html,并非本人原创。


第一节 系统环境概述

SQL Server Express 2017
SQL Server Management Studio 17.9.1
Oracel Java Development Kit 11.0.2
Eclipse IDE for JavaEE 4.10 (2019-03)
Apache Tomcat 9.0.16
JDBC for SQL Server 7.2 JRE11

 

第二节 问题描述与重现

在完成JSP课程设计(利用JDBC开发Web数据库程序)过程中,出现JDBC无法连接登陆SQL Server数据库的情况,程序源代码如下:

// DatabaseConnect.java
package task1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 这是一个通过Microsoft JDBC for SQL Server连接数据库的封装类
 * 
 * @author Legend_1949
 * @date 2019/04/17
 */
public class DatabaseConnect {
    /**
     * 数据库链接
     */
    private String connectURL = null;
    /**
     * 数据库连接对象
     */
    private Connection connection = null;
    /**
     * 结果集对象
     */
    private ResultSet resultSet = null;

    /**
     * 构造函数,预置连接配置文件
     */
    public DatabaseConnect() {
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            connectURL = "jdbc:sqlserver://localhost:1433;";
            connectURL += "database=Market;";
            connectURL += "user=sa;";
            connectURL += "password=Furious5;";
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 执行精确查询
     * 
     * @param _SQL
     *            需要执行的SQL语句
     * @return 查询结果集
     */
    public ResultSet executeSelect(String _SQL) {
        try {
            // 登陆数据库
            connection = DriverManager.getConnection(connectURL);
            Statement statement = connection.createStatement();
            resultSet = statement.executeQuery(_SQL);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return resultSet;
    }

    /**
     * 执行模糊查询
     * 
     * @param _SQL
     *            需要执行的SQL语句
     * @return 查询结果集
     */
    public ResultSet executeInsensitiveSelect(String _SQL) {
        try {
            connection = DriverManager.getConnection(connectURL);
            Statement statement =
                connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            resultSet = statement.executeQuery(_SQL);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return resultSet;
    }

    /**
     * 执行数据更新
     * 
     * @param _SQL
     *            需要执行的SQL语句
     * @return 数据更新影响的行数
     */
    public int executeModify(String _SQL) {
        int result = 0;
        try {
            connection = DriverManager.getConnection(connectURL);
            System.out.println("Database Connected!");
            Statement statement = connection.createStatement();
            result = statement.executeUpdate(_SQL);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return result;
    }
}
<!-- insert.jsp -->
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<meta charset="UTF-8" />
<title>输入数据</title>
<style type="text/css">
* {
    margin: auto;
    padding: auto;
    text-align: center;
}

input {
    text-align: left;
}
</style>
</head>
<body>
  <div>
    <form action="insertSolver.jsp">
      <table>
        <tbody>
          <tr>
            <td style="font-size: 36; font-weight: bold; margin: 10px auto;"
              colspan="2">数据输入</td>
          </tr>
          <tr>
            <td>产品名称:</td>
            <td><input type="text" name="Name" /></td>
          </tr>
          <tr>
            <td>产品型号:</td>
            <td><input type="text" name="Series" /></td>
          </tr>
          <tr>
            <td>品牌:</td>
            <td><input type="text" name="TradeMark" /></td>
          </tr>
          <tr>
            <td>产地:</td>
            <td><input type="text" name="MadeIn" /></td>
          </tr>
          <tr>
            <td>价格:</td>
            <td><input type="number" name="Price" /></td>
          </tr>
          <tr>
            <td colspan="2"><input type="submit" value="插入" /> <input
              type="reset" value="清空" /></td>
          </tr>
        </tbody>
      </table>
    </form>
  </div>
</body>
</html>
<!-- insertSolver.jsp -->
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<jsp:useBean id="connector" scope="page" class="task1.DatabaseConnect"></jsp:useBean>
<html>
<head>
<meta charset="UTF-8" />
<title>数据插入中,请稍候……</title>
<%
    // 设置参数编码格式    
    request.setCharacterEncoding("UTF-8");
    // 用户输入的数据集
    String[] parameters = new String[5];
    parameters[0] = request.getParameter("Name");
    parameters[1] = request.getParameter("Series");
    parameters[2] = request.getParameter("TradeMark");
    parameters[3] = request.getParameter("MadeIn");
    parameters[4] = request.getParameter("Price");
    // 分段形成插入语句
    String sqlString = "INSERT INTO [dbo].[Goods] ([Name], [Series], [TradeMark], [MadeIn], [Price]) VALUES (";
    for (int i = 0; i < parameters.length - 1; i++) {
        sqlString += ("'" + parameters[i] + "', ");
    }
    // Price字段的类型与前面不同,需要单独出来
    sqlString += (parameters[4] + ")");
    System.out.println(sqlString);
    System.out.println("Trying to connect ...");
    // 受到影响的行数
    int effect = connector.executeModify(sqlString);
    // 当受到影响的行数不为0
    if (effect != 0) {
        out.println("<script type='text/javascript'>");
        out.println("alert('添加成功!');");
        out.println("window.location.href='#';");
        out.println("</script>");
    } else {
        out.println("<script type='text/javascript'>");
        out.println("alert('错误:添加失败!');");
        out.println("window.location.href='insert.jsp';");
        out.println("</script>");
    }
%>
</head>
<body>
</body>
</html>

启动Tomcat服务器并在浏览器运行jsp页面:

图1 数据输入页面(insert.jsp)

输入数据并提交,会出现以下问题:

图2 Apache Tomcat报错页面(insertSolver.jsp)

第三节 问题溯源及解决方案

以上问题是由于数据库连接被阻止的缘故,所以通过修改JVM“政策”允许JVM与SQL Server建立连接。

定位至以下路径并打开文件:

$JAVA_HOME\conf\security\java.policy

在我的设备上则是这个:
D:\Program_Files_(x64)\Java\JDK_11.0.2\conf\security\java.policy

 在其中添加第46~50行内容并保存(也可以直接将第49行内容放在第17~43行中间):

//
// This system policy file grants a set of default permissions to all domains
// and can be configured to grant additional permissions to modules and other
// code sources. The code source URL scheme for modules linked into a
// run-time image is "jrt".
//
// For example, to grant permission to read the "foo" property to the module
// "com.greetings", the grant entry is:
//
// grant codeBase "jrt:/com.greetings" {
//     permission java.util.PropertyPermission "foo", "read";
// };
//

// default permissions granted to all domains
grant {
    // allows anyone to listen on dynamic ports
    permission java.net.SocketPermission "localhost:0", "listen";

    // "standard" properies that can be read by anyone
    permission java.util.PropertyPermission "java.version", "read";
    permission java.util.PropertyPermission "java.vendor", "read";
    permission java.util.PropertyPermission "java.vendor.url", "read";
    permission java.util.PropertyPermission "java.class.version", "read";
    permission java.util.PropertyPermission "os.name", "read";
    permission java.util.PropertyPermission "os.version", "read";
    permission java.util.PropertyPermission "os.arch", "read";
    permission java.util.PropertyPermission "file.separator", "read";
    permission java.util.PropertyPermission "path.separator", "read";
    permission java.util.PropertyPermission "line.separator", "read";
    permission java.util.PropertyPermission
                   "java.specification.version", "read";
    permission java.util.PropertyPermission "java.specification.vendor", "read";
    permission java.util.PropertyPermission "java.specification.name", "read";
    permission java.util.PropertyPermission
                   "java.vm.specification.version", "read";
    permission java.util.PropertyPermission
                   "java.vm.specification.vendor", "read";
    permission java.util.PropertyPermission
                   "java.vm.specification.name", "read";
    permission java.util.PropertyPermission "java.vm.version", "read";
    permission java.util.PropertyPermission "java.vm.vendor", "read";
    permission java.util.PropertyPermission "java.vm.name", "read";
};

// The following grant permissions are defined by Administrators.
grant {
    // Allows everyone to connect SQL Server Database by using JDBC for SQL Server
    permission java.net.SocketPermission "localhost:1433", "connect,resolve";
};

在Eclipse中重新启动Apache Tomcat服务器,即可正常连接至数据库。

图3 正常连接并插入数据(insertSolver.jsp)
图4 数据插入结果(SSMS 17.9.1)
发布了11 篇原创文章 · 获赞 8 · 访问量 4763

猜你喜欢

转载自blog.csdn.net/u011367208/article/details/89382477