Liferay7 BPM门户开发之29: 核心kernel.util包下面的通用帮助类ParamUtil、GetterUtil使用

与其闭门造车,不如直接开动原装、进口、免费的法拉利。 -- 王昕

不多说废话,直接上代码。

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 {

    @Override
    public 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;
    }

    @Reference
    public void setBookmarksFolderLocalService(
            BookmarksFolderLocalService bookmarksFolderLocalService) {

        _bookmarksFolderLocalService = bookmarksFolderLocalService;
    }

    @Reference
    public 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类,像判空、类型转换、验证的大段代码可以大大的省略,非常简洁

时间: 2024-11-07 22:23:54

Liferay7 BPM门户开发之29: 核心kernel.util包下面的通用帮助类ParamUtil、GetterUtil使用的相关文章

Liferay7 BPM门户开发之37: Liferay7下的OSGi Hook集成开发

hook开发是Liferay客制扩展的一种方式,比插件灵活,即可以扩展liferay门户,也能对原有特性进行更改,Liferay有许多内置的服务,比如用hook甚至可以覆盖Liferay服务. 可作为系统服务挂钩(Liferay Service Hook),还有其他类型的hook... Liferay6.2 时的hook开发比较有限,而在Liferay7则大为不同,OSGi services的彻底改进至Liferay的底层模型框架,使得Liferay可以支持更多的定制扩展!OSGi plugin

Liferay7 BPM门户开发之17: Portlet 生命周期

Portlet 生命周期 init() =〉 render() =〉 processAction() =〉 processEvent() =〉 serveResource() =〉destroy() init() 在Liferay容器部署portlet时,启动portlet实例化 init有两个写法: public void init() throws PortletException public void init(PortletConfig config) throws PortletEx

Liferay7 BPM门户开发之39: Form表单提交的ProcessAction处理

在v6.2开始后,需要设置<requires-namespaced-parameters>false</requires-namespaced-parameters>  来避免在jsp中写<portlet:namespace/>的input前缀 在v7.0发现,注解方式是不灵的! 即  "javax.portlet.requires-namespaced-parameters=false", 无效果, 真是汗... 但我们是有办法在7.0中解决的,直

Liferay7 BPM门户开发之41: Expando API入门

Expando 是liferay的一种自定义表格扩展的方式,从5.0就已存在 , 可以在运行时新建表格\字段\行\值. 这是一种Service Builder之外的轻量级替代扩展方式,不必像Service Builder那么繁琐, 实现的具体技术实际上是列转行,其中ExpandoValue有点像Activiti的act_ru_variable 主要有4种接口,分别是表\行\列\值 ExpandoTableLocalServiceUtil ExpandoRowLocalServiceUtil Ex

Liferay7 BPM门户开发之44: 集成Activiti展示流程列表

集成Activiti之前,必须搞清楚其中的依赖关系,才能在Gradle里进行配置. 依赖关系: 例如,其中activiti-engine依赖于activiti-bpmn-converter,而activiti-bpmn-converter又依赖于activiti-bpmn-model 那么这以下的引用都是要设置的,缺一不可,否则portlet会无法注入进OSGi容器 org.activiti:activiti-engine:jar:5.xx.0+- org.activiti:activiti-b

Liferay7 BPM门户开发之40: Form表单的Action到Render的数据传递

在Form提交后的变量,很多情况是要展现在jsp页面中,这时Action到Render的变量传递就非常有用. 例如,您在数据库中添加了学生的详细信息. 为了实现这一需求,先创建Form表单(学生的细节,如姓名.出生日期等,通过action url来实现). 当用户提交表单时,这些数据(学生信息)会在你执行CRUD操作的action方法添加. 添加完成后,需要把一些信息展现到jsp页面. 和v6.2不同的是,action方法里不需要写类似这样的语句: actionResponse.setRende

Liferay7 BPM门户开发之33: Portlet之间通信的3种方式(session、IPC Render Parameter、IPC Event、Cookies)

文章介绍了5种方式,4种是比较常用的: Portlet session IPC Public Render Parameters IPC Event Cookies 参考地址: https://web.liferay.com/zh/community/wiki/-/wiki/Main/Portlet%E9%97%B4%E7%9A%84%E9%80%9A%E4%BF%A1 方式1:Session portlet session作用域: APPLICATION_SCOPE  :全局 PORTLET_

Liferay7 BPM门户开发之30: 通用帮助类Validator、ArrayUtil、StringUtil等使用

简单.优雅.有序才是真的美   -- 王昕 废话不多说,直接上代码. 验证类Validator 主要是空验证.数字.格式验证 调用的例子: protected void validateEmailFrom(ActionRequest actionRequest){ String emailFromName = getParameter(actionRequest, "emailFromName"); String emailFromAddress = getParameter( act

Liferay7 BPM门户开发之42: Liferay核心JSP定制扩展

Liferay最大的好处是不仅接口强大,利于扩展,就连JSP定制扩展都提供了3种方式. 修改核心jsp代码,有3种修改方式:1.暴力修改直接修改(位于portal-web/docroot/html),编译部署,会带来风险,而且不能同步更新. 2.全量扩展修改热部署jsp文件(替代原有jsp),这是v7.0下的OSGi方式,实现方式非常优雅. 3.CustomJspBag Hook方式实现CustomJspBag接口,做jsp片段式的修改,同样是增量热部署,也是v7.0下的OSGi方式(需要增加依