不要在一个给UIData组件提供数据的函数中访问数据库!例如<h:dataTable>,我经常看到有人这样做。这是个坏建议,只会带来坏的实施。 不要这样做!
大多数人都没有意识到(或许他们根本就没有关注他们使用的ORM工具的 SQL 输出日志)在 JSF 生命周期中, 这些表达式不仅仅被计算一次-- 通常多于一次。当每次值表达式提供给UIData组件值的时候,都会访问下数据库。在这之上,根据你获取的内容和如何实现的方式可能会改变结果集。On top of that, the result set could change depending on what you are retrieving and how you are doing it.
我将给出一个简单的示例,然后讲解下如何在 Seam中解决这个问题。
假设,你使用下面的类来取得一个User实体的数据,UserService 示例用来代理查询数据库的操作。
package example;
public class UserListBean {
private UserService userService;
public List getUsers() {
return userService.findAll();
}
}
然后在JSF配置文件中配置该类为managed bean。UserService通过一个EL值表达式注入(或许使用一个 EL
resolver 从Spring 容器中得到一个示例). 顺便提一下,设置该bean的作用域为session是另外一个坏的实践
这里我不讨论这个问题。如果你打算使用Session作用域,建议你去看看Seam的会话作用域。
<manage-bean>
<managed-bean-name>userList</managed-bean-name>
<managed-bean-class>example.UserListBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>userService</property-name>
<property-value>#{userService}</property-value>
</managed-property>
</manage-bean>
使用UserListBean类的 getUsers()方法给一个UIData组件提供数据是一个坏的实践,如下示例:
<h:dataTable id="users" var="user" value="#{userList.users}">
<h:column>
<f:facet name="header">Name</f:facet>
#{user.name}
</h:column>
</h:dataTable>
在这种情况下,当渲染页面的时候,SQL日志记录会显示多个查询记录,假设在该页面中还有个UICommand组件,在JSF postback节段会有其他的查询记录,
正确的做法是,绑定该list到一个上下文变量中,可以使用Seam的工厂组件,这样不管这个变量没查询了多少次,这个用户的list就会只在每个页面执行一次。注意下面我们使用了Seam的组件来代替上面的类。使用page 作用域就避免了在JSF postback节段重新查询数据。
package example;
@Name("userList")
public class UserListBean {
@In
private UserService userService;
@Factory(value = "users", scope = ScopeType.PAGE)
public List getUsers() {
return userService.findAll();
}
}
现在,我们就可以在JSF view中使用这个users 上下文变量了。
<h:dataTable id="users" var="user" value="#{users}">
<h:column>
<f:facet name="header">Name</f:facet>
#{user.name}
</h:column>
</h:dataTable>
请不要再一次进入前面提及的陷阱!
分享到:
相关推荐
这个例子程序展示了如何在SQL数据库环境中调用C#编写的.NET组件中的函数方法。 首先,我们需要了解SQL Server中的CLR集成。SQL Server 2005开始引入了对.NET Framework的内置支持,允许开发者使用.NET语言(如C#或...
在描述中提到的"封装类",意味着有开发者或团队为了简化MFC与ACCESS数据库的交互,编写了一个类库,将常见的数据库操作如打开、关闭、查询、插入、更新、删除等函数封装在一起。这样做的好处是提高了代码的可重用性...
关系模式的设计问题及数据的函数依赖一. 关系模式的设计问题1.1 数据依赖1.2 数据依赖对关系模式的影响二. 数据的函数依赖2.1 函数依赖2.1.1 函数依赖的定义2.1.2 函数依赖的3种基本情形2.2 函数依赖和码(关键字)...
- 数据源:一个可以配置数据库连接信息的位置或配置项,可能是一个配置文件或者系统数据库中的设置。 2. 访问SQL Server数据库的方法 - 创建数据库连接:在访问数据库之前,首先需要创建一个数据库连接。可以通过两...
DB-Library for C 是一个访问 SQL Server 数据库的函数库,提供了丰富的功能函数,能够使客户机和服务器之间的数据流在细粒度上进行控制。该函数库包括四个组件:应用程序、驱动程序管理器、驱动程序和数据源。 DB-...
数据库函数是 Microsoft Excel 中的一类函数,用于对存储在数据清单或数据库中的数据进行分析。这些函数统称为数据库函数(Dfunctions)。数据库函数有三个参数:database、field 和 criteria,这三个参数指向函数所...
8. 在InTouch中,需要新建一个窗口,并在新窗口中建立按钮和脚本来实现与关系数据库的数据交互。 9. 使用SQLConnect函数可以连接到关系数据库,并读取或写入关系数据库数据。 10. 使用SQLExec函数可以执行SQL语句...
在Excel中,数据库函数是一组专门设计用于处理大型数据列表的工具,它们允许用户执行类似于在数据库管理系统中进行的操作,如筛选、查询、计算和汇总数据。这些函数可以帮助用户高效地管理和分析数据,无需借助复杂...
总的来说,这个示例集涵盖了四种不同类型数据库的访问方法,旨在帮助开发者熟练地在函数计算环境中集成和操作这些数据库。通过学习这些示例,你可以了解到如何在无服务器架构中灵活地处理数据存储和检索,这对于构建...
在“vba连接访问数据库(access)”这个主题中,我们将探讨如何通过VBA代码与Access数据库进行交互,这对于数据处理、报告生成以及自动化工作流程非常有用。 首先,我们需要了解Access数据库的基本结构。Access...
作为企业级大型、通用...在数据的转换过程中,向导能根据源数据和目标数据具体类型,通过内置的转换规则提供数据类型 的默认映射关系、数据类型的精度匹配、空与非空信息提取、主键及相关索引建立等辅助功能,帮助用
在提供的"StudentManageSystem"项目中,很可能是实现了一个学生管理系统,包括对学生的增删改查功能,并使用模型视图组件显示学生信息。你可能需要查看源代码以了解具体实现细节,例如如何构建模型,如何处理数据库...
ADO.NET是.NET Framework的一部分,它提供了一组数据访问组件,用于连接到各种数据库系统,如SQL Server、Oracle、MySQL等。它以数据集(DataSet)为核心,实现了离线数据处理和数据源的直接连接。 2. 数据库连接...
标题 "PB-数据库保存图片并在Datawindow中显示" 涉及到的是使用PowerBuilder(PB)这个开发工具,将图片数据存储在数据库中,并在DataWindow控件中进行显示的技术。下面,我们将深入探讨这一主题。 1. **Power...
在力控中,我们需要新建一个Access数据库,用于存储力控中的数据。新建Access数据库时,我们需要选择数据库名称,例如“表1”,并创建两个字段,ID(数字型)和Name(文本型)。 三、力控变量写入到Access数据库 ...
每次访问数据库都必须创建数据连接和打开数据库,这样每次都需要重复编写这些代码,比较耗时耗力,所以我编写两个函数:创建数据库连接函数和打开相应数据库函数,在使用时可以直接在php文件中调用,非常方便!...
在提供的"lhwy_odbc2"压缩包中,可能包含了一个示例工程,演示了以上所述的功能。通过阅读和分析源代码,你可以更深入地了解如何在VC++中实现ODBC数据库程序,包括动态创建数据源的细节。此外,学习和理解ODBC API...
数据库函数和存储过程是数据库管理系统中的重要组成部分,它们在数据处理和业务逻辑实现中起着核心作用。在Sybase数据库系统中,这两者都提供了强大的功能,帮助开发者更有效地管理和操作数据。 首先,我们来详细...
10. **代码示例**:在提供的压缩包中可能包含一个名为`codefans.net`的文件,这可能是代码示例或教程链接。实际的代码实现会涉及上述步骤的具体代码逻辑,包括连接数据库、创建数据集、设置数据源、绑定事件以及填充...