JQuery AJAX Partial Page refresh

 

Default JQuery AJAX Partial Page refresh

Has anyone managed to use JQuery and Webflow render fragments to achieve partial page refresh.

I'm pretty new to all this and I'm struggling to get my head around how i can get it to work.

We can not use Spring JSF Ajax tags and we are stuck with JSF 1.1 and it is mandated we must use JQuery for all client-side Javascript


Cheers
Paul

  • #2
    Join Date
    Apr 2009
    Posts
    7

    Default

    I am trying to achieve the same thing. If anyone has any insight into how one might do this it would be much appreciated.

  • #3
    Join Date
    Feb 2009
    Location
    Russia, SPb
    Posts
    10

    Default

    Hi,

    I use Tiles2.1 + SWF + jQuery.

    There is AjaxHandler which defines is request ajax or not. The only implementation is SpringJavascriptAjaxHandler uses request header or parameter to define. So you have to set header Accept to text/html;type=ajax or set ajaxSource parameter to whatever you like exept blank string.

    Here is my code
    Code:
    	$("#page").change(function(ev){
    		$("#results").load("${flowExecutionUrl}", {_eventId: 'page', page: 0, ajaxSource: 'resultList'});
    	});
    But there is NPE in AjaxTilesView.renderMergedOutputModel method. Problem is BasicTilesContainer.getContextFactory method returns null.

  • #4
    Join Date
    Apr 2009
    Posts
    7

    Default

    Thanks for the advice _ado. I've got FlowAjaxTilesView (which uses SpringJavascriptAjaxHandler) to recognize that I am sending an ajax request (by changing the header "Accept") but the fragments still are not recognized and re-rendered. I tried both including the "fragments" parameter in the request URL as well as using the <render fragments="foo" /> tag in the flow. I do not however get a null pointer exception when using this code though. Currently I'm working around the fragment rendering problem using jquery's "load" method to parse the response and replace the specific dom elements (aka my tiles fragments).

    Anyone have any idea how to fix the native fragment rendering in this case??

  • #5
    Join Date
    Feb 2007
    Location
    England
    Posts
    63

    Unhappy

    I gave up in the end, the info on this thread did point me in the right direction and I got JQuery calling partial render fragment in webflow but then get an exception about JSF missing a method. This is due to the functionality relying on JSF 1.2 but unfortunately im using JSF 1.1.

    So what have I done? The only workaround I could find was to use plain old mvc controlers to service the AJAX request and return html fragments. This is ok for a small application but the side effects are potential view code duplication and also you have to use session scope to share data between flows and controllers.

    Of for the day we can used JSF 1.2 even better when we can drop JSF all together.

    CHeers
    Paul

  • #6
    Join Date
    Apr 2009
    Posts
    7

    Default

    Paulg,

    Do you mind posting the code that got JQuery to render fragments? I'm not having any luck with that.

    Thanks,
    Tim

  • #7
    Join Date
    Feb 2007
    Location
    England
    Posts
    63

    Default

    Sorry for the long time to respond

    I have misplaced the fragment calling code will dig around some more, here is the code for calling a separate servlet for AJAX response

    Code:
    <script>
    		 $(document).ready(function() {
    			   $("#mainForm\\:myButton").click(function(event) {
    				   event.preventDefault();
    				   $("#mainForm\\:myText").load("#{facesContext.externalContext.requestContextPath}/spring/ajax/text/");
    			   });
    			 });
    	   </script>
    	   
    	   <div class="field">
    			<div class="label"><h:outputLabel for="selectedProductFunction">Product Function</h:outputLabel>
    			</div>
    
    			<h:commandButton id="formProductSubmitButton" value="Submit"
    				action="checkCompliance" /></div>
    			<br />
    			<h:outputText id="myText" value="sometext" />
    			<br />
    			<h:commandButton id="myButton" value="Submit Ajax"
    				action="getFunctionsFragment" />

  • #8
    Join Date
    Nov 2008
    Location
    Dublin
    Posts
    16

    Default

    Thanks _ado. Your solution is perfect.

    I tried first setting "Accept" header to "text/html;type=ajax". However, JQuery way of doing this seems not reliable across all browsers. Dojo has no problem setting this header across browsers.

    So I used your option of passing parameter "ajaxSource" in every ajax request and it works.

  • #9
    Join Date
    Dec 2010
    Location
    INDIA
    Posts
    1

    Default Re:

    Please PM me the same.

  • #10
    Join Date
    Jul 2009
    Posts
    17

    Smile

    After searching everywhere, I was unable to find a clear example of how to make jQuery Ajax calls to update a page fragment, but I finally figured it out, so I am posting my solution here for all to see.

    (Note: My example adds a row to a table, i.e. an item to a list.)

    Spring Configuration:
    Code:
    <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
        <property name="definitions">
            <list>
                <value>/WEB-INF/tiles-defs.xml</value>
            </list>
        </property>
    </bean>
    
    <bean id="tilesViewResolver" class="org.springframework.js.ajax.AjaxUrlBasedViewResolver">
        <property name="viewClass" value="org.springframework.webflow.mvc.view.FlowAjaxTilesView"/>
    </bean>
    
    <bean id="viewFactoryCreator" class="org.springframework.webflow.mvc.builder.MvcViewFactoryCreator">
        <property name="viewResolvers">
            <list>
                <ref bean="tilesViewResolver"/>
            </list>
        </property>
    </bean>
    
    <webflow:flow-builder-services id="flowBuilderServices" view-factory-creator="viewFactoryCreator"/>
    
    <webflow:flow-registry id="flowRegistry" flow-builder-services="flowBuilderServices">
        <webflow:flow-location-pattern value="/WEB-INF/flows/**/*-flow.xml" />
    </webflow:flow-registry>
    
    <webflow:flow-executor id="flowExecutor"  flow-registry="flowRegistry"/>
    
    <bean name="/app.htm" class="org.springframework.webflow.mvc.servlet.FlowController">
        <property name="flowExecutor" ref="flowExecutor"/>
        <property name="flowUrlHandler">
            <bean class="org.springframework.webflow.context.servlet.WebFlow1FlowUrlHandler"/>
        </property>
    </bean>
    
    <bean id="personAction" class="com.app.action.PersonAction">
        <property name="formObjectName" value="personForm"/>
        <property name="formObjectClass" value="com.app.form.PersonForm"/>
        <property name="formObjectScope" value="FLOW"/>
    </bean>
    (Note: I am using FlowController instead of FlowHandlerAdapter, but I believe it is recommended to use FlowHandlerAdapter for new applications.)


    Tiles Configuration:
    Code:
    <definition name="editPerson" template="/WEB-INF/jsp/editPerson.jsp">
        <put-attribute name="title" value="Edit Person"/>
        <put-attribute name="pets" value="/WEB-INF/jsp/fragments/pets.jsp"/>
    </definition>
    JSP:

    editPerson.jsp
    Code:
    <head>
        <title><tiles:insertAttribute name="title"/></title>
    </head>
    <body>
        <form:form modelAttribute="personForm" method="post" id="personForm">
            <input id="key" type="hidden" name="key" value="${key}" />
            <div id="pets"><tiles:insertAttribute name="pets"/></div>
        </form:form>
    </body>
    pets.jsp
    Code:
    <input type="button" value="Add Row" οnclick="addPet();"/>
    <table>
        <tr><td>
            <c:forEach items="${personForm.pets}" varStatus="row" var="pet">
                <spring:bind path="personForm.pets[${row.index}].name">
                    <input type="text" name="${status.expression}" value="${status.value}"/>
                </spring:bind>
            </c:forEach>
        </td></tr>
    </table>
    (Note: The fragment will not render on an Ajax call using <form:*> tags if your <form:form> tag is outside of the fragment JSP. You must use the <spring:bind> tags instead. Someone has made a request to fix this issue here.)

    jQuery:
    Code:
    function addPet() {
        $.ajax({
            url: '?_flowExecutionKey=' + $('#key').val() + '&_eventId=addPet'&ajaxSource=true',
            success: function(data) {
                $('#pets').html(data);
            }
        });
    }
    (Note: It is important to have the "ajaxSource=true", since this is what SpringJavascriptAjaxHandler checks to determine isAjaxRequest(). There are other things that can be done to make this method return true as well. Look at the class for more info.)

    Flow:
    Code:
    <var name="personForm" class="com.app.form.PersonForm" />
    
    <view-state id="newPerson" view="editPerson" model="personForm">
        <on-entry>
            <evaluate expression="personAction.setupForm" result="flowScope.personForm"/>
        </on-entry>
        <transition on="addPet">
            <evaluate expression="personAction.addPet"/>
            <render fragments="pets"/>
        </transition>
        <transition on="save" to="savePerson"/>
    </view-state>
    (Note: The transition on addPet does not have a "to". This tells Webflow that we are staying on the same page.)

    Java:
    Code:
    public class PersonAction extends FormAction {
        
        public Event setupForm(RequestContext context) throws Exception {
            PersonForm form = new PersonForm();
            context.getFlowScope().put("personForm", personForm);
            return success();
        }
    
        public Event addPet(RequestContext context) {
            PersonForm form = (PersonForm)context.getFlowScope().get("personForm");
            form.getPets().add(new Pet());
            return success();
        }
    }
    As a disclaimer, I have not run this exact code. I have modified it from my application code to be more simple and to remove company-specific information.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值