<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>in Action</title>
	<atom:link href="http://www.inaction.jp/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.inaction.jp/blog</link>
	<description>We development Software in Action!!</description>
	<lastBuildDate>Mon, 08 Aug 2011 13:09:25 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>rich:dropDownMenuで動的メニューの生成</title>
		<link>http://www.inaction.jp/blog/?p=217</link>
		<comments>http://www.inaction.jp/blog/?p=217#comments</comments>
		<pubDate>Mon, 08 Aug 2011 13:08:06 +0000</pubDate>
		<dc:creator>社長</dc:creator>
				<category><![CDATA[EJB]]></category>

		<guid isPermaLink="false">http://www.inaction.jp/blog/?p=217</guid>
		<description><![CDATA[Seam RichFacesのDropDownMenuは、RichFacesのコンポーネントの中でもどうしても使いたい機能のひとつだけど、なかなかどうして一筋縄ではいかなかった。
公式サイトのサンプルにあるように、普通に静的メニューを作るならば問題無い。
しかし業務システムなので当然データベースから動的に生成したいのだけど、サンプルのようには動かなかった。
まず常套手段のコード
&#60;rich:toolBar&#62;
 &#60;rich:dropDownMenu event=&#8221;onclick&#8221;&#62; 
&#60;f:facet name=&#8221;label&#8221;&#62;
 &#60;h:outputText value=&#8221;File&#8221; /&#62; 
&#60;/f:facet&#62;
 &#60;a4j:repeat value=&#8221;#{dropDownMenuBean.items}&#8221; var=&#8221;item&#8221;&#62; 
&#60;rich:menuItem submitMode=&#8221;ajax&#8221; value=&#8221;#{item}&#8221; /&#62;
 &#60;/a4j:repeat&#62; 
&#60;/rich:dropDownMenu&#62;
 &#60;rich:dropDownMenu&#62; 
&#60;f:facet name=&#8221;label&#8221;&#62;
 &#60;h:outputText value=&#8221;Edit&#8221;/&#62; 
&#60;/f:facet&#62;
 
&#60;/rich:dropDownMenu&#62;
 &#60;/rich:toolBar&#62; 
a4j:repeatがui:repeatでもdataTableでも動かない。
 で、以下が正解のコード 
&#60;rich:toolBarGroup&#62;
 &#60;c:forEach var=&#8221;cates&#8221; items=&#8221;#{dropCategorys}&#8221; varStatus=&#8221;pri&#8221;&#62; 
&#60;rich:dropDownMenu&#62;
 &#60;f:facet name=&#8221;label&#8221;&#62; 
&#60;h:panelGroup&#62;
 &#60;h:outputText value=&#8221;#{cates}&#8221; /&#62; 
&#60;/h:panelGroup&#62;
 &#60;/f:facet&#62; 
&#60;c:forEach var=&#8221;menus&#8221; items=&#8221;#{dropItems[pri.index]}&#8221;　varStatus=&#8221;sec&#8221;&#62;
 &#60;rich:menuItem submitMode=&#8221;none&#8221; styleClass=&#8221;menuLink&#8221; value=&#8221;#{menus}&#8221;&#62; 
&#60;s:link view=&#8221;#{dropUrls[pri.index][sec.index]}&#8221; /&#62;
 &#60;/rich:menuItem&#62; 
&#60;/c:forEach&#62;
 [...]]]></description>
			<content:encoded><![CDATA[<p>Seam RichFacesのDropDownMenuは、RichFacesのコンポーネントの中でもどうしても使いたい機能のひとつだけど、なかなかどうして一筋縄ではいかなかった。</p>
<p>公式サイトのサンプルにあるように、普通に静的メニューを作るならば問題無い。</p>
<p>しかし業務システムなので当然データベースから動的に生成したいのだけど、サンプルのようには動かなかった。</p>
<p>まず常套手段のコード</p>
<p><em>&lt;rich:toolBar&gt;</em></p>
<p><em> &lt;rich:dropDownMenu event=&#8221;onclick&#8221;&gt; </em></p>
<p><em>&lt;f:facet name=&#8221;label&#8221;&gt;</em></p>
<p><em> &lt;h:outputText value=&#8221;File&#8221; /&gt; </em></p>
<p><em>&lt;/f:facet&gt;</em></p>
<p><em> &lt;a4j:repeat value=&#8221;#{dropDownMenuBean.items}&#8221; var=&#8221;item&#8221;&gt; </em></p>
<p><em>&lt;rich:menuItem submitMode=&#8221;ajax&#8221; value=&#8221;#{item}&#8221; /&gt;</em></p>
<p><em> &lt;/a4j:repeat&gt; </em></p>
<p><em>&lt;/rich:dropDownMenu&gt;</em></p>
<p><em> &lt;rich:dropDownMenu&gt; </em></p>
<p><em>&lt;f:facet name=&#8221;label&#8221;&gt;</em></p>
<p><em> &lt;h:outputText value=&#8221;Edit&#8221;/&gt; </em></p>
<p><em>&lt;/f:facet&gt;</em></p>
<p><em> </em></p>
<p><em>&lt;/rich:dropDownMenu&gt;</em></p>
<p><em> &lt;/rich:toolBar&gt; </em></p>
<p><em>a4j:repeatがui:repeatでもdataTableでも動かない。</em></p>
<p><em> で、以下が正解のコード </em></p>
<p><em>&lt;rich:toolBarGroup&gt;</em></p>
<p><em> &lt;c:forEach var=&#8221;cates&#8221; items=&#8221;#{dropCategorys}&#8221; varStatus=&#8221;pri&#8221;&gt; </em></p>
<p><em>&lt;rich:dropDownMenu&gt;</em></p>
<p><em> &lt;f:facet name=&#8221;label&#8221;&gt; </em></p>
<p><em>&lt;h:panelGroup&gt;</em></p>
<p><em> &lt;h:outputText value=&#8221;#{cates}&#8221; /&gt; </em></p>
<p><em>&lt;/h:panelGroup&gt;</em></p>
<p><em> &lt;/f:facet&gt; </em></p>
<p><em>&lt;c:forEach var=&#8221;menus&#8221; items=&#8221;#{dropItems[pri.index]}&#8221;　varStatus=&#8221;sec&#8221;&gt;</em></p>
<p><em> &lt;rich:menuItem submitMode=&#8221;none&#8221; styleClass=&#8221;menuLink&#8221; value=&#8221;#{menus}&#8221;&gt; </em></p>
<p><em>&lt;s:link view=&#8221;#{dropUrls[pri.index][sec.index]}&#8221; /&gt;</em></p>
<p><em> &lt;/rich:menuItem&gt; </em></p>
<p><em>&lt;/c:forEach&gt;</em></p>
<p><em> &lt;/rich:dropDownMenu&gt; </em></p>
<p><em>&lt;/c:forEach&gt;</em></p>
<p><em> &lt;rich:jQuery selector=&#8221;.menuLink&#8221; query=&#8221;click(function()  {location.href = jQuery(this).find(&#8216;a&#8217;).attr(&#8216;href&#8217;) })&#8221;/&gt; </em></p>
<p><em>&lt;/rich:toolBarGroup&gt;</em></p>
<p><em> sessionBean部分                    List&lt;MenuCategory&gt; tmpCategorys =  entityManager.createQuery(&#8220;SELECT m FROM MenuCategory AS m WHERE  m.active =¥ </em></p>
<p><em>:active ORDER BY m.indication&#8221;)</em></p>
<p><em> .setParameter(&#8220;active&#8221;,true) </em></p>
<p><em>.getResultList();</em></p>
<p><em> int cateSize = tmpCategorys.size(); </em></p>
<p><em>int menuSize = 0;</em></p>
<p><em> dropCategorys = new String[cateSize]; </em></p>
<p><em>dropItems = new String[cateSize][];</em></p>
<p><em> dropUrls = new String[cateSize][]; </em></p>
<p><em>for(int s = 0;s&lt;cateSize;s++) {</em></p>
<p><em> dropCategorys[s] = tmpCategorys.get(s).getNameja(); </em></p>
<p><em>List&lt;Menu&gt; menus = tmpCategorys.get(s).getMenu();</em></p>
<p><em> menuSize = menus.size(); </em></p>
<p><em>dropItems[s] = new String[menuSize];</em></p>
<p><em> dropUrls[s] = new String[menuSize]; </em></p>
<p><em>for(int q = 0;q&lt;menuSize;q++) {</em></p>
<p><em> dropItems[s][q] = menus.get(q).getNameja(); </em></p>
<p><em>dropUrls[s][q] = menus.get(q).getUrl();</em></p>
<p><em> } </em></p>
<p><em>}</em></p>
<p>RichFacesのバグ？とにかくui:repeatは捨てて、c:forEachでやる。</p>
<p>さらにList&lt;&gt;やArrayList&lt;&gt;ではなく、配列をわたさなきゃならないらしい。</p>
<p>分かればどうってことないけど、リソースも無いし結構はまりました。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.inaction.jp/blog/?feed=rss2&amp;p=217</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>seamとIE6</title>
		<link>http://www.inaction.jp/blog/?p=215</link>
		<comments>http://www.inaction.jp/blog/?p=215#comments</comments>
		<pubDate>Mon, 08 Aug 2011 13:06:58 +0000</pubDate>
		<dc:creator>社長</dc:creator>
				<category><![CDATA[EJB]]></category>

		<guid isPermaLink="false">http://www.inaction.jp/blog/?p=215</guid>
		<description><![CDATA[IE6はRichFacesのSkinスタイルを思いっきり無視するので要注意。
特にcommandButtonとcheckBoxは「ただのinput」とみなされ、色もマージンも妙なコトになる。
theme.cssをみると
input, textarea { 
border: 1px solid #BBBBBB;
 font-size: 12px; 
background: #F0F8FF;
 color: black; 
}
 input[type="submit"], input[type="button"],.hinput { 
background: #4477AA;
 color: white; 
margin: 5px;
 padding: 2px;          border-color: gray; 
}
こうなっている。
つまり
1.input指定でinput要素全てに対してスタイルを設定。
2.input[type=""]で、特定の要素（ここではbotton、submit）のスタイルをオーバーライド。
という流れ。
つまり、IE6は2のinput[type=""]を無視するわけだ。
しかし、様々なCSSハックを行っても何故か状況は変わらず…（通常のHTMLではうまくいった）。
結局faceletsに
&#60;style&#62; 
.input_class {
 border: 1px solid #BBBBBB; 
font-size: 10px;
 background: #F0F8FF;         [...]]]></description>
			<content:encoded><![CDATA[<p>IE6はRichFacesのSkinスタイルを思いっきり無視するので要注意。</p>
<p>特にcommandButtonとcheckBoxは「ただのinput」とみなされ、色もマージンも妙なコトになる。</p>
<p>theme.cssをみると</p>
<p><em>input, textarea { </em></p>
<p><em>border: 1px solid #BBBBBB;</em></p>
<p><em> font-size: 12px; </em></p>
<p><em>background: #F0F8FF;</em></p>
<p><em> color: black; </em></p>
<p><em>}</em></p>
<p><em> input[type="submit"], input[type="button"],.hinput { </em></p>
<p><em>background: #4477AA;</em></p>
<p><em> color: white; </em></p>
<p><em>margin: 5px;</em></p>
<p><em> padding: 2px;          border-color: gray; </em></p>
<p><em>}</em></p>
<p>こうなっている。</p>
<p>つまり</p>
<p>1.input指定でinput要素全てに対してスタイルを設定。</p>
<p>2.input[type=""]で、特定の要素（ここではbotton、submit）のスタイルをオーバーライド。</p>
<p>という流れ。</p>
<p>つまり、IE6は2のinput[type=""]を無視するわけだ。</p>
<p>しかし、様々なCSSハックを行っても何故か状況は変わらず…（通常のHTMLではうまくいった）。</p>
<p>結局faceletsに</p>
<p><em>&lt;style&gt; </em></p>
<p><em>.input_class {</em></p>
<p><em> border: 1px solid #BBBBBB; </em></p>
<p><em>font-size: 10px;</em></p>
<p><em> background: #F0F8FF;                  color: black; </em></p>
<p><em>}</em></p>
<p><em> .check_class { </em></p>
<p><em>background-color: transparent;</em></p>
<p><em> border: none; </em></p>
<p><em>margin-left: 5px;</em></p>
<p><em> margin-right: 5px; </em></p>
<p><em>}</em></p>
<p><em> .button_class { </em></p>
<p><em>background: #4477AA;</em></p>
<p><em> color: white; </em></p>
<p><em>margin-left: 5px;</em></p>
<p><em> margin-right: 5px; </em></p>
<p><em>padding: 2px;</em></p>
<p><em> border-color: gray; </em></p>
<p><em>}</em></p>
<p><em> &lt;/style&gt; </em></p>
<p>のようにべた書きして、各要素でstyleClassを使って強制指定することで、ようやく解決した。</p>
<p>う～ん…Vistaがずっこけたので、企業ではいまだにXPがほとんど。</p>
<p>アップデートを意図的に抑制している企業も多くて、IE6はまだ無視出来ない。</p>
<p>PHPやHTML開発でもそうだがIE6には、もうウンザリ。</p>
<p>いつまでWEB開発者は、こんな無駄な時間を浪費せざるおえないのだろうか…。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.inaction.jp/blog/?feed=rss2&amp;p=215</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>seamでのファイルアップロード＆ダウンロード</title>
		<link>http://www.inaction.jp/blog/?p=213</link>
		<comments>http://www.inaction.jp/blog/?p=213#comments</comments>
		<pubDate>Mon, 08 Aug 2011 13:05:22 +0000</pubDate>
		<dc:creator>社長</dc:creator>
				<category><![CDATA[EJB]]></category>

		<guid isPermaLink="false">http://www.inaction.jp/blog/?p=213</guid>
		<description><![CDATA[seamでファイルのアップロードにはs:fileUploadを使う。
これを使うと、EntityBeanに簡単にinsert出来る。
view部分
&#60;h:form id=&#8221;setFORM&#8221; enctype=&#8221;multipart/form-data&#8221;&#62; 
&#60;h:outputText value=&#8221;#{workfile.filename}&#8221;  /&#62;
 &#60;s:fileUpload id=&#8221;uploadFile&#8221; data=&#8221;#{workfile.data}&#8221; fileName=&#8221;#{workfile.filename}&#8221; /&#62; 
&#60;h:commandButton id=&#8221;save&#8221; value=&#8221;登録&#8221; action=&#8221;#{fileEntryAction.save}&#8221;  /&#62;
 &#60;/h:form&#62; 
sessionBean部分
public String save() { 
em.persist(workfile);
 } 
entityBean部分
public class Workfile implements java.io.Serializable { 
@Id
 @GeneratedValue 
private Long workfile;
 private String filename; 
@Lob
 @Column(length = 2147483647) 
@Basic(fetch = FetchType.LAZY)
 private byte[] data; 
～　getter/setter 省略 ～
 } 
わずか数分でコーディング完了。
次にEntityBeanにbyte[]で登録したファイルのダウンロード。
s:linkでリンクをはっておき
&#60;th&#62;&#60;h:outputLabel value=&#8221;図面:&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>seamでファイルのアップロードにはs:fileUploadを使う。</p>
<p>これを使うと、EntityBeanに簡単にinsert出来る。</p>
<p>view部分</p>
<p><em>&lt;h:form id=&#8221;setFORM&#8221; enctype=&#8221;multipart/form-data&#8221;&gt; </em></p>
<p><em>&lt;h:outputText value=&#8221;#{workfile.filename}&#8221;  /&gt;</em></p>
<p><em> &lt;s:fileUpload id=&#8221;uploadFile&#8221; data=&#8221;#{workfile.data}&#8221; fileName=&#8221;#{workfile.filename}&#8221; /&gt; </em></p>
<p><em>&lt;h:commandButton id=&#8221;save&#8221; value=&#8221;登録&#8221; action=&#8221;#{fileEntryAction.save}&#8221;  /&gt;</em></p>
<p><em> &lt;/h:form&gt; </em></p>
<p>sessionBean部分</p>
<p><em>public String save() { </em></p>
<p><em>em.persist(workfile);</em></p>
<p><em> } </em></p>
<p>entityBean部分</p>
<p><em>public class Workfile implements java.io.Serializable { </em></p>
<p><em>@Id</em></p>
<p><em> @GeneratedValue </em></p>
<p><em>private Long workfile;</em></p>
<p><em> private String filename; </em></p>
<p><em>@Lob</em></p>
<p><em> @Column(length = 2147483647) </em></p>
<p><em>@Basic(fetch = FetchType.LAZY)</em></p>
<p><em> private byte[] data; </em></p>
<p><em>～　getter/setter 省略 ～</em></p>
<p><em> } </em></p>
<p>わずか数分でコーディング完了。</p>
<p>次にEntityBeanにbyte[]で登録したファイルのダウンロード。</p>
<p>s:linkでリンクをはっておき</p>
<p><em>&lt;th&gt;&lt;h:outputLabel value=&#8221;図面:&#8221; /&gt;&lt;/th&gt; </em></p>
<p><em>&lt;td&gt;&lt;s:link  action=&#8221;#{restoreAction.download(item.workfile)}&#8221;  value=&#8221;#{item.workfile.filename}&#8221; /&gt;&lt;/td&gt;&lt;/tr&gt;</em></p>
<p>該当action部分</p>
<p><em>public void download(Workfile workfile) {</em></p>
<p><em> try { </em></p>
<p><em>ExternalContext externalContext = facesContext.getExternalContext();</em></p>
<p><em> HttpServletResponse response = (HttpServletResponse) externalContext.getResponse(); </em></p>
<p><em>response.setContentType(&#8220;application/octet-stream&#8221;);</em></p>
<p><em> response.setHeader(&#8220;Content-Disposition&#8221;,&#8221;attachment; filename=¥&#8221;"+workfile.getFilename()+&#8221;¥&#8221;"); </em></p>
<p><em>ServletOutputStream os = response.getOutputStream();</em></p>
<p><em> os.write(workfile.getData()); </em></p>
<p><em>os.flush();</em></p>
<p><em> os.close(); </em></p>
<p><em>facesContext.responseComplete();</em></p>
<p><em> } catch(Exception ex) {          } </em></p>
<p><em>}</em></p>
<p>これでブラウザにダウンロードダイアログが表示される。</p>
<p>日本語ファイル名の場合は、ダウンロード時にファイル名の文字コードを変換すればよい。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.inaction.jp/blog/?feed=rss2&amp;p=213</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>とっても便利なModalPanel</title>
		<link>http://www.inaction.jp/blog/?p=211</link>
		<comments>http://www.inaction.jp/blog/?p=211#comments</comments>
		<pubDate>Mon, 08 Aug 2011 13:02:41 +0000</pubDate>
		<dc:creator>社長</dc:creator>
				<category><![CDATA[EJB]]></category>

		<guid isPermaLink="false">http://www.inaction.jp/blog/?p=211</guid>
		<description><![CDATA[SeamのRichFacesで最も便利な機能ModalPanel。
これを使いたくてSeamを使ってると言っても良いかも。
ただし、便利に使うには少々コツが必要。意外にリソースが少なかったりするからメモっておく。
普通に上位１０件程度の履歴などを見せる場合には、特にコツもなく以下のようなコードで出来る。
パネルを開く
&#60;h:outputLink value=&#8221;#&#8221; id=&#8221;show_link&#8221;&#62; 
&#60;h:graphicImage url=&#8221;img/historys-mini.gif&#8221; alt=&#8221;履歴&#8221; border=&#8221;0&#8243; /&#62;
 &#60;rich:componentControl for=&#8221;history_panel&#8221;  attachTo=&#8221;show_link&#8221; operation=&#8221;show&#8221; event=&#8221;onclick&#8221; 　/&#62; 
 
 &#60;a4j:support event=&#8221;onclick&#8221; actionListener=&#8221;#{orderEntryAction.getHistorys(row)}&#8221; reRender=&#8221;hispanel&#8221; /&#62; 
 
 &#60;/h:outputLink&#62; 
パネル部分
&#60;rich:modalPanel id=&#8221;history_panel&#8221; width=&#8221;550&#8243; height=&#8221;400&#8243;&#62; 
&#60;f:facet name=&#8221;header&#8221;&#62;
 &#60;h:panelGroup&#62; 
&#60;h:outputText value=&#8221;購買履歴（最近の１０件）:&#8221; /&#62;
 &#60;/h:panelGroup&#62; 
&#60;/f:facet&#62;
 &#60;f:facet name=&#8221;controls&#8221;&#62; 
&#60;h:panelGroup&#62;
 &#60;h:graphicImage value=&#8221;img/wclose.png&#8221; style=&#8221;cursor:pointer&#8221; id=&#8221;hidelink&#8221;/&#62; 
&#60;rich:componentControl for=&#8221;history_panel&#8221; attachTo=&#8221;hidelink&#8221; operation=&#8221;hide&#8221; event=&#8221;onclick&#8221; /&#62;
 &#60;/h:panelGroup&#62; 
&#60;/f:facet&#62;
 &#60;rich:dataTable id=&#8221;hispanel&#8221; var=&#8221;sublists&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>SeamのRichFacesで最も便利な機能ModalPanel。</p>
<p>これを使いたくてSeamを使ってると言っても良いかも。</p>
<p>ただし、便利に使うには少々コツが必要。意外にリソースが少なかったりするからメモっておく。</p>
<p>普通に上位１０件程度の履歴などを見せる場合には、特にコツもなく以下のようなコードで出来る。</p>
<p>パネルを開く</p>
<p><em>&lt;h:outputLink value=&#8221;#&#8221; id=&#8221;show_link&#8221;&gt; </em></p>
<p><em>&lt;h:graphicImage url=&#8221;img/historys-mini.gif&#8221; alt=&#8221;履歴&#8221; border=&#8221;0&#8243; /&gt;</em></p>
<p><em> &lt;rich:componentControl for=&#8221;history_panel&#8221;  attachTo=&#8221;show_link&#8221; operation=&#8221;show&#8221; event=&#8221;onclick&#8221; 　/&gt; </em></p>
<p><em> </em></p>
<p><em> &lt;a4j:support event=&#8221;onclick&#8221; actionListener=&#8221;#{orderEntryAction.getHistorys(row)}&#8221; reRender=&#8221;hispanel&#8221; /&gt; </em></p>
<p><em> </em></p>
<p><em> &lt;/h:outputLink&gt; </em></p>
<p>パネル部分</p>
<p><em>&lt;rich:modalPanel id=&#8221;history_panel&#8221; width=&#8221;550&#8243; height=&#8221;400&#8243;&gt; </em></p>
<p><em>&lt;f:facet name=&#8221;header&#8221;&gt;</em></p>
<p><em> &lt;h:panelGroup&gt; </em></p>
<p><em>&lt;h:outputText value=&#8221;購買履歴（最近の１０件）:&#8221; /&gt;</em></p>
<p><em> &lt;/h:panelGroup&gt; </em></p>
<p><em>&lt;/f:facet&gt;</em></p>
<p><em> &lt;f:facet name=&#8221;controls&#8221;&gt; </em></p>
<p><em>&lt;h:panelGroup&gt;</em></p>
<p><em> &lt;h:graphicImage value=&#8221;img/wclose.png&#8221; style=&#8221;cursor:pointer&#8221; id=&#8221;hidelink&#8221;/&gt; </em></p>
<p><em>&lt;rich:componentControl for=&#8221;history_panel&#8221; attachTo=&#8221;hidelink&#8221; operation=&#8221;hide&#8221; event=&#8221;onclick&#8221; /&gt;</em></p>
<p><em> &lt;/h:panelGroup&gt; </em></p>
<p><em>&lt;/f:facet&gt;</em></p>
<p><em> &lt;rich:dataTable id=&#8221;hispanel&#8221; var=&#8221;sublists&#8221;  value=&#8221;#{orderHistoryLists}&#8221; border=&#8221;0&#8243;　cellpadding=&#8221;0&#8243; cellspacing=&#8221;0&#8243;  rowKeyVar=&#8221;subrow&#8221;&gt; </em></p>
<p><em>&lt;rich:column styleClass=&#8221;cell_no&#8221;&gt;</em></p>
<p><em> &lt;f:facet name=&#8221;header&#8221;&gt; </em></p>
<p><em>&lt;h:outputText value=&#8221;No:&#8221; /&gt;</em></p>
<p><em> &lt;/f:facet&gt; </em></p>
<p><em>&lt;h:outputText value=&#8221;#{subrow+1}&#8221; /&gt;</em></p>
<p><em> &lt;/rich:column&gt; </em></p>
<p><em>&lt;rich:column&gt;</em></p>
<p><em> &lt;f:facet name=&#8221;header&#8221;&gt; </em></p>
<p><em>&lt;h:outputText value=&#8221;年月日:&#8221; /&gt;</em></p>
<p><em> &lt;/f:facet&gt; </em></p>
<p><em>&lt;h:outputText value=&#8221;#{sublists.orders.bdate}&#8221;&gt;</em></p>
<p><em> &lt;s:convertDateTime pattern=&#8221;yyyy/MM/dd HH:mm&#8221; /&gt; </em></p>
<p><em>&lt;/h:outputText&gt;</em></p>
<p><em> &lt;/rich:column&gt; </em></p>
<p><em>&lt;rich:column styleClass=&#8221;cell_number&#8221;&gt;</em></p>
<p><em> &lt;f:facet name=&#8221;header&#8221;&gt; </em></p>
<p><em>&lt;h:outputText value=&#8221;数量:&#8221; /&gt;</em></p>
<p><em> &lt;/f:facet&gt; </em></p>
<p><em>&lt;h:outputText value=&#8221;#{sublists.num}&#8221; /&gt;</em></p>
<p><em> &lt;/rich:column&gt; </em></p>
<p><em>&lt;rich:column&gt;</em></p>
<p><em> &lt;f:facet name=&#8221;header&#8221;&gt; </em></p>
<p><em>&lt;h:outputText value=&#8221;金額:&#8221; /&gt;</em></p>
<p><em> &lt;/f:facet&gt; </em></p>
<p><em>&lt;h:outputText value=&#8221;#{sublists.price}&#8221; /&gt;</em></p>
<p><em> &lt;/rich:column&gt; </em></p>
<p><em>&lt;/rich:dataTable&gt;</em></p>
<p><em> &lt;/rich:modalPanel&gt; </em></p>
<p>特に難しくもなく、RichFacesのマニュアル通りに書けば普通に動く。</p>
<p>rich:modalPanelのコードは、どこに書いてもOKなので、ページの頭にでも書いておけばOK。</p>
<p>ただし、ModalPanelの中でフォームを使って検索などをしたい場合には書き方が変わる。</p>
<p>例えば、メインでリンクをクリック-&gt;モーダルオープン-&gt;商品や顧客などを検索-&gt;検索結果をメインにセット等という業務システムではあるととても助かる機能を実装したい場合、上記の方法だと何故かフォームの変数がSessionBeanに渡らない。</p>
<p>なので以下のように書く</p>
<p>パネルを開く</p>
<p>（上記といっしょ。省略）</p>
<p>パネル部分</p>
<p><em>&lt;ui:include src=&#8221;ItemsearchPanel.xhtml&#8221; /&gt;</em></p>
<p>として別のfaceletファイルを読み込む。ui:includeは必ずa4j:formの外側で行う。何故ならItemsearchPanelの中でもa4j:formを使うから。</p>
<p>そしてItemsearchPanelActionクラスを作成（無論インターフェースも）。</p>
<p><em>@Stateful </em></p>
<p><em>@Name(&#8220;itemsearchPanelAction&#8221;)</em></p>
<p><em> public class ItemsearchPanelAction implements Serializable, IItemsearchPanel { </em></p>
<p><em>@PersistenceContext(type = EXTENDED)</em></p>
<p><em> private EntityManager em; </em></p>
<p><em>@In(required = false)</em></p>
<p><em> private String searchcd; </em></p>
<p><em>@In(required = false)</em></p>
<p><em> private String searchname; </em></p>
<p><em>@DataModel(value = &#8220;searchItemLists&#8221;)</em></p>
<p><em> private List&lt;Item&gt; searchItemLists; </em></p>
<p><em>@Out(required = false)</em></p>
<p><em> private Item item; </em></p>
<p><em>@In</em></p>
<p><em> private FacesMessages facesMessages; </em></p>
<p><em>@In</em></p>
<p><em> private Events events; </em></p>
<p><em>@Logger</em></p>
<p><em> private Log log; </em></p>
<p><em>Query query;</em></p>
<p><em> @Remove </em></p>
<p><em>@Destroy</em></p>
<p><em> public void destroy() { </em></p>
<p><em>}</em></p>
<p><em> public void searchItem() { </em></p>
<p><em>try {</em></p>
<p><em> if(searchcd.equals(&#8220;&#8221;)) { </em></p>
<p><em>query = em.createQuery(&#8220;SELECT i FROM Item AS i WHERE  :searchname IS NULL OR (i.nameja LIKE :searchname OR i.namekana LIKE  :searchname OR i.modelname LIKE :searchname OR i.modelkana  LIKE　:searchname OR i.makername LIKE :searchname OR i.standards  LIKE　:searchname )&#8221;);</em></p>
<p><em> query.setParameter(&#8220;searchname&#8221;,getSearchPattern(searchname)); </em></p>
<p><em>} else {</em></p>
<p><em> query = em.createQuery(&#8220;SELECT i FROM Item AS i WHERE i.item = :searchcd&#8221;); </em></p>
<p><em>query.setParameter(&#8220;searchcd&#8221;,Long.parseLong(searchcd));</em></p>
<p><em> } </em></p>
<p><em>query.setFirstResult(0);</em></p>
<p><em> query.setMaxResults(8); </em></p>
<p><em>searchItemLists = query.getResultList();</em></p>
<p><em> } catch(NoResultException ex) { </em></p>
<p><em>facesMessages.add(&#8220;商品がありません&#8221;);</em></p>
<p><em> } </em></p>
<p><em>}</em></p>
<p><em> public String getSearchPattern(String word) {          return word == null ? &#8220;%&#8221; : &#8216;%&#8217; + word.toLowerCase().replace(&#8216;*&#8217;, &#8216;%&#8217;) + &#8216;%&#8217;; </em></p>
<p><em>}</em></p>
<p><em> ｝ </em></p>
<p>view部分</p>
<p><em>&lt;ui:composition xmlns=&#8221;http://www.w3.org/1999/xhtml&#8221; </em></p>
<p><em>xmlns:s=&#8221;http://jboss.com/products/seam/taglib&#8221;</em></p>
<p><em> xmlns:ui=&#8221;http://java.sun.com/jsf/facelets&#8221; </em></p>
<p><em>xmlns:f=&#8221;http://java.sun.com/jsf/core&#8221;</em></p>
<p><em> xmlns:c=&#8221;http://java.sun.com/jsp/jstl/core&#8221; </em></p>
<p><em>xmlns:h=&#8221;http://java.sun.com/jsf/html&#8221;</em></p>
<p><em> xmlns:a4j=&#8221;http://richfaces.org/a4j&#8221; </em></p>
<p><em>xmlns:rich=&#8221;http://richfaces.org/rich&#8221;</em></p>
<p><em> template=&#8221;layout/template3.xhtml&#8221;&gt; </em></p>
<p><em>&lt;ui:component&gt;</em></p>
<p><em> &lt;rich:modalPanel id=&#8221;search_panel&#8221; width=&#8221;550&#8243; height=&#8221;400&#8243;&gt; </em></p>
<p><em>&lt;f:facet name=&#8221;header&#8221;&gt;</em></p>
<p><em> &lt;h:panelGroup&gt; </em></p>
<p><em>&lt;h:outputText value=&#8221;商品の検索:&#8221; /&gt;</em></p>
<p><em> &lt;/h:panelGroup&gt; </em></p>
<p><em>&lt;/f:facet&gt;</em></p>
<p><em> &lt;f:facet name=&#8221;controls&#8221;&gt; </em></p>
<p><em>&lt;h:panelGroup&gt;</em></p>
<p><em> &lt;h:graphicImage value=&#8221;img/wclose.png&#8221; style=&#8221;cursor:pointer&#8221;　id=&#8221;search_hide&#8221; /&gt; </em></p>
<p><em>&lt;rich:componentControl  for=&#8221;search_panel&#8221; attachTo=&#8221;search_hide&#8221; operation=&#8221;hide&#8221;  event=&#8221;onclick&#8221; /&gt;</em></p>
<p><em> &lt;/h:panelGroup&gt; </em></p>
<p><em>&lt;/f:facet&gt;</em></p>
<p><em> &lt;a4j:form ajaxSubmit=&#8221;true&#8221;&gt; </em></p>
<p><em>&lt;h:panelGrid border=&#8221;0&#8243; columns=&#8221;5&#8243;&gt;</em></p>
<p><em> &lt;h:panelGroup&gt; </em></p>
<p><em>&lt;h:outputLabel value=&#8221;商品コード:&#8221; /&gt;</em></p>
<p><em> &lt;/h:panelGroup&gt; </em></p>
<p><em>&lt;h:panelGroup&gt;</em></p>
<p><em> &lt;h:inputText value=&#8221;#{searchcd}&#8221; size=&#8221;5&#8243; maxlength=&#8221;255&#8243; style=&#8221;ime-mode:disabled;&#8221; /&gt; </em></p>
<p><em>&lt;/h:panelGroup&gt;</em></p>
<p><em> &lt;h:panelGroup&gt; </em></p>
<p><em>&lt;h:outputLabel value=&#8221;キーワード:&#8221; /&gt;</em></p>
<p><em> &lt;/h:panelGroup&gt; </em></p>
<p><em>&lt;h:panelGroup&gt;</em></p>
<p><em> &lt;h:inputText value=&#8221;#{searchname}&#8221; size=&#8221;30&#8243; maxlength=&#8221;255&#8243; /&gt; </em></p>
<p><em>&lt;br /&gt;</em></p>
<p><em> &lt;h:outputText value=&#8221;注）品名、型式、メーカー、サイズ/仕様であいまい検索&#8221; /&gt; </em></p>
<p><em>&lt;/h:panelGroup&gt;</em></p>
<p><em> &lt;h:panelGroup&gt; </em></p>
<p><em>&lt;a4j:commandButton value=&#8221;検索&#8221;  actionListener=&#8221;#{itemsearchPanelAction.searchItem}&#8221; reRender=&#8221;slists&#8221;  styleClass=&#8221;button_class&#8221; /&gt;</em></p>
<p><em> &lt;/h:panelGroup&gt; </em></p>
<p><em>&lt;/h:panelGrid&gt;</em></p>
<p><em> &lt;rich:dataTable id=&#8221;slists&#8221; var=&#8221;slists&#8221;  value=&#8221;#{searchItemLists}&#8221; border=&#8221;0&#8243; cellpadding=&#8221;0&#8243; cellspacing=&#8221;0&#8243;  rowKeyVar=&#8221;srow&#8221;&gt; </em></p>
<p><em>&lt;rich:column styleClass=&#8221;cell_no&#8221;&gt;</em></p>
<p><em> &lt;f:facet name=&#8221;header&#8221;&gt; </em></p>
<p><em>&lt;h:outputText value=&#8221;No:&#8221; /&gt;</em></p>
<p><em> &lt;/f:facet&gt; </em></p>
<p><em>&lt;h:outputText value=&#8221;#{srow+1}&#8221; /&gt;</em></p>
<p><em> &lt;/rich:column&gt; </em></p>
<p><em>&lt;rich:column&gt;</em></p>
<p><em> &lt;f:facet name=&#8221;header&#8221;&gt; </em></p>
<p><em>&lt;h:outputText value=&#8221;商品名:&#8221; /&gt;</em></p>
<p><em> &lt;/f:facet&gt; </em></p>
<p><em>&lt;h:outputText value=&#8221;#{slists.nameja}&#8221; /&gt;</em></p>
<p><em> &lt;/rich:column&gt; </em></p>
<p><em>&lt;rich:column&gt;</em></p>
<p><em> &lt;f:facet name=&#8221;header&#8221;&gt; </em></p>
<p><em>&lt;h:outputText value=&#8221;型番:&#8221; /&gt;</em></p>
<p><em> &lt;/f:facet&gt; </em></p>
<p><em>&lt;h:outputText value=&#8221;#{slists.modelname}&#8221; /&gt;</em></p>
<p><em> &lt;/rich:column&gt; </em></p>
<p><em>&lt;rich:column styleClass=&#8221;cell_center&#8221;&gt;</em></p>
<p><em> &lt;f:facet name=&#8221;header&#8221;&gt; </em></p>
<p><em>&lt;h:outputText value=&#8221;設定:&#8221; /&gt;</em></p>
<p><em> &lt;/f:facet&gt; </em></p>
<p><em>&lt;a4j:commandButton value=&#8221;設定&#8221;  actionListener=&#8221;#{orderEntryAction.getItem(comming,slists)}&#8221;  reRender=&#8221;main&#8221; id=&#8221;search_set&#8221; styleClass=&#8221;button_class&#8221; /&gt;</em></p>
<p><em> &lt;rich:componentControl  for=&#8221;search_panel&#8221; attachTo=&#8221;search_set&#8221; operation=&#8221;hide&#8221;  event=&#8221;onclick&#8221; /&gt; </em></p>
<p><em>&lt;/rich:column&gt;</em></p>
<p><em> &lt;/rich:dataTable&gt; </em></p>
<p><em>&lt;/a4j:form&gt;</em></p>
<p><em> &lt;/rich:modalPanel&gt; </em></p>
<p><em>&lt;/ui:component&gt;</em></p>
<p><em> &lt;/ui:composition&gt; </em></p>
<p>ここまで来ればすぐ実装出来るはずだけど、a4j:formをつい忘れてしまうので要注意かな。</p>
<p>昨今はブラウザ側がポップアップブロックを標準装備しててJavaScriptのwindow.open()も使えないから、これは必須の機能だね。</p>
<p>もう気に入っちゃってガンガン多投してるけど、凄く表現力上がるし客受けも良い。</p>
<p>こういうのをパッと出来ちゃう所がseamの便利なところだなぁ。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.inaction.jp/blog/?feed=rss2&amp;p=211</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SeamでのCSV出力</title>
		<link>http://www.inaction.jp/blog/?p=209</link>
		<comments>http://www.inaction.jp/blog/?p=209#comments</comments>
		<pubDate>Mon, 08 Aug 2011 13:01:45 +0000</pubDate>
		<dc:creator>社長</dc:creator>
				<category><![CDATA[EJB]]></category>

		<guid isPermaLink="false">http://www.inaction.jp/blog/?p=209</guid>
		<description><![CDATA[Seam（JSF)でCSVを出力する場合、facesContextを利用してファイルデータを書き出す。
String encoding = &#8220;Windows-31J&#8221;; 
String filename = &#8220;order.csv&#8221;;
 ExternalContext externalContext = facesContext.getExternalContext(); 
HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
 response.setContentType(&#8220;application/octet-stream; charset=&#8221;+encoding); 
response.setHeader(&#8220;Content-Disposition&#8221;,&#8221;attachment; filename=¥&#8221;"+filename+&#8221;¥&#8221;");
 response.setCharacterEncoding(encoding); 
try {
 PrintWriter out = response.getWriter(); 
out.print(&#8220;aaaa&#8221;,&#8221;bbbb&#8221;,&#8221;cccc&#8221;,&#8221;dddd&#8221;);
 out.print(&#8220;¥n&#8221;); 
out.close();
 facesContext.responseComlete();   } catch (IOException ex) { 
}
このへんの処理も業務システムでは多投する。
もう少しスマートに出来るような仕組みがフレームワーク側にあると便利なのだが…。
]]></description>
			<content:encoded><![CDATA[<p>Seam（JSF)でCSVを出力する場合、facesContextを利用してファイルデータを書き出す。</p>
<p><em>String encoding = &#8220;Windows-31J&#8221;; </em></p>
<p><em>String filename = &#8220;order.csv&#8221;;</em></p>
<p><em> ExternalContext externalContext = facesContext.getExternalContext(); </em></p>
<p><em>HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();</em></p>
<p><em> response.setContentType(&#8220;application/octet-stream; charset=&#8221;+encoding); </em></p>
<p><em>response.setHeader(&#8220;Content-Disposition&#8221;,&#8221;attachment; filename=¥&#8221;"+filename+&#8221;¥&#8221;");</em></p>
<p><em> response.setCharacterEncoding(encoding); </em></p>
<p><em>try {</em></p>
<p><em> PrintWriter out = response.getWriter(); </em></p>
<p><em>out.print(&#8220;aaaa&#8221;,&#8221;bbbb&#8221;,&#8221;cccc&#8221;,&#8221;dddd&#8221;);</em></p>
<p><em> out.print(&#8220;¥n&#8221;); </em></p>
<p><em>out.close();</em></p>
<p><em> facesContext.responseComlete();   } catch (IOException ex) { </em></p>
<p><em>}</em></p>
<p>このへんの処理も業務システムでは多投する。</p>
<p>もう少しスマートに出来るような仕組みがフレームワーク側にあると便利なのだが…。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.inaction.jp/blog/?feed=rss2&amp;p=209</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JAVA_OPTS</title>
		<link>http://www.inaction.jp/blog/?p=205</link>
		<comments>http://www.inaction.jp/blog/?p=205#comments</comments>
		<pubDate>Mon, 08 Aug 2011 12:59:48 +0000</pubDate>
		<dc:creator>社長</dc:creator>
				<category><![CDATA[EJB]]></category>

		<guid isPermaLink="false">http://www.inaction.jp/blog/?p=205</guid>
		<description><![CDATA[Jboss AS は、デフォルト設定のままでは、deploy時にOutOfMemoryだしまくり。
Linux環境ではrun.conf、Winではrun.batのJAVA_OPTS変更しないと開発では利用出来ない。
JAVA_OPTS=&#8221;-Xms1303m -Xmx1303m -XX:PermSize=256m -XX:MaxPermSize=512m&#8221;  Jboss ASはメモリイーターなので、けっこう多めに振っておいた方が安心？ メモリ搭載量の少ないマシンに多めのメモリを振りすぎても、やはりOutOfMemory…。 自分の環境では、いちどにたくさんのデータを取得するようなページでは752以上ないとダメだった。 パス式でHQLを書くなどのチューニングまでは（まだ）いっていないが、OS領域もあわせると最低１GB以上は必要かも。
RedHatの公式サポートなどを受けると、この辺のラインはキチンとだしてくれるのだろうか？
とりあえずデュアルコアのプロセッサとタップリなメモリ、それとなるだけメモリを消費しないようなソースで、この仕事をしのいでいこう。 ハードは安くなったからね。
]]></description>
			<content:encoded><![CDATA[<p>Jboss AS は、デフォルト設定のままでは、deploy時にOutOfMemoryだしまくり。</p>
<p>Linux環境ではrun.conf、Winではrun.batのJAVA_OPTS変更しないと開発では利用出来ない。</p>
<p>JAVA_OPTS=&#8221;-Xms1303m -Xmx1303m -XX:PermSize=256m -XX:MaxPermSize=512m&#8221;  Jboss ASはメモリイーターなので、けっこう多めに振っておいた方が安心？ メモリ搭載量の少ないマシンに多めのメモリを振りすぎても、やはりOutOfMemory…。 自分の環境では、いちどにたくさんのデータを取得するようなページでは752以上ないとダメだった。 パス式でHQLを書くなどのチューニングまでは（まだ）いっていないが、OS領域もあわせると最低１GB以上は必要かも。</p>
<p>RedHatの公式サポートなどを受けると、この辺のラインはキチンとだしてくれるのだろうか？</p>
<p>とりあえずデュアルコアのプロセッサとタップリなメモリ、それとなるだけメモリを消費しないようなソースで、この仕事をしのいでいこう。 ハードは安くなったからね。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.inaction.jp/blog/?feed=rss2&amp;p=205</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>リダイレクト先の選択</title>
		<link>http://www.inaction.jp/blog/?p=203</link>
		<comments>http://www.inaction.jp/blog/?p=203#comments</comments>
		<pubDate>Mon, 08 Aug 2011 12:58:39 +0000</pubDate>
		<dc:creator>社長</dc:creator>
				<category><![CDATA[EJB]]></category>

		<guid isPermaLink="false">http://www.inaction.jp/blog/?p=203</guid>
		<description><![CDATA[seamで、条件によって処理後のリダイレクト先を切替える場合はpages.xmlを利用すると良い。
&#60;page view-id=&#8221;/Recognition.xhtml&#8221; action=&#8221;#{recognitionAction.setHome}&#8221; /&#62;   上記をpages.xmlに書き込んだ場合、view-idのページがレンダリングされる直前にactionメソッドが呼び出される。
なので、あとはBeanに
if(come.equals(&#8220;homeAction&#8221;)) { 
return &#8220;/home.xhtml&#8221;;
 } else { 
return &#8220;/RecognitionList.xhtml&#8221;;
 } 
とでも書いておけばOK。
この辺の処理は、本番業務システムではよく必要とする。 けど、自前で書くとけっこう面倒。 フレームワークが面倒を見てくれるととても助か
]]></description>
			<content:encoded><![CDATA[<p>seamで、条件によって処理後のリダイレクト先を切替える場合はpages.xmlを利用すると良い。</p>
<p>&lt;page view-id=&#8221;/Recognition.xhtml&#8221; action=&#8221;#{recognitionAction.setHome}&#8221; /&gt;   上記をpages.xmlに書き込んだ場合、view-idのページがレンダリングされる直前にactionメソッドが呼び出される。</p>
<p>なので、あとはBeanに</p>
<p><em>if(come.equals(&#8220;homeAction&#8221;)) { </em></p>
<p><em>return &#8220;/home.xhtml&#8221;;</em></p>
<p><em> } else { </em></p>
<p><em>return &#8220;/RecognitionList.xhtml&#8221;;</em></p>
<p><em> } </em></p>
<p>とでも書いておけばOK。</p>
<p>この辺の処理は、本番業務システムではよく必要とする。 けど、自前で書くとけっこう面倒。 フレームワークが面倒を見てくれるととても助か</p>
]]></content:encoded>
			<wfw:commentRss>http://www.inaction.jp/blog/?feed=rss2&amp;p=203</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Skinカラー</title>
		<link>http://www.inaction.jp/blog/?p=201</link>
		<comments>http://www.inaction.jp/blog/?p=201#comments</comments>
		<pubDate>Mon, 08 Aug 2011 12:57:52 +0000</pubDate>
		<dc:creator>社長</dc:creator>
				<category><![CDATA[EJB]]></category>

		<guid isPermaLink="false">http://www.inaction.jp/blog/?p=201</guid>
		<description><![CDATA[seamでRichFacesを利用している場合、Skinの色にアクセスしたい場合は
&#60;style&#62; 
.r_header  {
 border: 1px solid #{a4jSkin.tableBorderColor}; 
background-color: #{a4jSkin.headerGradientColor};
 } 
&#60;/style&#62;
のようにa4jSkinで、Skinのスタイルにアクセス出来る。 自前のテーブルやパーツをスタイリングする場合に、普通にcolor:#BCBCBCなどと書いてしまうと、Skinを変更したとき色が合わずに悲しい結果になってしまう。 利用できるスタイルはRichFacesのAPIガイド-&#62;Skinを参照。 上記スタイルはfacelets中に書くべし。
別スタイルシートファイルに書いてもダメだった（まぁ当たり前だが…）。
テンプレにスタイルが入るのは気持ち悪いけど、JSFはもともとそれほど綺麗なHTMLを生成してくれる訳ではないので割り切っていく。
]]></description>
			<content:encoded><![CDATA[<p>seamでRichFacesを利用している場合、Skinの色にアクセスしたい場合は</p>
<p><em>&lt;style&gt; </em></p>
<p><em>.r_header  {</em></p>
<p><em> border: 1px solid #{a4jSkin.tableBorderColor}; </em></p>
<p><em>background-color: #{a4jSkin.headerGradientColor};</em></p>
<p><em> } </em></p>
<p><em>&lt;/style&gt;</em></p>
<p>のようにa4jSkinで、Skinのスタイルにアクセス出来る。 自前のテーブルやパーツをスタイリングする場合に、普通にcolor:#BCBCBCなどと書いてしまうと、Skinを変更したとき色が合わずに悲しい結果になってしまう。 利用できるスタイルはRichFacesのAPIガイド-&gt;Skinを参照。 上記スタイルはfacelets中に書くべし。</p>
<p>別スタイルシートファイルに書いてもダメだった（まぁ当たり前だが…）。</p>
<p>テンプレにスタイルが入るのは気持ち悪いけど、JSFはもともとそれほど綺麗なHTMLを生成してくれる訳ではないので割り切っていく。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.inaction.jp/blog/?feed=rss2&amp;p=201</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>改行の出力</title>
		<link>http://www.inaction.jp/blog/?p=198</link>
		<comments>http://www.inaction.jp/blog/?p=198#comments</comments>
		<pubDate>Mon, 08 Aug 2011 12:56:53 +0000</pubDate>
		<dc:creator>社長</dc:creator>
				<category><![CDATA[EJB]]></category>

		<guid isPermaLink="false">http://www.inaction.jp/blog/?p=198</guid>
		<description><![CDATA[inputTextaraなどで入力させた文字列を表示させるには、s:formattedTextとpreを組み合わせると便利。
&#60;pre&#62; 
&#60;s:formattedText value=&#8221;#{testBean.textarea}&#8221; /&#62;
 &#60;/pre&#62;
preを入れないと、普通に出力されてしまう。 単純だが以外にハマッた。 改行をbrに置き換えるメソッドなどをゴリゴリ書いてて、「まてよ？」と。 なのでメモっておく。
]]></description>
			<content:encoded><![CDATA[<p>inputTextaraなどで入力させた文字列を表示させるには、s:formattedTextとpreを組み合わせると便利。</p>
<p><em>&lt;pre&gt; </em></p>
<p><em>&lt;s:formattedText value=&#8221;#{testBean.textarea}&#8221; /&gt;</em></p>
<p><em> &lt;/pre&gt;</em></p>
<p>preを入れないと、普通に出力されてしまう。 単純だが以外にハマッた。 改行をbrに置き換えるメソッドなどをゴリゴリ書いてて、「まてよ？」と。 なのでメモっておく。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.inaction.jp/blog/?feed=rss2&amp;p=198</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>コンボボックスの連携</title>
		<link>http://www.inaction.jp/blog/?p=193</link>
		<comments>http://www.inaction.jp/blog/?p=193#comments</comments>
		<pubDate>Mon, 08 Aug 2011 12:54:24 +0000</pubDate>
		<dc:creator>社長</dc:creator>
				<category><![CDATA[EJB]]></category>

		<guid isPermaLink="false">http://www.inaction.jp/blog/?p=193</guid>
		<description><![CDATA[あるコンボボックスの選択結果によって、次のコンボボックスを動的に変化させたいような場合がある。
seamの場合はa4j:supportタグを利用すると良さそう。
&#60;h:selectOneMenu value=&#8221;#{machinesListAction.sectioncd}&#8221;&#62; 
&#60;s:selectItems value=&#8221;#{machinesSections}&#8221; var=&#8221;sections&#8221; label=&#8221;#{sections.nameja}&#8221; /&#62;
 &#60;s:convertEntity /&#62;          &#60;a4j:support event=&#8221;onchange&#8221; reRender=&#8221;linecd&#8221;  ajaxSingle=&#8221;true&#8221; action=&#8221;#{machinesListAction.getMachinesSrLine}&#8221; /&#62; 
&#60;/h:selectOneMenu&#62;
 &#60;h:selectOneMenu value=&#8221;#{machinesListAction.linecd}&#8221; id=&#8221;linecd&#8221;&#62; 
&#60;s:selectItems value=&#8221;#{machinesLines}&#8221; var=&#8221;lines&#8221; label=&#8221;#{lines.nameja}&#8221; /
 &#60;s:convertEntity /&#62; 
&#60;a4j:support event=&#8221;onchange&#8221; reRender=&#8221;main&#8221; action=&#8221;#{machinesListAction.getMachinesLists}&#8221; /&#62;
 &#60;/h:selectOneMenu&#62; 
とっても簡単。 ただし、SessionBean側で@Beginをしておかないと、JSFのライフサイクルエラーが出てうまくいかなかった。 どうやらフォーム系は全て@Beginと@Endでライフサイクルを意識した方が良さそう。
]]></description>
			<content:encoded><![CDATA[<p>あるコンボボックスの選択結果によって、次のコンボボックスを動的に変化させたいような場合がある。</p>
<p>seamの場合はa4j:supportタグを利用すると良さそう。</p>
<p><em>&lt;h:selectOneMenu value=&#8221;#{machinesListAction.sectioncd}&#8221;&gt; </em></p>
<p><em>&lt;s:selectItems value=&#8221;#{machinesSections}&#8221; var=&#8221;sections&#8221; label=&#8221;#{sections.nameja}&#8221; /&gt;</em></p>
<p><em> &lt;s:convertEntity /&gt;          &lt;a4j:support event=&#8221;onchange&#8221; reRender=&#8221;linecd&#8221;  ajaxSingle=&#8221;true&#8221; action=&#8221;#{machinesListAction.getMachinesSrLine}&#8221; /&gt; </em></p>
<p><em>&lt;/h:selectOneMenu&gt;</em></p>
<p><em> &lt;h:selectOneMenu value=&#8221;#{machinesListAction.linecd}&#8221; id=&#8221;linecd&#8221;&gt; </em></p>
<p><em>&lt;s:selectItems value=&#8221;#{machinesLines}&#8221; var=&#8221;lines&#8221; label=&#8221;#{lines.nameja}&#8221; /</em></p>
<p><em> &lt;s:convertEntity /&gt; </em></p>
<p><em>&lt;a4j:support event=&#8221;onchange&#8221; reRender=&#8221;main&#8221; action=&#8221;#{machinesListAction.getMachinesLists}&#8221; /&gt;</em></p>
<p><em> &lt;/h:selectOneMenu&gt; </em></p>
<p>とっても簡単。 ただし、SessionBean側で@Beginをしておかないと、JSFのライフサイクルエラーが出てうまくいかなかった。 どうやらフォーム系は全て@Beginと@Endでライフサイクルを意識した方が良さそう。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.inaction.jp/blog/?feed=rss2&amp;p=193</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

