yamicha.com's Blog - Presented by yamicha.com
Blog yamicha.com's Blog - 2018/06 の記事
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30]

yamicha.com's Blog
 諸事情により、現在更新休止中。ご了承ください。もし今後ブログを再開することがあるとすれば、その際にはこのブログスクリプトではなく、新しく開発したものによるかもしれません。
 当ブログ管理者についてはこちらをご参照。
開発魔法(737)
社会問題(733)
お知らせ(11)
質問・バトン回答(15)
ゲスト出演(8)
経済・知的財産(150)
ゲーム開発(182)
[Ada] 勝手に補足
- Note
- 金配りの次の一手


- Endless Ultimate Diary
- 銃世界

漢字バトン
- うるる雑記帳
- 漢字接力棒

ツキアイゲノムバトン
- ブログ@うにうに画像倉庫
- あぶ内閣

縺イ縺セ縺、縺カ縺励ヰ繝医Φ
- 月夜のボヤキ
- 騎士サーラバトン
パスワードを使う
名無し (2012/02/27)


開発者解放裁判
yamicha.com (2010/03/14)
Winnyに関しては、私も「純白」とまでは考えておりませんし、使用し..

開発者解放裁判
通りすがり (2010/03/08)
winnyに関しては「ダウンロードソフト板」なんてところを拠点に開発..

新型インフルエンザの恐怖
いげ太 (2009/11/03)
> C#などの「int Some(int , int)」は、F#では「(int * int) ->..

時効に関する思考
yamicha.com (2009/08/31)
>いげ太さんコメントありがとうございます。手元にドキュメントが少..
Homepage
Blog Top
Normal View
List View
Search
Calendar
Comment List
Trackback List
Blog RSS
Send Trackback
Phone Mode
Administrator
yamicha.com
Blog
るううるる。
Source
法令データ提供システム
FindLaw
Development
Java2 Platform SE 6
Java EE 6 API
MySQL Developer Zone
PHP Reference
MSDN Library
Ada Reference Manual
Objective Caml
Python Documentation
Erlang
Prolog Documents
 垂オ訳ございませんが、現在このブログではトラックバックを受け入れていません。

 この記事に対してリンクされる場合には、こちらのURLをご利用ください。
http://void.yamicha.com/blog/blog.cgi?mode=view&number=757
 上記URLをトリプルクリックされますと、簡単にURL全体の選択が行えます。

※以下の記事がトラックバックされます。
代理十票
2010/04/04(Sun)08:25:19
 参院自民党の若林氏が、何と隣席の青木氏の投票ボタンを本人退席中に勝手に操作したことが発覚し、大問題になっています。民主党は若林氏への懲罰動議を提出しましたが、自民党が若林氏に圧力をかけたこともあってか、氏は自ら議員辞職願を提出して議員辞職、謝罪を行いました。
 このようなことがまさか本当に発生するとは、驚愕を禁じ得ないとしか言いようがありません。しかも、例えば杉村氏のような不見識な「チルドレン」がそれを行ったのならともかく、「良識の府」として被選挙権が衆院より厳しく設定されている参院において、しかも75歳のベテランである若林氏がこのような大失態を犯したのですから、なおさら唖然とさせられます。
 本件に対する反応を見てみると、さすがに社説などでは若林氏を擁護するものは見当たりませんが、中にはなぜか民主党などへの責任転嫁を図ろうとしている内容のものもあり、大変理解に苦しみます。また、個人レベルでは「なぜここまで大騒ぎしなくてはならないのか」といった意見もごく一部に存在しますが、いくら個人の意見であるとはいえ、あまりにも不見識過ぎるとしか評しようがありません。
 本件について、民主党の姿勢を批判したり、あるいは党議拘束について批判したりする意見に関しては、それはそれとして意義のあるものではありますが、その種の議論は本件とは別の議論として行うべきです。なぜなら、仮に民主党の姿勢が評価できるものではなかったり、党議拘束が矛盾のある制度であったとしても、勝手に他の議員の投票を決定する行為の罪はいささかも軽減されず、何の言い訳にもならないためです。氏のような行動は、党議拘束が存在しようがしまいが、民主党がいかなる状況であろうが、等しく重大行為として評価されなくてはならず、民主党がどうこうといったことは何の免罪符にもならない、全く無関係の事柄です。
 ましてや、本件を大した問題でないと評する人間に対しては、唖然とする以外にありません。もし本件のような問題がほとんど、あるいは全く問題視されずに終わってしまえば、他の幾人もの議員が勝手に他人の投票権を行使したり、あるいは欠席・退席する議員が他の議員に代理投票を頼んだりといった行為が日常的に横行し、日本の議会制度が大混乱に陥り、根底から崩壊してしまう状況にもなりかねません。だからこそ、本件における若林氏の行為が最大限の非難を浴びるのは当然ですし、議員辞職でもあがないきれないほど重い問題なのです。
 一方、自民党の「タガの緩み」に原因を求める声もありますが、本件はもはや「タガの緩み」以前の問題です。本件について自民党に責任がないかといえば、全くのゼロであるとまでは言い切れませんが、これまでにも自民党内で同様の行為が横行していたならまだしも、そうでないなら基本的には議員個人の資質や自覚の問題です。タガが緩もうが緩むまいが、他人の分の投票を勝手に行ってはいけない程度のことは、数百分の一もの投票権を行使できる国会議員どころか、一億分の一程度の投票権しか行使できない一般国民でも知っています。
 また、自民党に関しては、衆院選敗北後の首相指名選挙では若林氏に投票する方針として氏を立てておきながら、本件が問題になると「トカゲの尻尾切り」のごとく若林氏を見限って批判に回り、議員辞職に追い込んだ同党の姿勢を批判する意見も一部に存在するようです。
 確かに、党内の都合でこのような不見識な人物を担ぎ上げ、可決はされないにせよ首相にまで指名した点は、自民党にも問題があります。安部氏や麻生氏を担いで失敗した図式そのままで、しかも自民党はその後も田母神氏を立てようとしてみたり、「美人過ぎる市議」なるもので話題づくりに励んだりと、全く反省がありません。自民党に対してそのようなやり方への反省を求めるのは、極めて妥当な意見でしょう。
 しかし、問題発覚後の自民党の厳しい対応は、決して非難されるべきものではありません。本件において自民党が若林氏をかばったのであれば、同党が代理投票行為を「取るに足らない問題」と評価したことになり、そちらの方が大問題であるためです。この問題は議員辞職でも足りないほど重いものですから、もし自民党がその肩を持っていたらと考えるとぞっとしますし、当然ながら許されざる行為です。
 それにしても不思議で仕方ないのが、本件が「若林氏の長男の出馬に影響を与えるかもしれない」という報道です。小泉氏の次男といい、自民党はいつまで時代遅れの世襲行為を繰り返せば気が済むのでしょうか。自民党は「民主党政権は社会主義」などとえらそうなことを言ったりしていますが、元首相の子が世襲し、首相に指名しようとした人物の子まで世襲する以上、少なくとも自民党に「機会の平等」を唱える権利はありません。また、世襲は世襲でも「子に政治家としての実力があり、親がたまたま議員であった」場合の世襲にまで文句をつけるつもりはありませんが、それなら親の議員としての失態がなぜ子に関係するのでしょうか。親の議員としての悪評が子の出馬や選挙に影響するならば、親の知名度や評判もまた子に影響することになりますので、これは世襲者のスタートラインが非世襲者と明らかに異なるという裏づけになります。いずれにせよ大変意味不明で、全くわけが分かりません。
 本件は若林氏というあまりにも非常識な議員が起こした問題であり、しかも自民党は氏をかばっているわけでもなく、その責任の多くを自民党に求めるのには無理があります。しかし、代理投票の問題についてはともかく、これほどまでに非常識な人間を首相にまで指名したこと、また未だに平然と世襲を行っている事実が知れ渡ったことにより、自民党の責任が問われたり、評価を落とすのは仕方のないところでしょう。

 ここまででJSF 2.0のcompositeタグの大部分を使用してみましたが、まだactionSourceやvalueHolderといったものが残っています。何やら少々分かりづらそうなタグですが、ひとまず使用してみなくてはなりません。
 JSF 2.0のAPIドキュメントは非常に不親切で、タグの説明を見ただけでは何が何だか分からない場合が大多数であるため、特に初見のタグを使う場合は開発効率も非常に悪くなりがちなのですが、これらについては例外的にそれなりに親切なサンプルが付加されており、概要をつかむことができます。
 actionSourceのサンプルでは、呼び出し側よりf:actionListenerが渡されており、f:actionListenerとセットで使用できるものであることが読み取れます。f:actionListenerはその名の通りActionListenerを用いるタグですから、actionSourceはリスナにかかわる操作が行えるものであると容易に理解できます。
 valueHolderはf:converterとセットで使用されていますが、実際にはconverterの他にvalidator系統も使用できます。このタグを用いれば、以前に行ったようなスマートでないバリデータの渡し方は回避できそうです。
 以下は、これらのタグを用いた検索プログラム(ただし検索の動作は未実装)のサンプルです。
/resources
 /comp
  searchForm.xhtml
/WEB-INF
 /classes
  /com
   /yamicha
    /custom
     SearchBean.java
     SearchListener.java
     TextValidator.java
 web.xml
customSearchForm.xhtml
searchResult.xhtml
 SearchListenerはActionListenerを実装したクラスで、f:actionListenerで用います。TextValidatorはクラスバリデータで、こちらはf:validatorで使用しています。
 web.xmlは例によって前回と同様です。
<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app>
  <context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
  </context-param>

  <display-name>JSF 2.0 Custom Component Servlet</display-name>
  <description>JSF 2.0 Custom Component Servlet</description>

  <servlet>
    <servlet-name>jsf20custom</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>jsf20custom</servlet-name>
    <url-pattern>*.jsf</url-pattern>
  </servlet-mapping>
</web-app>
 SearchBean.javaはいくつかのデータを保持する他、ActionListener実装クラスのインスタンスを保持するbindingA及びbindingBプロパティ、同じくValidatorの実装クラスのインスタンスを返すasciiValidatorプロパティを用意しています。
package com.yamicha.custom;

import javax.ejb.*;
import javax.annotation.*;
import javax.faces.validator.ValidatorException;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.application.FacesMessage;
import javax.faces.component.html.HtmlInputText;
import javax.faces.bean.*;
import javax.faces.event.*;
import java.util.*;

@ManagedBean @RequestScoped public class SearchBean
	implements java.io.Serializable{
	private String word;
	private String type;
	private SearchListener bindingA;
	private SearchListener bindingB;

	public SearchBean(){
		bindingA = new SearchListener("Binding A");
		bindingB = new SearchListener("Binding B");
	}

	public String getWord(){
		return word;
	}
	public String getType(){
		return type;
	}

	public SearchListener getBindingA(){
		return bindingA;
	}
	public SearchListener getBindingB(){
		return bindingB;
	}

	public void setWord(String w){
		word = w;
	}
	public void setType(String t){
		type = t;
	}

	public void setBindingA(SearchListener s){
		bindingA = s;
	}
	public void setBindingB(SearchListener s){
		bindingB = s;
	}

	public TextValidator getAsciiValidator(){
		return new TextValidator((char)0x0 , (char)0x7F);
	}
}
 SearchListener.javaには、検索ボタンが押された際の動作を記述しています。
package com.yamicha.custom;

import javax.ejb.*;
import javax.annotation.*;
import javax.faces.context.ExternalContext;
import javax.faces.component.UIComponent;
import javax.faces.component.ValueHolder;
import javax.faces.context.FacesContext;
import javax.faces.bean.*;
import javax.faces.event.*;
import java.util.*;

public class SearchListener implements ActionListener{
	private String type;

	public SearchListener(){
		this("Default");
	}
	public SearchListener(String t){
		type = t;
	}

	public void processAction(ActionEvent event)
		throws AbortProcessingException{
		ValueHolder word = (ValueHolder)
			event.getComponent().findComponent("word");
		ExternalContext ec = FacesContext.
			getCurrentInstance().getExternalContext();
		Map<String , Object> request = ec.getRequestMap();

		if(word != null){
			String w = (String)word.getValue();
			if(!w.isEmpty()){
				SearchBean sb = (SearchBean)
					request.get("searchBean");
				if(sb == null)
					sb = new SearchBean();

				sb.setType(type);
				sb.setWord(w);

				request.put("searchBean" , sb);

				try{
					ec.dispatch("searchResult.jsf");
				}catch(java.io.IOException e){
				}
			}
		}
	}
}
 processActionの呼び出しがあると、まずfindComponent("word")で"word"というidを持つコンポーネント(xhtml内部で記述)を取得、それが空でない場合にはSearchBeanのwordプロパティにそれを書き込み、typeプロパティにはSearchListenerが保持するtype文字列を書き込みます。さらにsearchResult.jsfにディスパッチし、結果表示画面を表示するようにします。一方、wordが空の場合には何も行いません。
 TextValidator.javaは単純なバリデータの実装で、単に「文字列の中に指定範囲外のものが見つかったらValidatorExceptionを投げる」だけのものです。
package com.yamicha.custom;

import javax.faces.validator.*;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.application.FacesMessage;
import javax.faces.bean.*;
import javax.faces.event.*;
import java.util.*;

public class TextValidator implements Validator{
	char min;
	char max;

	public TextValidator(char min , char max){
		this.min = min;
		this.max = max;
	}

	public void validate(FacesContext context ,  UIComponent component ,
		Object object) throws ValidatorException{
		String str = (String)object;

		for(int i = 0; i < str.length(); i++){
			if(str.charAt(i) < min || str.charAt(i) > max){
				throw new ValidatorException(
					new FacesMessage(
"入力された文字列の中に、制限の範囲外の文字があります。"));
			}
		}
	}
}
 actionSource及びvalueHolderを使用している、肝心のsearchForm.xhtmlは次の通りです。
<?xml version="1.0" encoding="Shift_JIS" ?>
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:c="http://java.sun.com/jsp/jstl/core"
  xmlns:composite="http://java.sun.com/jsf/composite">

  <composite:interface>
    <composite:attribute name="size" />
    <composite:attribute name="buttonLabel" default="Search" />
    <composite:valueHolder name="word" />
    <composite:actionSource name="searchEvent" />
  </composite:interface>

  <composite:implementation>
    <h:inputText id="word" size="#{cc.attrs.size}" />
    <h:commandButton id="searchEvent" value="#{cc.attrs.buttonLabel}" />
  </composite:implementation>
</html>
 これを使用しているのがcustomSearchForm.xhtmlです。
<?xml version="1.0" encoding="Shift_JIS" ?>
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:c="http://java.sun.com/jsp/jstl/core"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:cc="http://java.sun.com/jsf/composite/comp">

<h:head>
  <title>JSF 2.0 Custom Component</title>
</h:head>

<h:body>
  <h:form>
    <b>サンプル検索フォーム(type)</b><br />
    <cc:searchForm buttonLabel="検索(type)">
      <f:actionListener for="searchEvent"
        type="com.yamicha.custom.SearchListener" />
    </cc:searchForm>
  </h:form>

  <!-- テキストボックスに入力がなければエラー -->
  <h:form>
    <b>サンプル検索フォーム(type/validateRequired)</b><br />
    <cc:searchForm buttonLabel="検索(type/validateRequired)">
      <f:actionListener for="searchEvent"
        type="com.yamicha.custom.SearchListener" />
      <f:validateRequired for="word" />
    </cc:searchForm>
  </h:form>

  <!-- 0x00 から 0x7F の範囲外の文字が送信されたらエラー -->
  <h:form>
    <b>サンプル検索フォーム(type/CustomValidator)</b><br />
    <cc:searchForm buttonLabel="検索(type/CustomValidator)">
      <f:actionListener for="searchEvent"
        type="com.yamicha.custom.SearchListener" />
      <f:validator for="word" binding="#{searchBean.asciiValidator}" />
    </cc:searchForm>
  </h:form>

  <h:form>
    <b>サンプル検索フォーム(binding A)</b><br />
    <cc:searchForm buttonLabel="検索(binding A)">
      <f:actionListener for="searchEvent" binding="#{searchBean.bindingA}" />
    </cc:searchForm>
  </h:form>

  <h:form>
    <b>サンプル検索フォーム(binding B)</b><br />
    <cc:searchForm buttonLabel="検索(binding B)">
      <f:actionListener for="searchEvent" binding="#{searchBean.bindingB}" />
    </cc:searchForm>
  </h:form>
</h:body>

</html>
 f:actionListenerのリスナ指定方法には2種類があり、typeの場合にはクラス名を指定します。この場合にはおそらくデフォルトコンストラクタが呼び出され、そうして生成されたインスタンスのprocessActionメソッドが呼び出されます。bindingの場合はリスナのインスタンスが格納されたプロパティを指定し、そのインスタンスのメソッドが呼び出されます。
 上記xhtmlのフォームは上から順に、f:actionListenerのtypeにてクラスの指定を行ったもの、type指定かつ標準バリデータであるf:validatorRequredで"word"をチェックするもの、type指定かつカスタムバリデータで"word"をチェックするもの、f:actionListenerにbindingAプロパティを渡すもの、同じくbindingBプロパティを渡すものの5種類となっています。
 後はリダイレクト先のsearchResult.xhtmlを残すのみです。これはサンプルですから検索は実装していませんが、実装の際にはSearchListenerに検索の動作を書き加え、searchResult.xhtmlで結果を表示すれば、おそらく正しく動作するでしょう。
<?xml version="1.0" encoding="Shift_JIS" ?>
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:c="http://java.sun.com/jsp/jstl/core"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:cc="http://java.sun.com/jsf/composite/comp">

<h:head>
  <title>JSF 2.0 Custom Component</title>
</h:head>

<h:body>
  <b>
    <h:outputText value="#{searchBean.type}" />
  </b>
  検索フォームにて
  <b>
    <h:outputText value="#{searchBean.word}" />
  </b>
  を検索しました。
</h:body>

</html>
カテゴリ [開発魔法][社会問題] [トラックバック 0][コメント 0]
<- 前の記事を参照 次の記事を参照 ->

- Blog by yamicha.com -