Portlet开发入门实例
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Portlet开发入门实例相关的知识,希望对你有一定的参考价值。
参考技术A原生Portlet开发
这是最简单 最本质的开发方式 直接基于Portlet规范定义的接口开发Portlet 优点是贴近底层比较灵活
缺点当然就是所有事情都要自己去做 就好比不用SpringMVC Struts 直接基于Servlet开发一样
这种方式比较适合自己开发Portlet框架
public class NativePortlet implements Portlet
private Logger logger = LoggerFactory getLogger(NativePortlet class);
private PortletConfig config;
@Override
public void init(PortletConfig portletConfig) throws PortletException
( 初始化Portlet );
nfig = portletConfig;
@Override
public void processAction(ActionRequest actionRequest ActionResponse actionResponse) throws PortletException IOException
( 处理Action动作 );
( 接收到POST请求 用户名为[] actionRequest getParameter( userName ));
@Override
public void render(RenderRequest renderRequest RenderResponse renderResponse) throws PortletException IOException
( 处理Render动作 );
WindowState state = renderRequest getWindowState();
if (state equals(WindowState MINIMIZED))
return;
// doDispatch();
PortletMode mode = renderRequest getPortletMode();
if (PortletMode VIEW equals(mode))
// doView();
String normalPage = config getInitParameter( ViewPage );
if (WindowState NORMAL equals(state))
this include(renderRequest renderResponse normalPage);
else
this include(renderRequest renderResponse );
else if (PortletMode EDIT equals(mode))
// doEdit();
else if (PortletMode HELP equals(mode))
// doHelp();
else
throw new PortletException( unknown portlet mode: + mode);
@Override
public void destroy()
( 销毁Portlet );
private void include(RenderRequest request RenderResponse response String viewPage) throws PortletException IOException
response setContentType( text/ );
PortletContext context = config getPortletContext();
PortletRequestDispatcher requestDispatcher = context getRequestDispatcher(viewPage);
requestDispatcher include(request response);
可以看到 在render()方法中 我们要自己处理不同Portlet模式(View Edit Help等)的渲染 根据需要做分发
诸如此类的各种细节都需要我们自己去制定规则 自己处理
注解Portlet开发
Portlet规范也提供了注解的方式来开发Portlet 这样不用依赖SpringMVC Portlet等第三方框架
也能比较方便的开发Portlet 又不用处理特别底层的实现细节 来看一个例子
public class AnnotatedPortlet extends GenericPortlet
private Logger logger = LoggerFactory getLogger(AnnotatedPortlet class);
/**
* 进入主页面(View模式)
* @param request
* @param response
* @throws Exception
*/
@RenderMode(name = view )
public void toIndexPage(RenderRequest request RenderResponse response) throws Exception
getPortletContext()
getRequestDispatcher(getInitParameter( ViewPage ))
include(request response);
/**
* 保存用户名
* @param request
* @param response
*/
@ProcessAction(name = saveUsername )
public void saveUsername(ActionRequest request ActionResponse response)
String userName = request getParameter( userName );
( 保存用户名[] userName);
/**
* 保存电子邮件地址
* @param request
* @param response
*/
@ProcessAction(name = saveEmail )
public void saveEmail(ActionRequest request ActionResponse response)
String email = request getParameter( email );
( 保存Email[] email);
使用@RenderMode注解定义不同模式下 Portlet渲染的实现方法 @ProcessAction注解可以根据动作名称
直接将请求交给标有注解的方法去处理 不用我们自己去实现根据注解分发请求的代码了
lishixinzhi/Article/program/Java/hx/201311/26248
Liferay7 BPM门户开发之36: 使用Portlet filters过滤器做切面AOP
使用Portlet filters过滤器做切面AOP
Portlet Filters定义于JSR286 Java Portlet Specification 2.0 Portlet Filters
是为了在4个生命周期的过程中,提供外部的AOP支持,这非常不显眼,但也很有用,比如可以用在Liferay的Hook开发中。
JSR286 Java Portlet Specification 2.0 的更多介绍:
http://www.ibm.com/developerworks/websphere/library/techarticles/0803_hepper/0803_hepper.html
针对不同周期的4个过滤器Portlet filters:
- javax.portlet.filter.ResourceFilter - For serveResource method
- javax.portlet.filter.RenderFilter - For render method
- javax.portlet.filter.ActionFilter - For processAction method
- javax.portlet.filter.EventFilter - For processEvent method
可以看到,这个是属于javax.portlet.filter包,而不是liferay私有的,只是liferay对JSR286的实现较完整,提供了这种过滤机制。
Portlet filters除了可以实现Hook,还能实现不修改原portlet代码前提下的扩展,核心思想就是AOP,能够在生命周期方法之后或者之前做额外动作开发。
XXXXXXFilter其实是一个接口,主要方法:
- init(javax.portlet.filter.FilterConfig filterConfig)
- doFilter (*Request, *Response, FilterChain chain)
我们主要是要实现doFilter方法。
用例子来说明,比如在提交操作时,不用改动原代码,嵌入一个计数器。
先要通过property = {"javax.portlet.name=Your_portlet_Name"} 定义需要监听的Portlet,这步比较关键
import javax.portlet.PortletException; import javax.portlet.RenderRequest; import javax.portlet.RenderResponse; import javax.portlet.filter.FilterChain; import javax.portlet.filter.FilterConfig; import javax.portlet.filter.PortletFilter; import javax.portlet.filter.RenderFilter; import org.osgi.service.component.annotations.Component; @Component( immediate = true, property = {"javax.portlet.name=Your_portlet_Name"}, service = PortletFilter.class ) public class HitCounterFilter implements RenderFilter { int count; @Override public void doFilter(RenderRequest renderRequest, RenderResponse renderResponse, FilterChain filterChain) throws IOException, PortletException { System.out.println("==============="); System.out.println("显示数: " +count); System.out.println("==============="); . . . System.out.println("Before filter"); filterChain.doFilter(renderRequest, renderResponse); System.out.println("After filter"); } @Override public void destroy() { } @Override public void init(FilterConfig filterConfig) throws PortletException { } }
以上是关于Portlet开发入门实例的主要内容,如果未能解决你的问题,请参考以下文章