goo blog サービス終了のお知らせ 

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

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

Javascript|JSONでの、レコードの表現方法(配列、連想配列)→{}と[]の違い

2013-10-18 12:45:54 | JavaとWeb
■お題

・データベースで検索したレコードをJSON形式で渡したり、
 JSPを使って、Javascriptにおける”ある変数”の初期値としたり

するために、

 データベースのレコードの形を、JSONで表現したい

ということがある。今日は、この形について




■問題へのアプローチ

 表現方法として3つを考える。

(1)CSV形式のように、値だけを、行列の形で渡す

例:テストの点、学生番号、氏名、点数の順(4人分)

   "1","name1","98"
   "2","name2","80"
   "3","name3","67"
   "4","name4","32"


(2)キーと値の組の連想配列(Javaだとハッシュマップ)があって
   (=レコードになっている)、それが配列になっている

例:テストの点(4人分)
学生番号(no)氏名(name)点数(score)
1name198
2name280
3name367
4name432


(3)上記(1)の配列(または(2)のレコードの配列)が
   ある変数(例えばdataとか)の中に入っている




■基本的な規則

JSON 構文
http://memopad.bitter.jp/w3c/json/json_syntax.html


にあるように、

・配列は、[](大括弧、角括弧)でくくる

・ハッシュマップ、連想配列のように
   key=valueの場合は
   key:value

・オブジェクトは{}(中括弧)でくくる

・Javascriptでは、連想配列のキーをオブジェクトの属性として表現できる
   data.attr1→data["attr1"]と同じ




■具体例

(1)CSV形式のように、値だけを、行列の形で渡す

var myarray=
[
["1","name1","98"],
["2","name2","80"],
["3","name3","67"],
["4","name4","32"]
];


[]の中に、1レコード分の[]がある

(2)キーと値の組の連想配列(Javaだとハッシュマップ)があって
   (=レコードになっている)、それが配列になっている

var myrec=
[
{"no":"1","name":"name1","score":"98"},
{"no":"2","name":"name2","score":"80"},
{"no":"3","name":"name3","score":"67"},
{"no":"4","name":"name4","score":"32"}
];

[]の中に、レコードとして{}でくくったものがあり、
このレコードがKey:Valueの形になっている

(3)上記(1)の配列(または(2)のレコードの配列)が
   ある変数(例えばdataとか)の中に入っている

var mydata=
{data:[
["1","name1","98"],
["2","name2","80"],
["3","name3","67"],
["4","name4","32"]
]};

全体はオブジェクトなので{}でくくり、その中の要素dataの値が
2重[]→(1)と同じものになっている。




■サンプル
各データ表現したものが、表になって現れる
<HTML>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js" 

type="text/javascript"></script>

<script>
var myarray=
	[
		["1","name1","98"],
		["2","name2","80"],
		["3","name3","67"],
		["4","name4","32"]
	];

var myrec=
	[
		{"no":"1","name":"name1","score":"98"},
		{"no":"2","name":"name2","score":"80"},
		{"no":"3","name":"name3","score":"67"},
		{"no":"4","name":"name4","score":"32"}
	];

var mydata=
	{data:[
		["1","name1","98"],
		["2","name2","80"],
		["3","name3","67"],
		["4","name4","32"]
	]};

$(function(){

	//	ボタン1:配列の場合
	$("#mybutton1").click(function(){
		buf = "<table border=1>";
		for(i = 0 ; i < myarray.length;i++)
		{
			buf=buf + "<tr>";
			buf=buf + "<td>"+myarray[i][0]+"</td>";
			buf=buf + "<td>"+myarray[i][1]+"</td>";
			buf=buf + "<td>"+myarray[i][2]+"</td>";
			buf=buf + "</tr>";
		}
		buf = buf+"</table>";
		$("#mytable").html(buf);
	});

	//	ボタン2:連想配列の配列
	$("#mybutton2").click(function(){

		buf = "<table border=1 style='color:red'>";
		for(i = 0 ; i < myrec.length;i++)
		{
			buf=buf + "<tr>";
			buf=buf + "<td>"+myrec[i]['no']+"</td>";
			buf=buf + "<td>"+myrec[i]['name']+"</td>";
			buf=buf + "<td>"+myrec[i].score +"</td>";
			buf=buf + "</tr>";
		}
		buf = buf+"</table>";
		$("#mytable").html(buf);
	});

	//	ボタン3:変数の中に入っている
	$("#mybutton3").click(function(){
		buf = "<table border=1 style='color:blue'>";
		for(i = 0 ; i < mydata.data.length;i++)
		{
			buf=buf + "<tr>";
			buf=buf + "<td>"+mydata.data[i][0]+"</td>";
			buf=buf + "<td>"+mydata["data"][i][1]+"</td>";
			buf=buf + "<td>"+mydata.data[i][2]+"</td>";
			buf=buf + "</tr>";
		}
		buf = buf+"</table>";
		$("#mytable").html(buf);
	});

});

</script>

<body>
<div id="mytable"></div>
<BUTTON  id="mybutton1">配列</BUTTON>
<BUTTON  id="mybutton2">連想配列の配列</BUTTON>
<BUTTON  id="mybutton3">変数</BUTTON>

</body>
</html>


なお、サンプルは
・Javascriptでは、連想配列のキーをオブジェクトの属性として表現できる

を示すため、わざと、

myrec[i].score
mydata["data"][i][1]

と表現している。もちろんこれらは、

myrec[i]['score']
mydata.data[i][1]

と書いてもよい。





■サンプルの様子
「連想配列の配列」をクリックしたところ




■全力で注意点!!!

配列の要素
4つあるとき、1から3番目は,で区切る
例:["1","name1","98"],

けど、4番目の最後の要素に,はいれない!!
["4","name4","32"]

入れると、私のIEではエラーになり表示されない

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

ブラウザ上に、いろんな複雑なグラフを書きたい・・・やっぱ、SVG?

2013-10-17 12:35:35 | JavaとWeb
ブラウザで、いろんな複雑なグラフを書きたいという話
をしていたんだけど・・・

やっぱ、SVGじゃねかな~って話になった。

どうも、IE8でも、プラグインが有るみたいだし・・・

IE8でSVGファイルを表示する方法
http://uujiron.net/archives/504


プラグイン

svgweb
http://code.google.com/p/svgweb/


曲線があるんだけど、ベジエスプラインも対応しているみたいだし・・・

http://www.envinfo.uee.kyoto-u.ac.jp/user/susaki/envinfo/svg_basic.html#line


編集したかったら、フリーソフトの「Inkscape」があるし・・・

Illustratorのようにベクター画像を扱うフリーソフト「Inkscape」
http://gigazine.net/news/20060705_inkscape/


ってなことで、「いいね!」感満載となっている・・・


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

struts2のstruts.xmlを書かない方式で「はまった」こと・・・あれこれ

2013-10-17 09:04:52 | JavaとWeb
ゼロコンフィグレーションって言うんでしょうか・・・
struts2のstruts.xmlを書かない方式で、はまったことあれこれ




■一般的には、こうしろ!と書いてある

やることは、4つ

1.サーバー側のstruts2から呼び出されるものを
  ~Action(~の1文字目は大文字)にして、

2.アノテーションとして、executeのところに、
   @Action("~" ) 
 (~の1文字目、大文字を小文字に変える)

3.一番上に、

@Results({
@Result(name="success", location="/index.jsp")
})

のようにResultで、returnしたときの行き先を書く

4.web.xmlのフィルターのところ
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>actionPackages</param-name>
<param-value>struts2.s2down</param-value>
</init-param>
</filter>

 のように、init-paramを指定せよ
(< >は、本当は半角。ただ、これをコピペしないように。理由は後述)


●そうすれば、
http://localhost:8080/アプリ名/~.action
(~の1文字目は小文字)でアクセスすると,Acion実行後、Resultで指定したJSPが動くはず!

※くわしくは、ここ

@いう間にWebアプリを作れる「Struts 2」入門
http://www.atmarkit.co.jp/fjava/special/struts2/struts2_1.html

注意:このソースをダウンロードして実行しようとしても、
   ライブラリが無いので動かない。
   そこで、最新のライブラリを入れても・・・動かない。後述




■はまった点1:eclipseで、アノテーションのところのエラーが消えない

・現象
  コレを行うためには、
    @Results
    @Action
  のアノテーションの指定が必要だが、ここでエラーになる

・理由
 struts2-convention-plugin-2.3.15.1.jar を見ていなかった。

・対応
(1)struts2-convention-plugin-2.3.15.1.jarを、javaのクラスパスに足す
  (WEB-INFのlibにも入れておくこと)

(2)ソースファイルで
   import org.apache.struts2.convention.annotation.*;
  を入れる




■はまった点2:500エラー、ぬるぽで落ちる

・現象

struts2.3いくつかをいれ、上記サイトからサンプルを落としてきて
実行すると、

HTTPステータス 500 -

type 例外レポート

メッセージ

説明 The server encountered an internal error () that prevented it from fulfilling this request.

例外

java.lang.NullPointerException
org.apache.struts2.impl.StrutsActionProxy.getErrorMessage(StrutsActionProxy.java:69)


・理由
 最新のものは、フィルターが変わっている。

・対策

web.xmlを開くと、
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
となっている。

このフィルタークラスを
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

に変える




■はまった点3:見えない(404エラー)

・現象

上記のようにフィルタークラスを変えると、今度は

HTTPステータス 404 - There is no Action mapped for namespace [/] and action name [index] associated with context path

・理由
 どうやら、param-valueに指定する値、すなわち、パッケージは、1単語ではだめで、
  ○○○.XXXのように、.がはいるものでないといけないようだ。


・対策
(1)param-valueをstruts2.s2downのように、○○○.XXXの形にする
(2)ということは、プログラムのパッケージもstruts2.s2downのように
   ○○○フォルダの下にXXXがあるようにして、そこにクラスファイルを置く
(3)ということは、ソースコードのpackageも修正する




■はまった点4:404エラー WEB-INF/content/を見に行こうとする

・現象
@Result(name="success", location="index.jsp")
と指定すると、
WEB-INF/content/index.jspを見に行こうとする。
(そこにファイルを作ると、うまく表示される)

・理由
 相対パスになっている。

・対策
 ゼッタイパス指定する
@Result(name="success", location="/index.jsp")
と、index.jspの前に/をつけると、サーブレットのフォルダの下のindex.jspを
見に行く。




■このほか

うちは、はまらなかったけど・・・

AbcEfgActionのように、大文字が2回出る場合、問題があるらしい。


Struts2のアクション名指定ではまった話
http://scarmitt.sakura.ne.jp/programs/struts2_no_action_mapped.html

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

Struts(1.X系)とStruts2の設計上の違い

2013-10-16 15:43:20 | JavaとWeb
って、書いてなかったっけ?書いてみる。

struts(1.X系)の場合、ActionFormに入力データを入れるけど、
出力データは画面が違う場合、どうしよう・・・って話になる。
そこで、セッションに出力データをいれてしまうケースが
多い気がする。


一方、struts2の場合は、入力データをActionの属性として
セットする。そして、actionの中に出力データをセットして、
そのデータをもとに、出力のJSPが書き出せる。

したがって、struts2であれば、

・入力するactionに、入出力データを全部属性としてもち、
・Actionで入力データを加工して、出力データをセットして
・表示JSPは基本的にactionからデータをみる
・actionはActionSupportのダミーでも作っておけば、
 単体でテスト可能になる

という形で設計が出来る。
結構、機械的に設計&テストできるのだ・・・



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

IE7で複数フォントが使えなかった・・・とか

2013-10-11 12:23:52 | JavaとWeb
きのうの

HTML(CSS)で書体を変えるとき、注意すべきこと
http://blog.goo.ne.jp/xmldtp/e/45957cb7cde8eb5147506d869332f476


をお家で見てびっくり!

明朝体以外、かわっていない・・・

フォントが入っていない環境では、もちろん、変化しない
(デフォルトの文字が表示される)

「コントロールパネル」の「フォント」に出てくる書体
しか、表示されない




それと、複数フォント指定をIE7でやったらうまくいかなかった。
古いIEでは、複数フォント指定(font-familyのところで、
,で区切って複数フォントを書くと、前のフォント指定に無い文字ならば、
後の指定フォントが使われる)が、きかないみたいよ・・・

http://weboook.blog22.fc2.com/blog-entry-330.html

にこんな記述が(以下太字は上記サイトより引用)

複数のフォントを指定するとIE8以下でエラーが起きるそうです。#?を入れると最初のEOT形式だけ読み込んで解決だそうです。難しいですね。




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

HTML(CSS)で書体を変えるとき、注意すべきこと

2013-10-10 10:05:40 | JavaとWeb
HTMLというか、CSSを使って書体を変えたいとき、
たとえば、見出しをポップ体にしたいとき、


こんなかんじで!!




DIVとかSPAN等のタグの属性の

    


で指定するわけなんだけど、この書体名、

コントロールパネルの「フォント」に出てくる書体名

を「忠実に」かかないと出てこない。

「HG創英角ポップ体」ではなく「HG創英角ポップ体」
(半角カタカナ)

「MSゴシック」ではなく「MS ゴシック」
(MSのあとにスペース)

だ。

■サンプル
<HTML>
<BODY>
<DIV >
<H1>MS 明朝</H1>
</DIV>

<DIV >
<H1>MS明朝(スペースなし、上と比較)</H1>
</DIV>

<DIV >
<H1>HG 教科書体</H1>
</DIV>

<DIV >
<H1>HGS 行書体</H1>
</DIV>

<DIV >
<H1>HGS 創英プレゼンス EB</H1>
</DIV>

<DIV >
<H1>HG創英角ポップ体</H1>
</DIV>

</BODY>
</HTML>


■サンプルの結果


MS 明朝





MS明朝(スペースなし、上と比較)





HG 教科書体





HGS 行書体





HGS 創英プレゼンス EB





HG創英角ポップ体




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

Struts2のOGNL式のまとめ その1

2013-10-09 12:28:56 | JavaとWeb
まとめてみる。




■目的

Struts2では、Sタグの属性の中に、<%= %>や、EL式をかけない
(実際に書いてみると、500内部エラー

 org.apache.jasper.JasperException:
   TLD又はタグファイル中のattribute指示子に従って
   属性valueはどんな式も受け付けません

をエラーとして返す)

そこで、Struts2の中のタグで、Actionの中にある属性や、セッションの
値を使いたい場合(一部加工もOK)に用いる・・・らしい

※なお、
・後述するように、Actionの中にある属性や、セッションの値そのものを、
 表示することもできるが、その場合もsタグを用いる

・JSPの中で作成した変数を<%= %>みたいな形で使えるかどうか、
 よくわかっていない。
 ただし、後述するように、JSPの中で作った変数を、session.setAttribute
 してしまえば、セッションの変数として、利用できる。

・OGNL式の中に、以下のサイト
 http://www.techdoctranslator.com/struts2/tag-developers-guide/ognl
 の「ラムダ表現式」に示されるように、フィボナッチ数列を生成
 する式を書き、「どうだ、俺ってすごいだろう!」と自慢することはできるが、
 たぶん、それは、目的ではないと思われる。




■EL式との違い

 OGNL式が%{}で書くのに対し、EL式が${}で記述するので、とてもよく似ているが、
 決定的に違うのは、

EL式は
  S式内で書くと、エラーになる

OGNL式は
  S式の外で%{abc}とかかくと、そのまま%{abc}と表示される。
  EL式は、展開される

※なお、
OGNL式で、Actionの中にある属性や、セッションの値そのものを、表示したい場合は、
s:propertyを使う
<s:property value='abc'/>




■基本的な書き方

 基本的に'%{ ここにいろいろかく }'で書く
 ただし、value='属性値やセッションの値等'のように%{}でくくらず、直接書くことも




■書く場所

S式の中なら、好きなところに書いていいんでしょうかね?

<s:submit type="button" id='%{"id_" + #session.password}' value='%{#session.password}' />
<s:submit type="input"  cssClass='%{"class_" + #session.password}' value="実行" />


って書くと、(パスワードには、"1234567"と入っている)

<button type="submit" id="id_1234567" value="1234567">
1234567
</button>

<input type="submit" id="exe_0" value="実行" class="class_1234567"/>

って展開されます。




■表示できるものと書き方

まず、actionクラスの属性の値が、そのままかけます
たとえば、いま、ExeActionというアクションの中に、abcという属性が有り、
(abcはExeAction内でセッター、ゲッターが記述されている)
これを利用したい場合は、

%{abc}

でOK。

次に、セッション、request,response,applicationなどなど・・・

頭に#をつけます。たとえば、セッションの中に、passwordというのが入っていたら、

%{#session.password}

でOK




■変数の処理加工

●変数そのものでなく、前後に何かつけたりして、処理加工できる。
  ふつうに、足し算する。

  '%{"id_" + #session.password}'

  は、セッションに入っているpasswordが1234567なら、id_1234567
  になる。

●もちろん、変数を2つ足すことも出来る。
  セッションの中に、ユーザー名(user)とパスワード(password)が入っていたら、

  %{#session.user + ":" + #session.password}

  なども、書ける。


●論理式も書ける。s:ifタグのtestできじゅつする
 パスワードが1234567かどうかのチェック

 '%{#session.password == "1234567"}

 文字列でも、==で比較してしまって大丈夫。
 ""か''かについては、

Struts2 s:ifタグの条件判定文(OGNL式)がうまくいかない場合
http://mofuken.blogspot.jp/2009/07/struts2-sifognl.html

 を参考にしてね!

●さらに、この値は、stringなので、それに、メソッドを適用
 することも出来たりする。

  #session.password.length()

 とか。そのサンプルは、このあとすぐ・・・じゃないかな、
 ちょっと先(「変わったサンプル」参照)

●再帰させた関数を作って、それを実行するということも、
 できなくはないけど、技巧的すぎるので、やめておく。
 (「目的」のところ参照)




■変わったサンプル

パスワードの文字数文、****に置き換えるプログラム

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>処理メッセージ</title>
</head>
<%
// パスワード
session.setAttribute("password","1234567");

// パスワード上、考えられる最大文字数を入れる
session.setAttribute("dummyword","**************************************");
%>


<body>

<s:property value='%{#session.dummyword.substring(0,#session.password.length())}'/>

</body>
</html>


これが変換されると、こんなHTMLになる

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>処理メッセージ</title>
</head>



<body>

*******

</body>
</html>





次回は、ArrayListとかについて・・・

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

Submitボタンをクリックしても、画面を遷移させないことも出来る方法

2013-10-08 15:33:48 | JavaとWeb
あれ、これ書いていなかったか・・・(^^;)


AJAXで受け取ったデータを元に、画面遷移する
http://blog.goo.ne.jp/xmldtp/e/5dea7caf15b2f882ce3481311fb54825



AJAXを使わずSubmitで、画面遷移なしにサーバアクセスする-ファイルアップロード等で使う
http://blog.goo.ne.jp/xmldtp/e/be437400b05856141b2f49aa67e52fe2

は、画面遷移する/しないのはなしだけど・・・




■お題
submitで、値をチェックし、
  ・エラーのときは、画面遷移しない
  ・エラーじゃないとき、画面遷移するのは、どうしたらよいのか?




■方法
submitボタンで、onclickのところで、

onclick="return test()"

のように書き、そこで書いた関数(ここではtest()で)、

  遷移させたければtrue
  遷移させたくなければ(エラーのとき)false

とかく。




■サンプル
値が入ってなかったら、alert出して、遷移しない
入っていたらyahoo表示

<html>
<head>
<title>submitのテスト</title>
<script type="text/javascript">
function test()
{
	if (f1.arg1.value == "" )
	{
		alert("なにか入れてください");
		return false;
	}
	else
	{
		return true;
	}
}
</script>
</head>
<body>
<form name="f1" action="http://www.yahoo.co.jp" method="post">
<INPUT TYPE="text" name="arg1" />
<INPUT type=submit onclick="return test()" name="sub1"/>
</form>
</body>
</html>






■注意

onclickのところで、onclick="return test()"のようにreturnを入れないと、
ここで評価が行われないので、falseのときでも、submitのactionを実行してしまう
ので注意

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

Struts2でのButtonやイメージボタン

2013-10-03 12:48:12 | JavaとWeb
Struts2では、INPUTタグのsubmitも、BUTTONタグも、イメージボタンも全部
s:submitタグで作るらしい・・・(属性「type」が異なる)

こんなかんじ
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 

"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>ボタン</title>
</head>
<body>
<s:form method="POST" action="exe.action" theme="simple">
<s:submit type="button"  value="実行" />
<s:submit type="input"  value="実行" />
<s:submit type="image" src="ci0161c.jpg" />
</s:form>
イメージは
http://www.iconsozai.com/free_sample/
より(上から2番目)
</body>
</html>

そうすると

なかんじになる。
1番左が、BUTTONタグ
2番目(真ん中)がINPUT TYPE=SUBMITと同じタグ

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

Struts2でBeanの配列を表示する際、Beanのある項目値によって表示方法を変えたい

2013-10-02 14:54:27 | JavaとWeb
具体的には以下のIchiranBean
package s2bean;

public class IchiranBean {
	private String s1;
	private String s2;

	public String getS1() {
	    return s1;
	}

	public void setS1(String s1) {
	    this.s1 = s1;
	}

	public String getS2() {
	    return s2;
	}

	public void setS2(String s2) {
	    this.s2 = s2;
	}
}

があって、以下のactionで、このBeanに値をセットして、配列にしている

package s2demo;

import java.util.*;
import org.apache.struts2.interceptor.SessionAware;
import s2bean.IchiranBean;

public class ExeAction implements SessionAware {

private Map<String, Object> sessionMap;
@Override
public void setSession(Map<String, Object> sessionMap) {
this.sessionMap = sessionMap;
}

private ArrayList<IchiranBean> data = new ArrayList<IchiranBean>();
public ArrayList<IchiranBean> getData() {
return data;
}
public void setData(ArrayList<IchiranBean> data) {
this.data = data;
}

public String execute() throws Exception {

for(int i = 0 ; i < 5 ; i++)
{
IchiranBean ib = new IchiranBean();
ib.setS1("1");
if ( i%2 == 0)
{
ib.setS2("Active");
}
else
{
ib.setS2("inactive");
}
}
sessionMap.put("data", data);

return "success";
}
}
</pre>



このとき、data(=Beanの配列)の内容をJSPで書き出すんだけど、
s2の値がActiveだったら、赤字にしたいというもの。

こんなかんじで、iteratorタグとifタグで書ける


<%@ page language="java" contentType="text/html; charset=windows-31j"
pageEncoding="windows-31j" import="java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
<title>Insert title here</title>
</head>
<body>
<s:iterator value="data" status="st">
<s:property value="s1"/>,

<s:if test='%{s2 == "Active"}'>
<font color=red>
</s:if>

<s:property value="s2"/>,

<s:if test='%{s2 == "Active"}'>
</font>
</s:if>

</s:iterator>
</body>
</html>



いじょう・・



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

AJAXを使わずSubmitで、画面遷移なしにサーバアクセスする-ファイルアップロード等で使う

2013-09-26 09:52:58 | JavaとWeb
サーバーアクセスする場合、
  画面遷移させてよいなら、Submitが使える
  画面遷移させない場合は、AJAXを使う。

 だけど、ファイルアップロードなどでは、inputタグのタイプfileで指定した、ファイルの内容はみれない(セキュリティの都合らしい)。ということは、AJAXでは送れない。

 このようなケースのほかに、submitしちゃいたい(データいっぱいあるし・・・)だけど、画面遷移はしたくない!というときがある。

 このようなとき、どうするか・・・



画面遷移なしでファイルアップロードする方法
http://blog.joyfullife.jp/archives/2007/04/17134117.php

というサイトに書いてあるけど、要するに

・IFRAME で、NAME="名前"で名前をつけて、style="display:none"のタグを書く
・formタグの属性にtarget="名前" と、IFRAMEのNAMEで書いたものをターゲット名として書く
・そうすると、submitされたとき、サーバーから帰ってきた値は、非表示のIFRAMEに
 展開されるので、見えない
  →画面遷移なしで、サーバーにアクセスできる。




しかし、サーバーアクセスしたあとで、処理結果が聞きたい場合がある。
そうする場合はどうするか・・・

さっきのつづき

・サーバー側のファイルは、JQueryで、document.readyしたときに、
 親側(IFRAMEの親、すなわちsubmitした画面)の関数を呼び出す。
 親側に渡したい値は、その関数の引数として渡す

・親側は、その関数を実行させられるので、そこで、適当に処理する。




■サンプル

こんなかんじ。

親側のプログラム(oya.htm)
<!doctype html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js" type="text/javascript"></script>

<script>
function myalert(buf)
{
	alert(buf);
}

</script>
</head>
<body>

<form name="f1" id="f1" action="ko.htm" method="post" target="nodisp">
入力項目<INPUT TYPE="text" NAME="arg1"/>
<INPUT TYPE="SUBMIT" value="実行" />
</form>

<IFRAME NAME="nodisp" id="naiyo"  style="display:none"></IFRAME>
</body>
</html>



入力項目の実行が実行されると、サーバー側に行く。
そして、サーバー側で処理した結果は、IFRAMEのNAME nodispにセットされる。
  →display:noneなので見えない

サーバーの結果は、こんなかんじ

<!doctype html>
<HTML>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"

type="text/javascript"></script>

<script>
$(function(){
parent.myalert("このデータを親へ");
});
</script>

<body>

やっほ~

</body>
</html>


JQueryで、document.readyしたとき($(function(){ の中)
parent.myalert();を実行する。
この場合、IFRAMEの親、つまり上記oya.htmのmyalertを
実行する。
親に渡したい値は、引数にしてある。
上記の例の場合”このデータを親へ”というのが渡すデータ

親側では、この引数の値を見て、エラー処理や正常系処理を行う。

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

Struts2タグリファレンス(タグ一覧)

2013-09-15 21:44:01 | JavaとWeb
まず、Struts2のタグは、汎用とUIに分かれるらしい。

汎用タグのファレンスは、

http://www.techdoctranslator.com/struts2/tag-developers-guide/struts-tags/generic-tags/generic-tag-reference


UIタグのリファレンスは、

http://www.techdoctranslator.com/struts2/tag-developers-guide/struts-tags/ui-tags/ui-tag-reference


どちらも「ソフトウェア技術ドキュメントを勝手に翻訳」さんから


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

Struts2+JQueryで画面操作(19時修正&追加)

2013-09-15 17:17:11 | JavaとWeb
■はじめに

 最近、画面はJQueryで使うことが多い。一方、Strutsの後継?Struts2をコントローラーで使うケースも有る。このとき、Struts2では、ViewにStrutsのタグを使うが、このタグで生成される入力項目(Inputなど)を、JQueryで操作できるか?というお話




■基本方針

・Strutsタグ(s:なんとか)は、以下の決まりでName,IDが振られるらしい

 ・フォームについて:アクション名の.acctionの前がID,NAMEになる?
 ・フォーム内の部品について:key名がNAME,アクションのID_key名がID

なので、このIDを利用して、セレクタを書けば、JQueryで操作できる   

(19時追加)
・ではあるが、sタグの属性にIDを指定すると、そのIDのなるので、
 自分でIDを振ってしまえばよい。





■開発手順
(19時修正)
・Strutsタグ入りJSPで、画面を作ってみる
 その際、必要な箇所には、自分でIDを振ってしまう
 例:<s:textfield label="arg1" key="arg1" id="myid"/>
(<>は、本当は半角)

・自分で振った
IDを利用して、JSP内にJQueryを記述する。
   フォーム内の要素は、セレクタでIDを指定して、選択する。

・submitの代わりにボタンを使い、AJAXで送る場合は
     $.post(
        $("#フォームのID").attr("action"),
        {"要素名": $("#フォーム内要素のID").val()}, // データ
        function(data, status) {
          帰ってきたときの処理
          (dataに、結果のJSP)
        },
        "html"
     );
 で、いける

・それ以外は、普通にJQueryを書けばよいが、以下の「注意点」に注意




■注意点

・デフォルトでは、フォームの要素は、勝手にテーブルを使って配置される
 回避するには、 s:formタグで、属性に theme="simple" を設定する


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

JQueryの簡単な説明

2013-09-11 15:43:54 | JavaとWeb
ちょっと、今回説明する機会があったので、
そのときの内容をメモメモ




■JQueryとは
Javascriptのライブラリの1つ
ライブラリ:他にはprototype.jsなど
特徴:メソッドの返り値がJQueryオブジェクトになっている
→つなげて書ける:後でわかる

■JQueryの説明

(1)$(function () {  なんか書く }); ではじまる

  なぜ、こう書くか・・・

  ★$→JQuery()を略したもの

  ★ドキュメントが読み終わったとき、何かしたい場合、

JQuery(document).ready(なんかすること);

   と書くことになる。ここで$でかくと、

    $(document).ready(なんかすること)

   となるが、(document).readyは省略可能。なので、

$( なんかすること );

   になる。

  ★匿名のfunction
   一般にJavascriptではfunction abc(){ }のように、
   functionのあとに関数名をつけるが、一時的に利用し、
   名前をつけなくて言い場合には、これを省略する。
   そのため「なんかすること」に匿名のfunctionに
   すると、

     $(function () {  なんか書く });

   になる。

(2)「なんか書く」に相当する部分
   ここで、いろいろ行いたいこと、つまり
     ・何かクリックされたら、処理を行う
     ・CSSを読み込み時に変更する
        :
   などの処理を書く。

  ★ $("#button1").click(function(){ ボタンがおされたときの処理 });

  $=JQueryなので、これは

   JQuery("#button1").click(引数);

  に相当する。
  JQuery()関数は、引数に対応するオブジェクトを返す。
  そのオブジェクトのclickという関数が実行される。
  clickの引数は、クリックされたとき実行する関数

  一般にJQueryは、
  $(対象).命令やイベント(その引数→匿名の関数のときもある);
  という形をとる

 ★対象の部分をセレクタという。主に

  $("div")  HTMLのタグ
  $("#id1")  ID名
  $(".class") クラス名

  で指定する divの中のfontのように限定するときは div fontとスペースで区切る
  id1とid2のようなときは#id1,#id2のように、,で区切る

これ以外のセレクタは
  http://ascii.jp/elem/000/000/498/498710/index-2.html
参照

 ★セレクタの後には、セレクトしたものに対しての
   命令・操作または
   イベントを書く
  命令、操作としては、
    text(書き換えたい言葉);
    html(書き換えたいHTML文);
    css(プロパティ,値);
    val(入力値);
    hide(隠れる時間);
    fadeIn(表示する時間);
  などを使う
  詳しくは
http://ascii.jp/elem/000/000/498/498710/index-3.html
参照

  イベントとしては
   click(クリックされたときの関数);
   mouseover(マウスオーバーしたときの関数);
  などがある。
  関数は、匿名の関数を書くことになる

くわしくは
http://ascii.jp/elem/000/000/498/498710/index-4.html
参照

■JQueryの書き方

(1)はじめに

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.1/jquery-ui.min.js"></script>
<script type="text/javascript" src="js/pqgrid.min.js"></script>

等と、JQueryのあるところを書く

  ★CDN(コンテンツ デリバリー ネットワーク)
   一般に言われる意味と違うので注意!
   googleに、ajaxのライブラリがある。そこで、これをリンクして
src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"
   などと指定する。このとき、GoogleのJQueryのソースを
   CDNということがある(普通のCDNの定義ではない)

  ★ローカルに持つ
   上記の方法だと、かならずGoogleを参照することになるので、
   ローカルにJQueryを置いて、src="js/jquery.min.js"のようにすることもある

  ★JQueryと、プラグイン
    JQueryには、
      JQuery本体jquery.min.js
      JQueryuiなど
    のほかに、公開されているプラグインがある。今回は
      "js/pqgrid.min.js
    がそれに相当する。このようなものは(なくならないように)ローカルに持っておく

   なお、JQueryMobileは、モバイル用のモノで、
   JQueryを使っているものの、書き方は結構違う

(2)スクリプトとして
Javascriptとして
<script>
$(function () {

  なんたらかんたら

});

</script>

として、JQueryを書く。なお、JQueryはJavascriptなので、この中に
ふつうのJavascript
document.f1.ABC.value = "5";

などと書いても、ちゃんと実行する。


■AJAXの関係

 画面で非同期処理(画面を遷移させないでサーバーとやり取りする)をするとき
 JQuery.post();などで出来る。こんなかんじ

http://stacktrace.jp/jquery/api/ajax/jquery.post.html から引用

とくにJSON形式でのやり取りが多い

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

今ドキFrameを使わない理由

2013-09-06 17:53:54 | JavaとWeb
最近のHTMLでは、Framesetを使って枠の分割をしないと思う。
一つのHTMLで、DIVによって、左右を分割するのが多い。

で、その理由なんだけど、「frameにすると、面倒くさいことがおこる」
といわれていて、何のことかわかんなかったけど、確かにそうだね!
と思った例があったので、メモメモ・・・




■お題

Framesetで2つに割ったウィンドウにおいて、
右側の枠のボタンがクリックされたら、
いっせいに半調にしたい。




■ためしにやってみると・・・

フレーム全体を、こんな風にわっておく

<!doctype html>
<html>
<head>
<link rel="stylesheet" 

href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.1/themes/base/jquery-ui.css" />
<script type="text/javascript" 

src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.1/jquery-ui.min.js"></script>
<script>
	function setcol()
	{
		alert("あとで、説明する");

	}
</script>  
</head>
<frameset id=myframe cols="150,*">
    <frame src="b.html" name="hidari">
    <frame src="a.html" name="migi">
    <noframes>
    このページはフレームを使用しています。
    </noframes>
</frameset>
</html>



そして、左側のb.htmlは、こんなかんじ

<!doctype html>
<html>
<head>
<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.1/themes/base/jquery-ui.css" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.1/jquery-ui.min.js"></script>
</head>
<body>
<h1>いいいい</h1>
<h1>いいいい</h1>
<h1>いいいい</h1>
<h1>いいいい</h1>
<h1>いいいい</h1>
<div id=mask2 style="background:black;top:0px; z-index:1;left:0px;width:100%;height:100%; position:fixed;display:none">
</div>

</body>
</html>



右側のほうのa.htmlは、こんなかんじ

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.1/themes/base/jquery-ui.css" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.1/jquery-ui.min.js"></script>
<script>

$(function(){

$("#tuika").click(function(){
parent.setcol();
parent.hidari.$("#mask2").fadeTo("slow",0.5);

parent.migi.$("#mask").fadeTo("slow",0.5);
parent.migi.$("#msg").fadeTo("slow",1);
});

$("#mybutton2").click(function(){
parent.hidari.$("#mask2").hide();

parent.migi.$("#mask").hide();
parent.migi.$("#msg").hide();
});
});

</script>
</head>

<body>
<H1>あああああい</H1>
<H1>あああああい</H1>
<H1>あああああい</H1>
<H1>あああああい</H1>
<H1>あああああい</H1>
<BUTTON id="tuika" >追加</BUTTON>

<div id=msg style="background:white;border:1px solid gray; top:100px; left:200px; width:300px; height:200px; position:fixed; z-index:2;display:none">

<form name="f2" action="index.html" nethod="post">
べつわく
<BUTTON id="mybutton2">キャンセル</BUTTON>
</form>
</div>
<div id=mask style="background:black;top:0px; z-index:1;left:0px;width:100%;height:100%; position:fixed;display:none">
</div>


</body>
</html>



この状態で、ページを開くと、

となる。で、ボタンをクリックすると

となり、境界線がのこる。

境界線の指定は、

境界線の色を指定する
http://www.tagindex.com/html_tag/frame/frameset_bordercolor.html

にあるように、framesetで設定できるが、なぜか、これを
ボタンがおされたときに、function setcol()のなかで
document.getElementById("myframe").style.border=100;
document.getElementById("myframe").style.borderColor ="black";
とかしても、その指定がきかない
(setcolが入っているのは、alertが出るので判る)

framesetを変える指定や、なんか一発でやる指定とかもあるのかもしれないけど、
それよりも、framesetで枠を割らないで、divでやって1つのhtmlファイルに
したほうが、作りやすいことは確かだ。



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