2013-07-11 15 views
8

私はliferayポートレット開発の初心者であり、http取得要求を受け取り、いくつかの情報を処理し、jsonオブジェクトを戻す必要があるポートレットを開発しています。私の問題は、ポートレットがjsonオブジェクトの代わりにHTMLページ全体を送信することです。 これは私のコードです:ポートレットでjsonオブジェクトを使用してhttp要求に応答します

HttpServletResponse servletResponse = PortalUtil.getHttpServletResponse((renderResponse)); 

      servletResponse.setHeader("Content-type", "application/json"); 
      servletResponse.setCharacterEncoding("application/json"); 
      PrintWriter out = servletResponse.getWriter(); 
      out.write(EntityUtils.toString(responseEntity)); 


      out.flush(); 
      out.close(); 

私はこれがベストプラクティスではないことを知っているが、私は、現時点ではそれに関係していないですdoView()メソッドでこれを実行します。誰かがjsonオブジェクトを返す方法を私に説明することはできますか?私はserveResponseについて何かを読んでいますが、呼び出す方法を理解できませんでした。

+0

私はポートレットでHttpServletRequestまたはHttpServletResponseクラスを使用することをお勧めします。ポートレットプログラミングモデル全体を壊し、さらに悪い習慣を歓迎するだけです。壊れたウィンドウのアイデアを参照してください。http://www.codinghorror.com/blog/2005/06/the-broken-window-theory.html –

+0

* doViewでこれを実装することは、動作しません*。これは 'serveResource'の内容です –

答えて

13

よくご存知のように、doView()が主にポートレットのレンダリングを担当しています。要件は、
1 - processAction(ポートレットアクション)または
2 - serveResource(ポートレットAJAXサービス)によって、よりよく達成できます。

私の見解では、AJAXリクエスト - 応答が最も適したケースです。そのためには、ポートレット・ビューにリソースURLを作成するだけです。 Like:

<portlet:resourceURL var="ajaxResourceURL" /> 

JavaScriptメソッドをページに追加すると、そこからポートレットにAJAXリクエストを生成できます。この方法は、

<script type="text/javascript"> 
function _callAjax(val1, val2){ 
    var url = '<%=ajaxResourceURL %>'; // pass resource URL you created using scriplet/EL. 
    jQuery.ajax({ 
    type : "POST", 
    url : url, 
    cache:false, 
    dataType: "json", 
    data: { 
     value1: val1, // extra parameters if you want to pass 
     value2: val2 
    },  
    success : function(data){ 
     // do whatever you want with your response data 
    }, 
    error : function(XMLHttpRequest, textStatus, errorThrown){ 
     alert(errorThrown); 
     alert(textStatus); 
    } 
    }); 
}; 
</script> 

コールを次のようになりますボタン/リンクのクリックイベントのAJAXメソッドその:

<input type="button" onclick="_callAjax('val1', 'val2')" value="Send" /> 

そして最後に、ポートレットのアクション・リスナー・クラスに以下のserveResourceメソッドを追加し、責任AJAXベースのリクエストを処理するためのものです。ここで

あなたが望むあなたのリクエストパラメータを取得し、意味での応答を生成することができます。

@Override 
public void serveResource(ResourceRequest request, ResourceResponse response) throws PortletException,IOException { 

String value1 = ParamUtil.getString(request , "value1", "default"); // request parameters 
String value2 = ParamUtil.getString(request , "value2", ""); 

PrintWriter writer = response.getWriter(); 

JSONObject jsonObject = new JSONObject(); 
jsonObject.put(String key, boolean/long/Collection/double/Map/Object value); 

writer.write(jsonObject.toString()); 
} 

厥それを!希望、これはあなたのために役立ちます:)

+0

あなたはJavaScript関数でURLを割り当てるときに '$ {ajaxResourceURL}'を使うつもりだと思います。それ以外の場合は、AJAXとserveResourceがJSONオブジェクトを返す適切な方法であることに同意します。 –

+0

ajaxResourceURLは、ポートレットによって作成された、serveResourceメソッドを示すURLです。同様のJSPで使用している場合は、javascript関数<%= ajaxResourceURL%>にURLを割り当てることができます。しかし、他の場所から要求を出したい場合は、varを印刷して、ハードコードされたURLを割り当てる必要があります。 –

+1

ありがとう、あなたは私を救った! – layser