BDF2-PROFILE模塊提供了一個允許管理員對系統(tǒng)當中頁面組件的顯示進行個性化定制的功能。對于這種組件的個性化定制,管理可以將其施加給某個用戶、某個部門或某個公司等,一旦對目標群體(用戶、部門或者公司)施加了個性化定制功能,那么隸屬于這個用戶、部門或者公司的人登錄系統(tǒng)之后就可以看到這個頁面被管理員修改后的效果,接下來們舉個例子來說明這個功能的適用場景。
假如我們需要開發(fā)一個系統(tǒng),這個系統(tǒng)將以SAAS模式給不同的公司去使用,但對于某一些功能頁面,不同的公司對頁面顯示效果要求可能也略有不同,比如某個業(yè)務系統(tǒng)維護頁面,某些公司可能其中的一個表單中字段A、B、C的顯示順序為A、B、C,但有些公司可能因為某些原因希望將順序改成B、C、A,對于這樣一種需求,因為兩家公司習慣不同,對頁面的顯示要求也不相同,但這么一點不同又不值得我們專門開發(fā)一個頁面特地給這家公司使用,這個時候就可以利用BDF2-PROFILE模塊輕松解決這個問題。當然,BDF2-PROFILE模塊能個性化的功能不僅僅是表單元素或表格列的顯示順序,它幾乎可以實現所有的支持屬性及事件定義的組件個性化定制,比如針對不同的公司為某個Button設置不同的caption,或者針對不同公司為某個UpdataAction設置不同的保存前的確認消息或保存成功之后的提示消息等。
要使用BDF2-PROFILE模塊,首先需要將BDF2-PROFILE模塊相關的jar放置到我們的項目當中,具體做法就是可以到nexus.bsdn.org上下載BDF2-PROFILE模塊相關jar或到我們提供的在線項目向導當中,創(chuàng)建一個包含BDF2-PROFILE模塊的項目,當然如果您采用的是Maven來管理我們的項目,那么只需要在我們項目的 pom.xml當中添加下面的依賴信息即可。
BDF2-PROFILE模塊的依賴信息
<dependency>
<groupId>com.bstek.bdf2</groupId>
<artifactId>bdf2-profile</artifactId>
<version>2.0.0</version>
</dependency>
添加完BDF2-PROFILE模塊所需要的jar之后,接下來還需要編寫一個IProfileDataService接口實現類,并將其配置到Spring當中,否則啟動時會拋出下面的異常:
異常消息
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
我們來看看IProfileDataService接口實現類代碼:
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模塊必須實現的接口
* @author Jacky.gao
* @since 2013-2-26
*/
public interface IProfileDataService {
/**
* 根據給出的父ID,返回其下所有子的URL,實現URL樹構建
* @param companyId 所在公司(或其它)的ID
* @param parentId 父URL ID
* @return 返回指定父ID的URL集合
*/
List<UrlDefinition> loadUrls(String companyId,String parentId);
/**
* 分頁加載分配資源的目標對象
* @param page Dorado7分頁對象
* @param criteria 過濾查詢對象
*/
void loadAssignTargets(Page<AssignTarget> page,Criteria criteria);
/**
* 返回加載個性化信息需要使用的分配資源目標對象的ID,比如username,companyid之
* @return 一個字符串
*/
String getAssignTargetId(HttpServletRequest request);
}
接下來我們編寫一個IProfileDataService接口實現類,代碼如下:
IProfileDataService接口實現類源碼
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中國");
targets.add(t2);
page.setEntities(targets);
}
public String getAssignTargetId(HttpServletRequest request) {
return ContextHolder.getLoginUser()==null?null:ContextHolder.getLoginUser().getCompanyId();
}
}
從實現類當中可以看到,在第一個方法加載菜單時,我們使用時BDF2-CORE模塊當中加載菜單的類,實際應用當中,如果您項目當中沒有CORE模塊,那么,您需要自己編寫加載URL菜單的代碼;第二個方法加載需要分配個性化信息的目標對象時,我們虛擬了兩家公司,實際應用當中,可以是公司,也可以是部門、群組或者直接分給某個用戶;最后一個方法是系統(tǒng)在加載個性化信息時使用的,這里與前面對應采用的是公司的ID。
實現類編寫好并配置到Spring當中之后,接下來啟動我們的項目,瀏覽com.bstek.bdf2.profile.view.component.ComponentMaintain.d這個URL,可以看到如下圖所示的頁面效果:

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