【问题标题】:Other Statergies to implemment <sql:query>实现 <sql:query> 的其他策略
【发布时间】:2014-10-18 05:16:49
【问题描述】:

我一直在使用 JSTL 从我的数据库中获取值并使用如下所示的类似代码将其显示在我的 jsp 页面中。

<sql:setDataSource
var="myDS"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mydb"
user="root" password="secret"
/>

<sql:query var="list_users" dataSource="${myDS}">
SELECT * FROM users;
</sql:query>

<c:forEach var="user" items="${listUsers.rows}">

<c:out value="${user.name}" />

<c:out value="${user.email}" />

<c:out value="${user.profession}" />

</c:forEach>

我的团队负责人告诉我,将查询直接放在 jsp 页面中并不是一个好习惯。由于此代码中有数据库名称和用户名和密码,我不确定此代码是否实现了适当的安全性。我想知道您对此事的看法,以及是否有任何替代方法可以使用 JSTL 本身来做到这一点。

【问题讨论】:

    标签: java sql jsp jakarta-ee jstl


    【解决方案1】:

    由于 JSTL 是在服务器端执行的,因此不存在安全漏洞,因为应用程序的客户端无法看到查询。这种方法还有其他问题:

    • 查询不可重复使用。如果您在其他页面中需要它,您将需要重复查询。当您有类似这样的简单查询时,您无法检查问题,但更复杂的语句也需要参数时会出现这种情况。
    • 您正在为每页手动创建一个连接!这会减慢您的应用程序。为配置为资源或以编程方式(例如 C3PO 或 BoneCP)的数据库连接池使用适当的数据源

    将所有数据库代码移动到适当的数据访问层类中。并且将 &lt;sql&gt; 用于 JSTL 仅用于学习目的,而不用于实际应用。

    更多信息:

    【讨论】:

      【解决方案2】:

      您真的应该在您的 java 类中进行查询,而不是在 jsp 中,就像您的团队负责人建议的那样。

      在安全方面这并不重要,所有代码都可以在服务器、jsp 或 java 上使用。 sql 标签不应在生成的页面中输出该信息。

      但实际上,问题更多在于正确使用这些技术:

      jsp 用作模板,它应该获取数据并将它们显示给最终用户。一些基本操作可以在数据列表上进行生命循环或格式化数据,但这应该只针对您想要制作的视图

      java controler用于恢复数据并根据需要配置视图,例如使用哪个jsp以及在该jsp中发送哪些数据

      【讨论】:

        猜你喜欢
        • 2012-04-16
        • 1970-01-01
        • 2013-02-23
        • 1970-01-01
        • 1970-01-01
        • 2021-11-16
        • 2021-07-16
        • 1970-01-01
        • 2012-10-16
        相关资源
        最近更新 更多