【コラム】

ライトニングJava

62 Servletプログラミング(2) - GET/POST、日本語の扱いについて

後藤大地  [2006/09/11]

GETを処理

もっとも簡単にパラメータを渡す方法はGETを使う方法だ。URLに?からはじまる文字列が付随することがあるが、これがGETでパラメータとして処理される。

リスト1.1はGETで渡されてくるパラメータをHTMLに加工して出力するServletだ。HttpServletRequest#getParameterNames()でパラメータ一覧が取得できるから、ここから値一覧を取り出して、HttpServletRequest#getParameter(String)を使ってひとつひとつ値を取り出している。パラメータはHttpServletRequestから取得できると覚えておこう。

リスト1.1 ParamsServlet.java - GETで渡されるパラメータを表示するサーブレット

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ParamsServlet extends HttpServlet 
{
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
        throws IOException, ServletException 
    {
        // UTF-8で入力を受付
        request.setCharacterEncoding("UTF-8");

        // パラメータを取り出す
        Enumeration<String> params = request.getParameterNames();

        // パラメータをHTMLで出力する形式へ加工
        StringBuffer buffer = new StringBuffer();
        while (params.hasMoreElements()) {
            String param_name = params.nextElement();
            buffer.append("<p>");
            buffer.append(param_name);
            buffer.append(": ");
            buffer.append(request.getParameter(param_name));
            buffer.append("</p>");
        }

        // HTML文書を出力
        response.setContentType("text/html; charset=UTF-8");

        PrintWriter out = response.getWriter();
        out.println("<html><head><title>Parameters Print Out</title></head><body>");
        out.println(buffer);
        out.println("</body></html>");
    }
}

リスト1.2 WEB-INF/web.xml デプロイメントディスクリプタ

<?xml version="1.0" encoding="UTF-8"?>

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

  <servlet>
    <servlet-name>ParamsServlet</servlet-name>
    <servlet-class>ParamsServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>ParamsServlet</servlet-name>
    <url-pattern>/Params</url-pattern>
  </servlet-mapping>
</web-app>

実行例が図1.3と図1.4だ。パラメータを何も渡さなければ、図1.3のように何も表示されない。「http://localhost:8080/paramtest/Params?id=510&name=dai&num=10」のように「idとして510」「nameとしてdai」「numとして10」を指定して呼び出した場合、図1.4のようにパラメータの内容が表示される。

図1.3 引数を何も指定しないと何も表示されない

図1.4 URLにパラメータを指定する方法(GET)で値を渡すと、渡した引数が表示される

実際のServletプログラミングでは、取り出したパラメータに応じて処理を実施したり、セッションインスタンスにパラメータの値を保存して次のServletに処理を託すといったことを実施する。

POSTを処理

次はPOSTを処理する方法を紹介する。まず、POSTでパラメータを送信するためのHTML文書を作成する。たとえばリスト2.1のように作成すればいいだろう。form要素の属性methodの値が「POST」になっている点に注意してほしい。ここをGETにするとGETで送信が試みられる。action属性で処理するServletを指定しておく。

リスト2.1 form.html - テキストフィールド、テキストエリアに入力された値をPOSTでサーブレットに送信するHTML

<html>
 <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>Form Input</title>
 </head>
<body>
<form method="POST" action="../Params">
 <p>タイトル <input type="text" name="title" size="60"></p>
 <p><textarea cols="50" rows="5" name="message"></textarea></p>

 <p><input type="submit" value="送信">
 <input type="reset" value="リセット"></p>
</form>
</body>
</html>

作成したHTML文書だが、たとえば図2.2のようにデプロイすればいい。WEB-INF以下はデプロイ方法が定まっているため、通常はWEB-INF以外のディレクトリにHTML文書やリソースをデプロイする。たとえば図2.2の場合、WEB-INFと同じレベルにhtmlというディレクトリを作成し、そこにHTML文書をデプロイしている。

2.2 HTML文書などはたとえばWEB-INFと同じレベルにディレクトリを作成してそちらにデプロイする

Servletにおける処理は基本的にGETの場合と同じになる。このため、リスト1.1にリスト2.3のメソッドを追加しておく。これでPOSTでやってくる処理内容はすべてdoGet(ttpServletRequest, HttpServletResponse)で処理されるようになる。

リスト2.3 POSTの処理をそのままGETに託す

    public void doPost(HttpServletRequest request,
                      HttpServletResponse response)
        throws IOException, ServletException 
    {
        // ここでは処理したい内容が同じであるため、フォームなどから
        // POSTメソッドできた場合、処理をdoGetに飛ばす
        doGet(request, response);
    }

実行例は図2.4と図2.5の通り。POSTでパラメータを渡した場合も、GETと同じように処理できることがわかる。

図2.4 HTMLからPOSTでサーブレットに処理を渡す

図2.5 POSTで渡したパラメータも同様に処理される

GETとPOSTの使い分け

Servlet APIの観点からすると、GETでやってくる処理もPOSTでやってくる処理も、かわりがない。しかし、使い分けるためのいくつかの指針はある。GETは基本的に1回の送信で結果を得るために使うことが多く、パラメータとして指定できる値には長さに上限がある。一方、POSTはデータを送信する目的が強く、比較的長いデータを送信する場合に適している。こうした性格による適材適所というのはあるだろう。

日本語処理

Servletでパラメータを渡す場合に問題になるのが、日本語の符号化形式についてだ。ここではフォーム入力を実施するHTML、Servletでパラメータを受ける場合、Servletから出力するHTML、のすべてにおいてUTF-8を指定している。基本的に、すべてにおいて適切にエンコーディングを指定しておくこと、これを守るようにしたい。

リスト4.1 フォーム入力を実施するHTMLでエンコーディング形式を指定

  <meta http-equiv="content-type" content="text/html; charset=UTF-8">

リスト4.2 HttpServletRequestにおいて入力されるデータのエンコーディング形式を指定

        request.setCharacterEncoding("UTF-8");

リスト4.3 HttpServletResponseにおいて出力するテキストのエンコーディング形式を指定

        response.setContentType("text/html; charset=UTF-8");

特にリスト4.2のようにHttpServletRequestにおいてエンコーディング形式を指定することを忘れないようにしたい。でないと、思っているように値が処理されないことがある。

特殊文字など、エンコーディング変換が実施されると好ましくない場合など、処理する必要があるエンコーディングですべて統一しておくといった方法が無難だ。

提供:毎日就職ナビ

会員登録はこちら

学生のための就職情報サイト「毎日就職ナビ」。4,000社以上の新卒採用情報が常時掲載され、社内の雰囲気が伝わる情報画面、さまざまな項目での会社検索、エントリーや説明会検索など、機能も充実。無料適職診断、就活Q & A、エントリーシート添削講座など、就職活動に役立つ記事も満載です。研究者、エンジニアを目指す学生の方々も是非エントリーしてください。お待ちしています!

毎日コミュニケーションズ 就職情報事業本部はプライバシーマークを取得しています。

    新着記事

    特設サイトの情報

    人気記事

    一覧

    イチオシ記事

    新着記事

    特別企画

    一覧