2011-08-01 24 views
0

我正在使用jQuery插件(3.0.0)進行ajax的struts2(2.2.3)web應用程序。如何將最近在URL中選擇的值作爲參數發送?

我有一個jsp其中我有2 SJ:autocompleter(第一個對提供者和第二個用於產品)。我需要通過所選供應商過濾產品。在這個特定的應用程序中,必須爲第二個集合提供一個自動完成器。

我要的是在URL中,以便我能使用此選擇用於過濾第二autocompleter發送第一autocompleter作爲參數選擇的值。我的JSP代碼

部分:

<s:url id="url_products" action="myAction" method="showProducts"> 
    <s:param name="providerSelected" value="%{purchase.provider.id}"></s:param> 
</s:url> 

<sj:autocompleter 
id="purchaseProviderId" 
name="purchaseProvider" 
value="%{purchaseProvider}" 
onCompleteTopics="providerChanged" 
cssClass="product" 
href="%{url_providers}" 
/> 

<sj:autocompleter 
id="productId" 
name="productDescription" 
value="%{productDescription}" 
listenTopics="providerChanged" 
href="%{url_products}" 
/> 

我遇到的問題是,「%{} purchase.provider.id」是在發送之前url_products究竟選擇什麼,當我通過發送值該值不會從最新的選擇中更新。 我認爲這個值是會話的一部分,並且由於爲提供者​​完成的新選擇尚未提交給操作,「%{purchase.provider.id}」只是指向會話的值意識到。

問:我怎樣才能通過發送URL作爲PARAM在「purchaseProviderId」 autocompleter近日評選出價值?

在此先感謝!

回答

0

使用在Struts2-jQuery documentation雙重選擇見的例子。

注意,第二選擇具有formIds="formSelectReload"。這告訴被調用的動作/ url填充第二個選擇,它取決於formSelectReload中的值。

在你的情況,你可能會碰到這樣的:

<s:form id='myForm'> 
<sj:autocompleter 
id="purchaseProviderId" 
name="purchaseProvider" 
value="%{purchaseProvider}" 
onCompleteTopics="providerChanged" 
cssClass="product" 
href="%{url_providers}" 
/> 

<sj:autocompleter 
id="productId" 
name="productDescription" 
formIds="myForm" <!-- This will send form values to action including selected purchaseProviderId --> 
value="%{productDescription}" 
listenTopics="providerChanged" 
href="%{url_products}" 
/> 
</s:form> 
+0

感謝您的答覆。您說得對,我將formIds添加到第二個自動完成器,並將「purchase.provider.id」發送到該操作。唯一的問題是提供商的ID不是最近選擇的,而是已經爲此次購買選擇/保存的提供商的ID,我需要新的選定ID。 請注意,我真的需要在這種情況下使用autocompleter組件。任何其他建議發送到行動新的供應商ID選擇?我可以從JavaScript獲取該id並將其作爲param發送到url中嗎? – clanmilano

+0

在您的第一個選擇列表中添加'onChangeTopics =「providerChanged」'。 – nmc

0

添加以下代碼提到在你的JSP頁面。

<sj:autocompleter 
    id="purchaseProviderId" name="purchaseProvider" 
    onSelectTopics="providerChanged" 
    list="productMap" 
    //Fill this map with the key value pair, and also make the getter 
    //and setter in order to have the access of the variable in jsp page 
    cssClass="product"/> 

<s:url id="provider" action="getProvider"/> 
<sj:autocompleter 
    id="productId" name="productDescription" 
    listenTopics="providerChanged" 
    listKey="key" listValue="value" 
    href="%{provider}" /> 

<script type="text/javascript">  
var key; 
$.subscribe('providerChanged', function(event, data) 
{ 
    var ui = event.originalEvent.ui; 
    key = ui.item.key; 

    //clear the children autocompleters 
    jQuery('#productId').val(""); 
    jQuery('#productId_widget').val(""); 

    var options_branchCity_widget    = {}; 
    options_productId_widget.hiddenid   = "productId"; 
    options_productId_widget.delay   = 50; 
    options_productId_widget.minimum   = 3; 
    options_productId_widget.selectBox  = false; 
    options_productId_widget.forceValidOption = true; 
    options_productId_widget.jqueryaction  = "autocompleter"; 
    options_productId_widget.id    = "productId_widget"; 
    options_productId_widget.name    = "productDescription_widget"; 
    options_productId_widget.href    = "getProvider.action"+"?providerSelected="+key; 
    options_productId_widget.listentopics  = "providerChanged"; 

    jQuery.struts2_jquery_ui.bind(jQuery('#productId_widget'),options_productId_widget); 
}); 
</script> 

添加下面的代碼中的struts.xml文件中註冊的尊重行動將爲autocompleter獲取數據。

<action name="getProvider" class="com.sample" method="getProvider"> 
    <result type="json"> 
     <param name="root">providerList</param> 
    </result> 
</action> 

創建如下所述的DTO類。

public class autocompleteDTO 
{ 
private String key; 
private String value; 

public autocompleteDTO(String key, String value) 
{ 
    this.key = key; 
    this.value = value; 
} 

public String getKey() 
{ 
    return key; 
} 
public void setKey(String key) 
{ 
    this.key = key; 
} 

public String getValue() 
{ 
    return value; 
} 
public void setValue(String value) 
{ 
    this.value = value; 
} 
} 

在您的動作類中添加下面提到的代碼來處理自動補全。

public String getProvider() 
{ 
    String userTypeCharacter = request.getParameter("term"); 
    String providerSelected = request.getParameter("providerSelected"); 

    List providerListDB = //fetch list from the database with respect to user typed character 
    //and providerSelected.  

    //Create the array list of the DTO class 
    providerList= new ArrayList<autocompleteDTO>(); 

    //providerList will be the member variable of the action along with the getter and setter, 
    //for data display in the jsp page 

    //Iterate the list and add the data to another list 
    for (Object provider: providerListDB) 
    { 
     Provider providerData = (Provider) provider; 

     String providerCode = providerData .getProviderCode(); 
     String providerName = providerData .getProviderName(); 

     providerList.add(new autocompleteDTO(providerCode , providerName)); 
    } 
} 
return SUCCESS; 
} 

此代碼將工作在struts 2和struts 2 jquery插件3.6.1上。

如果您有任何幫助,請讓我知道。 -Regards

相關問題