Twitterで以下の情報が流れてました。
OracleのJSFコンポーネントであるADF FacesでレスポンシブWebをやってみた話です。
レスポンシブWebは、Web系の方からすれば常識的なことかもしれないのですが、私が初めて知ったのは「HTML5とか勉強会 ビギナーズ」に参加してデモをみたときでした。
当時のエントリ↓
HTML5とか勉強会 ビギナーズ 第2回へ参加しました #html5j
このあと以下の本を買ってました(^^;けどパラパラ見ただけでした、すみません。
うわっ、すげー、と思いつつ、こういうのってHTML5使わないとダメ(=Java EE的にはEE 7でJSF2.2かぁ)、とか勝手に思ってました(^^;
でも最初のTwitterのリンク先にも書いてありますが、CSS3 Media Queriesを使える環境であればいいんですね。
そんなわけで、JSFでもそういうことやってみようと思って、とりあえず雑なサンプルですが、以下のようなものをJava EE6で作ってみました。
メニューのサンプル
メニューはADFではなく、PrimeFacesのコンポーネントを使ってます。
(こういう例でサードパーティー使うのもあれなんですが、このメニューの例だと後述するメリットがあるので使いました)
実行して表示されると単純にメニューがあるだけなんですが
画面を小さくして(タブレットサイズくらい)するとメニューの表示形式が変わります。
レスポンシブWebについてはまだ全然勉強していないため、ネットでいくつか見たサンプルを参考に作ってみたレベルです(^^;
CSSで以下を定義しました。
@media screen and (min-width : 700px) and (max-width : 1280px){
.verticalmenu{
display: none !important;
}
}
@media screen and (max-width : 700px){
.horizontalmenu{
display: none !important;
}
}
.menuFont{
font-size: 0.8em;
}
mediaを2つ定義して、横幅が700pxから1280pxだったら、横のメニューを非表示に、横幅が700px以下だったら縦のメニューを非表示にする感じです。
JSFのxhtmlは
<?xml version='1.0' encoding='UTF-8' ?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:outputStylesheet library="css" name="responsiveMenu.css" />
<h:body>
<h:form styleClass="menuFont">
<p:menu model="#{menuBean.menuModel}" styleClass="horizontalmenu" />
<p:menubar model="#{menuBean.menuModel}" styleClass="verticalmenu"/>
</h:form>
</h:body>
</html>
管理Beanは
package jp.co.hoge.mediaqueriessample;
import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
import lombok.Getter;
import lombok.Setter;
import org.primefaces.model.menu.DefaultMenuItem;
import org.primefaces.model.menu.DefaultMenuModel;
import org.primefaces.model.menu.DefaultSubMenu;
import org.primefaces.model.menu.MenuModel;
@Named
@RequestScoped
public class MenuBean implements Serializable{
@Getter @Setter
private MenuModel menuModel;
@PostConstruct
public void init(){
menuModel = new DefaultMenuModel();
DefaultSubMenu opp = new DefaultSubMenu("商談");
DefaultMenuItem newOpp = new DefaultMenuItem("新規作成");
DefaultMenuItem delOpp = new DefaultMenuItem("削除");
opp.addElement(newOpp);
opp.addElement(delOpp);
DefaultSubMenu quote = new DefaultSubMenu("見積");
DefaultMenuItem newQuote = new DefaultMenuItem("新規作成");
DefaultMenuItem delQuote = new DefaultMenuItem("削除");
quote.addElement(newQuote);
quote.addElement(delQuote);
menuModel.addElement(opp);
menuModel.addElement(quote);
}
}
メニューの中身はプログラムで生成しているのですが、PrimeFacesのメニュー系コンポーネントでは、どれも同じデータモデル(DefaultMenuModel)を利用します。
なので、メニュー系の中でコンポーネントが変わっても、valueバインディングする値(ここではmenuModel変数)は一緒に使えるメリットがあります(^^)
個人的には、こういうのもっと勉強して、積極的に取り入れていきたい…ですが、こんな素晴らしいCSS Media QueryもIEのバージョンによっては動かない、みたいな情報をちらほらみたので、自分のような業務系エンジニアにとっては辛いところかなぁと…。
未だに「IEは6、最低でも7は保証してください」なんて依頼を聞いたりもするので、なかなか時代の流行についていけない環境だったり…。
まあ、勉強して損はないし、趣味の範囲でもう少し色々やってみよう!