JavaEE/Web

Last-modified: 2013-01-06 (日) 23:18:22

基本形

  • web.xmlは無くても良い。

Servlet

ここでは、

  • サーブレットで処理してJSPで表示する構成とする。
  • HTTP methodとしてはGETとPOSTを処理し、どちらも同一の処理をするものとする。
  • HTML、リクエストの文字コードはUTF-8
@WebServlet("/userList") // このサーブレットに割り当てるURLを指定。
public class UserList extends HttpServlet {
    private static final long serialVersionUID = 1L;
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGetOrPost(request, response);
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGetOrPost(request, response);
    }
    private void doGetOrPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // リクエストパラメータの文字コードを指定。
        // POSTでのパラメータのみに適用される。
        // GET(Query文字列)には適用されないので、自前で文字コード変換が必要?
        request.setCharacterEncoding("UTF-8");
        String action = request.getParameter("action"); // リクエストパラメータを取得
        User user = new User();
        user.setName("山田太郎");
        user.setRemark("備考です。");
        // JSPで参照する値をrequestに登録。
        request.setAttribute("user", user);
        // sessionに登録するなら以下のように
        // request.getSession().setAttribute("user", user);
        // JSPに引き継ぐ
        // /で始まるパスを指定すると、コンテキストルートを起点としたパスで指定したことになる。
        RequestDispatcher dispatcher = request.getRequestDispatcher("/userList/detail.jsp");
        dispatcher.forward(request, response);
    }
}

JSPのファイルの場所は、Eclipseの動的Webプロジェクトでは、WebContentの配下。
WebContentがコンテキストルートに対応する。

Eclipseプロジェクト/WebContent/userList/detail.jsp

<?xml version="1.0" encoding="UTF-8" ?>
<%-- @ page の contentTypeのcharsetの値が、responseの文字コードとして
    セットされる仕組みだったと思う。要確認。 --%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>  <%-- JSTLのcoreタグを使う場合に必要 --%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> <%-- JSTL のfunctionを使う場合に必要 --%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
  </head>
  <body>
    <%-- アプリ内のURLを出力するときは、
         1. サーバルートからの相対URLにすると都合がよい。
            すなわち、 /<コンテキストルート>/<コンテキストルートからの相対URL> の形式
         2. セッション管理について、Cookieが使えないブラウザを想定する場合は、
            URL rewritingによる管理が可能となるよう、encodeURLで処理したURLを使う。
     --%>
    <form action="<%= response.encodeURL(request.getContextPath() + "/userRegistration") %>" method="post">
      <input type="hidden" name="action" value="write"/>
      <table>
        <tr>
          <td>氏名</td>
          <%-- サーブレット側でsetAttributeした値を出力するには
               ${foo} のようにする。
               fooは、setAttributeしたときの名前。pageContext, request, sessionなど
               狭いスコープから探して先に見つかったものが利用される。
               サニタイズ(エスケープ)をしてから出力するには、
                 <c:out value="${foo}"/>
               または
                 ${fn:escapeXml(foo)}
               fooがオブジェクトのとき、プロパティへはfoo.propの形式でアクセスできる。
           --%>
          <td>${fn:escapeXml(user.name)}</td>
        </tr>
        <tr>
          <td>備考</td>
          <td><pre>${fn:escapeXml(user.remark)}</pre></td>
        </tr>
      </table>
      <button type="submit">登録</button>
    </form>
  </body>
</html>