/**
 * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */

package com.liferay.util.bridges.mvc;

import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.portlet.LiferayPortlet;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.PortalClassInvoker;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.util.PortalUtil;

import java.io.IOException;

import java.util.List;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.EventRequest;
import javax.portlet.EventResponse;
import javax.portlet.PortletConfig;
import javax.portlet.PortletException;
import javax.portlet.PortletRequest;
import javax.portlet.PortletRequestDispatcher;
import javax.portlet.PortletResponse;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;
import javax.portlet.WindowState;

/**
 * @author Brian Wing Shun Chan
 */
public class MVCPortlet extends LiferayPortlet {

    public void doAbout(
            RenderRequest renderRequest, RenderResponse renderResponse)
        throws IOException, PortletException {

        include(aboutJSP, renderRequest, renderResponse);
    }

    public void doConfig(
            RenderRequest renderRequest, RenderResponse renderResponse)
        throws IOException, PortletException {

        include(configJSP, renderRequest, renderResponse);
    }

    public void doEdit(
            RenderRequest renderRequest, RenderResponse renderResponse)
        throws IOException, PortletException {

        if (renderRequest.getPreferences() == null) {
            super.doEdit(renderRequest, renderResponse);
        }
        else {
            include(editJSP, renderRequest, renderResponse);
        }
    }

    public void doEditDefaults(
            RenderRequest renderRequest, RenderResponse renderResponse)
        throws IOException, PortletException {

        if (renderRequest.getPreferences() == null) {
            super.doEdit(renderRequest, renderResponse);
        }
        else {
            include(editDefaultsJSP, renderRequest, renderResponse);
        }
    }

    public void doEditGuest(
            RenderRequest renderRequest, RenderResponse renderResponse)
        throws IOException, PortletException {

        if (renderRequest.getPreferences() == null) {
            super.doEdit(renderRequest, renderResponse);
        }
        else {
            include(editGuestJSP, renderRequest, renderResponse);
        }
    }

    public void doHelp(
            RenderRequest renderRequest, RenderResponse renderResponse)
        throws IOException, PortletException {

        include(helpJSP, renderRequest, renderResponse);
    }

    public void doPreview(
            RenderRequest renderRequest, RenderResponse renderResponse)
        throws IOException, PortletException {

        include(previewJSP, renderRequest, renderResponse);
    }

    public void doPrint(
            RenderRequest renderRequest, RenderResponse renderResponse)
        throws IOException, PortletException {

        include(printJSP, renderRequest, renderResponse);
    }

    public void doView(
            RenderRequest renderRequest, RenderResponse renderResponse)
        throws IOException, PortletException {

        include(viewJSP, renderRequest, renderResponse);
    }

    public void init() throws PortletException {
        super.init();

        jspPath = getInitParameter("jsp-path");

        if (Validator.isNull(jspPath)) {
            jspPath = StringPool.SLASH;
        }
        else if (jspPath.contains(StringPool.BACK_SLASH) ||
                 jspPath.contains(StringPool.DOUBLE_SLASH) ||
                 jspPath.contains(StringPool.PERIOD) ||
                 jspPath.contains(StringPool.SPACE)) {

            throw new PortletException(
                "jsp-path " + jspPath + " has invalid characters");
        }
        else if (!jspPath.startsWith(StringPool.SLASH) ||
                 !jspPath.endsWith(StringPool.SLASH)) {

            throw new PortletException(
                "jsp-path " + jspPath + " must start and end with a /");
        }

        aboutJSP = getInitParameter("about-jsp");
        configJSP = getInitParameter("config-jsp");
        editJSP = getInitParameter("edit-jsp");
        editDefaultsJSP = getInitParameter("edit-defaults-jsp");
        editGuestJSP = getInitParameter("edit-guest-jsp");
        helpJSP = getInitParameter("help-jsp");
        previewJSP = getInitParameter("preview-jsp");
        printJSP = getInitParameter("print-jsp");
        viewJSP = getInitParameter("view-jsp");

        clearRequestParameters = GetterUtil.getBoolean(
            getInitParameter("clear-request-parameters"));
        copyRequestParameters = GetterUtil.getBoolean(
            getInitParameter("copy-request-parameters"));

        String packagePrefix = getInitParameter(
            ActionCommandCache.ACTION_PACKAGE_NAME);

        if (Validator.isNotNull(packagePrefix)) {
            _actionCommandCache = new ActionCommandCache(packagePrefix);
        }
    }

    public void invokeTaglibDiscussion(
            ActionRequest actionRequest, ActionResponse actionResponse)
        throws Exception {

        PortletConfig portletConfig = getPortletConfig();

        PortalClassInvoker.invoke(
            true,
            "com.liferay.portlet.messageboards.action.EditDiscussionAction",
            "processAction",
            new String[] {
                "org.apache.struts.action.ActionMapping",
                "org.apache.struts.action.ActionForm",
                PortletConfig.class.getName(), ActionRequest.class.getName(),
                ActionResponse.class.getName()
            },
            null, null, portletConfig, actionRequest, actionResponse);
    }

    public void processAction(
            ActionRequest actionRequest, ActionResponse actionResponse)
        throws IOException, PortletException {

        super.processAction(actionRequest, actionResponse);

        if (copyRequestParameters) {
            PortalUtil.copyRequestParameters(actionRequest, actionResponse);
        }
    }

    public void serveResource(
            ResourceRequest resourceRequest, ResourceResponse resourceResponse)
        throws IOException, PortletException {

        String jspPage = resourceRequest.getParameter("jspPage");

        if (jspPage != null) {
            include(
                jspPage, resourceRequest, resourceResponse,
                PortletRequest.RESOURCE_PHASE);
        }
        else {
            super.serveResource(resourceRequest, resourceResponse);
        }
    }

    protected boolean callActionMethod(
            ActionRequest request, ActionResponse response)
        throws PortletException {

        if (_actionCommandCache == null) {
            return super.callActionMethod(request, response);
        }

        String actionName = ParamUtil.getString(
            request, ActionRequest.ACTION_NAME);

        if (!actionName.contains(StringPool.COMMA)) {
            ActionCommand actionCommand = _actionCommandCache.getActionCommand(
                actionName);

            if (actionCommand != ActionCommandCache.EMPTY) {
                return actionCommand.processCommand(request, response);
            }
        }
        else {
            List<ActionCommand> actionCommands =
                _actionCommandCache.getActionCommandChain(actionName);

            if (actionCommands.isEmpty()) {
                return false;
            }

            for (ActionCommand actionCommand : actionCommands) {
                if (!actionCommand.processCommand(request, response)) {
                    return false;
                }
            }

            return true;
        }

        return false;
    }

    protected void checkJSPPath(String path) throws PortletException {
        if (!path.startsWith(jspPath) ||
            path.contains(StringPool.DOUBLE_PERIOD) ||
            !PortalUtil.isValidResourceId(path)) {

            throw new PortletException(
                "Path " + path + " is not accessible by this portlet");
        }
    }

    protected void doDispatch(
            RenderRequest renderRequest, RenderResponse renderResponse)
        throws IOException, PortletException {

        String jspPage = renderRequest.getParameter("jspPage");

        if (jspPage != null) {
            if (!isProcessRenderRequest(renderRequest)) {
                renderRequest.setAttribute(
                    WebKeys.PORTLET_DECORATE, Boolean.FALSE);

                return;
            }

            WindowState windowState = renderRequest.getWindowState();

            if (windowState.equals(WindowState.MINIMIZED)) {
                return;
            }

            include(jspPage, renderRequest, renderResponse);
        }
        else {
            super.doDispatch(renderRequest, renderResponse);
        }
    }

    protected void include(
            String path, ActionRequest actionRequest,
            ActionResponse actionResponse)
        throws IOException, PortletException {

        include(
            path, actionRequest, actionResponse, PortletRequest.ACTION_PHASE);
    }

    protected void include(
            String path, EventRequest eventRequest, EventResponse eventResponse)
        throws IOException, PortletException {

        include(path, eventRequest, eventResponse, PortletRequest.EVENT_PHASE);
    }

    protected void include(
            String path, PortletRequest portletRequest,
            PortletResponse portletResponse, String lifecycle)
        throws IOException, PortletException {

        PortletRequestDispatcher portletRequestDispatcher =
            getPortletContext().getRequestDispatcher(path);

        if (portletRequestDispatcher == null) {
            _log.error(path + " is not a valid include");
        }
        else {
            checkJSPPath(path);

            portletRequestDispatcher.include(portletRequest, portletResponse);
        }

        if (clearRequestParameters) {
            if (lifecycle.equals(PortletRequest.RENDER_PHASE)) {
                portletResponse.setProperty("clear-request-parameters", "true");
            }
        }
    }

    protected void include(
            String path, RenderRequest renderRequest,
            RenderResponse renderResponse)
        throws IOException, PortletException {

        include(
            path, renderRequest, renderResponse, PortletRequest.RENDER_PHASE);
    }

    protected void include(
            String path, ResourceRequest resourceRequest,
            ResourceResponse resourceResponse)
        throws IOException, PortletException {

        include(
            path, resourceRequest, resourceResponse,
            PortletRequest.RESOURCE_PHASE);
    }

    private static Log _log = LogFactoryUtil.getLog(MVCPortlet.class);

    protected ActionCommandCache _actionCommandCache;

    protected String aboutJSP;
    protected boolean clearRequestParameters;
    protected String configJSP;
    protected boolean copyRequestParameters;
    protected String editDefaultsJSP;
    protected String editGuestJSP;
    protected String editJSP;
    protected String helpJSP;
    protected String jspPath;
    protected String previewJSP;
    protected String printJSP;
    protected String viewJSP;

}

 

注释:

    JSP中使用ActionURL标签的时候会调用processAction方法。如果设置ACTION_NAME参数的话,会直接跑设置的那个方法。

    JSP中使用RenderURL标签的时候会调用doView方法。

    JSP中使用ResourceURL标签的时候会调用serveResource方法。AJAX的时候好像用这个方式比较好。文件下载也用这个方法较好。

    参数中jspPage也是很有用的。可以控制跳转。

 

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐