次のタスクは:
Cognosに保存されているレポートのグラフを表示するポートレットを作成します。 Cognosのレポートには、数秒から20秒という非常に長い時間がかかる場合があります。ユーザーをそれほど長く待たせるのは恐ろしい決断です。
ポートレットアプリケーションにサーブレットを配置することにしました。 ロード時に、ポートレットはレポートへのパスを含むxmlHttpRequestを送信し、それに応答して、サーブレットがCognosから受信してサーバーに保存したレポート画像への相対リンクを受信します。
すべてが非常に簡単に思えますが、問題は、ページを更新するか、ページ上のポートレットにアクセスすると、Cognosポートレットが新しいリクエストをサーブレットに送信することです。 これは必要ありません 画像はすでにロードされており、5分ごとに更新する必要はありません。
ポータル(他のコンテナ)への訪問者がセッションを持っていることは秘密ではありません。 通常、セッションにはいわゆるStateBeanが配置されます。これは、ユーザーがポータルで作業するときに必要になる可能性のあるジャンクを格納するビンです。 ビンにフィールドを作りましょう
String pathToImage;
および2つの方法:
public String getPathToCognosImage(){ return pathToImage}
public void setPathToCognosImage(String path){ pathToImage = path;}
問題は、サーブレットの応答を受信すると、JavaScriptがBeanのメソッドを呼び出せないことです。 理由は理解できたと思います。
唯一の方法があります-サーブレットのビンに書き込みます。 しかし、それは可能ですか? 彼らが言うように、5.0ポータルでそのようなピースを入手することは不可能でした。 残念ながら、私は5.0ポータルを見つけられず、この噂をテストする機会もありませんでした。
セッションBeanにアクセスする方法は次のとおりです。
public class GetPathToChartImageServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
//bla-bla-bla
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//getting aditional parameters for Cognos.
//Try to get it from StateBean
Enumeration en = request.getSession().getAttributeNames();
while(en.hasMoreElements()){
attrName = (String)en.nextElement();
Object o = request.getSession().getAttribute(attrName);
System.out.println("attr name " + attrName + " = " + o.toString());
if(o instanceof ru.habr.bean.ChartDataStateBean){
System.out.println("attr name = " + attrName + ". Is my StateBean");
statebean = (ru.habr.bean.ChartDataStateBean)o;
break;
}
}
}//doPost
}//class
コンソールには次の行があります。
[04.06.08 11:04:25:495 MSD] 5a9899ea SystemOut O attr name PC_PRIVATE_5_0_CSI_PortletSessionData = {caiid = 5_0_CSI [PORTLET_ENTITY:13202]、creationTime = 1212562835246、lastAccessedTime = 12125630654
[04.06.08 11:04:25:495 MSD] 5a9899ea SystemOut O attr name PC_5_0_CSI_en.habr.bean.ChartDataStateBean = en.habr.bean.ChartDataStateBean@7dc1d9b7
[04/06/08 11:04:25:495 MSD] 5a9899ea SystemOut O attr name = PC_5_0_CSI_en.habr.bean.ChartDataStateBean。 私のstatebeanです
やばい、豆が手に入ります!
メソッドの本体が終了する前に、変更を忘れずに記述する必要があります。
String newRelativePathToImageFromCognos = CognosFacadeAdapter.getInstance().runReport(reportStringForCognos);
statebean.setPathToImage(newRelativePathToImageFromCognos);
request.getSession().setAttribute(attrName, statebean);
この可能性は、次の事実によって簡単に説明できます。
外側は、次のようになります。
PS
habracut text =「何をする?」は一度だけではなく、いくつか表示されます。 それはグリッチまたはそのような冗談ですか?