JetSpeed源码分析

来源:互联网 发布:source insight有linux 编辑:程序博客网 时间:2024/06/15 12:02

导读:

  类功能分析:

  1. Request相关:

  1.1. Interface org.apache.jetspeed.request.RequestContext

  这个接口定义了许多可获取的上下文组件:

  包括:

  1.HttpRequest/Response;

  2.ServletConfig;

  3.ProfileLocater

  4.Pipeline

  5.Page

  6.ContentDispachter

  7.PortalURL

  8.ActionWindow

  9.CapabilityMap

  这样所有处理该RequestContext的组件都已包含在它自己里面了;只需在调用的过程中注入这些对象的实例即可。

  1.2. Class org.apache.jetspeed.container.ContainerRequest

  该类继承自HttpServletRequestWrapper,持有PortletDefinition和PortletRequest;

  1.3. Class org.apache.jetspeed.request.PortalRequest

  该类继承自HttpServletRequestWrapper,持有servletpath和contextpath和Httpsession;

  1.4. Interface org.apache.jetspeed.request.PortletRequest

  1.保存Request参数和取得参数的键;

  2.获取对应Portlet的模式;检查是否支持特定的模式;

  3.获取本地信息和权限信息;

  该类代表了一个 标准的访问portlet对象,功能如下:

  定义了一组常量用来从getAttribute()方法中获取客户端属性;

  public static final String USER_INFO = "javax.portlet.userinfo";

  public static final String FORM_AUTH = "FORM";

  public Object getAttribute(String name);

  ...

  定义了两个方法来获取模式和窗体状态:

  public PortletMode getPortletMode();

  public WindowState getWindowState();

  ...

  定义了一组方法来获取当前PortletRequest的Session:

  public PortletMode getPortletMode();

  public WindowState getWindowState();

  ...

  1.5.

  Interface org.apache.jetspeed.request.ActionRequest

  该类继承自PortletRequest,提供了Reader来读取PortletRequest中的内容;

  1.6. Interface org.apache.jetspeed.request.RendereRequest

  该类继承自PortletRequest,没有新增任何方法;

  1.7. Class org.apache.jetspeed.engine.servlet.ServletRequestImpl

  该类继承了HttpRequestWrapper,用来在PortletContainer内部传递Request请求;

  1.8. Class org.apache.jetspeed.container.invoker.LocalServletRequest

  该类封装了HttpRequestWrapper来提供一组属性值信息;

  1.9.

  Interface org.apache.jetspeed.aggregator.ContentDispatcher

  该接口提供一个方法从Fragment解析为PortletContent:

  PortletContent getPortletContent(Fragment fragment);

  ...

  2. Response相关:

  2.1. public class ContainerResponse extends HttpServletResponseWrapper

  封装了RenderResponse和ActionResponse,用来在容器内和被调用的Servlet通信;

  2.2. public class ContainerResponse extends HttpServletResponseWrapper

  包装了HttpServletResponse,通过:

  _getHttpServletResonse()方法获取其中的HttpServletResponse;

  encodeURL() 编码URL字符串;

  sendRedirect() 进行转发;

  2.3. class ServletResponseImpl extends HttpServletResponseWrapper implements PortletDispatcherIncludeAware

  对HttpServletResponseWrapper的又一次封装,只有包含include才使用它;

  2.4. interface PortletResponse

  定义了该接口来使Portlet容器和调用它的Client通信,定义了:

  public String encodeURL(String path); 用该方法来返回一个包含资源/应用数据的URL字符串;

  2.5. interface RenderResponse

  Portlet使用它来完成对客户端的相应;定义了:

  public PortletURL createRenderURL (); 方法来返回一个标示Portlet的具体URL,该URL 可能包含状态/模式等数据;

  public PortletURL createActionURL ();方法来返回一个标示Portlet的具体URL,该URL 可能包含状态/模式等数据;

  3. Servlet相关:

  3.1. class JetspeedServlet extends HttpServlet implements JetspeedEngineConstants, HttpSessionListener

  整个Portal引擎的入口,定义了如下的方法:

  public final void init( ServletConfig config )

  来完成启动引擎和获取相关资源的工作;

  public final void doGet( HttpServletRequest req, HttpServletResponse res )

  使用RequestContextComponent来创建用于和Portal通信的RequestContext;

  3.2. class JetspeedContainerServlet extends HttpServlet

  该类仅起到了路由请求的作用,并未提供任何上下文设置,定义了:

  public final void doGet(HttpServletRequest request, HttpServletResponse response)

  来完成根据request中设置的portletRequest/portletResponse的相关属性来选择交给目地Portlet的特定方法;

  4. Context相关:

  4.1. public interface PortalContext

  可以由该接口获取支持的窗体状态,portlet模式和启动属性等;

  4.2. public interface PortletContext

  可以由该接口获取支持的MIME-TYPE,PortletRequestDispatcher等;

  4.3. public class PortletRequestContext

  该类使用ThreadLocal来保存自己,并持有以下:

  private PortletDefinition pd;

  private Portlet portlet;

  

  private PortletRequest request

  private PortletResponse response;

  4.4. public class JetspeedPortletContext implements PortletContext, InternalPortletContext

  该类持有ServletContext和MutablePortletApplication,从而和ServletContext建立联系,可以使用任何ServletContext中的上下文组件,如RequestDispatcher和MIME-TYPE;

  5. Invoker相关:

  5.1. public interface PortletInvoker

  5.2. class ServletPortletInvoker implements JetspeedPortletInvoker

  完成跨越Application的Portlet调用(redirect到另一个应用的portlet),通过调用另一个应用的JetSpeedContainerServlet来路由请求;

  它使用一个ServletContext来获取另一个应用的ServletContext,如下:

  ServletContext appContext = jetspeedContext.getContext(portletApplicationName);

  再通过这个Context来获取Portlet;

  PortletInstance portletInstance = portletFactory.getPortletInstance(appContext, portletDefinition);

  它定义了如下方法来完成Invoker:

  protected void invoke(PortletRequest portletRequest, PortletResponse portletResponse, Integer methodID)

  该方法将在获取目地Portlet后在发送的servletRequest中设置如下信息:

  PORTLET;PORTLET_CONFIG;PORTLET_REQUEST;PORTLET_RESPONSE;METHOD_ID;PORTLET_NAME;PORTAL_CONTEXT

  然后使用Dispatcher来转发请求:

  dispatcher.include(servletRequest, servletResponse);

  6. URL相关:

  6.1. public interface PortletURL

  由RenderResponse创建(包含状态/模式/安全信息),使用PortletURL来代表Portlet自身;PortletURL可以包含一些不符合规范的应用数据,它们在portal中统一为正确的格式;它定义了:

  public String toString (); 使用该方法创建用于嵌入在HTML中的URL字符串;

  void setRequest(HttpServletRequest request); 使用该方法来注入用来生成URL的HttpServletRequest ;

  6.2. public interface PortalURL

  由Portal创建的在Portalneib使用的URL形式,定义了:

  NavigationalState getNavigationalState(); 来获取该URL的导航状态

  String createPortletURL(PortletWindow window, PortletMode mode, WindowState state, boolean secure);

  来创建对应该URL的 portletURL;

  6.3. public interface BasePortalURL

  定义了portal基本的URL信息,如下:

  boolean isSecure();

  void setSecure(boolean secure);

  String getServerName();

  void setServerName(String serverName);

  int getServerPort();

  void setServerPort(int serverPort);

  String getServerScheme();

  void setServerScheme(String serverScheme);

  6.4. public abstract class AbstractPortalURL implements PortalURL

  使用一组: protected static String navStateParameter;

  protected NavigationalState navState;

  来保存导航状态,使用navStateParameter来将状态保存在PortalContext中;

  6.5. public class PortletURLImpl implements PortalURL

  6.6. public interface PortletURLFactory

  public PortletURL getPortletURL(PortletWindow portletWindow,

  javax.servlet.http.HttpServletRequest servletRequest,

  javax.servlet.http.HttpServletResponse servletResponse)

  使用该方法从WIndow来创建一个PortletURL

  

  6.7. public interface PortletURLProvider

  6.8. public class PortletURLProviderImpl implements PortletURLProvider

  它包装了PortalURL和WIndow来完成创建PortletURL的任务;

  7. Pipeline相关:

  7.1. interface Pipeline

  管线是j2中所有阀的一个流程,Engine使用管线来完成所有在转发给portlet之前的RequestContext,定义了以下方法:

  void addValve(Valve valve); 增加一个新的阀

  void invoke(RequestContext context) 调用下一个阀处理RequestContext,直到有一个阀终至掉这个流程;

  7.2. class JetspeedPipeline implements Pipeline

  j2中管线的实现,它的invoke方法中使用Invocation来表示一次Valve调用,也使用Invocation来计数管线的调用位置:

  class Invocation implements ValveContext

  {

  private final Valve[] valves;

  private int at = 0;

  public Invocation(Valve[] valves)

  {

  this.valves = valves;

  }

  

  public void invokeNext(RequestContext request) throws PipelineException

  {

  if (at
  {

  Valve next = valves[at];

  at++;

  // 将自己传递给Valve完成Pipeline位置计数

  next.invoke(request, this);

  }

  }

  }

  8. Pipeline相关:

  8.1. interface Valve

  j2中的一个阀用来完成特定的功能,定义了:

  public void invoke(RequestContext request, ValveContext context) 完成处理RequestContext 的功能;

  j2中构建了具有以下功能的Valve来完成基本的任务:

  页面聚合;

  AJAX支持;

  性能;

  容器管理;

  页面修饰;

  布局管理;

  本地化;

  登陆;

  监测;

  安全性;

  8.2. class ActionValveImpl extends AbstractValve implements ActionValve

  它持有一个PortletContainer和PortletWindowAccessor来访问特定的Portlet;

  它用patchResponseCommitted字段标示回应是否已经完成了;

  在它的Invoke方法中,先解析出actionWindow及相应的Request,然后调用:

  container.processPortletAction(

  actionWindow,

  requestForWindow,

  response);

  来使用PortletContainer处理该请求;

  最后标明回应已经完成;

  8.3. class ContainerValve extends AbstractValve

  在它的Invoke方法中,从RequetstContext中解析出PortalURL,从PortalURL中解析出PortletWindow,然后设置该RequetstContext的PortletWindow属性,为调用AcitonValve做准备。

  PortalURL url = request.getPortalURL();

  PortletWindow actionWindow = url.getNavigationalState().getPortletWindowOfAction();

  // set the requested action window request.setActionWindow(actionWindow);

  8.4. class PortalURLValveImpl extends AbstractValve

  将根据RequestCOntext中encoder是否Desktop使用如下两种方式解析Navigation,并设置RequestCOntext的Navigation:

  request.setPortalURL(navComponent.createDesktopURL(request.getRequest(), request.getCharacterEncoding()));

  request.setPortalURL(navComponent.createURL(request.getRequest(), request.getCharacterEncoding()));

  9. NavigationalState相关:

  9.1. interface NavigationalState

  它是一个嵌入在URL中的字符串用来表示当前PortalURL的状态,可以从它获取ActionWindow和PortletMode/WindowState;

  9.2. interface NavigationalStateComponent

  提供一组用于从HttpServletRequest构造PortalURL的方法;


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zl198183/archive/2007/11/22/1897916.aspx