ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

Windows7のPR,ラッキー7福神

2009-09-18 14:04:39 | Weblog

これ


http://www.microsoft.com/japan/athome/umall/win7/lucky7/default.aspx


(^^;)

ラッキー池田がいないのは?
ラッキィじゃないからか(^^;)
(じゃなくって、七福神じゃないだろって ^^;)



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

EclipseでXMLを作成する2つの方法(struts-config.xmlを例に)

2009-09-18 11:25:14 | Weblog

EclipseでXMLを作成する場合、2とおり考えられる。
ここで、struts-config.xmlを例に考えると、
(1)既存のXML(struts-config.xml)を読み込み、それを編集する。
(2)EclipseでWML,XHTML,HTMLを作成する方法で書いたように、DTD等から新規作成する。
となるが、この2つの場合を比べてみる



■(1)既存のXMLを読み込む方法(struts-config.xmlを例に)
 これは、かんたん。
・プロジェクトをクリック、右ボタン選択で、ポップアップをだして「Import」を選択
・ダイアログが出てきたらFile System選択してNext
・次のダイアログで、Browserからファイルを選んでFinishで読み込み
・読み込んだら、struts-configを開くと
  struts-config
 とでてくるので、あと、クリックしていくと、要素が出てくる
 右クリックで、下のように、要素を追加でき、

 一番下のNew Entryで、ここにないタグも追加できる。




■(2)DTD等から、新規作成する方法(struts-config.xmlを例に)
 DTDやXMLスキーマから、新規作成も出来る。
・DTDをダウンロードする。
 struts-config.xmlを開くと、上のほうに、

<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
"http://struts.apache.org/dtds/struts-config_1_3.dtd">

なんていう記述があることがある。つまり、DTDは、
http://struts.apache.org/dtds/struts-config_1_3.dtd
にあるってことなので、このURLをブラウザにいれる。
保存するか?ときいてきたら、保存する。

・新規作成
EclipseでWML,XHTML,HTMLを作成する方法で書いたように(一部赤字の部分違う)

   File→New→Otherでダイアログが出たら、XMLを選択してNext
  次ダイアログ、作成先プロジェクトを選んでNext
  次ダイアログ、Create XML file from a DTD file(一番上)選択NEXT
  次ダイアログ、

  Select file from Workspaceを選択、Import Filesをクリック
  出てきたダイアログで、Browseでフォルダを選び、今ダウンロードした
   struts-config_1_3.dtdのDTDを選択してFinish

  ダイアログがImport Filesのものに戻るので、
   そこから、読み込んだDTDを選択NEXT
  最後のダイアログ、Finish

とすると、新規作成される

(3)一部書き換え
 でも、そうすると、一番上の部分のDOCTYPEが違ってしまっているので、
 そこを、どこからかのstruts-config.xmlをもとに書き換え
  (Sourceタブにして、そこに貼りこみ)




■違い
このようにつくると、こんなかんじで

追加するとき、DTDに基づいたものしか出てこなくなる。
(図で、ファイルがnewFile.xmlになっているのは、さっき、(2)のところで、

   次ダイアログ、作成先プロジェクトを選んでNext

 としてしまったため。
 ここで、下にFileNameがあるので、そこにstruts-config.xmlと書けば、そのファイル名になる)

 でも、それだけに、こんだけのことをするのは・・めんどっちい?

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ブラウザで、新たなウィンドウを、ツールバーとか消して表示する

2009-09-17 13:04:22 | Weblog

ことで、この前の美人時計を常に出しておくやつ

を実現してみました
(時計の真上においても、意味ねーだろーって(^^;))

こんなかんじ

<html>
<head>
<script type="text/javascript">
<!--
function bijin()
{
window.open("http://www.gmodules.com/ig/ifr?url=http://bijint.com/bijint.xml&synd=open&w=240&h=320&title=%E7%BE%8E%E4%BA%BA%E6%99%82%E8%A8%88%EF%BC%88bijin-tokei%EF%BC%89&border=%23ffffff%7C3px%2C1px+solid+%23999999","_blank",
"toolbar=no,status=no,scrollbars=no,location=no,menubar=no,directories=no,width=240,height=320");
window.close();
}
//-->
</script>

</head>
<body>
</BODY>
<INPUT TYPE=BUTTON onClick="bijin()"value="美人時計"/>
</html>

(上記< >は、本当は半角)
window.open(美人時計のガシェットURL,"_blank",新しいウィンドウのスタイル);
で、新しいウィンドウのスタイルをツールバーとかをNOにして、
(toolbar=no,status=no,scrollbars=no,location=no,menubar=no,directories=no)
さいご、元のウィンドウをcloseしています。

何回か、メッセージが出て、それに答えなきゃいけないけど、
ま、できたことはできたから、よしとしよう。



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

JUDEが、「astah*」(アスター)に名前変わるんだって!

2009-09-16 23:51:46 | Weblog

UMLなどの描画ツールJUDEが、「astah*」(アスター)に名前変わるんだって!
ここ
JUDE から astah* へ名称変更・新価格などを発表
http://www.change-vision.com/ja/astah.html

なーぜー?

政権交代したから?じゃあ、なぜasoに似たastah?
あ、わかった(^_^)v
きっと、どっかの引っ越し会社のように、製品一覧で、
50音順でも、アルファベット順でも、
前のほうにくるため?真ん中じゃ、めだたないもんねえ・・・


・・・え、ばかなこと言ってないで、平鍋さんのブログみろって(^^;)
(理由書いてある)

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

UML等各種ダイアグラムのエラーチェック体系化(その32:業務流れ図→プログラム)

2009-09-16 18:07:23 | Weblog

シリーズUML等各種ダイアグラムのエラーチェック体系化です。

 現在「いろんなダイアグラムをRDBにいれよう!」化計画、
 をやっていて、
  ・クラス図
  ・ER図
  ・アクティビティ図
  ・ユースケース図
  ・DFD
  ・機能構成図(DMM)
  ・業務流れ図
 までをやりました。
 で、今回、まず、業務流れ図+アクティビティ図をあわせたものから、プログラムがどこまで作れるかについて、検討してみます。

ちなみに、今までのまとめは、ここ




■元となる「業務流れ図+アクティビティ図」

こんなかんじのテーブル構成
●レーンテーブル
  (レーンID,ロール(レーン名),親レーンID)
●エッジテーブル
  (エッジID,エッジ種別、元ノード等ID,先ノード等ID,エッジ説明)
●エッジコネクタテーブル
  (コネクタID,番号等)
●動作ノード(アクション)テーブル
  (動作ノードID,動作名、所属レーンID、親動作ノードID,動作ノード種別)
●オブジェクトノードテーブル
  (オブジェクトノードID、オブジェクト名、親オブジェクトノードID,オブジェクト種別)
●制御ノードテーブル*
  (制御ノードID,制御ノード種別)
●コメントテーブル
  (コメントID,コメント内容)


ここから、プログラムを書くわけですが、まず、参考図として、
EAの業務流れ図の
これ http://www.meti.go.jp/policy/it_policy/ea/gainen/product/wfa/images/2-34f.gif
をプログラムにすることを考えます。




■プログラム作成手順

こんなかんじ
1.オブジェクト種別に対する、プログラムのフレームワークを決定する
2.業務流れ図から、それに対応するプログラムを当てはめる
3.作成する。

ではまず、1から




■オブジェクト種別に対する、プログラムのフレームワークを決定する

 入出力の種別ごとに、プログラムのフレームワークが決まってきます。

今回は、

  ・コンピューター画面
  ・帳票 
  ・コンピューターファイル

とあります。

今回は、以下のように決定したとします。

  コンピューター画面=Struts
  バッチプログラム=作っておきます

上記2つから呼び出されるプログラムとして
  帳票=XML出力→FOPを使って→PDF
  コンピューターファイル=O/Rマッピング・・・までいくと面倒なので、
     SQLを受け取ったら、書き出すプログラムを作ってあるとする



■業務流れ図から、それに対応するプログラムを当てはめる

 さっきの図から当てはめます。あくまでも、現状のとおり、手作業のとことはそのままとして。

コンピューター画面=Struts
  (1)受講者募集
  (2)民間企業/他省庁参加申し込み
  (3)省内参加申し込み
  (4)受講者確認登録
  (5)テスト結果登録

バッチプログラム
  (6)受講者リスト作成
  (7)アンケート分析

 ただし、アンケート分析は、記入されたアンケート用紙を入力しているので、普通に考えると、画面が必要と思われます(ないってことは、マークシートなの?)


そして、DBとしては
  (A)研修募集テーブル
  (B)受講者テーブル
  (C)人事テーブル
が必要で(もちろん、DBは、正規化などすると、増える可能性アリ)、
帳票は、
  (D)受講者リスト
になります。帳票としてほかに、
  ・テスト結果
  ・アンケート記入
がありますが、これは、手作業からきているので、コンピューター化された帳票ではないと考えられます(テストを採点して出来たテスト結果と、アンケートを記入した紙)。
 なお、上記に書いたように、手作業の紙を入力するには、画面が必要なはずですが、アンケート分析には、画面がないので、アンケートはマークシートのような、画面入力ナシで電子化できるものと考えられます。
 また、テスト結果の登録は、テスト結果の画面入力によって、行われるものと考えます。

 上記コンピューター画面やバッチプログラムと、DB,帳票の関係(呼び出し)は、図のエッジの連結から、こんかんじと想像できます。
  (1)受講者募集
     Actionで、(A)研修募集テーブル呼び出し
  (2)民間企業/他省庁参加申し込み
     Actionで、(A)研修募集テーブル呼び出し
  (3)省内参加申し込み
     Actionで、(A)研修募集テーブル呼び出し
  (4)受講者確認登録
     Actionで、(B)受講者テーブル呼び出し(入出力のはず)
  (5)テスト結果登録
     Actionで、(C)人事テーブル呼び出し
  (6)受講者リスト作成
     バッチプログラムで、
        (A)研修募集テーブル呼び出し
        (B)受講者テーブル呼び出し
        (D)受講者リスト書き出し
  (7)アンケート分析
     バッチプログラムで、
        (B)受講者テーブル呼び出し
        (C)人事テーブル呼び出し
 となります。




■3.作成する。

 と、ここまできて、各画面の作成となります。
 で、これだけの資料で、どこまで作成できて、あと何が必要なのかについては、次回以降に書きたいと思います。

 ってことで、今日はここまで。



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

EclipseでWML,XHTML,HTMLを作成する方法

2009-09-16 16:32:18 | Weblog

 Eclipseから、XHTMLやHTML,ケータイのXHTMLや、(WAPの)WMLを作成、編集する方法について。

【環境】eclipse 3.5 (日本語パッチを当てていない)




【手順】



1.メニューから、File→New→Othersを選択


2.出てきたダイアログで、XML→XMLを選択


3.XMLファイルを保存するプロジェクトとファイル名を選択

ここで、HTMLを保存したいからと、NewFile.htmとしても、先にいけない。拡張子は必ずxmlにしないといけないようだ。もちろんファイル名NewFile部分は変えてよい。

4.次のダイアログで、一番上(DTDからXMLファイル新規作成)を選ぶ

DTDに、しないとできない。

5.次のダイアログ、下のほうまでいって、XHTMLなり、WMLなり、作りたいもののDTDを選ぶ。


ただし、HTMLを作りたい場合、そこにあるHTMLを選択しても、次の画面で、エラーになる。そこで、仕方ないからXHTMLを選ぶ

6.次の画面でFinishをクリック


7.画面からタグを操作
 HTMLの場合、HTMLをクリックすると、HEAD,BODY,TITLEと、クリックするだけででてくる。titleの右側が、titleと文字が出ている。ここをクリックすると、文字が入力できる。
 BODYに新しい子を作りたい場合、AddChildをクリック。作りたい要素を選ぶ。

 文字入力は、要素を作って、さらに、Add Childの#PCDATAでもできるけど

たとえば、H1の右側をクリックするだけで、文字を入力することも出来る。




●HTMLを書きたい場合


 これだとXHTMLなので、HTMLの場合は、Sourceタブをクリックして


テキスト内容を表示して、HTMLタグ内の部分だけ、なにかにコピーして保存するかんじ?
ちなみに、このSourceファイルから、書くこともできる。


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Javascriptを使い、ブラウザでSQLを組み立てると、かなり柔軟に仕様変更できるが・・・

2009-09-16 12:12:59 | Weblog

 昨日の、Javascriptを利用してActionを実行する方法だけど、この応用で、Javascriptを使い、ブラウザでSQLを組み立てると、サーバー側のプログラムを変えずに、かなり柔軟に仕様変更できる。

 さらに、サーバー側のプログラムはStrutsでなくても、CGIでも、サーブレットでも、何でもよくなってくる。

 具体的に例をだそう。

 なお、これ以降の説明中に出てくるテーブルは、改訂新版 はじめてのSQLの36ページDEPT表を使っている。(が、実は、どんなテーブルでもOKなのお・・・ってことは、後でわかる)




■概要

 たとえば、Strutsを利用して検索の場合、

(1)検索画面では、strutsタグでは、hiddenで、paraという1項目だけを定義する(ここにSQLが入る)
(2)そして、他の入力項目はINPUTタグで定義し(そうすると、ActionFormで、セッターゲッターを定義しなくてよい)、ボタンを用意する。
(3)ボタンが押されたら、入力項目からデータを取ってきて、検索SQL文を作成し、paraにセットし、submit()して、サーバーへ
(4)サーバー側では、paraからSQL文を受け取り、それを実行、結果をArrayList(要素はHashMap)にいれる
   1レコード1ArrayListの要素(=1HashMap)で、
   1レコード分のHashMapの1つのキーは1項目分、値は、それに対する値
(5)そのArrayListをセッションにいれて、結果表示JSPは、そのセッションの値を
   元に表示する。

 Strutsでない場合、(3)をsubmitでなく、AJAX(REST)とかにして、(5)の返り値をXMLにするとかすれば、サーバーのフレームワーク、言語は問わないことになる。




■ソース

ってことで、まず、(1)~(3)を実行する、検索部分のJSPはこんなかんじ(index.jsp)
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<%@ page contentType="text/html; charset=utf-8" %>
<html:html>
<HEAD>
<TITLE>検索</TITLE>
<script type="text/javascript" language="javascript">
<!--

function zikko()
{
	where = "";
	where = addwhere(where,selectForm.basho.value,"LOC","'");
	where = addwhere(where,selectForm.dname.value,"DNAME","'");
	selectForm.para.value = "SELECT * FROM DEPT";
	if ( where != "" )
	{
		selectForm.para.value += " WHERE " + where;
	}
	selectForm.submit();
}		

function addwhere(where,val,key,flg)
{
	if (val != "")
	{
		if ( where != "" )
		{
			where += " AND";
		}
		where += ( " "+ key+ "=" + flg + val + flg );
	}
	return where;
}
// -->
</script>
</HEAD>
<BODY>
<html:form action="/select">
<html:hidden property="para"/>
場所<INPUT TYPE=text NAME="basho" size="6"/><BR>
名前<INPUT TYPE=text NAME="dname" size="6"/><BR>
<html:button property="b1"  onclick="zikko()">検索実行</html:button>
</html:form>
</BODY>
</html:html>

(上記 < >は、本当は半角)

そして、(4)の部分だが、まず、ActionFormは、こんなかんじで、
package dbsample;
import org.apache.struts.action.*;
public class selectActionForm  extends ActionForm {
	private String para;
    public String getPara() {
        return para;
    }
    public void setPara(String para) {
        this.para = para;
    }
}

(4)を実行するActionは、こんなかんじ
package dbsample;
import java.sql.*;
import java.util.*;

import javax.servlet.http.*;
import org.apache.struts.action.*;
import java.io.*;

public class selectAction extends Action {
	 public ActionForward execute(
		     ActionMapping mapping,
		     ActionForm form,
		     HttpServletRequest request,
		     HttpServletResponse response) {

		//	画面パラメータの取得
	 	selectActionForm myForm = (selectActionForm)form;
		//	セッションの取得
        	HttpSession session = request.getSession();
	        
    		try
    		{
        		Connection con = null;
        		Statement stmt = null;
    			
        		// DB接続(testデータベースに、ログイン名root,パスワードpasswordの場合)
    			Class.forName("org.gjt.mm.mysql.Driver");
   			con = DriverManager.getConnection("jdbc:mysql:///test","root","password");
    			stmt = con.createStatement();

    			//	SQL(画面から引数para)実行
    			ResultSet rs = stmt.executeQuery(myForm.getPara());

    			//	結果をArrayListに
    			ArrayList<HashMap<String,String>> result 
    				= new ArrayList<HashMap<String,String>>();
    			while(rs.next())	//	行数分処理
    			{
    				HashMap<String,String> map = new HashMap<String,String>();
    				//	項目数分出力
    				for(int j = 1 ; j <= rs.getMetaData().getColumnCount() ; j ++)
    				{
    					map.put(rs.getMetaData().getColumnName(j),
    					 		rs.getString(j));
    				}
    				result.add(map);
    			}
    			//	あとしまつ
			stmt.close();
			con.close();
				
			//	結果をセッションにいれる
			session.setAttribute("result",result);
			session.setAttribute("kekka","");
    		}
    		catch(Exception e)
    		{
			session.removeAttribute("result");
			session.setAttribute("kekka",e.toString());
    			return mapping.findForward("error");
    		}
			return mapping.findForward("success");
	 }
}

(上記 < >は、本当は半角)
SQLを受け取るところ、myForm.getPara()になっている。
つまり、javascriptでSQLを作って、そのまま実行している。

そして、結果表示は、こんなかんじ(kekka.jsp)
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<%@ page contentType="text/html; charset=utf-8" %>

<HTML>
  <HEAD>
    <TITLE>検索結果</TITLE>
  </HEAD>
  <BODY>
    結果<BR>

<table border=1>
<tbody>
<logic:notEmpty name="result" scope="session">
<logic:iterate id="me" name="result" scope="session" indexId="idx">
	<tr>
		<td><bean:write name="me" property="DEPTNO" /></td>
		<td><bean:write name="me" property="DNAME" /></td>
		<td><bean:write name="me" property="LOC" /></td>
	</tr>
</logic:iterate>
</logic:notEmpty>
</tbody>
</table><BR>
<A HREF="index.jsp">戻る</A>
</BODY>
</HTML>

(上記 < >は、本当は半角)

エラーの場合は、エラーメッセージを出している(error.jsp)
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<HTML>
  <HEAD>
    <TITLE>エラー</TITLE>
  </HEAD>
  <BODY>
    <H2>
      <bean:write name="kekka" scope="session"/>
    </H2>
    <A HREF="index.jsp">戻る</A>
  </BODY>
</HTML>

(上記 < >は、本当は半角)

ついでに書くと、struts-config.xmlは、こんなかんじ
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
          "http://struts.apache.org/dtds/struts-config_1_3.dtd">

<struts-config>

    <form-beans>
        <form-bean name="selectForm" type="dbsample.selectActionForm"/>
    </form-beans>

    <action-mappings>
        <action
            path="/select"
            type="dbsample.selectAction"
	    name="selectForm" scope="request" validate="false">
	          <forward name="success" path="/kekka.jsp"/>
	          <forward name="error" path="/error.jsp"/>
	</action>
    </action-mappings>

</struts-config>

(上記 < >は、本当は半角)




■メリット

こりゃー、チョー便利だ。
テーブル項目を追加、変更したい場合,
たとえば、DEPTNOという項目を追加したい場合、
検索部分のJSP(index.jsp)を
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<%@ page contentType="text/html; charset=utf-8" %>
<html:html>
<HEAD>
<TITLE>検索</TITLE>
<script type="text/javascript" language="javascript">
<!--

function zikko()
{
	where = "";
	where = addwhere(where,selectForm.basho.value,"LOC","'");
	where = addwhere(where,selectForm.dname.value,"DNAME","'");
	where = addwhere(where,selectForm.deptno.value,"DEPTNO","");
	selectForm.para.value = "SELECT * FROM DEPT";
	if ( where != "" )
	{
		selectForm.para.value += " WHERE " + where;
	}
	selectForm.submit();
}		

function addwhere(where,val,key,flg)
{
	if (val != "")
	{
		if ( where != "" )
		{
			where += " AND";
		}
		where += ( " "+ key+ "=" + flg + val + flg );
	}
	return where;
}
// -->
</script>
</HEAD>
<BODY>
<html:form action="/select">
<html:hidden property="para"/>
場所<INPUT TYPE=text NAME="basho" size="6"/><BR>
名前<INPUT TYPE=text NAME="dname" size="6"/><BR>
番号<INPUT TYPE=text NAME="deptno" size="6"/><BR>
<html:button property="b1"  onclick="zikko()">検索実行</html:button>
</html:form>
</BODY>
</html:html>

(上記 < >は、本当は半角。赤字は修正箇所)
ってなかんじで、値をいれるところと、あとSQL文をつくるところを変えるだけで、本体を何もいじらないでできる。

ってか、テーブル自体変えちゃう事だってできる。
もちろん、変更に伴い、結果表示画面を変えることはある。でも、結果表示もJSPだけなので、結局JSPを書き換えるだけで、Action,ActionFormは変えずに、Tomcatをとめずにできる。

 エラーチェックはJavascriptですればいいし。。。

 つーか、元となるプログラムは
  ・select用(execQuery実行)
  ・1行Update用(execUpdate実行)
  ・トランザクション複数行更新用
 の3つを用意すれば、あとは画面のJSPを作れば、どーにでもなりそうな気がする
(画面制御は、kekka.jspにlogic:forwardを書いて、ステータス(をセッションに入れておき)によって、表示したいJSPにフォワードするようにすれば、struts-configの修正もいらない。
ステータスは、成功時、次に遷移するステータスをjavascriptでSQLと一緒に送るようにすればいい。もちろん、条件とかもあり、それも送らないといけない場合もあるかもしれないけど、まあ、そのへんは適当に拡張してもらって・・・)




■問題点

 しかし、このやり方は致命的問題点がある。

 セキュリティがぼろぼろだ。
 SQLがパラメータなので、テキトーなSQLを送ると、それを実行してしまう。
 テーブル全削除とか・・(^^;)

 なので、このままでは、使えないだろう。

 ただ、テーブルごとに画面を用意し、"SELECT * FORM DEPT "ぐらいを書いておき、Where句のみをJavascriptで作らせ(そのとき、Javascriptで、エラーチェックする)、サーバー側でも、複数文かかれていないか、つまり、";"とかが含まれていないかをチェックし、実行するという形にすれば、かなり柔軟に画面やDBが変えられることになる。

 とはいえ、今のように画面項目を受け渡すようにしてしまうと、DBや画面の項目変更に伴い、プログラムが動く。これは、ちょっと作業工程的に、ためし作りがしにくくなってくる(理由は、UML等各種ダイアグラムのエラーチェック体系化のほうで出てくる)。

 ということで、どこまでjavascriptを使って、クライアント側に柔軟性を持たせるかということが、セキュリティと開発効率の間でトレードオフになってくるわけだが、クラウドとかマッシュアップの流れは、明らかに、クライアント側に柔軟性を持たせる方向に進んでいるといえる。
(かといって、SQL発行までやらせはしないけど。。。)


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Strutsの要素技術の基本的構造(その10 複数ボタン Javascript利用その2)

2009-09-15 18:15:35 | Weblog

さっきの話の続き




■Actionを切り替える

 しかし、これでは(いままでのほかの方法でもそうなのだが)、不便なこともある。
 たとえば、「メニューに戻る」という共通処理が、いくつもの画面で発生する場合を考える。
 このとき、「メニューに戻る」アクションを1つ作ってしまえば、そのアクションを呼び出すだけで、どこの画面でもメニューに戻れることになる。

 しかし、上記のやり方では、Actionは、決まってしまうので、戻るときも、それ以外の処理も、みんな同じActionを呼び出さなければいけない。メニューに戻るだけ、別アクションを呼び出すということが出来ない。 

 でも、ヨーク考えると、別に、javascriptのsubmitは、どこのフォームのsubmitでも呼び出して実行できるわけだから、画面中にFormをいくつか作り、その中の1つに「メニューに戻る」フォームを作って、「メニューに戻る」ボタンがクリックされたら、それを実行するようにすればいい。必要な情報はhiddenで渡して、javascriptで設定すればいい。

ソースをみてみよう。同じように、足し算引き算のJSP
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<%@ page contentType="text/html; charset=utf-8" %>
<html:html>
  <HEAD>
    <TITLE>足し算</TITLE>
  </HEAD>
<SCRIPT language="JavaScript">
<!--
function tashizan()
{
	tashizanForm.submit();	
}

function hikizan()
{
	hikizanForm.parm1.value=tashizanForm.parm1.value;
	hikizanForm.parm2.value=tashizanForm.parm2.value;
	hikizanForm.submit();	
}
// -->
</SCRIPT>
  <BODY>
<html:form action="/tashizan" focus="parm1">
<html:text property="parm1" size="6"/>と
<html:text property="parm2" size="6"/>を<BR>
<html:button property="tasu" onclick="tashizan()">足す</html:button>
<html:button property="hiku" onclick="hikizan()">引く</html:button>
</html:form>

<html:form action="/hikizan">
<html:hidden property="parm1"/>
<html:hidden property="parm2"/>
</html:form>
</BODY>
</html:html>

(上記< > は本当は半角)
足し算は、今までと同じだが、引き算に関しては、hikizanのフォームにはいる。
値は、hiddenにして2つとっている。
ボタンはどこにあってもいいので、足し算の中に、引き算も入っていて、引き算がクリックされると、テキストエリアの値をhiddenの領域に渡して、hikizanのほうをsubmitしている。

このとき、ActionFormは足し算用
package tashizan;

import org.apache.struts.action.*;

public class tashizanActionForm extends ActionForm {

    private String parm1;
    private String parm2;

    public String getParm1() {
        return parm1;
    }

    public void setParm1(String parm1) {
        this.parm1 = parm1;
    }

    public void setParm2(String parm2) {
        this.parm2 = parm2;
    }

    public String getParm2() {
        return parm2;
    }
}



引き算用

ackage tashizan;

import org.apache.struts.action.*;

public class hikizanActionForm extends ActionForm {

    private String parm1;
    private String parm2;

    public String getParm1() {
        return parm1;
    }

    public void setParm1(String parm1) {
        this.parm1 = parm1;
    }

    public void setParm2(String parm2) {
        this.parm2 = parm2;
    }

    public String getParm2() {
        return parm2;
    }

}

両方用意するが、同じ内容になっている
(今回はたまたま同じだけで、2つの処理で違う値が必要な場合は、中身が違うこともある)

Action用も足し算用
package tashizan;
import javax.servlet.http.*;
import org.apache.struts.action.*;

public class tashizanAction extends Action {
	 public ActionForward execute(
		     ActionMapping mapping,
		     ActionForm form,
		     HttpServletRequest request,
		     HttpServletResponse response) {

	tashizanActionForm myForm = (tashizanActionForm)form;
	HttpSession session = request.getSession();
	String nextStep="success";	//	次画面

	try
	{
		int i1 = Integer.parseInt(myForm.getParm1());
		int i2 = Integer.parseInt(myForm.getParm2());
		session.setAttribute("kekka", String.valueOf(i1+i2));
	        	nextStep	=	"success";
	}
	catch(Exception e)
	{
		session.setAttribute("kekka", "数値を入れてください");
		nextStep	=	"error";
	}
        	return (mapping.findForward(nextStep));
    }
}


引き算用
package tashizan;
import javax.servlet.http.*;

import org.apache.struts.action.*;

public class hikizanAction  extends Action {
	 public ActionForward execute(
		     ActionMapping mapping,
		     ActionForm form,
		     HttpServletRequest request,
		     HttpServletResponse response) {
	hikizanActionForm myForm = (hikizanActionForm)form;
	HttpSession session = request.getSession();
        	String nextStep="success";	//	次画面

	try
	{
		int i1 = Integer.parseInt(myForm.getParm1());
	        	int i2 =	Integer.parseInt(myForm.getParm2());
		session.setAttribute("kekka", String.valueOf(i1-i2));
		nextStep	=	"success";
	}
	catch(Exception e)
	{
		session.setAttribute("kekka", "数値を入れてください");
		nextStep	=	"error";
	}
        	return (mapping.findForward(nextStep));
    }
}


の両方用意する。actionFormの内容を受け取る部分と、結果書き出しの+-のところが違っている(今回はたまたま似てるだけで、処理はぜんぜん違うことも当然ある)

出力のJSPに関しては、足し算用と引き算用と分けてもよいが、今回は
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<%@ page contentType="text/html; charset=utf-8" %>

<HTML>
  <HEAD>
    <TITLE>足し算</TITLE>
  </HEAD>
  <BODY>
    結果<BR>
    <H2>
      <logic:notEmpty name="tashizanForm">
          <bean:write name="tashizanForm" property="parm1" scope="request"/>+
          <bean:write name="tashizanForm" property="parm2" scope="request"/>=
      </logic:notEmpty>
      <logic:notEmpty name="hikizanForm">
          <bean:write name="hikizanForm" property="parm1" scope="request"/>-
          <bean:write name="hikizanForm" property="parm2" scope="request"/>=
      </logic:notEmpty>
      <bean:write name="kekka" scope="session"/>
    </H2>
    <A HREF="index.jsp">戻る</A>
  </BODY>
</HTML>

(上記< >は、本当は半角)
のように、共通にした。

ちなみに、struts-config.xmlは、こんなかんじ
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
          "http://struts.apache.org/dtds/struts-config_1_3.dtd">

<struts-config>

    <form-beans>
        <form-bean name="tashizanForm" type="tashizan.tashizanActionForm"/>
        <form-bean name="hikizanForm" type="tashizan.hikizanActionForm"/>
    </form-beans>

    <action-mappings>
        <action
            path="/tashizan"
            type="tashizan.tashizanAction"
	    name="tashizanForm" scope="request" validate="false">
	          <forward name="success" path="/kaito.jsp"/>
	          <forward name="error" path="/error.jsp"/>
	</action>
        <action
            path="/hikizan"
            type="tashizan.hikizanAction"
	    name="hikizanForm" scope="request" validate="false">
	          <forward name="success" path="/kaito.jsp"/>
	          <forward name="error" path="/error.jsp"/>
	</action>
    </action-mappings>

</struts-config>

(上記< >は、本当は半角)




 こんなように、LookupDispatchActionはよく本に紹介されているけど、めんどっちく、
 Javascriptを使ったほうが、簡単にきれいにいく。
 さらに別のActionが呼び出せるので、拡張性が高かったりする


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Strutsの要素技術の基本的構造(その9複数ボタン Javascript利用)

2009-09-15 18:14:23 | Weblog

 Strutsの要素技術の基本的構造の話。

 今、複数ボタンをある場合をやっていて、UTF-8なら、submitボタンのvalueの値をそのまま聞けばいい。けど、そうじゃない(Shift-JISとか)時や、国際化したい場合は、この方法はよくない。じゃ、どうするかというので、

(1)submitのname(property)を変えてしまい、値が入ってくるかどうかで見る
(2)LookupDispatchActionを使う
(3)javascriptを使って、Action等を切り替える

が考えられるという話を書いて、そのうち、(1)、(2)をやりました。

 今回は、残りの「(3)javascriptを使って、Action等を切り替える」を使ってみます。




■同じActionに送る
 まず、今までと同じように複数ボタンを1つのActionに送ることについて考えると、これは、以下の手順で出来る
・JSPのフォーム内に(hiddenで)どのボタンが押されたかを保存しておくところを用意する
・ボタンが押されたら、Javascriptのあるfunctionに飛んで、押されたボタンに応じて、
   上記保存エリアに値をセット
・Action内では、その値に応じて処理をする。

このやり方でやっているのが、こちら。
まずJSP
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<%@ page contentType="text/html; charset=utf-8" %>
<html:html>
  <HEAD>
    <TITLE>足し算</TITLE>
  </HEAD>
<SCRIPT language="JavaScript">
<!--
function myfunc(syori_no)
{
	tashizanForm.fugo.value = syori_no;
	tashizanForm.submit();	
}
// -->
</SCRIPT>
  <BODY>
<html:form action="/tashizan" focus="parm1">
<html:text property="parm1" size="6"/>と
<html:text property="parm2" size="6"/>を
<html:hidden property="fugo" value="0"/>
<html:button property="tasu" onclick="myfunc(0)">足す</html:button>
<html:button property="hiku" onclick="myfunc(1)">引く</html:button>
</html:form>
</BODY>
</html:html>

(上記< > は本当は半角)

 fugoというhiddenが、その保存する値、myfuncが、そのfunctionで、その中で値をセットして、submitしている。submitすると、submitボタンが存在してクリックされたのと同じ効果、つまり、tashizan.doに飛ぶことになる。
 そして、Action
package tashizan;

import java.io.IOException;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import org.apache.struts.action.*;

public class tashizanAction extends Action {
	 public ActionForward execute(
		     ActionMapping mapping,
		     ActionForm form,
		     HttpServletRequest request,
		     HttpServletResponse response) {
	tashizanActionForm myForm = (tashizanActionForm)form;
	HttpSession session = request.getSession();
	String nextStep="success";	//	次画面

	try
	{
		int i1 = Integer.parseInt(myForm.getParm1());
	        	int i2 = Integer.parseInt(myForm.getParm2());
	        	int f  =	Integer.parseInt(myForm.getFugo());

        		if ( f	==	0 )
        		{
			session.setAttribute("kekka", String.valueOf(i1+i2));
        		}
        		else
        		{
			session.setAttribute("kekka", String.valueOf(i1-i2));
        		}
	        	nextStep	=	"success";
	        }
	        catch(Exception e)
	        {
			session.setAttribute("kekka", "数値を入れてください");
			nextStep	=	"error";
		}
		return (mapping.findForward(nextStep));
	}
}


こんなかんじ。




この後続けると、10000字をこえるそうなので、ここで区切る


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

2次元アニメを、いろいろ動かすソフトの無料ダウンロードサイト

2009-09-15 15:48:47 | Weblog

昨日の前田アナのトレンドたまご、2次元の絵を、いろいろ動かせるというソフト、

Live2Dの無料ダウンロードサイトは

ここ http://www.live2d.jp/product/
みたい(まだダウンロードしてないけど、忘れそうなので、メモメモ)



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

UML等各種ダイアグラムのエラーチェック体系化(その31:業務流れ図とアクティビティ図)

2009-09-15 13:13:25 | Weblog

シリーズUML等各種ダイアグラムのエラーチェック体系化です。

 現在「いろんなダイアグラムをRDBにいれよう!」化計画、
 をやっていて、
  ・クラス図
  ・ER図
  ・アクティビティ図
  ・ユースケース図
  ・DFD
  ・機能構成図(DMM)
 までやり、昨日、業務流れ図をやりました。

 今日は、業務流れ図とアクティビティ図の違いについて考えます。

 ちなみに、今までのまとめは、ここ




■業務流れ図+アクティビティ図
 昨日のまとめ。

 アクティビティ図に、

  ・アクティビティの種別(手作業、コンピューター処理など)
  ・オブジェクトノードの種別(帳票、ファイルなど)
  ・ノードに親子関係

 を加えると、業務流れ図が表現できると書きました。

 そこで、アクティビティ図に業務流れ図を足すと、こんな感じになると・・・
●レーンテーブル
  (レーンID,ロール(レーン名),親レーンID)
●エッジテーブル
  (エッジID,エッジ種別、元ノード等ID,先ノード等ID,エッジ説明)
●エッジコネクタテーブル
  (コネクタID,番号等)
●動作ノード(アクション)テーブル
  (動作ノードID,動作名、所属レーンID、親動作ノードID,動作ノード種別)
●オブジェクトノードテーブル
  (オブジェクトノードID、オブジェクト名、親オブジェクトノードID,オブジェクト種別)
●制御ノードテーブル*
  (制御ノードID,制御ノード種別)
●コメントテーブル
  (コメントID,コメント内容)

 でも、業務流れ図になく、アクティビティ図にあるものがあるということも書いて、そこでおわりました。




■ちがいについて

 で、違いについてです。

 業務流れ図には、アクティビティ図にある、「制御ノード」がありません。
 つまり、何が同時にできるのかとか、何をやるには、どういう条件がそろう必要があるのかというのが、書いていません。


 一方、アクティビティ図には、業務流れ図にある、動作ノードとオブジェクトノードの種別がなく、何にデータが書かれているのかわからないという状況にあります。
 このことが、証憑をもとに業務監査する場合、どこに書かれているのかわからないので監査できないという話を書きました(そこに書いてあるように、これ以外にも困った問題を生じる)。




 では、上記のような

  ・業務流れ図には、制御構造がない
  ・アクティビティ図には種別がない

 という状態でプログラムを作る場合、どんな問題を生じるかということについて考えてみたいと思います。

 そのため、まず、2つあわせた、上記囲みのテーブル構造をもとにプログラムを作ることを考えます。この場合、
  ・なにを決定すると、プログラムがどこまで書けるのか?
  ・他に決定すべきことは何か
について、考えます。

 その上で、上記2つの差が、どのように、プログラム記述に影響するかについて考えます。




 今回はここまで。次回からいよいよ、業務流れ図からプログラムです。


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

温室ガス25%削減するなら、電気を大量消費するデータセンターは海外だね!

2009-09-14 19:00:13 | Weblog

クラウドにして、パソコンは、自分のうちで、充電。もちろん、太陽光で。
EU、民主の「温室ガス25%削減」絶賛
http://headlines.yahoo.co.jp/hl?a=20090913-00000665-yom-soci

絶賛とか、されちゃうと、やらざるを得なくなっちゃうよねえ(-_-;)

なんてこった。

まー、こーなってくると、大企業はできるだけ、日本脱出って言うことになってくるんでしょうか?

P.S 東京都は、ビルや大規模事業所にも規制があったと思うんだけど、そーなると、電気自動車とか、会社で充電できませんよね。みんながいっせいに充電したら(>_<!)

家で充電して、往復できる範囲の人のみ、自動車利用と。




  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

UML等各種ダイアグラムのエラーチェック体系化(その30:業務流れ図)

2009-09-14 16:45:13 | Weblog

シリーズUML等各種ダイアグラムのエラーチェック体系化です。

 現在「いろんなダイアグラムをRDBにいれよう!」化計画、
 をやっていて、
  ・クラス図
  ・ER図
  ・アクティビティ図
  ・ユースケース図
  ・DFD
  ・機能構成図(DMM)
 までやりました。

 今回は、業務流れ図です。
 業務流れ図に関しては、いろいろあるのですが、今回は、EAの業務流れ図(WFA)について考えます。

ちなみに、今までのまとめは、ここ



■業務流れ図とは

まず、業務流れ図についてですけど、

こんなかんじ

です。http://www.meti.go.jp/policy/it_policy/ea/gainen/product/wfa/images/2-34f.gif

つまり、アクティビティ図のアクティビティが
  ・手作業
  ・確認、チェック
  ・コンピューター処理
にわかれ、オブジェクトノードが、
  ・コンピューター画面
  ・帳票
  ・コンピューターファイル
にわかれたものです。

 なお、保管は、エッジに対して、先のほうに、保管のしるしをつけただけ、つまり、エッジがわかればかけそうなので、ここでは省略します。

 また、スイムレーン(ロール)に関して、親子関係があります(図の省内各課室と経済省職員の関係)。

 このように、オブジェクトノードをわける意義に関して、まず、EAでは業務流れ図に関して、
(以下斜体はここより引用)

業務流れ図(WFA)を作成するに当たっては、以下のポイントを明確にするよう意識することが期待される。


・ 生成される重要なトランザクションの内容

・ どのようにそれらのトランザクションが開始されるか(イベントの特定)

・ 情報が処理、利用されるノード

・ 重要な記録された情報、証憑、報告書

・ 情報処理、通信のセキュリティと信頼性。(重要な取引の開始から情報の利用先まで)


としています。この「重要な記録された情報、証憑、報告書」が明記されるということで、ここで書いた業務監査などにも使えるということになります。
(それ以上の意義は、今後書いていきます)



■RDBに入れるには

 項目の種別が増えただけなので、アクティビティ図の該当項目、つまり、

レーンテーブルに、親レーンID追加
動作ノードテーブルに動作ノード種別追加
オブジェクトノードテーブルにオブジェクト種別追加

をすればよいことになります。

アクティビティ図は、ここにまとまっているので、それとあわせると、業務流れ図は、こんなかんじ

●レーンテーブル
  (レーンID,ロール(レーン名),親レーンID)
●エッジテーブル
  (エッジID,エッジ種別、元ノード等ID,先ノード等ID,エッジ説明)
●エッジコネクタテーブル
  (コネクタID,番号等)
●動作ノード(アクション)テーブル
  (動作ノードID,動作名、所属レーンID、親動作ノードID,動作ノード種別)
●オブジェクトノードテーブル
  (オブジェクトノードID、オブジェクト名、親オブジェクトノードID,オブジェクト種別)
●制御ノードテーブル*
  (制御ノードID,制御ノード種別)
●コメントテーブル
  (コメントID,コメント内容)




 ただ、実際には、アクティビティ図にあって、業務流れ図にないものもありますので、ここまで書くと書きすぎとなります。
 次回は、そのアクティビティ図にあって、業務流れ図にないものなどを分析して、この2つの違いについて考えてみたいと思います。


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Strutsの要素技術の基本的構造(その8複数ボタンLookupDispatchAction)

2009-09-14 14:02:32 | Weblog

Strutsの要素技術の基本的構造の話。

 今、複数ボタンをある場合をやっていて、UTF-8なら、submitボタンのvalueの値をそのまま聞けばいい。けど、そうじゃない(Shift-JISとか)時や、国際化したい場合は、この方法はよくない。じゃ、どうするかというので、

(1)submitのname(property)を変えてしまい、値が入ってくるかどうかで見る
(2)LookupDispatchActionを使う
(3)javascriptを使って、Action等を切り替える

が考えられるという話を書いて、そのうち、前回は(1)をやりました。

 今回は、(2)の「LookupDispatchAction」を使ってみます。




■一般に「LookupDispatchAction」の使い方は・・・

ここ
Struts-12.アクション・クラス:LookupDispatchAction
http://www.javaroad.jp/opensource/js_struts14.htm

に書かれているとおり。

つまり、
1.JSPのsubmitを、propertyを使い、ボタンの表示値をbean:message keyで書く
2.struts-config.xmlで
   Actionのところ、parameterで1のpropertyを指定
   message-resourcesで、メッセージリソースを指定
3.メッセージリソース、1のkeyを日本語で書いたものをつくり、
  それをnative2asciiで変換する
4.Actionクラス作成
   ・LookupDispatchAction を継承
   ・protected Map getKeyMethodMap() でメソッドと1のkeyの対応
これで出来るような雰囲気に見える。

では、上記のサイトを参考に、ちょとだけ入れ替えて作ってみましょう。
今回は、そのため、(いつもはUTF-8だけど)上記サイトにあわせSHIFT-JISにします。



■ソース
いつもの足し算プログラム

●はじめに開くJSP(exLookupDispatch.jsp)
<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<html:html>
<head><title>exLookupDispatch.jsp</title></head>
<body>

<html:form action="/ExLookupDispatch">
  <html:text property="parm1" size="6"/>と
  <html:text property="parm2" size="6"/>を<br>
  <html:submit property="exeMethod">
    <bean:message key="submit.a"/>
  </html:submit>
  <html:submit property="exeMethod">
    <bean:message key="submit.b"/>
  </html:submit>
</html:form>
</body>
</html:html>

(上記< >は、本当は半角)

●結果表示JSP(kekka.jsp)
<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<html:html>
<head><title>結果</title></head>

<body>
<bean:write name="kekka" scope="session"/><BR>
<A HREF="exLookupDispatch.jsp">もどる</A>
</body>

</html:html>

(上記< >は、本当は半角)

●struts-config.xml
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE struts-config PUBLIC
 "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
 "http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>

  <form-beans>
    <form-bean
     name="ExLookupDispatch"
     type="struts.ExLookupDispatchForm"/>
  </form-beans>

  <action-mappings>
    <action path="/ExLookupDispatch"
     type="struts.ExLookupDispatchAction"
     name="ExLookupDispatch"
     parameter="exeMethod">
      <forward name="kekka" path="/kekka.jsp"/>
    </action>
  </action-mappings>

  <message-resources parameter="resources.application"/>

</struts-config>

(上記< >は、本当は半角)

●ExLookupDispatchForm.java(ActionFormクラス)
package struts;

import org.apache.struts.action.*;

public final class ExLookupDispatchForm extends ActionForm {
    private String parm1;
    private String parm2;
 
    public String getParm1() {
        return parm1;
    }

    public void setParm1(String parm1) {
        this.parm1 = parm1;
    }

    public void setParm2(String parm2) {
        this.parm2 = parm2;
    }

    public String getParm2() {
        return parm2;
    }
}



●ExLookupDispatchAction.java(Actionクラス)
package struts;

import javax.servlet.http.*;
import javax.servlet.ServletContext;
import org.apache.struts.action.*;
import org.apache.struts.actions.*;
import java.util.*;

public final class ExLookupDispatchAction extends LookupDispatchAction {
  protected Map getKeyMethodMap() {
    Map map = new HashMap();
    map.put("submit.a", "plus");
    map.put("submit.b", "minus");
    return map;
  }

  //足し算
  public ActionForward plus(ActionMapping mapping, 
         ActionForm form,
         HttpServletRequest req, 
         HttpServletResponse res)
  {
	  ExLookupDispatchForm myForm = (ExLookupDispatchForm)form;
	  HttpSession session = req.getSession();

	  try
	  {
		int i1 = Integer.parseInt(myForm.getParm1());
		int i2 = Integer.parseInt(myForm.getParm2());
		session.setAttribute("kekka", i1+"+"+i2+"="+(i1+i2));
	  }
	  catch(Exception e)
	  {
			session.setAttribute("kekka", "Error");
	  }
	  
	  return (mapping.findForward("kekka")); 

  }

  //引き算
  public ActionForward minus(ActionMapping mapping, 
         ActionForm form,
         HttpServletRequest req, 
         HttpServletResponse res) {
	  ExLookupDispatchForm myForm = (ExLookupDispatchForm)form;
	  HttpSession session = req.getSession();

	  try
	  {
		int i1 = Integer.parseInt(myForm.getParm1());
		int i2 = Integer.parseInt(myForm.getParm2());
		session.setAttribute("kekka", i1+"-"+i2+"="+(i1-i2));
	  }
	  catch(Exception e)
	  {
			session.setAttribute("kekka", "Error");
	  }
	  return (mapping.findForward("kekka")); 
  }
}


●resources.application

まず、以下のように日本語(Shift-JIS)で書いたファイルを作る
(ファイル名は実はなんでもいい。ここでは、application_ja.propertiesとする)

submit.a=足す
submit.b=引く
 



そしたら、native2ascii(JDKをインストールすれば、たぶん入ってると思う)をつかって

native2ascii application_ja.properties > application.properties
(上記 > は本当は半角)

をすると、

submit.a=\u8db3\u3059
submit.b=\u5f15\u304f
 

になる。これを、struts-configで指定したとおり、resources.applicationとしていれる
(つまり、アプリのフォルダ/WEB-INF/classesの下に、resourcesというフォルダをつくり、
 そこにapplication.propertiesという名前で保存する。つまり、ファイル名は、
 struts-configの指定.propertiesとなる)




■で、これで保存して、実行しようとすると・・・

まず、1.3だと、ソースがコンパイルエラーになる。
なので、

ここ 
StrutsのLookupDispatchActionの場所なんだけど・・・・
に書いたように、struts-extras-1.3.10.jarをつけてリンクする。

そして、実行。

もし、

javax.servlet.ServletException: サーブレットの実行により例外を投げました



というエラーが出たら、たぶん、サーブレット側にstruts-extras.jarを入れ忘れている。
ということで、WEB-INF/libにstruts-extras-1.3.10.jarとかを入れて、再度実行すると、


javax.servlet.ServletException: javax.servlet.ServletException: Action[/ExLookupDispatch]でキーメソッドマップの中にリソース {1} が見つかりません


とでてくる。ここで止まってしまう。




■理由

 ためしに、application.propertiesを、

submit.a=plus
submit.b=minus
 


に変えると、うまくいく(と思う)
ということは、日本語変換に問題がありそうだということになる。

実は、これ、SHIFT-JISで書いている場合には、SHIFT-JISで入力する必要がある。

上記サイトでは、
Struts-8.アクション・フォームBeanの日本語処理
http://www.javaroad.jp/opensource/js_struts10.htm

で、SHIFT-JISで入力する方法が書いてある。
(なので、LookupDispatchActionでは、書いていないんだと思う)




■対策

ということで、そこに書いてあるとおり、
●web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE web-app PUBLIC
	"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
	"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
  <filter>
    <filter-name>EncodeFilter</filter-name>
    <filter-class>filters.SetCharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>Shift_JIS</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>EncodeFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>


  <display-name>Struts Blank Application</display-name>
  <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
 </servlet>
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

</web-app>


(上記< >は、本当は半角)
を書いて(encodingがShift_JISなのに注意)
SetCharacterEncodingFilter.classをダウンロードして(上記Struts-8.アクション・フォームBeanの日本語処理からダウンロードできる)、WEB-INF/classesの下に、filtersというフォルダを作って、そこにSetCharacterEncodingFilter.classを保存する。

そうするとできる。




けど、こんなめんどっちいことをやるんだったら・・・

次回は、もっとやさしく、幅広くつかえるJavascriptの方法についてです。

※今回、SHIFT-JIS用にフィルタを使っていますが、このフィルタ、ウィリアムのいたずら、いつも使ってます。サンプルに書いてあるものは、このフィルタを通しているものと思ってください。でないと、日本語処理が変になることがあります。
 ただし、いつもはUTF-8でサンプルを書いているため、上記encodingは、utf-8に変えて実行しています。



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

グーグルは、ストリートビューこそ、Google Map使えば?

2009-09-13 09:59:07 | Weblog

ここの話
ストリートビュー運用方針明文化の総務省要請に対するグーグルの対応

(以下斜体は上記サイトより引用)

「総務省、ストリートビュー運用ルールの自主策定をグーグルに要請へ」で、プライバシーに配慮した運用方針を明文化して公表を促すことで透明性の確保を実現するとされていた件について、その対応がグーグルから発表されました。グーグル日本法人の公式ブログ「ストリートビューに関する取り組みについて」に発表されています。

っていうけど


、「現在撮影中のエリア」という情報が公開されるようになりました。先月のストーリーの報道では総務省からの要請は「撮影前に住民や自治体に場所や時期を通知」というものでしたが、「現在撮影中のエリア」には、「東京都23区東部」とか「大阪府北部」などと極めて大雑把なことしか書かれておらず、意味があるのか疑問です。


ってこれこそ、中央からじゃなくって、Web2.0のように、ユーザーから聞くべきじゃない?

つまり

(1)Googleのストリートビューの車をど派手にする
(2)Googleのストリートビュー発見報告というCGIをつくる
(3)そうすると、記入した住所またはケータイからの場合GPSから
   場所を見つけ、Google Mapに位置が示される
(4)さらに、近くの人(あらかじめ場所とメールアドレスを登録
   しておく)にメールで知らせる

そうすれば、近くに来たら、対策(戸締り?)ができる。
町内放送で、ストリートビューがくるので、注意しましょうと流せる。

このシステムをGoogleが作って、提供すれば??
(もっとも、Googleじゃなくっても、つくれそう・・ってか、あるのかなあ?)



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする