Psalm

プログラマ向け技術メモ

フィールド関係のショートカット

2008-09-18 17:30:46 | お知らせ
Alt + Shift + D
DATE フィールド (フィールド : 文字列、図、ページ番号などの情報を文書中に自動的に挿入するための命令。たとえば、Date (日付) フィールドは、現在の日付を挿入します。)を挿入します。

Alt + Ctrl + L
LISTNUM フィールドを挿入します。

Alt + Shift + P
PAGE フィールドを挿入します。

Alt + Shift + T
TIME フィールドを挿入します。

Ctrl + F9
空白のフィールドを挿入します。

Ctrl + Shift + F7
Word のリンク元ファイルのリンクされた情報を更新します。

F9
選択したフィールドを更新します。

Ctrl + Shift + F9
フィールドのリンクを解除します。

Shift + F9
選択したフィールド コード (フィールド コード : データ ソースの指定情報が表示される場所を示すテキストが入る枠。フィールドの実行結果を生成するフィールドの要素です。フィールド コードには、フィールド文字、フィールドの種類、および命令が含まれています。)の表示と実行結果 (フィールドの実行結果 : フィールドの命令が実行されたときに文書に挿入される文字列や図。文書を印刷したり、フィールド コードを非表示にすると、フィールド コードがフィールドの実行結果に置き換えられます。)の表示を切り替えます。

Alt + F9
すべてのフィールドについて、フィールド コードと実行結果の表示を切り替えます。

Alt + Shift + F9
フィールドの実行結果を表示しているときに、GOTOBUTTON フィールドまたは MACROBUTTON フィールドを実行します。

F11
次のフィールドへ移動します。

Shift + F11
前のフィールドへ移動します。

Ctrl + F11
フィールドをロックします。

Ctrl + Shift + F11
フィールドのロックを解除します。

マウスポインタの座標取得(IE限定)

2008-09-04 11:43:07 | JavaScript
現在のマウス座標:
window.event.clientX
window.event.clientY

スクロールバーの移動量:
document.body.scrollTop

画面の高さ:
document.body.clientHeight

つまり、スクロール分を含むページの縦サイズは

document.body.scrollTop + document.body.clientHeight

となるわけだ。
さらに、divブロックの高さは

document.getElementById(id).clientHeight

で取得できるので、これらを組み合わせて計算すると
程よく画面からはみ出さない位置にdivブロックを表示できる。
前々回書いたソースでは、divブロックが画面縦サイズより大きい場合に
上が切れてしまうので、少し修正した。

var x = window.event.clientX;
var y = window.event.clientY;
var windowHeight = document.body.clientHeight;
var element = document.getElementById(id);
var elementHeight = element.clientHeight;

// 説明表示位置を決定する
x = x + 10;
if( (windowHeight - 20) < elementHeight ) { // 上が切れる
y = 20 + document.body.scrollTop;
} else if((windowHeight - y) < elementHeight) { // 下が切れる
y = windowHeight - elementHeight - 20 + document.body.scrollTop;
} else {
y = y - 10 + document.body.scrollTop;
}

さて、ここでも注意点がひとつ。いや、ふたつ。
このような使い方をする場合、divブロックの初期状態は
display:noneか、visibility:hiddenになっているだろう。
visibility:hiddenでこの機能を実装したら、何故かdivブロックに載せた
tableのborderが隠れてくれなかった。
Windows2000のIE6では正常に動作するが、XPのIE6では駄目。
仕方なくdisplay属性を使うことにしたが、初期状態noneでは
element.clientHeightが取得できず、0が返ってきてしまう。
これまた非常によろしくない。
迷った末、divブロックの初期表示はdisplay:blockにして
x座標を3000、つまりページの外に配置することで対処した。
で、前回の横スクロール禁止が出てくるわけである。

見ちゃ駄目!

・・・いいのか、そんなことで。

struts-tilesを使って、includeする。

2008-09-04 11:35:15 | Struts
Tilesを使うと、サイトの部品の使いまわしができる。
・・・そこまで複雑なサイトを作ることはないだろうけど。
うちはweb屋さんじゃないから。
一応、便利そうなので書いておく。

tiles-def.xmlを書く。

<definition name="name" path="/pages/header.jsp">
</definition>

struts-config.xmlにプラグインを設定。

<plug-in className="org.apache.struts.tiles.TilesPlugin">
<set-property property="moduleAware" value="false" />
<set-property property="definitions-debug" value="0" />
<set-property property="definitions-parser-details" value="0" />
<set-property property="definitions-parser-validate" value="false" />
<set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml" />
</plug-in>

JSPにタグを書く。

<tiles:insert definition="header" flush="false"/>

includeと何処が違うんじゃ!と起こられそうなソースだ。
が、まあ、実は色々なことができるらしい。
暇があったら調べてみようと思う。

フォームで送信された日本語の文字化け対策

2008-09-04 11:25:14 | Struts
Strutsは、エンコード方式の情報を得る前にリクエストデータ情報を
beanに格納してしまうので、JSPとサーブレットでエンコードを
設定していても文字化けが発生する。
ので、Filterを使って回避する。

/**
* 日本語エンコードフィルター
*
*/
public class EncodingFilter implements Filter {

/** エンコード */
protected String encoding = null;

/** filterConfig */
protected FilterConfig filterConfig = null;


/**
* doFilter
*
* @param request 処理している Servlet リクエスト
* @param response 処理している Servlet レスポンス
* @param chain FilterChain
* @throws IOException 入出力例外
* @throws ServletException サーブレット例外
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {

String encoding = filterConfig.getInitParameter("encoding");

if (encoding != null) {
request.setCharacterEncoding(encoding);
}

// Pass control on to the next filter
chain.doFilter(request, response);
}

/**
* init
*
* @param filterConfig フィルタ設定のためのオブジェクト
* @throws ServletException サーブレット例外
*/
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;

}

/**
* destroy
*
*/
public void destroy() {
this.encoding = null;
this.filterConfig = null;

}
}

で、web.xmlに

<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>util.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>encodingFilter</filter-name>
<servlet-name>action</servlet-name>
</filter-mapping>

を追加する。

タグライブラリ拡張

2008-09-03 18:47:51 | Struts
Strutsのhtmlライブラリの<html:textarea>にはwrap属性が
用意されていない。
ということで、ライブラリを拡張してwrap属性を装備することにした。
手順は意外と簡単。
まず、org.apache.struts.taglib.html.TextareaTagをextendsした
オリジナルのtextareaクラスを作成して、wrap変数を持たせて
変数を有効にする。

public class ExTextareaTag extends org.apache.struts.taglib.html.TextareaTag {

/** wrap属性 */
private String wrap;

/**
* wrap属性を取得
* @return the wrap
*/
public String getWrap() {
return wrap;
}

/**
* wrap属性を設定
* @param wrap the wrap to set
*/
public void setWrap(String wrap) {
this.wrap = wrap;
}

/**
* wrap属性を有効とする
*/
@Override
protected void prepareOtherAttributes(StringBuffer handlers) {
prepareAttribute(handlers, "wrap", getWrap());
}
}

さて、次はstruts-html.tldの拡張。
textareaのタグを探してコピペ。nameとtagclassを変更、
attributeにwrapを追加。
ちなみに、requiredにtrueを設定すると属性が必須になる。
wrap属性は必須ではないのでfalseを設定。
rtexprvalueは、属性値をJSPのスクリプトで指定できるか。
一応、trueにしておく。

<tag>
<name>extextarea</name>
<tagclass>util.ExTextareaTag</tagclass>
<attribute>
<name>wrap</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
以降はtextareaと同じ

最後に実際のJSPの指定方法。
htmlタグの名前にextextareaを指定するだけ。

<html:extextarea property="xxxxx" rows="5" cols="54" wrap="phycical" />

完成!

時刻の桁合わせ

2008-09-03 18:14:57 | JavaScript
桁数分0をくっつけて、右からX桁を切り取る。

/*
* 現在時刻をyyyy/MM/dd hh:mm:ss.SSS形式で取得
*/
function getDateStr() {
var now = new Date();
var month = conv2deg(now.getMonth()+1);
var date = conv2deg(now.getDate());
var hours = conv2deg(now.getHours());
var minutes = conv2deg(now.getMinutes());
var seconds = conv2deg(now.getSeconds());
var milSec = conv3deg(now.getMilliseconds());
var dateStr = now.getFullYear() + "/" + month + "/" + date + " ";
dateStr += hours + ":" + minutes + ":" + seconds + "." + milSec;

return dateStr;
}

/*
* 時刻の桁あわせ(2桁)
*/
function conv2deg(val){
val = "00"+val;
return val.substr(val.length-2,2);
}

/*
* 時刻の桁あわせ(3桁)
*/
function conv3deg(val){
val = "000"+val;
return val.substr(val.length-3,3);
}

Struts validatorとvalidateメソッドを併用する

2008-09-01 17:25:58 | Struts
両方使おうとしたが、Struts validatorが実行されない。
何故かと思ったら、varidateメソッドの中でStruts validatorの
実行結果を取得していないのだった・・・
Strutsの仕組みを理解していればすぐに分かるはずなのだが。
付け焼刃はつらい。

varidateメソッドで以下を実行すべし。

// Validator の検証結果を取得
ActionErrors errors = super.validate(mapping, req);