Ứng dụng HelloWorld Spring Portlet MVC Framework

Cách tốt nhất để học một framework mới là viết một ứng dụng HelloWorld dùng nó. Tôi xin bắt đầu theo cách này, viết một HelloWorld portlet dùng Spring Portlet MVC Framework. Để đơn giản, ứng dụng HelloWorld của tôi chỉ có mode View. Bất cứ khi nào người dùng truy cập đến HelloWorld portlet, chúng ta chỉ hiển thị trang View.jsp.


portlet.xml


Hãy bắt đầu với file portlet.xml trong webapp/WEB-INF/ như sau:


<?xml version="1.0" encoding="UTF-8"?>
<portlet-app
xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd
http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd" >
<portlet>
<description>HelloWorld Portlet using Spring MVC</description>
<portlet-name>HelloSpringPortletMVC</portlet-name>
<display-name>Hello World Spring Portlet MVC Framework Portlet</display-name>
<portlet-class> org.springframework.web.portlet.DispatcherPortlet
</portlet-class>
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>VIEW</portlet-mode>
</supports>

<supported-locale>en</supported-locale>
<portlet-info>
<title>
Hello World Spring Portlet MVC Framework Portlet
</title>
<short-title>
HelloWorldSpringPortletMVC
</short-title>
<keywords>
spring portlet
</keywords>
</portlet-info>
</portlet>
</portlet-app>

DispatcherPortlet chịu trách nhiệm điều khiển request từ người dùng. Khi nhận được một request, nó sẽ tìm Controller chịu trách nhiệm xử lý cho request này, sau đó gọi handleActionRequest() hay handleRenderRequest() tùy thuộc vào kiểu sử lý của request. Controller class thi hành phần business logic và trả lại một View để trả kết quả xử lý cho người dùng.

Như đã thấy, DispatcherPortlet là trung tâm xử lý trong Spring Portlet MVC Framework. Ngoài ra, DispatcherPortlet còn chịu trách nhiệm loading application context (file cấu hình của Spring). Đầu tiên, kiểm tra giá trị của configLocation. Nếu không được khai báo, nó sẽ đặt giá trị mặc định là <portlet-name>-portlet.xml, và tìm trong thư mục /WEB-INF. Trong file portlet.xml, chúng ta không khai báo configLocation, vậy ta cần tạo file HelloWorldPortletMVC-portlet.xml.

HelloSpringPortletMVC-portlet.xml


Tạo file HelloSpringPortletMVC-portlet.xml trong webapp/WEB-INF như sau:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
\"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="viewController"
class="com.bds.example.springmvc.ViewController"></bean>
<bean id="portletModeHandlerMapping" class=
"org.springframework.web.portlet.handler.PortletModeHandlerMapping">
<property name="portletModeMap">
<map>
<entry key="view">
<ref bean="viewController"/>
</entry>
</map>
</property>
</bean>
</beans>

Đây là file cấu hình của portlet HelloSpringPortletMVC. Có 2 beans được định nghĩa:
  • viewController. Chỉ đến class com.bds.example.springmvc.ViewController.java.
    portletModeHandlerMapping. Như ta đã biết, khi DispatcherPortlet nhận được một request, nó sẽ tìm Controller thích hợp để điều khiển request đó. PortletModeHandlerMapping là nơi điều khiển view.

  • PortletModeHandlerMapping là một class đơn giản hiện thực từ interface HandlerMapping và được DispatcherPortlet dùng để tìm Controller thích hợp cho mọi request. Class PortletModeHandlerMapping dùng mode của Portlet để tìm Controller.


  • ViewController.java


    Ta biết rằng viewController bean sẽ xử lý tất cả View mode requests. Bước tiếp theo là tạo ViewController.java như sau:



    package com.bds.example.springmvc;

    import javax.portlet.RenderRequest;
    import javax.portlet.RenderResponse;
    import org.springframework.web.portlet.ModelAndView;
    import org.springframework.web.portlet.mvc.AbstractController;

    public class ViewController extends AbstractController{
    protected ModelAndView handleRenderRequestInternal(RenderRequest request,
    RenderResponse response) throws Exception {
    ModelAndView modelAndView = new ModelAndView("View");
    return modelAndView;
    }
    }


    Chú ý: Nếu bạn đã từng dùng Struts Framework, thì Controller class cũng giống như một Action class trong Struts.
    Mọi controller class trong Spring Portlet MVC Framework phải trực tiếp hoặc gián tiếp implement interface org.springframework.web. portlet.mvc.Controller. Để đơn giản hơn, Spring Framework cung cấp AbstractController, và một số extends phục vụ một số action cơ bản. Ta cũng có thể tự implement Controller class, nhưng phải quan tâm đến một số vấn đề như: reuse, thread-safe, và khả năng điều khiển nhiều requests trong suốt vòng đời của portlet.
    Trong code trên, tôi tạo ViewController class bằng cách extend từ AbstractController. Vì ta chỉ cần xử lý cho mode view, nên ta chỉ cần override phương thức handleRenderRequest() từ AbstractController. Với controller trên, HelloWorldPortletMVC sẽ chỉ render trang View.jsp đến người dùng khi người dùng truy cập đến portlet này.

    web.xml


    Theo Portlet Specification 1.0, mọi ứng dụng portlet sẽ theo chuẩn của Servlet Specification 2.3, và cần một file miêu tả cho deployment(web.xml). Tạo web.xml trong thư mục /WEB-INF/ như sau:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation=
    "http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>
    Hello Spring Portlet MVC Framework Application
    </display-name>
    <servlet>
    <servlet-name>ViewRendererServlet</servlet-name>
    <servlet-class>
    org.springframework.web.servlet.ViewRendererServlet
    </servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>ViewRendererServlet</servlet-name>
    <url-pattern>/WEB-INF/servlet/view</url-pattern>
    </servlet-mapping>
    <listener>
    <listener-class>
    org.springframework.web.context.ContextLoaderListener
    </listener-class>
    </listener>
    </web-app>

    File web.xml khai báo 2 việc:
  • ViewRendererServlet. ViewRendererServlet là một cầu nối thể hiện servlet cho portlet. Trong quá trình render, DispatcherPortlet đặt PortletRequest trong ServletRequest và chuyển điều khiển cho ViewRendererServlet để render. Bước này cho phép Spring Portlet MVC Framework dùng lại các thành phần View như trong phiên bản cho servlet, là Spring Web MVC Framework.

  • ContextLoaderListener. ContextLoaderListener chịu trách nhiệm phần load file cấu hình Web Application context tại thời điểm ứng dụng bắt đầu chạy. Web application context được chia sẻ cho tất cả các portlet trong cùng ứng dụng portlet. Trường hợp có 1 bean được định nghĩa 2 lần, bean được định nghĩa trong portlet application context được ưu tiên hơn trong Web application context.


  • ContextLoader đọc giá trị của contextConfigLocation. Nếu contextConfigLocation không được khai báo, sẽ dùng giá trị mặc định là /WEB-INF/applicationContext.xml.

    applicationContext.xml


    Như đã nói ở trên, nếu giá trị của contextConfigLocation không được khai báo, ViewRendererServlet sẽ lấy giá trị mặc định là /WEB-INF/applicationContext.xml file. Tạo applicationContext.xml có nội dung sau:


    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
    "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
    <bean id="viewResolver" class=
    "org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass">
    <value>
    org.springframework.web.servlet.view.JstlView
    </value>
    </property>
    <property name="prefix">
    <value>/WEB-INF/jsp/</value>
    </property>
    <property name="suffix">
    <value>.jsp</value>
    </property>
    </bean>
    </beans>

    Trong code trên, file applicationContext.xml định nghĩa 1 bean là viewResolver. viewResolver được dùng để khai báo nơi chứa các file JSP.
    Ta khai báo 2 giá trị cho viewResolver bean:
  • Prefix – thư mục chứ file jsp /WEB-INF/jsp/

  • Suffix – đuôi của file phải là JSP

  • Lấy một ví dụ, khi đối tượng ModelAndView trả về với giá trị là View thì file được view ra là /WEB-INF/jsp/View.jsp.
    Và cuối cùng, tạo một file View.jsp đơn giản với thông điệp "Hello from Spring Portlet MVC Framework" trong thư mục /WEB-INF/jsp.

    Cao Trong Hien

    ,

    1 Response to "Ứng dụng HelloWorld Spring Portlet MVC Framework"

    lúc 09:39 20 tháng 8, 2008
    Anh ơi, sao mấy cái framworks Spring hay Hibernate cứ phải làm việc nhiều với XML nhỉ? nhìn nó rỗi mắt quá trời.

    Anh viết bài về Sping + Hibernate thì hay quá, em sẽ ủng hộ nhiệt tình :D

    Đăng nhận xét