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 にデプロイした際に起きた問題メモ
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>
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>
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になる
ハッシュ#aaa参照
$('a')[0].hash