PHPの基礎メモ

禁断のPHPに手を出してみる(うちの会社もそろそろやばそうなので、引き出し増やさないと・・ふぅ)

おおらかすぎる動的型付け

文字列同士の比較でも値が数値形式だと数値として比較される

var_dump("-3" > "-4"); // true
var_dump("-3a" > "-4a"); // false

まじすか・・?

型を確認する方法

$a="456";
$b=789;
var_dump($a); // string(3) "456"
var_dump($b); // int(789)

Oracle の rownum を使用したページング処理

select	*
from	(
	select	*
	from	tab
	where	tabtype = 'TABLE'
	order	by
			tname	desc
)
where	rownum between 1 and 5

一見これでうまくいので問題なさそうだが、以下のようにページの開始が1以外だと抽出されない。

where	rownum between 6 and 10

なので入れ子をもう1つ設ける必要がある。

select	*
from	(
	select	rownum	no
		,	a.*
	from	(
		select	*
		from	tab
		where	tabtype = 'TABLE'
		order	by
				tname	desc
	)	a
)
where	no	between 6 and 10

pdfファイルをOutputStreamでダウンロードさせる方法メモ

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
	try {
		response.reset();
		response.setHeader("Content-Disposition", "inline; filename=aaa.pdf");
		response.setContentType("application/pdf");
		BufferedInputStream in = null;
		byte[] buf;
		in = new BufferedInputStream(
				new FileInputStream("x:\\xxx\\aaa.pdf")
		);
		buf = new byte[in.available()];
		in.read(buf);
		OutputStream out = response.getOutputStream();
		out.write(buf);
		out.flush();					

		in.close();
		out.close();
	} catch (Exception e) {
		throw new IllegalStateException(e);
	}
}

で、ファイルがでかくて、ちょっとづつレスポンスに返したい場合は、以下のようにする。

buf = new byte[1024];
int bytedata = 0;
while ((bytedata = in.read(buf, 0, buf.length)) > -1) {
	out.write(buf, 0, bytedata);
}
out.flush();

Tomcat 環境で開発した Java アプリを Oracle Application Server にデプロイした際に起きた問題メモ

ちなみにOASJDKは1.4、Tomcatは1.5を使用

web.xmlのあたまの宣言

Tomcatでは以下のように記述していた。

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">

これでOASにデプロイするとエラーになる。以下のように修正することでデプロイできた。

<?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>

SetCharacterEncoding 問題

responseに対し SetCharacterEncodingを適用する必要あり。
OAS の response クラスの実態はコンテナ上の servlet.jar で管理されてる(tomcatの場合 servlet-api.jar)が、ここにresponseのSetCharacterEncodingが定義されてないのでこける。

ちなみにSetCharacterEncodingをコンテナに依存させない方法として、apacheのSetCharacterEncodingFilter.classを使用する方法がある。

Java Servlet 文字化け対策

DBマガジン-2010/02より
request,responseに対し、setCharacterEncofing()でISO-2022-JPを指定する。getWriterを実行する前に設定すること。

データをpostしてpdfを生成するServletがあった場合

public class GeneratePdf extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
	throws ServletException, IOException{
		try {
			request.setCharacterEncoding("ISO-2022-JP");
			response.setCharacterEncoding("ISO-2022-JP");
			response.setContentType("text/html;charset=ISO-2022-JP");
			PrintWriter out = response.getWriter();
			out.println("<html><body><form action=\"generatepdf\" method=\"post\"><input type=\"submit\"/><textarea name=\"dat\"></textarea></form></body></html>");
		} catch (Exception e) {
			throw new IllegalStateException(e);
		}
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
	throws ServletException, IOException{
		try {
			request.setCharacterEncoding("ISO-2022-JP");
			response.setCharacterEncoding("ISO-2022-JP");
			response.setContentType("text/html;charset=ISO-2022-JP");

			//PDF生成用データテキストの作成
			FileOutputStream fileOutputStream;
			OutputStreamWriter outputStreamWriter;
			BufferedWriter bufferedWriter;
			fileOutputStream = new FileOutputStream("data.txt");
			outputStreamWriter = new OutputStreamWriter(fileOutputStream,"Shift_JIS");
			bufferedWriter = new BufferedWriter(outputStreamWriter);
			bufferedWriter.write(request.getParameter("dat"));
			bufferedWriter.close();

			Process p;
			p = Runtime.getRuntime().exec("generatepdf.exe data.txt");
			p.waitFor();

			out.println("<html>");
			//省略
		} catch (Exception e) {
			throw new IllegalStateException(e);
		}

}

データの書き出しにFileWriterを使用すると文字コードが使用できないので、文字化けしちゃう場合はFileOutputStreamで文字コードを指定する。(何故かローカルのwindows環境では化けないのにサーバのwindows環境では化けてしまう・・ってことがあったので)

例では、postするformを自身で出力してるので、ISO-2022-JPで統一してるが、postするformを利用者側で生成されてる場合は注意が必要。例えばC/Sシステムでhtmlを動的に生成してる場合などはwindows環境ならShift_JISになるので、

request.setCharacterEncoding("Shift_JIS");

とする必要がある


文字コードが基本1つで、Servletいっぱいあって、毎回エンコするのが面倒な場合はフィルタを使う

package util;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class CharacterEncodingFilter implements Filter {

	private String encoding = null;
	
	public void destroy(){
		encoding = null;
	}
	
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,ServletException{
		if(encoding != null){
			request.setCharacterEncoding(encoding);
		}
		chain.doFilter(request,response);
	}

	public void init(FilterConfig filterConfig) throws ServletException{
		this.encoding = filterConfig.getInitParameter("encoding");
	}

}

web.xml

<filter>
	<filter-name>CharacterEncodingFilter</filter-name>
	<filter-class>util.CharacterEncodingFilter</filter-class>
	<init-param>
		<param-name>encoding</param-name>
		<param-value>ISO-2022-JP</param-value>
	</init-param>
</filter>
	
<filter-mapping>
	<filter-name>CharacterEncodingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

doltengでのs2dao使用手順メモ

DBビューワーよりdto,entityを自動生成
hogeテーブルのcodeにひもづくnameを取得するためjoin なselectが必要な場合は、

  • hogeDto[] = selectWithName()
  • selectWithNameを右クリックでsqlファイル作成
  • sqlファイル右クリックでhogeDto自動生成

単一テーブルの操作はentityを使用
テーブル+@を保持する場合は同dao+テーブル名Dto
主テーブルが不明確なロジック的daoはlogicロジック名Dao とかにする

jQueryちょいメモ

ちょいちょいメモしてこうかと

v1.6系の仕様変更がらみ

attr('tagName')は使用しないほうがいい
iframe内をまさぐる場合も要注意。iframeのloadイベントにて、iframe内のbodyを取得しようとしてもできないケースあり(IEのみだったかな??忘れた)
iframe.contents().find('body')[0].tagName

とか書くとこけるので以下のようにかく

iframe.contents().find('body').size() || iframe.contents().find('body')[0].tagName

bodyが取れない場合、size()は0になる

jQuery インスタンスかの判定

alert($('body') instanceof jQuery ) //true

ハッシュ#aaa参照

$('a')[0].hash