如何在ADF Faces中使用JSTL函数

概述

在ADF页面中,我们不可避免的会对数据库的数据根据相应的业务进行格式化,很多情况下我们可以通过使用JSTL函数来进行简易的处理。

实现

1. 在页面的头上加上

xmlns:fn="http://java.sun.com/jsp/jstl/functions"

Image[4]

2. 选择安装JSP标签库

Image(1)[4]

3.选择JSP库

Image(2)[4]

4.在页面中使用JSTL表达式了

例如:

   1: <af:column sortProperty="FirstName" sortable="false"

   2:            headerText="#{bindings.EmployeesVO1.hints.FirstName.label}"

   3:            id="c10">

   4:   <af:outputText value="#{row.FirstName}  #{fn:substring(row.FirstName,1,3)}" id="ot3"/>

   5: </af:column>

Fuction类源码:

   1: /*

   2:  * The contents of this file are subject to the terms

   3:  * of the Common Development and Distribution License

   4:  * (the "License").  You may not use this file except

   5:  * in compliance with the License.

   6:  *

   7:  * You can obtain a copy of the license at

   8:  * glassfish/bootstrap/legal/CDDLv1.0.txt or

   9:  * https://glassfish.dev.java.net/public/CDDLv1.0.html.

  10:  * See the License for the specific language governing

  11:  * permissions and limitations under the License.

  12:  *

  13:  * When distributing Covered Code, include this CDDL

  14:  * HEADER in each file and include the License file at

  15:  * glassfish/bootstrap/legal/CDDLv1.0.txt.  If applicable,

  16:  * add the following below this CDDL HEADER, with the

  17:  * fields enclosed by brackets "[]" replaced with your

  18:  * own identifying information: Portions Copyright [yyyy]

  19:  * [name of copyright owner]

  20:  *

  21:  * Copyright 2005 Sun Microsystems, Inc. All rights reserved.

  22:  *

  23:  * Portions Copyright Apache Software Foundation.

  24:  */ 

  25:  

  26: package org.apache.taglibs.standard.functions;

  27:  

  28: import java.lang.reflect.Array;

  29: import java.util.Collection;

  30: import java.util.Enumeration;

  31: import java.util.Iterator;

  32: import java.util.Map;

  33: import java.util.StringTokenizer;

  34:  

  35: import javax.servlet.jsp.JspTagException;

  36:  

  37: import org.apache.taglibs.standard.resources.Resources;

  38: import org.apache.taglibs.standard.tag.common.core.Util;

  39:  

  40: /**

  41:  * <p>JSTL Functions</p>

  42:  * 

  43:  * @author Pierre Delisle

  44:  */

  45:  

  46: public class Functions {

  47:  

  48:     //*********************************************************************

  49:     // String capitalization

  50:  

  51:     /**

  52:      * Converts all of the characters of the input string to upper case.

  53:      */

  54:     public static String toUpperCase(String input) {

  55:         return input.toUpperCase();

  56:     }

  57:  

  58:     /**

  59:      * Converts all of the characters of the input string to lower case.

  60:      */

  61:     public static String toLowerCase(String input) {

  62:         return input.toLowerCase();

  63:     }

  64:     

  65:     //*********************************************************************

  66:     // Substring processing

  67:     

  68:     public static int indexOf(String input, String substring) {

  69:         if (input == null) input = "";

  70:         if (substring == null) substring = "";

  71:         return input.indexOf(substring);

  72:     }    

  73:  

  74:     public static boolean contains(String input, String substring) {

  75:         return indexOf(input, substring) != -1;

  76:     }    

  77:  

  78:     public static boolean containsIgnoreCase(String input, String substring) {

  79:         if (input == null) input = "";

  80:         if (substring == null) substring = "";        

  81:         String inputUC = input.toUpperCase();

  82:         String substringUC = substring.toUpperCase();

  83:         return indexOf(inputUC, substringUC) != -1;

  84:     }    

  85:  

  86:     public static boolean startsWith(String input, String substring) {

  87:         if (input == null) input = "";

  88:         if (substring == null) substring = "";

  89:         return input.startsWith(substring);

  90:     }    

  91:         

  92:     public static boolean endsWith(String input, String substring) {

  93:         if (input == null) input = "";

  94:         if (substring == null) substring = "";

  95:         int index = input.indexOf(substring);

  96:         if (index == -1) return false;

  97:         if (index == 0 && substring.length() == 0) return true;

  98:         return (index == input.length() - substring.length());

  99:     }  

 100:     

 101:     public static String substring(String input, int beginIndex, int endIndex) {

 102:         if (input == null) input = "";

 103:         if (beginIndex >= input.length()) return "";

 104:         if (beginIndex < 0) beginIndex = 0;

 105:         if (endIndex < 0 || endIndex > input.length()) endIndex = input.length();

 106:         if (endIndex < beginIndex) return "";

 107:         return input.substring(beginIndex, endIndex);

 108:     }    

 109:     

 110:     public static String substringAfter(String input, String substring) {

 111:         if (input == null) input = "";

 112:         if (input.length() == 0) return "";

 113:         if (substring == null) substring = "";

 114:         if (substring.length() == 0) return input;

 115:         

 116:         int index = input.indexOf(substring);

 117:         if (index == -1) {

 118:             return "";

 119:         } else {

 120:             return input.substring(index+substring.length());

 121:         }

 122:     }    

 123:         

 124:     public static String substringBefore(String input, String substring) {

 125:         if (input == null) input = "";

 126:         if (input.length() == 0) return "";

 127:         if (substring == null) substring = "";

 128:         if (substring.length() == 0) return "";

 129:  

 130:         int index = input.indexOf(substring);

 131:         if (index == -1) {

 132:             return "";

 133:         } else {

 134:             return input.substring(0, index);

 135:         }

 136:     }    

 137:  

 138:     //*********************************************************************

 139:     // Character replacement

 140:     

 141:     public static String escapeXml(String input) {

 142:         if (input == null) return "";

 143:         return Util.escapeXml(input);

 144:     }

 145:     

 146:     public static String trim(String input) {

 147:         if (input == null) return "";

 148:         return input.trim();

 149:     }    

 150:  

 151:     public static String replace(

 152:     String input, 

 153:     String substringBefore,

 154:     String substringAfter) 

 155:     {

 156:         if (input == null) input = "";

 157:         if (input.length() == 0) return "";

 158:         if (substringBefore == null) substringBefore = "";

 159:         if (substringBefore.length() == 0) return input;

 160:                 

 161:         StringBuffer buf = new StringBuffer(input.length());

 162:         int startIndex = 0;

 163:         int index;

 164:         while ((index = input.indexOf(substringBefore, startIndex)) != -1) {

 165:             buf.append(input.substring(startIndex, index)).append(substringAfter);

 166:             startIndex = index + substringBefore.length();

 167:         }

 168:         return buf.append(input.substring(startIndex)).toString();

 169:     }

 170:     

 171:     public static String[] split(

 172:     String input, 

 173:     String delimiters) 

 174:     {

 175:         String[] array;

 176:         if (input == null) input = "";

 177:         if (input.length() == 0) {

 178:             array = new String[1];

 179:             array[0] = "";

 180:             return array;

 181:         }

 182:         

 183:         if (delimiters == null) delimiters = "";

 184:  

 185:         StringTokenizer tok = new StringTokenizer(input, delimiters);

 186:         int count = tok.countTokens();

 187:         array = new String[count];

 188:         int i = 0;

 189:         while (tok.hasMoreTokens()) {

 190:             array[i++] = tok.nextToken();

 191:         }

 192:         return array;

 193:     }        

 194:         

 195:     //*********************************************************************

 196:     // Collections processing

 197:     

 198:     public static int length(Object obj) throws JspTagException {

 199:         if (obj == null) return 0;  

 200:         

 201:         if (obj instanceof String) return ((String)obj).length();

 202:         if (obj instanceof Collection) return ((Collection)obj).size();

 203:         if (obj instanceof Map) return ((Map)obj).size();

 204:         

 205:         int count = 0;

 206:         if (obj instanceof Iterator) {

 207:             Iterator iter = (Iterator)obj;

 208:             count = 0;

 209:             while (iter.hasNext()) {

 210:                 count++;

 211:                 iter.next();

 212:             }

 213:             return count;

 214:         }            

 215:         if (obj instanceof Enumeration) {

 216:             Enumeration enum_ = (Enumeration)obj;

 217:             count = 0;

 218:             while (enum_.hasMoreElements()) {

 219:                 count++;

 220:                 enum_.nextElement();

 221:             }

 222:             return count;

 223:         }

 224:         try {

 225:             count = Array.getLength(obj);

 226:             return count;

 227:         } catch (IllegalArgumentException ex) {}

 228:         throw new JspTagException(Resources.getMessage("FOREACH_BAD_ITEMS"));        

 229:     }      

 230:  

 231:     public static String join(String[] array, String separator) {

 232:         if (array == null) return "";         

 233:         if (separator == null) separator = "";

 234:         

 235:         StringBuffer buf = new StringBuffer();

 236:         for (int i=0; i<array.length; i++) {

 237:             buf.append(array[i]);

 238:             if (i < array.length-1) buf.append(separator);

 239:         }

 240:         

 241:         return buf.toString();

 242:     }

 243: }

 244:  

 245:  

ADF界面使用多皮肤

概述

本文主要描述了在新版本的JDeveloper(11.1.2.1)当中,ADF页面如何使用多皮肤。

内容主要包括:

1. 使用ADF Skin Editor开发多个皮肤

2. 开发选择皮肤组件

源码及文档下载:here

实现

1.创建应用ADF应用

2.创建皮肤

     NewSkin1

     NewSkin2

3.开发页面

    创建页面

    编辑页面以及选择皮肤处理逻辑

   1: <?xml version='1.0' encoding='UTF-8'?>

   2: <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1" xmlns:f="http://java.sun.com/jsf/core"

   3:           xmlns:af="http://xmlns.oracle.com/adf/faces/rich">

   4:     <jsp:directive.page contentType="text/html;charset=UTF-8"/>

   5:     <f:view>

   6:         <af:document title="useSkin" id="d1">

   7:             <af:form id="f1">

   8:                 <af:outputText value="How To Use Skin !!" id="ot1"/>

   9:                 <af:toolbox id="t1">

  10:                     <af:menuBar id="mb1">

  11:                         <af:menu text="Change Skin" id="m1">

  12:                             <af:commandMenuItem text="NewSkin1" id="cmi1" type="radio"

  13:                                                 selected="#{sessionScope.skinFamily == 'NewSkin1'}"

  14:                                                 actionListener="#{SkinBean.selectSkinMenuAction}"/>

  15:                             <af:commandMenuItem text="NewSkin2" id="cmi2" type="radio"

  16:                                                 selected="#{sessionScope.skinFamily == 'NewSkin2'}"

  17:                                                 actionListener="#{SkinBean.selectSkinMenuAction}"/>

  18:                         </af:menu>

  19:                     </af:menuBar>

  20:                 </af:toolbox>

  21:             </af:form>

  22:         </af:document>

  23:     </f:view>

  24: </jsp:root>

   clip_image002

   backing bean

   1: package com.dickluo.howto.useskin.view.backing;

   2:  

   3: import java.io.IOException;

   4:  

   5: import java.util.Map;

   6:  

   7: import javax.faces.context.ExternalContext;

   8: import javax.faces.context.FacesContext;

   9: import javax.faces.event.ActionEvent;

  10:  

  11: import oracle.adf.controller.ControllerContext;

  12: import oracle.adf.share.ADFContext;

  13: import oracle.adf.view.rich.component.rich.nav.RichCommandMenuItem;

  14:  

  15: public class SkinBean {

  16:     /**

  17:      * 构造函数

  18:      * 初始化皮肤为fusion,即为ADF默认的皮肤

  19:      */

  20:     public SkinBean() {

  21:         ADFContext adfctx = ADFContext.getCurrent(); //获取当前adf context

  22:         Map sessionScope = adfctx.getSessionScope(); //获取 session scop

  23:         Object skinFamily = sessionScope.get("skinFamily");

  24:         if (skinFamily == null) {

  25:             sessionScope.put("skinFamily", "fusion"); //初始化skinFamily变量,即为SessionScop.skinFamily

  26:         }

  27:     }

  28:  

  29:     /**

  30:      * 选择皮肤菜单事件

  31:      * @param actionEvent

  32:      */

  33:     public void selectSkinMenuAction(ActionEvent actionEvent) {

  34:         RichCommandMenuItem menuItem = (RichCommandMenuItem)actionEvent.getComponent(); //获取菜单项

  35:         ADFContext adfctx = ADFContext.getCurrent();

  36:         Map sessionScope = adfctx.getSessionScope();

  37:         sessionScope.put("skinFamily", menuItem.getText());//将skinFamily设置为菜单项的文本

  38:         redirectToSelf();

  39:     }

  40:     /**

  41:      * 重定向到当前页面(刷新当前页面)

  42:      */

  43:     private void redirectToSelf() {

  44:         FacesContext fctx = FacesContext.getCurrentInstance();

  45:         ExternalContext ectx = fctx.getExternalContext();

  46:         String viewId = fctx.getViewRoot().getViewId();

  47:         ControllerContext controllerCtx = null;

  48:         controllerCtx = ControllerContext.getInstance();

  49:         String activityURL = controllerCtx.getGlobalViewActivityURL(viewId);

  50:         try {

  51:             ectx.redirect(activityURL);

  52:             fctx.responseComplete();

  53:         } catch (IOException e) {

  54:             //Can't redirect

  55:             e.printStackTrace();

  56:             fctx.renderResponse();

  57:         }

  58:     }

  59: }

4.编辑皮肤

NewSkin1:

clip_image002[4]

NewSkin2:

clip_image002[6]

5.编辑trinidad-config.xml配置文件

   1: <?xml version="1.0" encoding="GBK"?>

   2: <trinidad-config xmlns="http://myfaces.apache.org/trinidad/config">

   3:   <skin-family>#{sessionScope.skinFamily}</skin-family>

   4: </trinidad-config>

6.显示效果

默认皮肤:

clip_image002[8]

选择NewSin1:

clip_image002[10]

选择NewSkin2:

clip_image002[12]

Weblogic 12c

千呼万唤始出来

Weblogic 12c,在Oracle首页待了许久的weblogic 12c终于出来了

期待重大改变,期待Oracle应用更快更强大。

至于如何,有待深入探讨。文档!文档!文档!

image

先上个console大图吧

clip_image002

clip_image004

安装过程:

需准备:

Redhat 5.4

JDK 1.6

1. 下载安装介质:

http://www.oracle.com/technetwork/middleware/weblogic/downloads/index.html

clip_image006

相关文档:

http://www.oracle.com/technetwork/middleware/weblogic/documentation/index.html

clip_image008

2. 创建中间件目录

mkdir –p /app/Oracle/Middleware2

3. 设置环境变量:

JAVA_HOME:export JAVA_HOME=/usr/java/jdk1.6.0_26

MW_HOM:export MW_HOME=/app/Oracle/Middleware2

4. 将安装介质拷贝到中间件目录下:

cp /install/wls1211_dev.zip /app/Oracle/Middleware2/

5. 进入到中间件目录下,并将介质解压:

cd /app/Oracle/Middleware2/

unzip wls1211_dev.zip

6. 运行配置脚本:

./configure.sh

clip_image010

clip_image012

运行完毕。

7. 设置参数

. $MW_HOME/wlserver/server/bin/setWLSEnv.sh

clip_image014

8. 扩展新的Domain:

cd wlserver/common/bin/

./config.sh

clip_image016

clip_image018

clip_image020

clip_image022

clip_image024

clip_image026

clip_image028

clip_image030

clip_image032

cd /app/Oracle/Middleware2/user_projects/domains/base_domain

./startWebLogic.sh

输入用户名:weblogic

启动失败:

clip_image034

1.进入到$DOMAIN_HOME/servers/<your server>/文件夹下

     cd /u02/app/Oracle/Middleware/user_projects/domains/IDMDomain/servers/AdminServer/

2. 创建security目录

mkdir security

3.创建文件 c

     touch boot.properties

4.编辑boot.properties如以下:

     username=weblogic

     password=weblogic1

5.启动weblogic

不需要提供用户名密码进行启动

6.启动好了以后查看 boot.properties

#Sun Nov 06 22:56:29 CST 2011

password={AES}KBg2GWUT2lAXHjrZFNTyTAKuht732pECQ8bv+duOknE\=
  username={AES}YK2J5oCgBJo2r8V0w3mJZ7Zvxwu531CAMxZgt4oQcKA\=

重新启动:

cd /app/Oracle/Middleware2/user_projects/domains/base_domain

./startWebLogic.sh

不需要输入用户名密码。

启动成功!

报了些警告,但还是起来了

clip_image036

weblogic基本概念

Oracle Weblogic Server Domain

             Weblogic Server Domain(域)是一个逻辑的管理单元,一个Oracle WebLogic Server域是多个Java组件的逻辑相关组。Domain是weblogic中最大的概念,一个域下面包含着weblogic应用服务器中的所有东西,weblogic应用服务器的启动,停止都是以domain为单位进行管理的。域是由单个管理服务器管理的WebLogic Server实例的集合。

 

    一个weblogic domain包含了一个特定weblogic 服务器实例:Administration Server,Administration Server是整个domain的配置以及管理所有资源的中心点。通常情况下,还会在这个domain中通过配置来扩展出其他的weblogic服务器实例,扩展出来的服务器实例叫做Managed Server。可以将java组件,例如EJB应用,Web Service,各种JAVAEE应用部署到Managed Server上,与此同时Administration Server只是用来进行配置以及管理的。在一个domain中,成组的managed server会作为集群。

Weblogic domain的目录和weblogic安装目录是区分开的,domain的目录可以放置于任何地方,也可以不在Middleware Home里面。

Domain与Oracle instance是同级的,所有的相关配置文件都在 oracle home外面。

Administration Server

Administration server是作为整个domain配置的中心控制实体。Admin Server维护着domain的配置文件以及将配置分配到每个managed server中。Admin Server作为整个domain所有资源的监视中心。

每个domain都必须存在着一个Admin Server。

与Admin Server交互,可以通过三种方式:Admin Server console,Oracle WebLogic Scripting Tool (WLST),或者创建Java Management Extension (JMX) 客户端。另外,还可以使用fusion middleware的控制console(EM)来进行其中的某些事情。Console与EM都是运行在Admin Server上的。Console是基于Web用来对整个domain的资源进行管理的,包含了Admin Server以及Managed Server。EM也是基于Web的管理控制台,用以管理所有的中间件组件,例如webcenter,soa,http server等。

Managed Servers和Managed Server Clusters

Managed Server上包含了商业应用,应用组件,Web Service,其他相关资源等等。为了优化性能,managed server维护着一个只读的domain配置文件。当一个managed server启动的时候,它会连接到Admin Server去同步的配置文件,配置文件是由Admin Server进行维护的。

当创建一个domain的时候,你可以去选择特定的模板去进行创建,这个模板会包含了所有你的domain的配置信息。模板可以针对不同的使用进行额外的安装。模板会支持特定的组件或者是支持特定的某组组件,例如Oracle SOA Suit。一般会针对不同的组件去创建肚子的managed server。

Oracle中间件的java组件(例如Oracle SOA, Webcenter,UCM等)以及自己开发的应用都是部署到managed server上的。

Managed Server是java virtrual machine(JVM)进程。

如果你想添加某个组件到domain中,例如webcenter,你可以通过使用相应模板去扩展,创建新的managed server。

一般情况下,生产环境为了提高应用的性能,吞吐以及高可用,会去配置两个或者多个managed server作为集群来使用。集群就是多个同时运行,一起工作的weblogic 服务器实例的集合,集群提高了可扩展性以及可靠性。在集群中,大多数资源以及服务会对等的部署到每一个managed server中,启用故障切换以及负载均衡。一个domain可以包含多个集群。做集群和不做集群最主要的差别是故障切换与负载均衡。

Node Manager

节点管理器是区分于weblogic服务器的一个独立运行的java工具进程,节点管理器使你能够去对managed server进行通常的操作,而不用去管相关的Admin Server在哪里。一般情况下,需要对应用对高可用配置的时候,就会启用节点管理器。节点管理器可以对managed server执行如下操作:

  • Start
  • Stop
  • Process Monitoring
  • Death Detection
  • Restart

如果启动了节点管理器对managed server进行管理,你就可以通过weblogic console或者命令行来针对被管理的managed server进行相应的操作。节点管理器还可以在出现未可预料的错误的时候去自动重启managed server。

 

阅读文档,记性不好,记下来吧。

OID动态组实现方式

OID提供了三种对象类和属性的组合方式来实现动态组:

1. orclDynamicGroup对象类和labeleduri属性

2. orclDynamicGroup对象类和CONNECT_BY属性

3. orclDynamicList对象类和labeleduri

1. labeleduri方式

1. 首先在需要实现动态组的组里面加上orclDynamicGroup对象类

image

2.添加属性到用户用以存储所属组信息

image

将该属性添加到用户某一对象类的可选属性中:

image

3.选择某一测试用户,将其可选属性的custGroup的值设置为其所属组的cn

test

4. 将test组的labeleduri属性设置为

ldap://idmdev.xxxx.com.cn:3060/dc=xxxx,dc=com,dc=cn??sub?(custGroup =*test*)

image

5. 查看结果:

通过ldap browser查看:

image

2. Connect by

1. 添加动态组属性dynamicGroup

2. 设置connect by属性为:manager,以及orclConnectByStartingValue设置为User的baseDN

image

3. 在用户上的manager属性上添加该组

image

 

orclDynamicList方法和第一种方法类似

OID创建超级管理员

1.创建用户dick

cn=dick,cn=users,dc=xxxx,dc=com,dc=cn

2.进入到装有OID的oracle_home/bin下:

cd /u01/app/Oracle/Middleware/Oracle_IDM1/bin

3.执行查询,查出所有uniquemember为cn=orcladmin的条目,并将其输出到dn.txt文件中

ldapsearch -p 3060 -h oid_host -D "cn=orcladmin" -w pasword -L -b "" -s sub "(uniquemember=cn=orcladmin)" dn > dn.txt

4.编辑dn.txt文件

在查询到的所有的条目的下面都加上

changetype: modify

add: uniquemember

uniquemember: cn=dick,cn=users,dc=xxxx,dc=com,dc=cn

例如:

dn: cn=odisgroup,cn=odi,cn=oracle internet directory

changetype: modify

add: uniquemember

uniquemember: cn=dick, cn=users,dc=xxxx,dc=com,dc=cn

dn: cn=Provisioning admins,cn=changelog subscriber,cn=oracle internet director

y

changetype: modify

add: uniquemember

uniquemember: cn=dick, cn=users,dc=xxxx,dc=com,dc=cn

note:切记两个DN下面需要有回车

5.对文件中的所有条目执行修改操作

ldapmodify -p 3060 -h idmdev.xxxxx.com.cn -D "cn=orcladmin" -w password -f dn.txt

6.执行结果

不报任何错误表示执行成功。

7.测试:

使用cn=dick,cn=users,dc=xxxx,dc=com,dc=cn进行登录ODSM,登录成功,并可以进行任意操作