[Java] 44. Web Spring frameworkのviewで使うプログラム言語(JSTL) - XML


Study / Java    作成日付 : 2019/10/09 07:34:08   修正日付 : 2021/06/10 15:12:52

こんにちは。明月です。


この投稿はWeb Spring frameworkのviewで使うプログラム言語(JSTL) - XMLに関する説明です。


以前の投稿でJSTL言語のコアー、フォーマット、関数、データベースに関して説明しました。

XML処理はhtmlファイルから別のxmlファイルのデータを抽出して使うライブラリです。

最近はajaxでjsonタイプのデータを通信する方法をよく使うし、そのことに関してライブラリも多いし、使い方も使いやすいのでこのxmlライブラリをよく使いません。

しかし地域化(Localization)やメッセージのデータを取得するために使うこともあるので知ってる方がよいです。

XMLライブラリ

まず、XMLライブラリを使うためにはpom.xmlにライブラリを追加しなければならないです。

<!-- https://mvnrepository.com/artifact/xalan/xalan -->
<dependency>
  <groupId>xalan</groupId>
  <artifactId>xalan</artifactId>
  <version>2.7.1</version>
</dependency>

まず、xmlファイルの一つを生成しましょう。

<?xml version="1.0" encoding="UTF-8"?>
<data>
  <title>Hello world</title>
  <persons>
    <student>
      <name>Mary</name>
      <age>12</age>
      <class>5</class>
    </student>
    <student>
      <name>John</name>
      <age>13</age>
      <class>6</class>
    </student>
  </persons>
</data>


ここでこのxmlファイルのパスはウェブブラウザ状態のパスではなく、サーバ側のディレクトリパスです。

なぜならviewのファイルはサーバ側でcontrollerのデータとviewのJSTL言語のファイルのデータを結合して最終のhtmlをブラウザに応答することです。なのでJSTLはブラウザ側のパスではなく、サーバ側のパスを考えて作成しなければならないです。

XMLパーシングと出力 <x:parse />, <x:out />

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- コアーライブラリ -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- XMLライブラリ -->
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>
<!-- HTMLタグ開始 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <!-- xmlファイルを読み込む -->
    <c:import var="xmlDoc" url="data.xml"/>
    <!-- xmlデータパーシング -->
    <x:parse var="parsedDocument" xml="${xmlDoc}"/>
    <!-- xpathアドレスのxmlデータのdataタグの中のtitleデータを出力 -->
    <x:out select="$parsedDocument/data/title" />
  </body>
</html>

XMLデータの繰り返し <x:forEach />

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- コアーライブラリ -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- XMLライブラリ -->
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>
<!-- HTMLタグ開始 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <!-- xmlファイルを読み込む -->
    <c:import var="xmlDoc" url="data.xml"/>
    <!-- xmlデータパーシング -->
    <x:parse var="parsedDocument" xml="${xmlDoc}"/>
    <!-- dataのタグのpersonsタグのstudentのタグを繰り返し -->
    <x:forEach select="$parsedDocument/data/persons/student">
      <p>
        <!-- studentタグのnameタグ -->
        <x:out select="name" />
        <!-- studentタグのnameタグ -->
        <x:out select="age" />
        <!-- studentタグのclassタグ -->
        <x:out select="class" />
      </p>
    </x:forEach>
  </body>
</html>

XMLデータを変数に置換 <x:set />

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- コアーライブラリ -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- XMLライブラリ -->
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>
<!-- HTMLタグ開始 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <!-- xmlファイルを読み込む -->
    <c:import var="xmlDoc" url="data.xml"/>
    <!-- xmlデータパーシング -->
    <x:parse var="parsedDocument" xml="${xmlDoc}"/>
    <!-- xpathアドレスのxmlデータのdataタグのtitleデータをtitle変数に格納 -->
    <x:set select="$parsedDocument/data/title" var="title"/>
    <!-- データ出力 -->
    <x:out select="$title" />
  </body>
</html>

XMLデータの分岐文 <x:if />

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- コアーライブラリ -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- XMLライブラリ -->
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>
<!-- HTMLタグ開始 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <!-- xmlファイル読み込み -->
    <c:import var="xmlDoc" url="data.xml"/>
    <!-- xmlデータパーシング -->
    <x:parse var="parsedDocument" xml="${xmlDoc}"/>
    <!-- xpathアドレスのxmlデータのpersonsのstudentの二つの歳は13歳 -->
    <x:if select="$parsedDocument/data/persons/student[2]/age = 13">
      <!-- 出力 -->
      John is 13 years old.
    </x:if>
  </body>
</html>


XMLデータの分岐文 <x:choise />, <x:when />, <x:otherwise />

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- コアーライブラリ -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- XMLライブラリ -->
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>
<!-- HTMLタグ開始 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <!-- xmlファイル読み込む -->
    <c:import var="xmlDoc" url="data.xml"/>
    <!-- xmlデータパーシング -->
    <x:parse var="parsedDocument" xml="${xmlDoc}"/>
    <!-- 分岐文 -->
    <x:choose>
      <!-- xpathアドレスのxmlデータのpersonsのstudentの二つの歳は13歳 -->
      <x:when select="$parsedDocument/data/persons/student[2]/age = 13">
        <!-- 出力 -->
        John is 13 years old.
      </x:when>
      <!-- xpathアドレスのxmlデータのpersonsのstudentの二つの歳は12歳 -->
      <x:when select="$parsedDocument/data/persons/student[2]/age = 12">
        <!-- 出力 -->
        John is 12 years old.
      </x:when>
      <!-- その以外 -->
      <x:otherwise>
        I don't know how old John is.
      </x:otherwise>
    </x:choose>
  </body>
</html>


XSLファイルと結合 <x:transform />, <x:param />

XSLファイルとはXMLスタイルシートファイルだと思えばよいです。(eXtensible Stylesheet Language)

つまり、XML構造とXSLファイルを結合して一つのHTMLファイルを作ることです。

CSSを使ったらXML構造とXSLファイルを結合するとスタイルシートを作る必要がなくみえます。

しかしCSSは構造的な定義までは定義することが大変です。同じ構造的なスタイルでデータ別にページを繰り返して作る形なら良いと思います。例えばブログみたいにデータだけ異なって同じ形式のページを大量に生産する時に良いです。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <!-- 出力タイプ -->
  <xsl:output method="html" indent="yes" />
  <!-- パラメータ設定 -->
  <xsl:param name="bgColor" />
  <!-- パーシングのテンプレート -->
  <xsl:template match="/">
    <html>
      <head>
        <meta charset="UTF-8" />
        <title>Insert title here</title>
      </head>
      <body>
        <xsl:apply-templates />
      </body>
    </html>
  </xsl:template>
  <!-- XMLデータのbooksタグ -->
  <xsl:template match="books">
    <!-- ここでパラメータの特徴は${}ではなく{$}の形 -->
    <table border="1" width="100%" bgColor="{$bgColor}">
      <xsl:for-each select="book">
        <tr>
          <td>
            <b>
              <!-- xmlのbooksのbookのnameデータ -->
              <xsl:value-of select="name" />
            </b>
          </td>
          <td>
            <!-- xmlのbooksのbookのauthorデータ -->
            <xsl:value-of select="author" />
          </td>
          <td>
            <!-- xmlのbooksのbookのpriceデータ -->
            <xsl:value-of select="price" />
          </td>
        </tr>
      </xsl:for-each>
    </table>
  </xsl:template>
</xsl:stylesheet> 
<?xml version="1.0" encoding="UTF-8"?>
<books>
  <book>
    <name>C#</name>
    <author>nowonbun</author>
    <price>200</price>
  </book>
  <book>
    <name>JAVA</name>
    <author>nowonbun</author>
    <price>1000</price>
  </book>
  <book>
    <name>PHP</name>
    <author>nowonbun</author>
    <price>500</price>
  </book>
</books>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- コアーライブラリ -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- XMLライブラリ -->
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>
<!-- xmlファイル設定 -->
<c:import var="xml" url="data.xml"/>
<!-- xslファイル設定 -->
<c:import var="xsl" url="data.xsl"/>  
<!-- xmlとxslを結合 -->
<x:transform xml="${xml}" xslt="${xsl}">  
  <!-- パラメータ設定 -->
  <x:param name="bgColor" value="yellow"/>  
</x:transform> 


普通の管理用のウェブサービスにはXMLをパーシングして使う場合はないと思います。

でも、ブログや不特定な多数に掲示するウェブプログラムなら固定になった構造によりデータだけ変わって掲示することになります。

そしてJavascriptの非同期処理でデータを取得、設定することになるとグーグルボットには認識されてないので、Googleなどで検索エンジンには内容を認識しなく、検索結果には出ない可能性もあります。

その時にはこのXMLパーシング形式で作成するほうが良いと思います。


ここまでWeb Spring frameworkのviewで使うプログラム言語(JSTL) - XMLに関する説明でした。


ご不明なところや間違いところがあればコメントしてください。

Study / Java」の他投稿
最新投稿