基本形
- 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>