JSPによる表示

【前提条件】

[環境]

【概要】

JAX-RSの結果をJSPで表示させる方法です。

サンプルではフィルタを使用して
JSPの表示を行います。

【アプリケーションクラス】

今まで使用していた
javax.ws.rs.core.Applicationクラスのサブクラスは
今回は使いません。
(あるとうまく動かないようなので消したほう良いみたいです。

【web.xml

web.xmlに設定を行います。

<?xml version="1.0" encoding="UTF-8"?>
<web-app
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <filter>
        <filter-name>jersey</filter-name>
        <filter-class>com.sun.jersey.spi.container.servlet.ServletContainer</filter-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>jp.glory.ui.service</param-value>
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.config.property.JSPTemplatesBasePath</param-name>
            <param-value>/WEB-INF/template</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>jersey</filter-name>
        <url-pattern>/service/*</url-pattern>
    </filter-mapping>
</web-app>
[フィルタクラス]

フィルタクラスには
com.sun.jersey.spi.container.servlet.ServletContainerを指定します。

[サービスクラスの設定]

Applicationクラスを使用していないので、
フィルタ側でサービスクラスを登録する必要があります。

サービスクラスの登録にはサービスクラスのパッケージを指定します。
init-paramタグのinit-nameタグに「com.sun.jersey.config.property.packages」を、
init-valueタグにサービスクラスがあるパッケージを指定します。

[JSPのパスの指定]

JSPが格納されているパスを指定します。

init-paramタグのinit-nameタグに「com.sun.jersey.config.property.JSPTemplatesBasePath」を、
init-valueタグにJSPファイルがあるディレクトリを指定します。

【サービスクラス】

package jp.glory.ui.service;

import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;

import jp.glory.ui.template.bean.SampleJspBean;

import com.sun.jersey.api.view.Viewable;

@Path("/service/jsp")
public class JspService {

    @FormParam("name")
    private String name = null;

    @FormParam("year")
    private Integer year = null;

    @POST
    public Viewable view() {

        return new Viewable("/sample.jsp", new SampleJspBean(name, year));
    }
}
[Viewableクラス]

JSPの表示を行うためには
com.sun.jersey.api.view.Viewableクラスのオブジェクトを返却します。

サンプルではテンプレートとなるJSPの名前とモデルオブジェクト(表示用のBean)を
コンストラクタのパラメータとして渡しています。

[Pathアノテーション]

今まではAplicationクラスを通していたので、
個々のサービスクラスではルートからの指定は不要でした。

今回はApplicationクラスを使用していないので、
ルートからのパスの指定をしています。

JSP

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JAX-RSサンプル</title>
    </head>
    <body>
        <div>
            Name:${it.name}
        </div>
        <div>
            Year:${it.year}
        </div>
    </body>
</html>
[モデルオブジェクトの名称]

Viewableのコンストラクタで指定したモデルオブジェクトの名称は
固定で「it」となります。

【実行用のHTML】

<html>
    <head>
        <title>JAX-RSサンプル</title>
        <style type="text/css">
            .area {
                margin-bottom: 20px;
            }
        </style>
    </head>
    <body>
        <div class="area" >
            <form action="../service/jsp" method="post">
                <input type="text" name="name" /><br/>
                <input type="number" name="year" /><br/>
                <input type="submit"  value="JSP Response"/>
            </form>
        </div>
    </body>
</html>