Dorado 5 : 3.实例三:EL表达式控制页面状态 (T33)

场景描述:

在应用当中我们经常会遇到使用自定义EL表达式控制页面的状态。

实例实现:

界面:

  1. (编辑):

  1. (查看):

实现步骤:

  1. 自定义EL表达式需要编写三个类,如下:

注册类PageTypeExprInitializer需要实现ExprInitializer接口,代码如下:

package el;

import java.util.Map;

import com.bstek.dorado.common.DoradoContext;
import com.bstek.dorado.common.rtexpr.ExprInitializer;

/**

  • 自定义EL注册类
  • @author Gavin
  • @date 2008-9-9
    */
    public class PageTypeExprInitializer implements ExprInitializer {

    @SuppressWarnings("unchecked")
    public void perform(Map map, DoradoContext context) {
    PageTypeExprHandler ptExprHandler=new PageTypeExprHandler();
    map.put("pagetype", ptExprHandler);
    map.put("Pagetype", new PageTypeContextMap(ptExprHandler));
    }

    }

逻辑实现类PageTypeExprHandler

package el;

import javax.servlet.http.HttpServletRequest;

import com.bstek.dorado.common.DoradoContext;
import com.bstek.dorado.common.HttpDoradoContext;

/**

  • 逻辑实现类
  • @author Gavin
  • @date 2008-9-9
    */
    public class PageTypeExprHandler {
    public boolean isIgnored(String resString) {
    HttpServletRequest httpRequest=((HttpDoradoContext)DoradoContext.getContext()).getRequest();
    String ptype=httpRequest.getParameter("ptype");
    if(!resString.equals(ptype)){
    return true;
    }else{
    return false;
    }
    }

    }

辅助类PageTypeContextMap类

package el;

import com.bstek.dorado.common.rtexpr.impl.AbstractContextMap;

/**
* @author Gavin
* @date 2008-9-9
*/
public class PageTypeContextMap extends AbstractContextMap {
private PageTypeExprHandler hand;

public PageTypeContextMap(PageTypeExprHandler hand){
this.hand=hand;
}
public Object get(Object key) {
// TODO Auto-generated method stub
return hand.isIgnored((String)key);
}
}

  1. 在Dorado home下配置文件rtexpr.xml中添加如下代码:

    <?xml version="1.0" encoding="UTF-8"?>
    <initializers>
    <initializer clazz="el.PageTypeExprInitializer"/>
    </initializers>

    当应用启动时就会加载自定义的EL表达式。
  2. 建立测试页面如图:


JSP代码如下:

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://www.bstek.com/dorado" prefix="d" %>
<html>
<head>
<title></title>
</head>
<body scroll="no">
<d:View config="view.EditAndReadPage">
<d:Layout type="vflow" height="100%">
<d:Pane>
<d:AutoForm id="form1" />
</d:Pane>
<d:Pane height="100%">
<d:DataTable id="table2" />
</d:Pane>
<d:Pane>
<d:Layout type="Hflow" width="100%">
<d:Pane>
<d:DataPilot id="datapilot1" />
</d:Pane>
<d:Pane width="1%">
<d:Button id="button1" />
</d:Pane>
</d:Layout>

</d:Pane>
</d:Layout>
</d:View>
</body>
</html>

  1. 在需要控制的组件上加入EL表达式:${Pagetype.key}(key可替换成任意字符串如:${Pagetype.edit})本例添加EL表达式组件代码如下:

Dataset的readOnly属性:

<Dataset type="Custom" id="dataset1" insertOnEmpty="true" readOnly="${Pagetype.edit}">
......
......
......
</Dataset>
<Dataset type="Custom" id="dataset2" insertOnEmpty="true" readOnly="${Pagetype.edit}">
......
......
......
</Dataset>

Button1(Button)的ignored属性:

<Control id="button1" width="70px" ignored="${Pagetype.edit}" type="Button" value="保存" />

datapilot1(DataPilot)的ignored属性:

<Control ignored="${Pagetype.edit}" type="DataPilot" dataset="dataset2" id="datapilot1" />

  1. 通过url传递过来参数设置页面的状态。

主页面菜单设置如下:

<MenuItem name="menuitemPageType" label="页面控制">
<MenuItem name="menuitemEdit" label="编辑页面" tag="edit_and_read_page.jsp?ptype=edit" />
<MenuItem name="menuitemRead" label="查看页面" tag="edit_and_read_page.jsp?ptype=read" />
</MenuItem>


这样通过自定义EL表达式控制页面状态的实例就完成了。

延伸思路:

通过实现本例我们不难发现自定义EL表达式功能强大,使用上也非常便捷。我们可以实现自己的功能代码,通过EL表达式的方式在需要的时候得到它。想一想,我们可以做的很多,比如使用EL表达式来实现权限框架等等。