BDF2-PROFILE模塊提供了一個(gè)允許管理員對(duì)系統(tǒng)當(dāng)中頁(yè)面組件的顯示進(jìn)行個(gè)性化定制的功能。對(duì)于這種組件的個(gè)性化定制,管理可以將其施加給某個(gè)用戶、某個(gè)部門(mén)或某個(gè)公司等,一旦對(duì)目標(biāo)群體(用戶、部門(mén)或者公司)施加了個(gè)性化定制功能,那么隸屬于這個(gè)用戶、部門(mén)或者公司的人登錄系統(tǒng)之后就可以看到這個(gè)頁(yè)面被管理員修改后的效果,接下來(lái)們舉個(gè)例子來(lái)說(shuō)明這個(gè)功能的適用場(chǎng)景。
假如我們需要開(kāi)發(fā)一個(gè)系統(tǒng),這個(gè)系統(tǒng)將以SAAS模式給不同的公司去使用,但對(duì)于某一些功能頁(yè)面,不同的公司對(duì)頁(yè)面顯示效果要求可能也略有不同,比如某個(gè)業(yè)務(wù)系統(tǒng)維護(hù)頁(yè)面,某些公司可能其中的一個(gè)表單中字段A、B、C的顯示順序?yàn)锳、B、C,但有些公司可能因?yàn)槟承┰蛳M麑㈨樞蚋某葿、C、A,對(duì)于這樣一種需求,因?yàn)閮杉夜玖?xí)慣不同,對(duì)頁(yè)面的顯示要求也不相同,但這么一點(diǎn)不同又不值得我們專門(mén)開(kāi)發(fā)一個(gè)頁(yè)面特地給這家公司使用,這個(gè)時(shí)候就可以利用BDF2-PROFILE模塊輕松解決這個(gè)問(wèn)題。當(dāng)然,BDF2-PROFILE模塊能個(gè)性化的功能不僅僅是表單元素或表格列的顯示順序,它幾乎可以實(shí)現(xiàn)所有的支持屬性及事件定義的組件個(gè)性化定制,比如針對(duì)不同的公司為某個(gè)Button設(shè)置不同的caption,或者針對(duì)不同公司為某個(gè)UpdataAction設(shè)置不同的保存前的確認(rèn)消息或保存成功之后的提示消息等。
要使用BDF2-PROFILE模塊,首先需要將BDF2-PROFILE模塊相關(guān)的jar放置到我們的項(xiàng)目當(dāng)中,具體做法就是可以到nexus.bsdn.org上下載BDF2-PROFILE模塊相關(guān)jar或到我們提供的在線項(xiàng)目向?qū)М?dāng)中,創(chuàng)建一個(gè)包含BDF2-PROFILE模塊的項(xiàng)目,當(dāng)然如果您采用的是Maven來(lái)管理我們的項(xiàng)目,那么只需要在我們項(xiàng)目的 pom.xml當(dāng)中添加下面的依賴信息即可。
BDF2-PROFILE模塊的依賴信息
<dependency>
<groupId>com.bstek.bdf2</groupId>
<artifactId>bdf2-profile</artifactId>
<version>2.0.0</version>
</dependency>
添加完BDF2-PROFILE模塊所需要的jar之后,接下來(lái)還需要編寫(xiě)一個(gè)IProfileDataService接口實(shí)現(xiàn)類,并將其配置到Spring當(dāng)中,否則啟動(dòng)時(shí)會(huì)拋出下面的異常:
異常消息
Caused by: java.lang.RuntimeException: The current spring application context without a
[com.bstek.bdf2.profile.service.IProfileDataService] interface implementation
at
com.bstek.bdf2.profile.view.component.ComponentMaintain.afterPropertiesSet(ComponentMaintain.java:
414)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1545)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1483)
... 23 more
我們來(lái)看看IProfileDataService接口實(shí)現(xiàn)類代碼:
IProfileDataService接口源碼
package com.bstek.bdf2.profile.service;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import com.bstek.bdf2.profile.model.AssignTarget;
import com.bstek.bdf2.profile.model.UrlDefinition;
import com.bstek.dorado.data.provider.Criteria;
import com.bstek.dorado.data.provider.Page;
/**
* 使用profile模塊必須實(shí)現(xiàn)的接口
* @author Jacky.gao
* @since 2013-2-26
*/
public interface IProfileDataService {
/**
* 根據(jù)給出的父ID,返回其下所有子的URL,實(shí)現(xiàn)URL樹(shù)構(gòu)建
* @param companyId 所在公司(或其它)的ID
* @param parentId 父URL ID
* @return 返回指定父ID的URL集合
*/
List<UrlDefinition> loadUrls(String companyId,String parentId);
/**
* 分頁(yè)加載分配資源的目標(biāo)對(duì)象
* @param page Dorado7分頁(yè)對(duì)象
* @param criteria 過(guò)濾查詢對(duì)象
*/
void loadAssignTargets(Page<AssignTarget> page,Criteria criteria);
/**
* 返回加載個(gè)性化信息需要使用的分配資源目標(biāo)對(duì)象的ID,比如username,companyid之
* @return 一個(gè)字符串
*/
String getAssignTargetId(HttpServletRequest request);
}
接下來(lái)我們編寫(xiě)一個(gè)IProfileDataService接口實(shí)現(xiàn)類,代碼如下:
IProfileDataService接口實(shí)現(xiàn)類源碼
package test;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import com.bstek.bdf2.core.context.ContextHolder;
import com.bstek.bdf2.core.model.Url;
import com.bstek.bdf2.core.view.url.UrlMaintain;
import com.bstek.bdf2.profile.model.AssignTarget;
import com.bstek.bdf2.profile.model.UrlDefinition;
import com.bstek.bdf2.profile.service.IProfileDataService;
import com.bstek.dorado.data.provider.Criteria;
import com.bstek.dorado.data.provider.Page;
@Component
public class TestProfileDataService implements IProfileDataService {
@Autowired
@Qualifier("bdf2.urlMaintain")
private UrlMaintain urlMaintain;
public List<UrlDefinition> loadUrls(String companyId,String parentId) {
List<UrlDefinition> list=new ArrayList<UrlDefinition>();
try {
for(Url url:urlMaintain.loadUrls(parentId)){
UrlDefinition def=new UrlDefinition();
def.setId(url.getId());
def.setUrl(url.getUrl());
def.setName(url.getName());
def.setParentId(parentId);
list.add(def);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return list;
}
public void loadAssignTargets(Page<AssignTarget> page, Criteria criteria) {
List<AssignTarget> targets=new ArrayList<AssignTarget>();
AssignTarget t1=new AssignTarget();
t1.setId("root-bstek");
t1.setName("上海銳道");
targets.add(t1);
AssignTarget t2=new AssignTarget();
t2.setId("root-ibm");
t2.setName("IBM中國(guó)");
targets.add(t2);
page.setEntities(targets);
}
public String getAssignTargetId(HttpServletRequest request) {
return ContextHolder.getLoginUser()==null?null:ContextHolder.getLoginUser().getCompanyId();
}
}
從實(shí)現(xiàn)類當(dāng)中可以看到,在第一個(gè)方法加載菜單時(shí),我們使用時(shí)BDF2-CORE模塊當(dāng)中加載菜單的類,實(shí)際應(yīng)用當(dāng)中,如果您項(xiàng)目當(dāng)中沒(méi)有CORE模塊,那么,您需要自己編寫(xiě)加載URL菜單的代碼;第二個(gè)方法加載需要分配個(gè)性化信息的目標(biāo)對(duì)象時(shí),我們虛擬了兩家公司,實(shí)際應(yīng)用當(dāng)中,可以是公司,也可以是部門(mén)、群組或者直接分給某個(gè)用戶;最后一個(gè)方法是系統(tǒng)在加載個(gè)性化信息時(shí)使用的,這里與前面對(duì)應(yīng)采用的是公司的ID。
實(shí)現(xiàn)類編寫(xiě)好并配置到Spring當(dāng)中之后,接下來(lái)啟動(dòng)我們的項(xiàng)目,瀏覽com.bstek.bdf2.profile.view.component.ComponentMaintain.d這個(gè)URL,可以看到如下圖所示的頁(yè)面效果:

可以看到,在選擇不同的公司后,對(duì)應(yīng)的URL菜單也會(huì)加載進(jìn)來(lái),在選擇不同的URL時(shí),這個(gè)URL對(duì)應(yīng)的頁(yè)面組件會(huì)被剖析成一棵樹(shù)形,在這棵樹(shù)當(dāng)中找到我們需要進(jìn)行個(gè)性化調(diào)整的組件,設(shè)置它的屬性、事件或其下子組件的順序。在做完這些操作之后,別忘記刷新系統(tǒng)緩存,否則將不會(huì)生效。
更多建議: