jboss portal API 如何与web容器交换和传递数据呢?
首先,我明白的是servlet和portlet是两个完全不同的东西,他们各自独立,自成体系。比较一下定义:
public class VicPortlet extends GenericPortlet {......
public class FrontControllerServlet extends HttpServlet {......
public abstract class javax.servlet.http.HttpServlet extends javax.servlet.GenericServlet implements java.io.Serializable {......
VicPortlet 和FrontControllerServlet 分别是GenericPortlet 和GenericServlet 的子类,GenericPortlet 和GenericServlet 都是Object的子类。可以说在类的定义上,portlet和servlet是两个平行的东西,没有交叉点。不过GenericPortlet 和GenericServlet 有类似的API,作用也类似。
那么,portlet到底怎样和servlet(以jsp为例)通信呢?
jsp中有9个隐式的对象(application , session , request , pageContext ,config , exception,out,page,response ),其中的四个结合起来可以实现会话管理,他们是application , session , request , pageContext 。portlet中的API和pageContext 是不太可能沟通了,那么他们会怎样和application , session , request这三个家伙沟通的呢?
●application (javax.servlet.ServletContext对象)是使用范围最广的上下文状态。它允许 JSP 页面的 servlet 与包括在同一应用程序中的任何 Web 组件共享信息。
●session(javax.servlet.http.HttpSession ) 可能是状态管理上下文中使用得最多的对象。“会话”的概念是指单个用户与 Web 应用程序在几个请求上进行交互。
●request(javax.servlet.http.HttpServletRequest ) 提供对 HTTP 请求数据的访问,同时还提供用于加入特定于请求的数据的上下文。
对应于servlet,portlet也有相应的对象:
PortletContext是portlet的上下文状态,所有统一应用中的portlet共享PortletContext的对象。不同应用中不能共享。
PortletSession的对象对于单个用户在同一个会话内有效。
RenderRequest 的对象对于单个用户在同一个请求内有效。
1.application对象可以获得PortletContext对象中set的值。
2.session和PortletSession可以通过PortletSession.APPLICATION_SCOPE参数来实现交换数据,例如:
PortletSession ps = request.getPortletSession(); //获得
ps.setAttribute("username3", "balabala",PortletSession.APPLICATION_SCOPE);
String username4 = (String)ps.getAttribute("username4", PortletSession.APPLICATION_SCOPE);
3.当然,在jsp中,也可以通过标签定义好一些portlet对象,然后直接调用,例如:
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%>
<portlet:defineObjects />
<%
portletSession.getAttribute("username4", PortletSession.APPLICATION_SCOPE);
%>
4.RenderRequest/RenderResponse
RenderRequest一般会用于doXXX函数中作为参数,而doXXX一般是在界面上以某种模式(view、edit、help)显示的时候自动调用。 在jsp中,request对象可以获得RenderResponse对象中set的值,反之不可。
5.ActionRequest/ActionResponse
在jsp中,request对象可以获得ActionResponse对象中set的值。
在portlet中ActionRequest用于向RenderRequest对象中存入参数,或者还可以用于重定向。ActionRequest用于获取actionURL中的参数。