oo

Rendering Views with MVC Portlet

If you want users to access your portlet’s views, you must implement navigation to them. Portlet render URLs help you do this.

Here you’ll deploy an example application that uses portlet render URLs. You’ll examine how the portlet creates URLs that set the view path using use MVC Portlet’s mvcPath parameter.

The example portlet has two views: View 1 displays its name and a link to View 2, and vice-versa.

Here is View 1.

Deploy an MVC Portlet with Multiple Views

Here’s how to deploy the example portlet and navigate between its views. For learning purposes, the portlet logs the mvcPath parameter value.

Start a new Liferay instance by running

docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.112-ga112

Sign in to Liferay at http://localhost:8080. Use the email address test@liferay.com and the password test. When prompted, change the password to learn.

Then, follow these steps:

  1. Download and unzip the example.

    curl https://resources.learn.liferay.com/dxp/latest/en/building-applications/developing-a-java-web-application/using-mvc/liferay-c8m3.zip -O
    
    unzip liferay-c8m3.zip
    
  2. Build and deploy the example.

    cd liferay-c8m3
    
     ./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
    
    note

    This command is the same as copying module JARs to /opt/liferay/osgi/modules on the Docker container.

  3. Confirm the deployment in the Docker container console.

    STARTED com.acme.c8m3.web_1.0.0
    
  4. Add the C8M3 Portlet widget from the Samples category to a widget page. View 1 (the portlet’s default view) appears.

    You've added View 1 to a page.

    The following message prints to your log.

    MVC path null
    

    The render request doesn’t yet include an MVC path parameter. This is expected. The portlet renders View 1 by default using the portlet class (described later). The next step uses the MVC path parameter.

  5. Click Go to View 2. View 2 appears.

    You navigated to View 2.

    The log message shows the MVC path value /view_2.jsp—the path to the View 2 template.

    MVC path /view_2.jsp
    
  6. Click Go to View 1. View 1 appears again.

    You navigated back to View 1.

    The log message prints the MVC path /view_1.jsp.

     MVC path /view_1.jsp
    

You’ve made the round trip between the portlet views. Next, learn how the portlet sets a default view and sets paths to views using render URLs and the MVC path request parameter.

Setting the Default View

A portlet’s default view renders when users first land on the portlet’s page. An initialization parameter in the portlet class sets the default view. The C8M3Portlet.java example class sets the default view in its @Component annotation.

@Component(
	property = {
		"com.liferay.portlet.display-category=category.sample",
		"javax.portlet.display-name=C8M3 Portlet",
		"javax.portlet.init-param.view-template=/view_1.jsp"
	},
	service = Portlet.class
)
public class C8M3Portlet extends MVCPortlet {

The @Component property "javax.portlet.init-param.view-template=/view1.jsp" specifies /view1.jsp as the default view template. The template path is relative to the portlet’s src/main/resources/META-INF/resources folder.

Next, learn how View 1 links to View 2.

Linking to a View Using a Portlet Render URL

View 1 has only a heading called View 1 and a link labeled Go to View 2. Here’s the view1.jsp code:

<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>

<h4>C8M3 Portlet</h4>

<h5>View 1</h5>

<portlet:renderURL var="view2URL">
	<portlet:param name="mvcPath" value="/view_2.jsp" />
</portlet:renderURL>

<a href="<%= view2URL %>">Go to View 2</a>

The portlet:renderURL tag comes from the portlet taglib and is assigned the prefix portlet. The render URL above is assigned to the variable view2URL. The render URL declares the portlet:param named mvcPath the value /view_2.jsp. When the portlet renders, the mvcPath parameter is added to the portlet’s RenderRequest object. On processing portlet requests, MVCPortlet renders the template assigned to mvcPath.

A render URL must be bound to a UI component, such as a hyperlink or buttons, for the portlet to use the URL. The hyperlink <a href="<%= view2URL %>">Go to View 2</a> binds the render URL to a UI component.

When a user clicks on the Go to View 2 hyperlink, a portlet request that includes the mvcPath parameter is sent to the portlet class.

Handling the mvcPath Portlet Parameter

When a portlet receives the request object, it can respond to the request object parameters. C8M3Portlet’s render method responds to render requests.

@Override
public void render(
		RenderRequest renderRequest, RenderResponse renderResponse)
	throws IOException, PortletException {

	if (_log.isInfoEnabled()) {
		String mvcPath = renderRequest.getParameter("mvcPath");

		_log.info("MVC path " + mvcPath);
	}

	super.render(renderRequest, renderResponse);
}

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

C8M3Portlet’s render method logs the mvcPath parameter value and then delegates rendering the portlet to the superclass MVCPortlet. MVCPortlet renders the view assigned to the mvcPath portlet request parameter.

note

In the absence of an mvcPath request parameter, MVCPortlet displays its default template (i.e., the template that the javax.portlet.init-param.view-template component property specifies).

The View 2 template view2.jsp maps back to view1.jsp using a portlet render URL too.

<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>

<h4>C8M3 Portlet</h4>

<h5>View 2</h5>

<portlet:renderURL var="view1URL">
	<portlet:param name="mvcPath" value="/view_1.jsp" />
</portlet:renderURL>

<a href="<%= view1URL %>">Go to View 1</a>

It implements the round trip back to View 1.

What’s Next

Now you know how to render portlet views. Next, you can perform actions in your portlet or render your views using separate RenderCommand classes.