2015-09-19 1 views
2

Je l'ai beaucoup essayé depuis quelques jours, mais je n'arrive toujours pas à résoudre ce problème. J'utilise liferay 6.1 et struts 2. Fondamentalement, j'ai deux dropdowns dans mon portlet liferay, un pour le pays et l'autre pour les états. Lors de la sélection du pays, la liste des états doit figurer dans la liste déroulante en fonction du pays sélectionné. J'essaye de faire ceci par l'intermédiaire d'AJAX. (Ci-dessous le code que je trouve de google, son travail dans un projet Web dynamique distincte, mais quand je l'ai essayé ceci dans Liferay portlet son erreur de lancerLiferay portlet + struts2 + Ajax

Voici mon code:.

StartPage.jsp

<script > 
$(document).ready(function() { 
    $('#country').change(function(event) { 
     var country = $("select#country").val(); 
     alert(country); 
     $.getJSON("<s:url action='ajaxAction' namespace='ajax' includeParams='none' />", {countryName : country}, function(jsonResponse) { 
       $('#ajaxResponse').text(jsonResponse.dummyMsg); 
       alert($('#ajaxResponse').text(jsonResponse.dummyMsg)); 
       var select = $('#states'); 
       select.find('option').remove(); 
       $.each(jsonResponse.stateMap, function(key, value) { 
        $('<option>').val(key).text(value).appendTo(select); 
       }); 
      }); 
    }); 
}); 
</script> 




<s:form name="StartPage" id="StartPage"> 

     <s:select id="country" name="country" 
      list="{'Select Country','India','US'}" label="Select Country" /> 
     <br /> 
     <br /> 
     <s:select id="states" name="states" list="{'Select State'}" 
      label="Select State" /> 
     <br /> 
     <br /> 
     <div id="ajaxResponse"></div> 

</s:form> 

struts.xml

<package name="default" extends="json-default"> 
     <action name="ajaxAction" class="com.action.AjaxJsonAction"> 
      <result type="json">/WEB-INF/view/StartPage.jsp 
      </result> 
     </action> 
    </package> 

Class action:

public class AjaxJsonAction extends DefaultActionSupport{ 

    private Map<String, String> stateMap = new LinkedHashMap<String, String>(); 
    private String dummyMsg; 
    //Parameter for Jquery 
    private String countryName; 

    @Override 
    public String execute() { 
     System.out.println("i am executed..."); 
     System.out.println("CountryName: " + countryName); 
     if (countryName.equals("India")) { 
      stateMap.put("1", "Kerala"); 
      stateMap.put("2", "Tamil Nadu"); 
      stateMap.put("3", "Jammu Kashmir"); 
      stateMap.put("4", "Assam"); 
     } else if (countryName.equals("US")) { 
      stateMap.put("1", "Georgia"); 
      stateMap.put("2", "Utah"); 
      stateMap.put("3", "Texas"); 
      stateMap.put("4", "New Jersey"); 
     } else if (countryName.equals("Select Country")) { 
      stateMap.put("1", "Select State"); 
     } 
     dummyMsg = "Ajax action Triggered"; 
     System.out.println("exiting....."); 
     return "success"; 
    } 

    public Map<String, String> getStateMap() { 
     return stateMap; 
    } 

    public String getDummyMsg() { 
     return dummyMsg; 
    } 

    public String getCountryName() { 
     return countryName; 
    } 

    public void setStateMap(Map<String, String> stateMap) { 
     this.stateMap = stateMap; 
    } 

    public void setDummyMsg(String dummyMsg) { 
     this.dummyMsg = dummyMsg; 
    } 

    public void setCountryName(String countryName) { 
     this.countryName = countryName; 
    } 
} 

Errro Log:

java.lang.IllegalArgumentException: application/json;charset=UTF-8 is not a supported mime type 
    at com.liferay.portlet.MimeResponseImpl.setContentType(MimeResponseImpl.java:159) 
    at org.apache.struts2.portlet.servlet.PortletServletResponse.setContentType(PortletServletResponse.java:219) 
    at org.apache.struts2.json.JSONUtil.writeJSONToResponse(JSONUtil.java:225) 
    at org.apache.struts2.json.JSONResult.writeToResponse(JSONResult.java:211) 
    at org.apache.struts2.json.JSONResult.execute(JSONResult.java:172) 
    at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:373) 

Répondre

1

Vous pouvez utiliser le script AJAX AUI pour cela. J'utilise Liferay 6.2 sp2 SDK et Liferay MVC portlet. Vous pouvez essayer cette approche avec des entretoises pour voir si cela vous aide.

Utilisez la fonction liferay.provide dans votre script AUI.

<aui:script> 
Liferay.provide(
    window, 
    '<portlet:namespace />updatePermState', 
    function() { 
     var A = AUI(); 
     var url = '<%= ajaxCallResourceURL.toString() %>'; 
     A.io.request(
      url, 
      { 
       //data to be sent to server 
       data: { 
       <portlet:namespace />param1: (document.getElementById('<portlet:namespace/>mCountry').value), 
       }, ..... 

} 

fonction Créer servResource dans votre classe de portlet. Ce sera câblé avec votre appel AUI:

public void serveResource(ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws IOException, PortletException { 

     resourceResponse.setContentType("text/javascript"); 
... ... 
//Send Data Back 
resourceResponse.setContentType("text/html"); 
} 

Dans votre appel fichier JSP ajouter ceci:

<!-- Create a serveResource URL --> 
<portlet:resourceURL var="ajaxCallResourceURL" /> 

appel AJAX. J'utilise la méthode onChange dans le champ Pays. Ma fonction UpdatePermState() crée dynamiquement un div avec les états.

<aui:select name="mCountry" id="mCountry" label="Country of permanent address*" inlineLabel="left" onChange='<%= renderResponse.getNamespace() + "updatePermState();" %>'>