Java 與 REST 的邂逅(三)淺談 Jersey MVC by popcorny | CodeData
top

Java 與 REST 的邂逅(三)淺談 Jersey MVC

分享:

Java 與 REST 的邂逅(二)JAX-RS 核心 Annotation << 前情

簡介

前面兩篇介紹以Jersey來做RESTful Web Service,Jersey的輕量簡潔但是強大的功能,對於RESTful的應用可以寫得非常簡單漂亮。這時候我們不難會繼續想說用Jersey來寫RESTful Web Application有沒有搞頭,這絕對有搞頭!!! 而且事實上也非常的簡單好用。

在Jersey本身,它定義了一個Viewable的class,當resource method回傳的是Viewable,則代表我們想要把結果轉到View上去執行,這不就是我們常見的MVC pattern嗎?沒錯,在Jersey當中,我們可以把resource method當作controller,在其中根據client request,產生對應的model,再dispatch到view去做呈現。因此如果想要選擇一個比較輕量級的MVC framework,但是又不想用Servlet當作Controller那麼陽春,那Jersey會是一個很好的選擇。

傳統純粹用Servlet打造的MVC Pattern:
mvc1

用Jersey來做MVC的實作:
mvc2

設定Jersey MVC

首先你需要加上這兩個Jersey Maven Dependency。Jersey目前提供JSP或是FreeMarker兩種template的實作,在此篇我們就以比較常用的JSP作為例子。

<dependency>
	<groupId>org.glassfish.jersey.ext</groupId>
	<artifactId>jersey-mvc</artifactId>
	<version>2.5</version>
</dependency>
<dependency>
	<groupId>org.glassfish.jersey.ext</groupId>
	<artifactId>jersey-mvc-jsp</artifactId>
	<version>2.5</version>
</dependency>

再來是設定web.xml。根據官網的文件,若要要使用Jersey MVC並且使用JSP當作template,必須在web.xml中明確用Filter的方式來設定Jersey,這個目前我還不清楚原因,官網這樣寫我們就照著做。

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
        version="3.0">
    <display-name>Jersey MVC Sample</display-name>

    <!-- Jersey -->
    <filter>
        <filter-name>jersey</filter-name>
        <filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>tw.com.codedata.jersey.MyApplication</param-value>
        </init-param>        
        <init-param>
            <param-name>jersey.config.servlet.filter.forwardOn404</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>jersey</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>    
</web-app>

再來是在我們的Jersey的Application class中,新增有關MVC的設定。其中JspMvcFeature是用來描述要使用Jersery MVC這個Feature,並且已JSP當作Template Engine。而JspMvcFeature.TEMPLATES_BASE_PATH是用來描述JSP的root的路徑,這在後面的Viewable的建構子當中所帶的template path就會根據此路徑來找到對應的template。

package tw.com.codedata.jersey;

import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.mvc.jsp.JspMvcFeature;

public class MyApplication extends ResourceConfig{
    public MyApplication(){
        packages("tw.com.codedata.jersey.controller");
        register(JspMvcFeature.class);
        property(JspMvcFeature.TEMPLATES_BASE_PATH, "/WEB-INF/jsp");
    }
}

再來來改寫我們的Resource(Controller) class。在Resource method中我們回傳一個Viewable代表我們想把結果丟到View上做呈現。建構子的第一個參數是Template path,第二個參數是丟給Template的model。注意template path不需要指定.jsp,Jersey會根據你使用的template engine來找到對應的副檔名。

package tw.com.codedata.jersey.controller;

import java.util.HashMap;

import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;

import org.glassfish.jersey.server.mvc.Viewable;

@Path("/hello")
public class HelloController {
    @GET
    public Viewable sayHello(@QueryParam("name") @DefaultValue("World") String name) {
        HashMap model = new HashMap();
        model.put("name", name);               
        return new Viewable("/hello", model);
    }
}

在Jersey把model丟到JSP後,它會產生一個it的變數,這就是我們剛剛丟過來的model物件。我們可以再用JSP相關的技術,例如JSTL或是Expression Language把結果呈現成HTML。下面這個檔案放在WEB-INF/jsp/hello.jsp

<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>   
</head>
<body>
Hello, <c:out value="${it.name}" /> 
</body>
</html>

輸出的結果
mvc3

結論

Jersey針對RESTful提供了需要的GET,POST,PUT,DELETE等annotation來快速對應method成為一個resource method。並且有各式各樣的@XXXParam來處理來自Http Request的各種參數。然而我們也可以把同樣的概念帶到RESTful Web Application,並且優雅地用Viewable,來讓Controller可以把結果丟到View上去作呈現。

當然,如果您已經對Spring很熟悉了,並且已經大量的使用Spring的功能,你可以選擇使用Spring MVC,這兩個是很類似的東西。但如果你想選擇比較輕量級,必且想使用JAX-RS提供的API,Jersey MVC提供給你的是一個比較輕量但功能也足夠應付大部份情況的解決方案。

分享:
按讚!加入 CodeData Facebook 粉絲群

相關文章

留言

留言請先。還沒帳號註冊也可以使用FacebookGoogle+登錄留言

關於作者

學生時代熱愛 Java 技術,然而為五斗米閃到腰跑去 IC Design House 去寫 C。這幾年重新拾起 Java 技術,並且也同時開發 Web, iOS 以及Android App,繼續另外一個閃到腰的旅程 ...

熱門論壇文章

熱門技術文章