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