与其闭门造车,不如直接开动原装、进口、免费的法拉利。 -- 作者说
不多说废话,直接上代码。
ParamUtil
ParamUtil、GetterUtil是Liferay最重要的帮助类
- ParamUtil用途:获取PortletRequest的参数值,并作类型转换和判空处理(内部机制是通过GetterUtil)
- GetterUtil用途:对输入做类型转换、判空处理、赋予默认值(即期望的获取值为空时侯的初始值)
ParamUtil的使用例子1:
public void deleteInterview(ActionRequest actionRequest, ActionResponse actionResponse)throws Exception {long interviewId = ParamUtil.getLong(actionRequest, "interviewId");InterviewLocalServiceUtil.deleteInterview(interviewId);sendRedirect(actionRequest, actionResponse); }
ParamUtil的使用例子2:
public void updateQuestion(ActionRequest actionRequest, ActionResponse actionResponse)throws Exception {long questionId = ParamUtil.getLong(actionRequest, "questionId");long questionSetId = ParamUtil.getLong(actionRequest, "questionSetId");String title = ParamUtil.getString(actionRequest, "title");String description = ParamUtil.getString(actionRequest, "description");int type = ParamUtil.getInteger(actionRequest, "type");ServiceContext serviceContext = ServiceContextFactory.getInstance(actionRequest);try {if (questionId <= 0) {QuestionLocalServiceUtil.addQuestion(questionSetId, title, description, type, serviceContext);}else {QuestionLocalServiceUtil.updateQuestion(questionId, title, description, type, serviceContext);}}catch (Exception e) {...}sendRedirect(actionRequest, actionResponse); }
ParamUtil可以通过get来直接获取PortletRequest参数,如:
public static short get(PortletRequest portletRequest, String param, short defaultValue) {return GetterUtil.get(portletRequest.getParameter(param), defaultValue);}public static String get(PortletRequest portletRequest, String param, String defaultValue) {String returnValue =GetterUtil.get(portletRequest.getParameter(param), defaultValue);if (returnValue != null) {return returnValue.trim();}return null;}
也可以通过类似getInteger、getLong 获取单一值和获取数组的getIntegerValues、getLongValues之类的方法(用于checkbox的提交)实际都是一样的。
区别是getIntegerValues、getLongValues的返回值是通过调用GetterUtil
public static int getInteger(HttpServletRequest request, String param) {return GetterUtil.getInteger(request.getParameter(param));}public static int getInteger(HttpServletRequest request, String param, int defaultValue) {return get(request, param, defaultValue);}public static int[] getIntegerValues(HttpServletRequest request, String param) {return getIntegerValues(request, param, new int[0]);}public static int[] getIntegerValues(HttpServletRequest request, String param, int[] defaultValue) {return GetterUtil.getIntegerValues(request.getParameterValues(param), defaultValue);}
同时,还可以通过print来打印参数输出,方便程序员使用
public static void print(PortletRequest portletRequest) {Enumeration<String> enu = portletRequest.getParameterNames();while (enu.hasMoreElements()) {String param = enu.nextElement();String[] values = portletRequest.getParameterValues(param);for (int i = 0; i < values.length; i++) {System.out.println(param + "[" + i + "] = " + values[i]);}}}
另外较高版本增加了ServiceContext的参数
static float getFloat(ServiceContext serviceContext, String param, float defaultValue) static float[] getFloatValues(ServiceContext serviceContext, String param, float[] defaultValue)
GetterUtil
GetterUtil的代码,就不具体解释了
可以访问:
https://docs.liferay.com/portal/5.1/javadocs/portal-kernel/com/liferay/portal/kernel/util/GetterUtil.java.html
GetterUtil的使用例子:发送request属性到jsp
//java:
package com.liferay.docs.exampleserviceconsumerportlet;import java.io.IOException; import javax.portlet.Portlet; import javax.portlet.PortletException; import javax.portlet.RenderRequest; import javax.portlet.RenderResponse; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; import com.liferay.portal.kernel.portlet.bridges.mvc.MVCPortlet; import com.liferay.portal.service.UserLocalService; import com.liferay.bookmarks.service.BookmarksFolderLocalService;@Component(immediate = true,property = {"com.liferay.portlet.display-category=category.sample","com.liferay.portlet.instanceable=true","javax.portlet.display-name=Example Service Consumer Portlet","javax.portlet.init-param.template-path=/","javax.portlet.init-param.view-template=/view.jsp","javax.portlet.security-role-ref=power-user,user"},service = Portlet.class ) public class ExampleServiceConsumerPortlet extends MVCPortlet {@Overridepublic void doView(RenderRequest request, RenderResponse response)throws IOException, PortletException {int userCount = getUserLocalService().getUsersCount();request.setAttribute("USER_COUNT", userCount);int bookmarksFolderCount =getBookmarksFolderLocalService().getBookmarksFoldersCount();request.setAttribute("BOOKMARKS_FOLDER_COUNT", bookmarksFolderCount);super.doView(request, response);}public BookmarksFolderLocalService getBookmarksFolderLocalService() {return _bookmarksFolderLocalService;}public UserLocalService getUserLocalService() {return _userLocalService;}@Referencepublic void setBookmarksFolderLocalService(BookmarksFolderLocalService bookmarksFolderLocalService) {_bookmarksFolderLocalService = bookmarksFolderLocalService;}@Referencepublic void setUserLocalService(UserLocalService userLocalService) {_userLocalService = userLocalService;}private UserLocalService _userLocalService;private BookmarksFolderLocalService _bookmarksFolderLocalService; }
//jsp:
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %> <%@ page import="com.liferay.portal.kernel.util.GetterUtil" %> <portlet:defineObjects /><% int userCount = GetterUtil.getInteger(renderRequest.getAttribute("USER_COUNT")); int bookmarksFolderCount = GetterUtil.getInteger(renderRequest.getAttribute("BOOKMARKS_FOLDER_COUNT")); %><p>The portal has <%= userCount %> users.</p> <p>The portal has <%= bookmarksFolderCount %> bookmarks folders.</p>
GetterUtil和ParamUtil的区别是:ParamUtil是解析请求专用类,而GetterUtil是通用的类型转换输出类
使用这两个类ParamUtil、GetterUtil的好处显而易见,如果配合Validator类,像判空、类型转换、验证的大段代码可以大大的省略,非常简洁