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

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

【お題】Struts2でdjunitしたい(ServletRequestAwareを実装)

2015-10-09 15:29:24 | JavaとWeb
前に、

Strutsの単体テスト StrutsTestCase for JUnitの使い方(16日追加)
http://blog.goo.ne.jp/xmldtp/e/aba8bac027597bd6e39c4d54f2f62c5a

で、Struts1の単体テストの話をした。
で、Struts2でJUnitテスト、djunitテストをしたい場合は?

SessionAwareやServletRequestAwareを使っていない場合は、問題ない。
そのまま、呼び出してくれればよい。

SessionAwareなら、まだまし。
HashMapをsessionにみたてて、そのMapをsetSessionで渡せばOK

問題は、ServletRequestAware。
これは、Tomcatが使っているCoyoteRequestとか、Requestとか
使おうとすると、いろいろたいへん(依存性とかあって・・・*注1)
で、どうするか?というのが、今日のお題。




【対応策例】Struts1のときに使ったstrutstestを使おう!

 上記Struts1の単体テストの話のときに使ったstrutstestの中に、

  servletunit.HttpServletRequestSimulator

 というのがいるので、こいつを使う。
 こいつは、setParameterができる。




【やってみよう】

・前提
 eclipseでやる→JUnitは標準的に作れる
 djunitは、いれたものとする(注2)
 strutstestは、ダウンロードしてあって、解凍してでてきたjarに対して
 作成するプロジェクトから、クラスパスが貼られている
 (プロジェクトで右ボタン、プロパティのJavaのビルド・パスで
  外部jar追加を行った) (注3)

 テスト対象クラスは、こんなかんじ
package struts2.gui;

//	セッションで使う
import java.util.Map;

//(1)リクエストで使うものインポート
import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.SessionAware;

//	一般的に・・・
import com.opensymphony.xwork2.ActionSupport;

//==============================================//
//												//
//	Struts2										//
//	セッション、リクエストのサンプル			//
//												//
//==============================================//
public class HelloAction extends ActionSupport implements SessionAware,ServletRequestAware{
	private String name;						//	sタグの変数
	private String msg;

	private Map<String,Object> session;						//	セッションの宣言
	private HttpServletRequest request;			//	(2)リクエストの宣言

	//	sタグで必要なアクセサ
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

	//	セッションで必要なアクセサ
	public void setSession(Map<String,Object> session) {
		this.session = session;
	}

	//	(3)リクエストで必要なアクセサ記述
	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}

	public HttpServletRequest getServletRequest() {
		return this.request;
	}

    public String execute()
    {
  	    //======================================//
  	    //		値の取得						//
  	    //======================================//
    	// sタグのnameは、何もしなくても取得されている

    	//	セッションでの取得
  	    int	kai;
  	    String kaistr = (String)session.get("kaisu");
  	    if ( kaistr	==	null)
  	    {
  	    	kai	=	0;
  	    }
  	    else
  	    {
  	    	kai = Integer.parseInt(kaistr);
  	    }

  	    //	(4)リクエストパラメタでの取得
  	    String start = getServletRequest().getParameter("start");
  	    if (start	!=	null)
  	    {
  	    	try
  	    	{
  	    		kai =  Integer.parseInt(start);
  	    	}
  	    	catch(Exception e)
  	    	{
  	    		//	数字でなかったら、なにもしない
  	    	}
  	    }


  	    //======================================//
  	    //		処理							//
  	    //======================================//
  	    kai++;		//	今回の分を足す
  	    setMsg("Hello World" + name + ":"+ kai+"回目");


  	    //======================================//
  	    //		出力								//
  	    //======================================//
  		//	セッション書き出し
  		session.put("kaisu", String.valueOf(kai));
  		session.put("msg", getMsg());

        this.addActionMessage("成功1");
        return SUCCESS;
    }
}


・テストするクラスを作る
 そこから、sessionは
HashMap<String,Object> session = new HashMap<String,Object>(); // セッションの作成
test.setSession(session);

 なかんじで、HttpServletRequestは、
HttpServletRequestSimulator request
= new HttpServletRequestSimulator(new ServletContextSimulator()); // HttpServletRequestの代わり作成
test.setServletRequest((HttpServletRequest)request);

なかんじでセットする
 以下のソースのかんじ

package struts2.gui;

import static org.junit.Assert.*;
import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;
import org.junit.Test;

//==================================
// HttpServletRequestのかわりに必要
//==================================
import servletunit.HttpServletRequestSimulator;
import servletunit.ServletContextSimulator;

public class HelloActionTest {

@Test
public void test() {

//============================================
// いろいろ設定
//============================================
// 作成する
HelloAction test = new HelloAction();

// SessionAware設定
HashMap<String,Object> session = new HashMap<String,Object>(); // セッションの作成
test.setSession(session);

// ServletRequestAware設定
HttpServletRequestSimulator request
= new HttpServletRequestSimulator(new ServletContextSimulator()); // HttpServletRequestの代わり作成
test.setServletRequest((HttpServletRequest)request);
String ret;

//============================================
// テスト実行
//============================================

// 1回目
ret = test.execute();
assertTrue(ret.equals("success"));
assertTrue(((String)session.get("kaisu")).equals("1"));

// 2回目
ret = test.execute();
assertTrue(ret.equals("success"));
assertTrue(((String)session.get("kaisu")).equals("2"));

// 3回目
String[] args = new String[1];
args[0] = "1";
request.setParameterValue("start", args);
ret = test.execute();
assertTrue(ret.equals("success"));
assertTrue(request.getParameter("start").equals("1"));

// 4回目
ret = test.execute();
assertTrue(ret.equals("success"));

}

}



・実行すると、こんなかんじ





*注1:HttpServletRequestはインターフェースなので、実際に使うには
実装しているはず。

Tomcat5では、CoyoteRequestで実装しているらしい
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=9845&forum=12

Tomcat7では、
http://www.coderanch.com/t/567946/Java/java/Java-Tomcat-Java-Tomcat
によると、CoyoteRequestがRequestになったらしい
このRequestは、catalina.jarのorg.apache.catalina.connector.Request
にいるが、こいつを使おうとすると、いろんなものをリンクしないとエラーになる。


*注2
入れ方については
テストを楽にっ!!「djUnit」によるJavaソーステスターへの道
http://maplesystems.co.jp/blog/all/programming/11326.html
の「導入方法」を参照。大事なことは、指定するロケーションのURLは
http://works.dgic.co.jp/djunit/update/3.5.x/site.xml
ってこと。それ以降の使い方については
http://www.mitchy-world.jp/java/test/djunit.htm
を参照のこと。


*注3
ダウンロードURLは、
http://sourceforge.net/projects/strutstestcase/files/

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

先生!JQueryでHTMLのエスケープって、どうするんですかあ?

2015-10-09 12:12:12 | JavaとWeb
【質問】PHPなら、htmlspecialcharsとかあるけど、
JQueryで同じようにエスケープさせたいとき、
どうするんですかあ?

【答え】$("#いれたいところ").text("入れたい文字");でやります。

【質問続き】でも、枠とかも書きたいんですよ!

【答え】
 枠の部分を先に

   $("#いれたいところ").html("空枠のHTML");

 で書いておいて、
 その空枠にIDを降っておいて、あとで、

   $("#空枠に振ったID").html("入れたい文字");

 とします。

サンプル

<!DOCTYPE html>
<html>
<head>
<meta charset = "UTF-8">
<title>フォーム</title>
<style>
</style>
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script type="text/javascript">
var rec=[
		{"title":"<B>1</B>","honbun":"&本文1"},
		{"title":"<B>2</B>","honbun":"&本文2"},
		{"title":"<B>3</B>","honbun":"&本文3"}
	];

function zikko()
{
	//==============================
	//	外枠をHTMLで書く
	//==============================
	buf = "";
	for (i = 0; i < rec.length ; i ++ )
	{
		buf = buf + "<DIV ID='title" + (i+1) + "'></DIV>";
		buf = buf + "<DIV ID='honbun" + (i+1) + "'></DIV>";
	}
	$("#area1").html(buf);

	//==============================
	//	中身をTEXTで書く
	//==============================
	for (i = 0; i < rec.length ; i ++ )
	{
		$("#title"+(i+1)).text(rec[i].title);
		$("#honbun"+(i+1)).text(rec[i].honbun);
	}

}
</script>
</head>
<body>
<h1>テスト</h1>
<DIV ID="area1">
</DIV>
<button id="submit" onclick="zikko()">実行</button>
</body>
</html>


結果(ボタンをクリックすると)


もし、textのところをhtmlにすると


タグはエスケープされず、解釈されてしまい、太字と&になる

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

次世代医療ICTとか、Watsonの質問応答4つのステップとか、聞いてきた!

2015-10-09 10:17:00 | Weblog
昨日、CEATECに行って来て

第6回「医療ヘルスケア産業イノベーションフォーラム」
-医療ヘルスケア産業の革新と新市場の創出に向けて-

を途中から着てきたので、メモメモ




■次世代医療ICT基盤の構築と利活用推進について
(途中から)

・アウトカムデータの利活用
・デジタル化のイメージ
  INPUT 処理 出力 応用システム(診断支援等)
・病院アーキテクチャ
 レセプト・・会計向け→情報の連携はできていなかった
 →クラウドによる統合も出始めている
・利用イメージ
 現在:問診票記入→看護師さんにせつめい→診察室で説明:患者ストレス・非効率
 新しいフロー:タブレットで入力→振り分け、診断支援
・取り組み
  共通インターフェース
  標準の普及
  デジタル化→データ利活用プログラム

・データ利活用
 →データを集約し、パーソナルヘルスレコードも
 →病気にならないと、インセンティブが働きにくい
 →データが利用しやすくなる

・これから
 5月の産業競争力会議で
 目的:質の向上
 ・医療連携:番号導入
 ・デジタル化
 ・利用拡大の基盤整備

・番号導入
 マイナンバーカードに
 医療番号統一→個人の一連の流れ

・デジタル化
 地域医療連携

・基盤整備
 標準化
 いまあるDBの利用を拡大

・情報の円滑な流通等の促進に向けた新たな法制度の創設
 →代理機関

・2020年までの集中5カ年計画
 医療番号制度




■質疑応答システムWatsonとその事業化
・ビッグデータによる産業変革
 2006年 目標をたてる
  ゲームは勝ち負けが分かる→クイズ番組

・システムの作り方が問題
 過去の問題をもとにしても、本番は違う問題なので、結果はよくならない
 →エキスパートシステムでも同じ問題
 →データを活用しよう!
   非構造データ:画像(メタデータ)コールセンター(対話)動画像
 →解き方、手掛かりに対する重みの学習

・2011年2月 watsonがジュパディーで勝利
 3000コアで2~3秒で答える
 4つのステップ
  (1)内容解析
    ジャンル、本文を入力とし、キーワードのあつまりとして表現
    文の解析→2語の間:セマンティックWeb
    検索式に変えて検索→1回目検索:キーワードを集める

  (2)解答候補の生成
    キーワードをあてはめ、文を作る
    パラグラフを検索:根拠を集める

  (3)確信度計算
    合致度を数値化・・・スコアが出る

  (4)もっとも確信度高いものを答える
    閾値を超えた時、答える

・医療に応用:学習できるようにした

・この手順だけでは、重みを獲得していないのでX
 →正解率を高めるためのチューニング(機械学習)
   →パラメータの変化で

・可能になった理由
 質問応答技術の劇的進歩
 並列処理能力の向上
 テキスト情報の劇的な増加(ビッグデータ) wikipedia

・事業化
 医療→がん情報提供
 顧客対応→コンタクトセンター、商品提案
 パートナーソリューション→マイクロサービス提供

・医療分野の課題
 医療情報 5年で倍増、8~9年で刷新:でも医者の勉強時間少
 →病院に提供、地域医療にも、タイにも
 →教育ツールとして:受験勉強に使う。PBL
 →日本でも利用
 日本語の電子カルテでwatson for oncologyに接続
  →英語が基本、少しづつローカル

・創薬
 正解が出ない答え
 →答えがあるならその薬はできているから

・顧客対応
 ソーシャルで答えを求める→マルチチャネル
 資産運用
  →一部にwason埋め込み
   プロファイルする
   コグニティブコンピューティング:専門家支援

・パートナー向けクラウド
 watson developer cloud:マイクロサービス
  alchemy API→ディープラーニング   
  watson quesion and answer
  cognitoysプロジェクト

・IBMコグニティブビジネスに特化した業界初のコンサルティング業務開始
 10ガうからエコシステムパートナー募集

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