Respons Ajax tidak berfungsi dengan Spring Webflow

Saya mencoba membangun aplikasi menggunakan jQuery Ajax dan Spring WebFlow. Saya dapat mengirim nilai ke pengontrol tetapi tidak mendapatkan seluruh halaman sebagai respons, bukan <script> spesifik

Melakukan panggilan Ajax menggunakan jquery

$.ajax({
    type:"POST",
    data:country,
    url:$("#welcomeForm").attr("action")+"&_eventId_country&ajaxSource_country"+"&countryName="+country,
    success:function(states){
        console.log(states);
    }
});

Aliran.xml:

<?xml version="1.0" encoding="UTF-8"?>
<flow xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/webflow" xsi:schemaLocation="http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">
<var class="com.model.Welcome" name="welcome"/>
<on-start>
<evaluate expression="springWebFlow.countryList()" result="flowScope.countries"/>
</on-start>
<view-state id="welcome" model="welcome" redirect="false" view="/WEB-INF/views/welcome.jsp">
<transition on="country" bind="false">
<evaluate expression="springWebFlow.stateList(flowRequestContext)" result="flowScope.states" result-type=""/>
</transition>
<transition on="welcome" to="actionState1"/>
</view-state>
<end-state commit="false" id="actionState1" view="/WEB-INF/views/myDetails.jsp"/>
</flow>

Pengontrol:

public @ResponseBody List<State> stateList(RequestControlContext context)  throws Exception {
    List<State> states= new ArrayList<State>() ;
    State stateName= new State();
    String countryName= context.getRequestParameters().get("countryName");
    if(countryName.equals("India")){
        stateName.setStateName("Delhi");
        states.add(stateName);
    }
     return states;
}

Saya tidak ingin menggunakan Spring JavaScript dan tidak menggunakan Tiles. Saya dapat mengirim permintaan ke pengontrol tetapi tidak bisa mendapatkan respons (mendapatkan seluruh halaman) atau menampilkan respons di halaman.


person Vaskar Ray Karmakar    schedule 25.01.2014    source sumber
comment
Jika Anda mendapatkan seluruh halaman sebagai respons, sepertinya Anda memanggil metode pengontrol yang salah. Sudahkah Anda mencoba men-debug? Juga apa itu stateS, beberapa variabel kelas? Untuk apa states dalam kode JavaScript dan Java? Pada pengontrol itu tidak disimpan di mana pun dan dalam panggilan AJAX Anda memperingatkan variabel yang tidak ditentukan dalam fungsi.   -  person t0mppa    schedule 26.01.2014
comment
dapatkah Anda memposting respons satu halaman penuh yang Anda dapatkan, dan URL yang diposting?   -  person Angular University    schedule 01.02.2014
comment
itu hanya halaman html   -  person Vaskar Ray Karmakar    schedule 03.02.2014


Jawaban (1)


Di WebMvcConfig, pastikan Anda telah AjaxThymeLeafViewResolver dikonfigurasi dengan benar. Nama kacang harus diberikan PERSIS @Bean(name = "thymeleafViewResolver").

Mengapa? Saya kira tanpa memberi nama kacang AjaxThymeleafViewResolver, nama kacang default hanya ajaxThymeleafViewResolver atau semacamnya sedangkan pegas hanya peduli pada kacang yang disebut thymeleafViewResolver mirip dengan antarmuka dan implementasi konkret. Misalnya, Anda mengatakan pada musim semi bahwa kami ingin mengonfigurasi thymeleafViewResolver menjadi turunan AjaxThymeleafViewResolver untuk menyediakan penanganan ajax khusus untuk fragmen parsial.

Ini konfigurasi saya. Ini adalah detail yang sangat halus dan ditemukan di salah satu panduan mvc pegas thymeleaf.

<bean id="thymeleafViewResolver" class="org.thymeleaf.spring4.view.AjaxThymeleafViewResolver">
    <property name="viewClass" value="org.thymeleaf.spring4.view.FlowAjaxThymeleafView" />
    <property name="templateEngine" ref="templateEngine" />
</bean>

http://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html#spring-webflow-integration

Memetakan xml itu ke java menggunakan spring boot diberikan di bawah ini.

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Autowired
    private WebFlowConfig webFlowConfig;

    @Autowired
    private SpringTemplateEngine springTemplateEngine;

    @Bean
    public FlowHandlerMapping flowHandlerMapping() {
        FlowHandlerMapping handlerMapping = new FlowHandlerMapping();
        handlerMapping.setOrder(-1);
        handlerMapping.setFlowRegistry(webFlowConfig.flowRegistry());
        return handlerMapping;
    }

    @Bean
    public FlowHandlerAdapter flowHandlerAdapter() {
        FlowHandlerAdapter handlerAdapter = new FlowHandlerAdapter();
        handlerAdapter.setFlowExecutor(webFlowConfig.flowExecutor());
        handlerAdapter.setSaveOutputToFlashScopeOnRedirect(true);
        return handlerAdapter;
    }

    @Bean(name = "thymeleafViewResolver")
    public AjaxThymeleafViewResolver ajaxThymeleafViewResolver() {
        AjaxThymeleafViewResolver viewResolver = new AjaxThymeleafViewResolver();
        viewResolver.setViewClass(FlowAjaxThymeleafView.class);
        viewResolver.setTemplateEngine(springTemplateEngine);
        return viewResolver;
    }
}

Hal berikutnya yang perlu Anda ketahui adalah bagaimana memahami <render fragments=...> karena dokumentasi IMO tidak jelas.

<view-state id="detail" view="bookingDetail" model="hotel">
    <transition on="updateData">
        <render fragments="hoteldata"/>
    </transition>
</view-state> 

Apa sebenarnya yang dimaksud dengan hotelData? Lihatlah markup daun thyme html.

<div th:fragment="hotelData">
  <h1 th:text="|The price is ${hotel.price}|">
</div>

Dikatakan bahwa ketika Anda melakukan posting ajax ke titik akhir aliran web pegas flowExecutionUrl menyediakan _eventId=updateData sebagai 1 bidang formulir serial dll, aliran web pegas hanya akan mengirim kembali markup html untuk fragmen hotelData di atas dengan mungkin harga hotel baru yaitu tersedia melalui pengikatan model hotel.

Kiat profesional:

Berhati-hatilah dengan opsi validasi dan pengikatan. Ada baiknya bermain-main dengan mereka jika tidak ada yang berhasil untuk Anda hingga saat ini. Misalnya jika Anda menyetel bind ke false, tidak ada kolom formulir yang dikirim dalam permintaan ajax yang akan diikat ke model hotel yang ditentukan dalam status tampilan flow.xml seperti di atas.

transition on="updateData" validate=true | false 
transition on="updateData" bind=true | false
person reversebind    schedule 21.02.2018