`
redhacker
  • 浏览: 494273 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle ADF中实现输入框字数统计功能

阅读更多
需求:在我们的信息系统中,为了用户体验,通常会有如下图的字数统计功能:



在传统的jsp页面里实现这样的功能,相信各位同学都会轻车熟路,但是当我们使用了oracle adf框架后,实现这个功能,尽然花费了我一天的时间,原因是,企图使用oracle adf自己封装的js api实现,结果是徒劳。原因如下:

先来看一下源代码:
<?xml version='1.0' encoding='UTF-8'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:af="http://xmlns.oracle.com/adf/faces/rich"
          xmlns:trh="http://myfaces.apache.org/trinidad/html">
  <jsp:directive.page contentType="text/html;charset=UTF-8"/>
  <f:view>
    <af:document id="d1" title="不能正常工作的字数自动统计输入框实验">
      <trh:script id="showAutoNum">
        var leftLen = 300;
        function counterNum2(actionEvent) {
            var component = actionEvent.getSource();
            var markContent = component.findComponent("markContent");
            var content = markContent.getValue();
            var usedLen = content.length;
            var maxLen = markContent.getMaximumLength();
            leftLen = maxLen - usedLen;
            var showNum = AdfPage.PAGE.findComponent("showNum");
            showNum.setValue("可写 " + leftLen + " 字");
        }
      </trh:script>
      <af:panelSplitter id="ps1">
        <f:facet name="first">
          <af:panelGroupLayout layout="scroll"
                               xmlns:af="http://xmlns.oracle.com/adf/faces/rich"
                               id="pgl1">
            <af:inputText label="备注" id="markContent" rows="10"
                          clientComponent="true" maximumLength="300">
              <af:clientListener type="keyUp" method="counterNum2"/>
            </af:inputText>
          </af:panelGroupLayout>
        </f:facet>
        <f:facet name="second">
          <af:outputText id="showNum" value="可写 300 字" clientComponent="true"/>
        </f:facet>
      </af:panelSplitter>
    </af:document>
  </f:view>
</jsp:root>



分析:

1、在这个页面中,我使用了oracle adf js api查找一个页面对象,设置其值,但af:clientListener这个标签的监听事件类型设为type="keyUp",根本不是想象的那样(当键盘键弹起时触发),只有当焦点移开af:inputText备注框时,才能触发。

2、oracle adf js api都是发送一些异步的ajax请求,上面的这个例子在备注输入框失去焦点的时候也能统计出结果,但是,似乎是由于ajax 异步请求后台处理的原因,统计很不流畅,甚至有很大的延迟,用户体验非常差。

基于上述两个原因,我继续寻求其他的解决办法,我在想,这样统计字数的功能,在使用jsp或html的时候,我们通常都是用前台的js技术解决,根本不需要与后台服务器交互,那么,在这里,我们能不能也这样处理呢?想到这里,我的思路豁然开朗,我借助firebug的强大功能,分析了上面代码在浏览器中解析后的结构,见如下图:



这样以来,我将上面的代码改为如下代码,最终达到了我们想要的效果:

<?xml version='1.0' encoding='UTF-8'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:af="http://xmlns.oracle.com/adf/faces/rich"
          xmlns:trh="http://myfaces.apache.org/trinidad/html">
  <jsp:directive.page contentType="text/html;charset=UTF-8"/>
  <f:view>
    <af:document id="d1" title="desc:auto count textarea input demo by using oracle adf framework. author:beanor@gmail.com">
      <af:panelSplitter id="ps1" orientation="vertical" collapsed="false"
                        disabled="true" splitterPosition="200">
        <f:facet name="first">
          <af:inputText label="备注" id="markContent" rows="10"
                        clientComponent="true" maximumLength="300"></af:inputText>
        </f:facet>
        <f:facet name="second">
          <af:outputText id="showNum" value="可写 300 字" clientComponent="true"/>
        </f:facet>
      </af:panelSplitter>
      <trh:script id="autoCountInput">
        //获取输入框对象,markContent为af:inputText的id
        var markContentObj = document.getElementById('markContent::content');
            
        //获取显示字数对象,showNum为af:outputText的id
        var showNumObj = document.getElementById('showNum');
        
        //设置输入框背景
        markContentObj.style.backgroundColor = "White";
        
        //设置输入框监听函数
        markContentObj.onkeyup = function () {                   
            
            //获取输入框中的字符串
            var markContent = markContentObj.value;
            
            //获取输入框中的字符串的长度
            var usedLen = markContent.length;
            
            //无法直接获取输入框允许输入的最大数,请保持与af:inputText的maximumLength一致
            var maxLen = 300;
            
            //计算还剩余多少字可输入
            var leftLen = maxLen - usedLen;
            
            var showNum = showNumObj.innerText;
            
            //设置界面显示剩余的字数
            var showMsg = "可写 " + leftLen + " 字";
            if (typeof(showNum) == "undefined") {
                showNumObj.textContent = showMsg;
            } else {
                showNumObj.innerText = showMsg;
            }
        };
      </trh:script>
    </af:document>
  </f:view>
</jsp:root>


代码里都做了详细的注释,我这里就不在赘述。值得一提的是,在最后ie和firefox兼容性上遇到了点麻烦,对于html的span标记的操作,firefox不支持innerText属性,最后改为textContent,但对于对undefined的比较变量,要使用typeof进行转换,是我之前不知道的知识点,经过查找资料解决了兼容性问题。

总结:

从上面的例子可以看到,对于oracle adf的js api如果在使用时不是那么得心应手,我们通过上面的方法,同样可以回归到最基础的html、js方式进行处理,这样就突破的oracle adf框架的限制,实现许多我们自己想要的功能。

值得一提的是,如果我们确定要使用原生的js api来操作html dom树实现自己的功能,兼容性是个问题,这就要求我们借助httpwatch(ie下使用)和firebug(firefox下使用)这些工具进行相应的调试,这一定程度上对我们的开发带来了难度,因此,这就要求我们对基础知识有足够的掌握,才能利用好任何的开发框架,在提高效率的同时,又能利用基础知识解决框架不能解决的难题。
  • 大小: 20.6 KB
  • 大小: 61.7 KB
0
1
分享到:
评论

相关推荐

    oracle ADF 开发指南

    ### Oracle ADF 开发指南知识点总结 #### 一、Oracle ADF 概述 - **Oracle ADF**(Application Development Framework)是一个全面的应用程序开发框架,它基于J2EE标准和开源技术,专为简化企业级应用开发而设计。...

    Oracle ADF AM常用配置参数参考

    在Oracle ADF (Application Development Framework) 应用程序中,AM (Application Module) 是一个关键组件,用于处理业务逻辑并提供数据访问功能。为了确保AM能够高效稳定地运行,正确配置AM的相关参数至关重要。...

    Oracle Adf级联菜单过滤

    在Oracle ADF中,级联菜单(Cascading Menus)是常见的一种交互元素,尤其在处理多表关联数据时非常实用。级联菜单允许用户在选择一个选项后,根据该选项的值动态地过滤下一级菜单的内容,这样可以提供更加直观和...

    最全的JSF框架Oracle ADF 开发资料分享

    - 部署选项:Oracle ADF应用可以部署在多种服务器环境中,包括Oracle WebLogic Server、Oracle GlassFish Server等,支持高可用性和性能优化。 5. **最佳实践与常见问题**: - **性能优化**:了解ADF的缓存机制,...

    oracle ADF

    ### Oracle ADF 架构与关键功能概述 Oracle Application Development Framework(简称 Oracle ADF)是Oracle提供的一套全面的应用开发框架,旨在简化企业级Java应用的构建过程。它结合了Oracle JDeveloper工具集来...

    oracleADF开发指南

    ### Oracle ADF 开发指南知识点概述 #### 一、Oracle ADF 概念与特性 - **Oracle Application Development Framework (ADF)**:Oracle ADF 是一套用于简化 Java 应用程序开发的完整框架,旨在帮助开发者快速构建高...

    基于Oracle ADF的应用程序开发过程

    ### 基于Oracle ADF 的应用程序开发过程详解 #### 一、Oracle ADF 概述 Oracle ADF (Application Development Framework) 是由 Oracle 公司推出的一款旨在简化 J2EE 应用程序开发复杂度的框架。ADF 的核心价值在于...

    Oracle ADF开发实战指南

    - **为何选择Oracle ADF**:ADF提供了丰富的功能,包括简化数据绑定、支持多种UI技术(如JSF)、自动处理事务管理和安全性等,这些都使得开发者能够更专注于业务逻辑而不是底层技术细节。 #### 二、Oracle ADF架构 ...

    Fusion Developer's Guide for Oracle ADF [11.1.1.7]

    《Fusion Developer's Guide for Oracle ADF》是一本详尽的技术手册,旨在帮助开发人员充分利用 ADF 的强大功能来构建高质量的企业应用。通过对 ADF 的各个方面的深入探讨,本书不仅适用于初学者,也适合希望深入...

    Oracle ADF 官方文档

    Oracle® Fusion Middleware Understanding Oracle Application Development Framework 12c (12.2.1.3.0) E80020-01 August 2017

    基于Oracle ADF的校园OA系统的设计与实现.pdf

    "基于Oracle ADF的校园OA系统的设计与实现" 一、系统概述 Oracle ADF(Application Development Framework)是一种基于Java的应用程序开发框架,旨在帮助开发人员快速构建企业级应用程序。使用Oracle ADF,可以...

    oracle adf real world

    Oracle ADF框架提供了丰富的功能组件,例如ADF Business Components、ADF Data Binding、ADF Controller、ADF Faces、ADF Task Flows等,这些组件可以简化企业级应用的开发过程。 ADF Business Components是ADF框架...

    [Oracle ADF] Oracle ADF 11gR2 初学者开发指南 (英文版)

    [Packt Publishing] Oracle ADF 11gR2 初学者开发指南 (英文版) [Packt Publishing] Oracle ADF 11gR2 Development Beginner's Guide (E-Book) ☆ 出版信息:☆ [作者信息] Vinod Krishnan [出版机构] Packt ...

    Oracle ADF faces rich client 11g 开发文档

    ### Oracle ADF Faces Rich Client 11g 开发文档知识点概览 #### 一、概述 Oracle ADF (Application Development Framework) 是一个用于快速构建企业级应用的强大框架,它简化了Java EE应用程序的开发过程。其中ADF...

    Oracle ADF MenuDemo 案例

    在这个案例中,我们将深入探讨Oracle ADF的核心概念和功能,以及MenuDemo的具体实现。 首先,Oracle ADF是基于JSF(JavaServer Faces)的,这意味着它利用了JSF的UI组件和生命周期,提供了一种声明式的方式来创建...

    oracle adf web service 案例

    - **Web Service Data Control**:ADF中的数据控制允许开发者轻松地与Web服务进行交互,提供了诸如调用操作、绑定到UI组件等功能。 - **JDeveloper集成**:Oracle JDeveloper IDE提供了对ADF Web Service的全面...

    Introduction to Building Fusion Web Applications with Oracle ADF

    - **高度集成**:Oracle ADF与Oracle的技术栈紧密结合,可以无缝集成到Oracle的其他产品和服务中。 - **开发效率高**:通过使用Oracle JDeveloper等工具,开发者可以快速构建复杂的应用程序,大大缩短了开发周期。 -...

Global site tag (gtag.js) - Google Analytics