Skip to content

Portlet Basics

Portlets are the building blocks of Liferay applications. They are modular, reusable web components that render fragments of HTML inside a portal page.

NOTE: This document is compiled in the reference of Liferay 7.4 and above


  • A Java-based web component that generates dynamic content.
  • Runs inside a Portlet Container (Liferay’s OSGi runtime).
  • Supports multiple modes (View, Edit, Config) and window states (Normal, Maximized, Minimized).
graph LR
    A[View Mode] -->|Default| B[Render Content]
    C[Edit Mode] -->|User Preferences| D[Customize UI]
    E[Help Mode] -->|Documentation| F[Show Help]
graph LR
    A[Normal] -->|Default| B[Part of Page]
    C[Maximized] -->|Full Page| D[Expanded View]
    E[Minimized] -->|Icon Only| F[Collapsed]

  • Uses JSPs for rendering.
  • Best for simple UIs and legacy applications.
@Component(
immediate = true,
property = {
"javax.portlet.name=com_example_MyPortlet",
"javax.portlet.display-name=My MVC Portlet"
},
service = Portlet.class
)
public class MyMVCPortlet extends MVCPortlet {
@Override
public void render(RenderRequest request, RenderResponse response) {
request.setAttribute("message", "Hello from MVC Portlet!");
super.render(request, response);
}
}
  • Uses JavaScript frameworks (via Liferay’s npm tools).
  • Best for modern SPAs inside Liferay.
Terminal window
blade create -t npm-react-portlet my-react-portlet
src/index.js
export default function () {
return <h1>Hello from React Portlet!</h1>;
}
  • Uses Spring Framework for dependency injection.
  • Best for enterprise apps needing Spring integration.
@Controller
@RequestMapping("VIEW")
public class MySpringPortlet {
@RenderMapping
public String view(Model model) {
model.addAttribute("message", "Hello from Spring Portlet!");
return "view";
}
}
  • Uses OSGi annotations for lightweight services.
  • Best for modular and scalable apps.
@Component(
property = "javax.portlet.name=com_example_MyDSPortlet",
service = Portlet.class
)
public class MyDSPortlet extends GenericPortlet {
@Override
protected void doView(RenderRequest request, RenderResponse response) {
response.getWriter().write("Hello from DS Portlet!");
}
}

my-portlet/
├── src/
│ ├── main/
│ │ ├── java/ # Portlet class
│ │ ├── resources/ # Language properties
│ │ └── webapp/ # JSPs, JS, CSS
│ └── test/
├── bnd.bnd # OSGi metadata
└── build.gradle # Build script
sequenceDiagram
    participant User
    participant Portlet
    participant Container
    User->>Portlet: Request
    Portlet->>Container: processAction()
    Container->>Portlet: render()
    Portlet->>User: HTML Response

  • Displays the main UI.
  • Defined in doView() (GenericPortlet) or @RenderMapping (Spring).
  • Allows user customization.
  • Example:
@RenderMapping(mode = "edit")
public String edit() {
return "edit-mode";
}
  • Configured via portlet.xml:
<portlet>
<portlet-preferences>
<preference>
<name>color</name>
<value>blue</value>
</preference>
</portlet-preferences>
</portlet>

FeatureDescription
AJAX SupportResourceURL for dynamic updates
Public Render ParametersShare data between portlets
Portlet FiltersModify requests/responses
EventsIPC (Inter-Portlet Communication)
Asset FrameworkTagging, categorization

  1. Auto-Deploy (Hot Deploy)
    Terminal window
    cp my-portlet.jar $LIFERAY_HOME/deploy/
  2. Blade CLI
    Terminal window
    blade deploy
  3. Gradle
    Terminal window
    ./gradlew deploy

Use JS Portlets for modern UIs
Leverage OSGi services for modularity
Follow Liferay’s naming conventions
Use portlet preferences for customization


  1. Try creating a sample portlet:
    Terminal window
    blade create -t mvc-portlet -p com.example.myportlet MyPortlet
  2. Explore Liferay’s official docs.