2008/04/30からのアクセス回数 9087 Cart問題にページレイアウトを追加します。 ページレイアウトには、SiteMeshを使用し、サイドメニューにはカートの内容も 追加しました。 SiteMeshを使う †今回はじめて使ったSiteMeshですが、WebDB Press Vol. 18に紹介記事がでています。 Cart問題をヘッダ、サイドメニュー、本体の構成にしました。 今回例題に使用したワインは、ドイツのWeingut Dr. Schnellさんのものです。 SiteMeshの特徴 †SiteMeshはservletのフィルターとして存在し、 複数のHTMLの内容を分解し、一つのHTMLページに再構成するツールです。 これによってframeを使わなくてもサイドメニューを表示したり、複数の画面の同時更新 ができるようになります。 ライブラリーの追加 †いつものように必要なjarファイルをpom.xmlに追加します。 今回必要となるのは、sitemeshとdisplaytagです。 dependecyタグは以下のようになります。 <dependency> <groupId>opensymphony</groupId> <artifactId>sitemesh</artifactId> <version>2.3</version> </dependency> <dependency> <groupId>displaytag</groupId> <artifactId>displaytag</artifactId> <version>1.1</version> </dependency> これらは、実行時にのみ必要となりますので、eclipseの設定ファイルの変更は不要です。 追加ファイル †sitemeshの追加で追加・変更のあるファイルは以下の通りです。
decoratorsには、組み立て後に使用するjspファイルを保存します。 declarations.jspは、必要なタグライブラリの宣言、文字コードの宣言をまとめてあります。 decorators.xmlが、sitemeshのdecoratorsの設定ファイルです。 menu.jpsは、サイドメニュー用のjspファイルです。 web.xmlの変更について †sitemeshは、フィルターとして実装されていますので、web.xmlでフィルターの定義を する必要があります。 web.xmlに追加された定義は以下の通りです。 <filter> <filter-name>sitemesh</filter-name> <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class> </filter> <filter-mapping> <filter-name>sitemesh</filter-name> <url-pattern>*.htm</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping> decorators.xmlの設定について †decorators.xmlでは、decoratorsディレクトリにある出力用jspファイルの 設定を行います。 ここでは、main.jsp, side.jpsの設定を行っています。 <decorators defaultdir="/WEB-INF/decorators"> <decorator name="main" page="main.jsp"> <pattern>/*</pattern> </decorator> <decorator name="side" page="side.jsp"/> </decorators> declarations.jspfについて †declarations.jspfは、あまり変更することはないでしょう。 <%@ page language="java" session="false" contentType="text/html; charset=UTF-8" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib uri="http://displaytag.sf.net" prefix="display" %> side.jspについて †side.jspでは、設定されたHTML入力をそのまま出力するだけなので、 以下のようになります。 <%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator" %> <decorator:body/> main.jsp †サイドにmain.jspですが、 id="side"のdivタグでサイドメニューに入力されるページを指定し、id="main"のdivで メインのページを指定します。 特に、sideには、2つの入力を指定しているところに注意してください。
です。このようにjspの他に別のページへのURLが指定できることが最大の特徴と言えます。 <%@ include file="/WEB-INF/jspf/declarations.jspf" %> <%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator" %> <%@ taglib uri="http://www.opensymphony.com/sitemesh/page" prefix="page" %> <?xml version="1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <c:url value="/images/logo.jpg" var="logoUrl"/> <head> <title><decorator:title default="Weingut Dr.Schnell Online Store"/></title> <link rel="StyleSheet" href="<c:url value="/css/cart.css"/>" type="text/css" /> <meta http-equiv="Pragma" content="no-cache"/> <meta http-equiv="Cache-Control" content="max-age=0"/> <meta http-equiv="Expires" content="0"/> <decorator:head/> </head> <body id="store"> <div id="banner"> <img src="${logoUrl}"> Weingut Dr.Schnell </div> <div id="columns"> <div id="side"> <page:applyDecorator page="/cartops/list.htm" name="side"/> <page:applyDecorator page="/menu.jsp" name="side"/> </div> <div id="main"> <decorator:body/> </div> </div> </body> </html> index.jpsの変更 †表示をカタログファイルに変更しました。 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!-- simply redirects to the main switchboard page of the showcase web application --> <c:redirect url="/productops/catalog.htm"/> menu.jsp †メニューはHome以外は、ダミーのメニューとしました。 <%@ page contentType="text/html; charset=UTF-8" %> <html> <head> <title>メニュー</title> </head> <body> <c:url value="/index.jsp" var="indexLink"/> <a href="${indexLink}">Home</a><br /> <a href="http://www..../faq">Questions</a><br /> <a href="http://www..../news">News</a><br /> <a href="http://www..../contact">Contact</a><br /> </body> </html> javaファイルの変更 †javaでは、CartOpsController.javaのaddの表示をカートの中身ではなく、カタログに 変更します。 public ModelAndView add(HttpServletRequest request, HttpServletResponse response) throws Exception { Integer productId = new Integer(ServletRequestUtils.getRequiredIntParameter(request, "id")); setupCartService(request); Product product = manager.findById(productId); LineItem item = new LineItem(); item.setProductId(productId); item.setProduct(product); cartService.addLineItem(item); ModelAndView modelAndView = new ModelAndView("redirect:/productops/catalog.htm"); return modelAndView; } たったこれだけの変更でページレイアウトを追加できるとは、本当にSiteMeshはすばらしい フィルターですね。 コメント †この記事は、 皆様のご意見、ご希望をお待ちしております。 Tweet |