WebSphere-Portlet開發知識積累

轉帖自  http://hi.baidu.com/hivemind/blog/item/1c3efb43ba8d301372f05d16.html

 

WebSphere-Portlet開發知識積累

 

1 javabean的寫法
- java頁面的代碼:
public void doView(RenderRequest request, RenderResponse response)
                                   throws PortletException, IOException {
    request.setAttribute("username","liuzhaoy ##################");
}
- jsp頁面的寫法
 <jsp:useBean id="username" class="java.lang.String" scope="request"></jsp:useBean>
 <%=username %>
- 展示結果10bfd7ad207.jpg

2 頁面編碼的寫法
<%@ page import="javax.portlet.*, java.util.*" session="false"%>
<%@ taglib uri="http://java.sun.com/portlet" prefix="portletAPI" %>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
如果讓其支持漢語,就改爲:gb2312嘍,呵呵。

3 圖片路徑的寫法
<IMG src="<%=renderRequest.getContextPath()%>/testportlet/images/mark.gif"><br>
<IMG src="<%=renderResponse.encodeURL(renderRequest.getContextPath()+"/testportlet/images/mark.gif")%>">
其中renderResponse.encodeURL表示編碼。目錄結構截圖:

10bff7a0e02.jpg
4 狀態的保存
怎麼讓一個textbox框保持其狀態呢,就是輸入框裏的內容在點擊提交按鈕後信息不會丟失。
jsp文件
<jsp:useBean id="saveUrl" scope="request" class="java.lang.String"></jsp:useBean>
<jsp:useBean id="username" class="java.lang.String" scope="request"></jsp:useBean>
<FORM method="post" action="<%=saveUrl %>">
<INPUT size="20" type="text" name="username" value="<%=username %>">
<input type="submit" name="save" value="Save"/>
</FORM>
--------------------------
java文件
聲明一個變量:
private String UN=null;
在doView()方法如下:
public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException {
  request.setAttribute("username",UN);
  PortletURL saveUrl=response.createActionURL();
  saveUrl.setParameter("save","save222");
  request.setAttribute("saveUrl",saveUrl.toString());
}
--------------------------
processAction()方法:
public void processAction(ActionRequest request, ActionResponse response) throws PortletException, java.io.IOException {
  String saveStr=request.getParameter("save");
  System.out.println(saveStr);
  if(saveStr!=null){
//   PortletPreferences prefs=request.getPreferences();
//   prefs.setValue("userName",request.getParameter("username"));
//   prefs.store();
   String username=request.getParameter("username");
   UN=username;
  }
}
這樣當點擊Save按鈕時,觸發processAction()方法,給UN負值,即UN=username;然後doView()事件觸發,在這裏,給username負值UN,然後在jsp中用javabean接收即可,即:<jsp:useBean id="username" class="java.lang.String" scope="request"></jsp:useBean>如圖:10bff8aa287.jpg另外,如果在doView()中寫了request.setAttribute("username",UN); 在jsp中用<%=renderRequest.getAttribute("username")%>可以直接接收的到,用這樣的方法保存狀態可能更簡單些。:)
另外一種更簡單的寫法:
java文件的processAction()方法中:
if( request.getParameter(FORM_SUBMIT) != null ) {
    response.setRenderParameter("saveValue",saveValue);
}
在jsp中直接接收即可:
<INPUT name="<%=Portlet01Portlet.FORM_TEXT%>" type="text" value="<%=request.getParameter("saveValue") %>"/>

5. 超鏈接的寫法
超鏈接這個東西折磨了我好久,今天終於把它解決掉了。超鏈接主要使用renderURL來解決。可以這樣理解,renderURL是actionURL的一種優化,Portlet開發過程中儘可能使用renderURL而避免使用actionURL,actionURL使用於確實有Action行爲的情況,比如說,form標單的提交,persistent狀態的改變,session的操作,preference的修改等。而renderURL通常用來操作portlet內容的導航。
renderURL的寫法有兩種。
1.使用標籤
<portlet:renderURL var="pu2">
<portlet:param name="testURL" value="testURL2"/>
</portlet:renderURL>
我的超鏈接:&nbsp;&nbsp;<A href="<%=pu2%>">viewURL</A>

當然,這種情況必須引入:<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet" %>這個標籤定義了。
2.寫程序
<%
PortletURL pu=renderResponse.createRenderURL();
pu.setParameter("testURL","urlTest");
 %>
<A href="<%=pu %>">testHref</A>
3. 直接使用標籤
<%
String dd="hello portal";
%>
<A href="<portlet:renderURL><portlet:param name="startPos" value="<%=dd %>"/></portlet:renderURL>"><%=dd%></A>
不管那種寫法,都會觸發render()函數,此函數是父類GenericPortlet的一個方法,這裏屬於覆蓋。如下:
 public void render(RenderRequest request, RenderResponse response)
   throws PortletException, IOException {
//  super.render(request, response);
  String markValue=request.getParameter("mark");
  PortletContext context=getPortletConfig().getPortletContext();
  if(markValue!=null){
   if(markValue.toString().equals("test01")){
    context.getRequestDispatcher("/portlet01/webApp/test01.jsp").include(request,response);
   }
   else if(markValue.equals("homepage")){
    request.setAttribute("saveValue",saveValue);
    context.getRequestDispatcher("/portlet01/jsp/html/Portlet01PortletView.jsp").include(request,response);
   }
   else if(markValue.equals("test02_new")){
    if(request.getParameter("mark_test02")!=null){
     request.setAttribute("hasButton","true");
    }
    context.getRequestDispatcher("/portlet01/webApp/test02.jsp").include(request,response);
   }
  }
  else{
    doView(request,response);
  } 
}
根據設置的testURL參數值,來判斷鏈接的文件。

5. 獲取portlet.xml中的初始值:
 public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException {
  System.out.println(getPortletConfig().getInitParameter("view"));
 }
---------------------------
portlet.xml文件
  <init-param>
   <name>view</name>
   <value>/fragments/portletrequest/view_portletrequest.jsp</value>
  </init-param>
系統會打印出/fragments/portletrequest/view_portletrequest.jsp來,這樣,可以把一些值放到這裏面在程序中獲取。

6. 用renderRequest負值,在jsp頁面直接接收
java頁面
public void render(RenderRequest request, RenderResponse response)
   throws PortletException, IOException {
    String viewParam=request.getParameter("linkParam2");
    request.setAttribute("voteResult_titleID",viewParam);
}
jsp頁面
<%
out.println("----"+request.getAttribute("voteResult_titleID"));
%>

7. Action提交時保持跳轉狀態
jsp頁面
<form name="form1" method="post" action="<portlet:actionURL><portlet:param name="jumpPath" value="<%=request.getRequestURI() %>"/><portlet:param name="inquireIdAnswerQuestion" value="<%=inquireIdStr %>"/></portlet:actionURL>" οnsubmit="return answerSubmit(this)">

   <input type="submit" name="inquireAnswerQuestion" value="保 存" class="font13">

</form>
--------------------------
java頁面
public void processAction(ActionRequest request, ActionResponse response) throws PortletException, java.io.IOException {
  if(request.getParameter("inquireAnswerQuestion")!=null){
      String jump_Path=request.getParameter("jumpPath");
      String idInquireStr=request.getParameter("inquireIdAnswerQuestion"); //獲取ID編號
      response.setRenderParameter("inquireID",idInquireStr);
      System.out.println(idInquireStr);
      jumpPath=rtnPath(jump_Path);
  }

}

 private String rtnPath(String path){
  int dealPathDivideDot=path.indexOf("/vote/");
  String jumppath=path.substring(dealPathDivideDot);
  return jumppath;
 }

public void render(RenderRequest request, RenderResponse response)
   throws PortletException, IOException {
   if(jumpPath!=null){
    String voteTitleId=request.getParameter("voteTitleID");
    context.getRequestDispatcher(jumpPath).include(request,response); 
   }
}
這裏主要的思想就是通過<%=request.getRequestURI() %>獲取本頁的路徑,然後通過<portlet:param name="jumpPath" value="<%=request.getRequestURI() %>"/> 進行參數傳遞,注意<portlet:actionURL>的參數傳遞方式和<portlet:renderURL>是一樣的,然後再在processAction()中通過String jump_Path=request.getParameter("jumpPath");進行接收,給公共變量jumpPath負值後,在render()中就完成了跳轉。
--------------------------
新認知例子
1.怎麼讓頁面上的renderRequest不會出現出錯提示呢,經過這樣類型轉換後即可
RenderRequest renderRequest =(RenderRequest)request.getAttribute("javax.portlet.request");
RenderResponse renderResponse =(RenderResponse)request.getAttribute("javax.portlet.response");
PortletConfig portletConfig =(PortletConfig)request.getAttribute("javax.portlet.config");

原來用問號的方式也可以傳遞參數,不錯
Code in the portlet
String path = "/jsptest/jsp/html/testCase.jsp?name=Hailey";
PortletRequestDispatcher rd = getPortletContext().getRequestDispatcher(path);
rd.include(request,response);
Code in JSP
Hello <%= renderRequest.getParameter("name") %>

JSTL標籤,用它可以讀屬性文件,不錯,避免把一些東東寫死在java文件裏,便於管理
<%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt" %>
<fmt:setBundle basename="nls.NLSExample"/>
<fmt:message key="message"/>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章