由于primefaces在国内使用的并不是太多,因此,国内对jsf做系统、详细的介绍的资料很少,即使有一些资料,也仅仅是对国外资料的简单翻译或者是仅仅讲表面现象(皮毛而已),它们的语句甚至还是错误的,很可能会误导使用者。

相对来说,看国内的那些仅仅是翻译过来的文章或书籍不如直接看国外的官方文档或资料来的实在,在我讲述jsf页面中如何使用js调用后台bean方法之前,先给大家说几个国外的资料。在primefaces官方网站上,你可以搜索到几乎所有你需要的东西,primefaces官网为:http://www.primefaces.org/showcase/index.xhtml 如过觉得自己英语不好的童鞋,可以前往primefaces国内镜像网站查阅资料: http://www.primefaces.cn/ ,只是国内的这个网站正在翻译中,有些东西还不完善;如果有想细致的了解primefaces的朋友,还可以下载primefaces的官方文档,最新的官方文档为5.2,全英文,我在这里给大家提供我下载好的primefaces官方文档:http://pan.baidu.com/s/1mg3i9Ry ,在这个文档里你可以通过他们的示例来组合出来很多有趣的东西。

好,接下来进入正文。

某些情况下,在开发jsf项目时,我们需要必须使用html组件来达到一些使用Jsf组件不能达到的目标。例如有时候我们希望,当触发某些html组件或标签时,触发后台方法甚至接收后台方法传过来的返回值。这回让我们很头疼,因为primefaces并没有给我们说如何使用js来调用后台bean方法。那么,我们就需要结合js和jsf同时才可以达到这个目的。

达到这个目的又两个方法。

1 使用jsf的inputHidden标签

这几乎算不上真正的js调用后台的方法,因为它无法向后抬bean传递值,但是简单的后台向页面传递数据可以使用这个方法

<h:inputHidden id="input" value="#{advancedQueryManager.aliaColums}"></h:inputHidden>

首先,在jsf中触发某个组件时,要及时update这个inputHidden标签,例如下面的组件

<p:selectOneMenu id="module"
    value="#{advancedQueryManager.selectedModule}">
    <f:selectItem itemLabel="----" itemValue="" />
    <f:selectItems value="#{advancedQueryManager.allModule}" />
    <p:ajax event="change" update="input"
        oncomplete="getVlue()"
        listener="#{advancedQueryManager.onModuleChange()}"></p:ajax>
</p:selectOneMenu>

这里面的组件就会当这个下拉值变化时,就会触发后台的方法

onModuleChange()

当,方法结束后,它会update(刷新)这个

h:inputHidden

如果你的这个inputHidden中的值是随下拉的变化和变化的呢,那么,你就可以在任何的js函数中获取到这个inputHidden中的值,然后进行处理,

function getVlue() {
    /* document.getElementById("commBtn").onclick; */
    alert("a");
    var aliaColums = document.getElementById("input").value;
    dataJson = eval("(" + aliaColums + ")");
        addqueryroot('.query', true);
}

我这里的inputHidden 盛的是一个json格式的字符串,我通过js函数就可以动态的获取这个json,进而进行其他的操作。当然,可以在任何html标签中调用这个js函数,然后获取这个json字符串。

2 使用commandButton来达到复杂的异步刷新取值

在这里说下,普通的html标签结合js函数结合commandButton可以达到什么效果呢?那就是在你触发任何html标签时,你都可以通过这个commandButton组件来将你在html标签中选定的值传递到后台,经过后台bean处理后,它会返回处理结果,js函数就可以接收到这个处理结果,然后再将这个结果整合到其他的组件中。

首先,创建这个隐藏的commandButton,注意,这个commandButton本身不具有隐藏的属性,可以通过其他有隐藏属性的组件将其包裹,以达到隐藏的目的,我通过一个div来达到这个目的。在这个commandButton中,我们发现,action的作用就是当点击这个commandButton时,它会调用后台方法,而attribute中的name 属性和value属性的作用会在下面将。

<div id="hiddenForm" style="display: none;">
    <p:commandButton id="command"
        actionListener="#{advancedQueryManager.testReturn}"
        oncomplete="handleComplete(xhr, status, args)">
        <f:attribute name="attrname1" value="liu" />
        <f:attribute name="attrname2" value="bei" />
    </p:commandButton>
</div>

然后我们需要一个普通的html标签,就以一个普通的html button为例:

<input type="button" value="回调测试" onclick="test()" />

然后写一个js函数,来连接这个普通的button和jsf组件commandButton

function test() {
    $('#command').click();
}

这个函数的意思就是,当你点击这个"回调测试"的按钮时,它就相当于触发了jsf的cimmandButton按钮,这时,commandButton中的两个

<f:attribute name="attrname1" value="liu" />

中的两个属性就会自动绑定成一个类似于map形式的数据,name属性的值作为key,value中的值作为map中的value,它们将会被传递至后台。

然后,后台的bean 中需要有方法来接收两个值:

public void testReturn(ActionEvent event) {
    String attrvalue1 = (String) event.getComponent().getAttributes()
        .get("attrname1");
    String attrvalue2 = (String) event.getComponent().getAttributes()
        .get("attrname2");
    System.out.println(attrvalue1);
    System.out.println(attrvalue2);
    RequestContext requestContext = RequestContext.getCurrentInstance();
    requestContext.addCallbackParam("isValid", true);

}

在上面的代码中,我们可以看到,java程序已经成功的接收前端页面传过来的值,它最后也返回了一个类是于map格式的值,key为:isValid,value 为:true

最后,我们要写一下页面如何接收后台传递过来的值:

<script type="text/javascript">
    function handleComplete(xhr, status, args) {
        var isValid = args.isValid;
        alert(isValid);
    }
</script>

接下来,就会发现不仅仅后台可以正常打印出前端页面中的那两个值,同时前端的js函数也可以打印出后台传过来的值,当然,同样的,从前端传递到后台的值的个数和形式,你可以自己改,同时从后台接收到的数据,你也可以随意的进行任何操作。

但是请注意,这个

p:commandButton

组件有个问题,就是你不可以动态的通过js函数来将一些值赋给这个组件,但是这个组件里的值可以接受后台的属性值

<f:attribute name="attrname1" value="#{bean.val}" />

这样其实也并没有达到我们想要通过js来传给后台bean的目的,接下来的方法,就可以完全达到通过js动态的传值给后台bean方法,bean方法处理完返回数据给js。

3 使用p:remoteCommand来达到复杂的异步刷新取值

大家请注意,这个方法可以真正的解决在jsf中通过js调用后台bean方法并获取bean方法返回值的问题。

同样,首先我们要写两个jsf组件,来和后台bean结合

<h:inputHidden id="input1" value="#{advancedQueryManager.vals}"></h:inputHidden>
<h:form>
    <p:remoteCommand name="processSelection"
        action="#{advancedQueryManager.testReturn}" update=":input1"
        oncomplete="processResult();" />
</h:form>

解释一下,上面的的这个inputHidden的作用是接收后台bean处理后的返回值。remoteCommand的作用是将js中的动态的值传递到后台bean方法。

<script>
    function processResult() {
        //接收后台bean方法中传递过来的处理结果,接收方法是获取inputHidden中的值,并可根据自己的业务继续处理
        alert($('#input1').val());
    }

    function makeSelection() {
            //普通的html组件调用这个js
        //将想要传递到后台的动态值封装成json格式的值,传给p:remoteCommand,然后由这个组件传给bean方法
        processSelection([ {name : 'setVal',value : 'getIt'} ]);
    }
/script>

js函数使用方法在代码中,谁不懂可以再艾特我,这里不再解释。

最后是后台bean方法代码:

public void testReturn() {
        String selectedValue = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("setVal");
        System.out.println("------>"+selectedValue);
           //拦截到这个页面传过来的值后可以进行你自己的业务处理
           //并将处理结果返回给vals,这个vals是这个bean中的一个属性
           vals = "getResult";

}

至此,jsf中使用js函数将普通的html组件的值动态的传递到后台bean方法并接受后台处理结果已经成功得到解决。

JSF页面中使用js函数回调后台bean方法并获取返回值的方法的更多相关文章

  1. JSF页面中使用js函数回调后台action方法

    最近遇到了一个问题就是在JSF页面中嵌入html页面,这个html页面中很多功能是使用js动态生成的,现在需要在js函数里想去调用JSF中action类method()方法并动态传送数据给后台进行处理 ...

  2. JSF页面中的JS取得受管bean的数据(受管bean发送数据到页面)

    JSF中引入jsf.js文件之后,可以拦截jsf.ajax.request请求.一直希望有一种方法可以像jquery的ajax一样,能在js中异步取得服务器端发送的数据.无奈标准JSF并没有提供这样的 ...

  3. 13 继续C#中的方法,带返回值的方法介绍

    在这一个练习中,我们要使用带返回值的方法.如果一个方法带返回值,那么它的形式是这样的. 定义一个带返回值的C#方法 static 返回类型 方法名字 (参数类型 参数1的名字,参数类型 参数2的名字) ...

  4. java后台发送请求并获取返回值(续)

    在java后端发送请求给另一个平台,从而给前端实现 "透传"的过程中,出现:数据请求到了并传到了前端,但是控制台打印时中文显示Unicode码而前端界面中中文显示不出来!!!开始怀 ...

  5. java后台发送请求并获取返回值

    项目中需要前端发送请求给后端,而后端需要从另一个平台中取数据然后再透传给前端,通过下述代码将其实现.在此记录一下. package com.autotest.utils; import java.io ...

  6. 微信小程序前端调用后台方法并获取返回值

    wxml代码 <wxs src="../../wxs/string.wxs" module="tools" /> <!-- 调用tools.i ...

  7. jquery操作iframe中的js函数

    关键字:jquery操作iframe中的js函数 1.jquery操作iframe中的元素(2种方式) var tha = $(window.frames["core_content&quo ...

  8. AS与JS相互通信(Flex中调用js函数)

    转载自http://www.blogjava.net/Alpha/archive/2009/06/27/284373.html Flex中As调用Js的方法是:     1.导入包 (import f ...

  9. a标签中执行js函数

    在a标签中调用js函数最适当的方法推荐使用: 1.a href="javascript:void(0);" onclick="js_method()" 这种方法 ...

随机推荐

  1. 【UOJ#33】【UR#2】树上GCD 有根树点分治 + 容斥原理 + 分块

    #33. [UR #2]树上GCD 有一棵$n$个结点的有根树$T$.结点编号为$1…n$,其中根结点为$1$. 树上每条边的长度为$1$.我们用$d(x,y)$表示结点$x,y$在树上的距离,$LC ...

  2. 【bzoj3110】 Zjoi2013—K大数查询

    http://www.lydsy.com/JudgeOnline/problem.php?id=3110 (题目链接) 题意 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在 ...

  3. 【poj2960】 S-Nim

    http://poj.org/problem?id=2960 (题目链接) 题意 经典Nim游戏,只是给出了一个集合S,每次只能取S[i]个石子. Solution ${g(x)=mex\{SG(x- ...

  4. SVN分支研究

    在结合之前总结的定制开发的产品版本开发问题解决的方法:http://www.cnblogs.com/EasonJim/p/5971906.html,今天来研究以下用SVN处理这类的问题. 研究SVN分 ...

  5. Xcopy命令参数

    XCOPY是COPY的扩展,可以把指定的目录连文件和目录结构一并拷贝,但不能拷贝系统文件:使用时源盘符.源目标路径名.源文件名至少指定一个:选用/S时对源目录下及其子目录下的所有文件进行COPY.除非 ...

  6. 微信公众平台教程和SDK收集

    教程收集: 1.Senparc(.net) http://www.cnblogs.com/szw/archive/2013/05/14/weixin-course-index.html 2.方倍工作室 ...

  7. hdu5047 找规律+欧拉公式

    题意:在一个正方形内画n个M,求最多能分成多少个平面 sol:这种求划分成多少个平面的题第一反应肯定是欧拉公式: 二维平面上的欧拉公式:V+F-E=1 (V:Vertices,F:Faces,E:Ed ...

  8. dedeCMS /plus/ad_js.php、/plus/mytag_js.php Vul Via Injecting PHP Code By /plus/download.php Into DB && /include/dedesql.class.php

    目录 . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 对于这个漏洞,我们可以简单概括如下 . "/plus/download. ...

  9. iOS WebView调用JS的一个小坑

    假如调用一个函数,传入的参数为String,要以这样的格式传入: let resultStr="1234" self.webView.stringByEvaluatingJavaS ...

  10. java循环遍历map

    import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class MapTest { pu ...