导读:
类功能分析:
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的方法;
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/zl198183/archive/2007/11/22/1897916.aspx