实现<sql:query> </sql:query>的其他策略

时间:2014-08-25 05:17:16

标签: java sql jsp java-ee jstl

我一直在使用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本身。

2 个答案:

答案 0 :(得分:4)

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

  • 查询不可重复使用。如果您在其他页面中需要它,则需要重复查询。如果您有这样的简单查询,则无法检查问题,但这也会出现需要参数的更复杂的语句。
  • 您每页都手动创建连接!这会降低您的申请速度。为配置为资源的数据库连接池或以编程方式使用适当的数据源(例如,C3PO或BoneCP)

将所有数据库代码移动到正确的数据访问层类中。并将<sql>用于JSTL仅用于学习目的,而不是用于实际应用程序。

更多信息:

答案 1 :(得分:1)

您应该在您的java类中进行查询,而不是像您的团队领导所建议的那样在jsp中进行查询。

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

但问题确实是关于正确使用这些技术的问题:

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

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