原生Portlet开发 这是最简单最本质的开发方式直接基于Portlet规范定义的接口开发Portlet优点是贴近底层比较灵活 缺点当然就是所有事情都要自己去做就好比不用SpringMVCStruts直接基于Servlet开发一样 这种方式比较适合自己开发Portlet框架 public class NativePortlet implements Portlet { private Logger logger = LoggerFactorygetLogger(NativePortletclass); 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请求用户名为[{}] actionRequestgetParameter(userName)); } @Override public void render(RenderRequest renderRequest RenderResponse renderResponse) throws PortletException IOException { (处理Render动作); WindowState state = renderRequestgetWindowState(); if (stateequals(WindowStateMINIMIZED)) { return; } // doDispatch(); PortletMode mode = renderRequestgetPortletMode(); if (PortletModeVIEWequals(mode)) { // doView(); String normalPage = configgetInitParameter(ViewPage); if (WindowStateNORMALequals(state)) { thisinclude(renderRequest renderResponse normalPage); } else { thisinclude(renderRequest renderResponse ); } } else if (PortletModeEDITequals(mode)) { // doEdit(); } else if (PortletModeHELPequals(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 { responsesetContentType(text/html); PortletContext context = configgetPortletContext(); PortletRequestDispatcher requestDispatcher = contextgetRequestDispatcher(viewPage); requestDispatcherinclude(request response); } } 可以看到在render()方法中我们要自己处理不同Portlet模式(ViewEditHelp等)的渲染根据需要做分发 诸如此类的各种细节都需要我们自己去制定规则自己处理 注解Portlet开发 Portlet规范也提供了注解的方式来开发Portlet这样不用依赖SpringMVC Portlet等第三方框架 也能比较方便的开发Portlet又不用处理特别底层的实现细节来看一个例子 public class AnnotatedPortlet extends GenericPortlet { private Logger logger = LoggerFactorygetLogger(AnnotatedPortletclass); /** * 进入主页面(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 = requestgetParameter(userName); (保存用户名[{}] userName); } /** * 保存电子邮件地址 * @param request * @param response */ @ProcessAction(name = saveEmail) public void saveEmail(ActionRequest request ActionResponse response) { String email = requestgetParameter(email); (保存Email[{}] email); } } 使用@RenderMode注解定义不同模式下Portlet渲染的实现方法@ProcessAction注解可以根据动作名称 直接将请求交给标有注解的方法去处理不用我们自己去实现根据注解分发请求的代码了 附其他代码 页面代码如下使用Portlet规范中定义的标签产生ActionUrl <%@ page language=java contentType=text/html; charset=UTF pageEncoding=UTF%> <%@ taglib uri=_rt prefix=c%> <%@ taglib uri= prefix=fmt%> <%@ taglib uri= prefix=fn%> <%@ taglib uri=__ prefix=portlet%> <portlet:defineObjects /> <h>这是一个演示FORM表单和AJAX提交的示例程序</h> <! FORM表单提交实例 > <form action=<portlet:actionURL name=saveUsername/> method=POST> <tr> <td>用户名</td> <td><input name=userName type=text /></td> </tr> <tr> <td><input type=submit value=表单提交 /></td> </tr> </form> <! AJAX提交实例 ><tr> <td>Email:</td> <td><input id=email type=text/></td></tr><tr> <input id=ajaxBtn type=button value=AJAX提交 /></tr><script> $(ajaxBtn)bind(click function () { var email = $(email)valueOf() jQueryajax({ type: GET async: true url: <portlet:actionURL name=saveEmail /> dataType: json data: { email: email } success: function (data) { alert(data) } error: function (data status e) { alert(e) } beforeSend: function () { } complete: function () { } }) }) </script> |