
JSP MVCモデルを使った模擬アプリ課題
以下に、Servlet、JSP、JDBC、フロントコントローラーパターンを活用した3つの課題を提案します。 課題1: 簡易タスク管理アプリケーション 要件 模範 […]
Servletは、JavaでWebアプリケーションを開発するためのコンポーネントです。クライアントからのリクエストを受け取り、動的なコンテンツを生成してレスポンスとして返します。サーバーサイドで動作し、HTTPプロトコルを扱うためのHttpServletクラスが一般的に使用されます。
1. init(): Servletが初期化されるときに1回だけ呼ばれる
2. service(): クライアントリクエストごとに呼ばれる(通常は直接扱わず、doGet/doPostを使用)
3. destroy(): Servletが破棄されるときに呼ばれる
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.example.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/myservlet</url-pattern>
</servlet-mapping>
@WebServlet("/myservlet")
public class MyServlet extends HttpServlet {
// Servlet実装
}
doGet(): HTTP GETリクエストを処理。URLにパラメータが表示され、キャッシュ可能
doPost(): HTTP POSTリクエストを処理。リクエストボディにパラメータを含み、キャッシュ不可
String value = request.getParameter("paramName");
response.setContentType("text/plain");
PrintWriter out = response.getWriter();
out.print("Hello World");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("");
out.println("Hello Servlet
");
out.println("");
Servletコンテナ(Webコンテナ)はServletを管理・実行する環境です。リクエストの受け付け、Servletのライフサイクル管理、スレッド管理などを行います。TomcatやJettyが代表的な実装です。
クライアントがフォームを表示(通常はGETリクエスト)
ユーザーがフォーム入力して送信(POSTリクエスト)
ServletがdoPost()でフォームデータを処理 4. 処理結果をレスポンスとして返す
@WebServlet("/form")
public class FormServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<form method='post'>");
out.println("Name: <input type='text' name='name'><br>");
out.println("<input type='submit'>");
out.println("</form>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("Hello, " + name);
}
}
@WebServlet("/headers")
public class HeaderServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
out.println(name + ": " + request.getHeader(name) + "<br>");
}
}
}
// キャッシュ無効化
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setHeader("Expires", "0");
// カスタムヘッダー
response.setHeader("X-Custom-Header", "MyValue");
// Servletに転送
RequestDispatcher dispatcher = request.getRequestDispatcher("/otherServlet");
dispatcher.forward(request, response);
// JSPに転送
RequestDispatcher dispatcher = request.getRequestDispatcher("/page.jsp");
dispatcher.forward(request, response);
String type = request.getParameter("type");
if ("xml".equals(type)) {
response.setContentType("application/xml");
// XML生成
} else if ("json".equals(type)) {
response.setContentType("application/json");
// JSON生成
} else {
response.setContentType("text/plain");
// テキスト生成
}
@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Part filePart = request.getPart("file");
InputStream fileContent = filePart.getInputStream();
// ファイル処理...
}
}
アプリケーション全体で共有するデータの格納: getServletContext().setAttribute("key", object);
初期化パラメータの取得: getServletContext().getInitParameter("paramName");
リソースへのアクセス: getServletContext().getResourceAsStream("/WEB-INF/config.xml");
if (request.getParameter("paramName") != null) { // パラメータが存在する場合の処理 }
String value = request.getParameter("paramName");
if (value == null || value.trim().isEmpty()) {
// デフォルト値設定またはエラー処理 value = "default";
}
// リクエストのエンコーディング設定
request.setCharacterEncoding("UTF-8");
// レスポンスのエンコーディング設定
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
// リダイレクト (クライアント側で新しいリクエスト)
response.sendRedirect("/newLocation");
// フォワード (サーバー側で処理を転送)
request.getRequestDispatcher("/newLocation").forward(request, response);
// 違い:
// - リダイレクトはURLが変わり、新しいリクエストが発生
// - フォワードはURLが変わらず、サーバー内部で処理
// 方法1: sendErrorを使用
response.sendError(HttpServletResponse.SC_NOT_FOUND, "Page not found");
// 方法2: 例外をスロー
throw new ServletException("Error message");
// web.xmlでエラーページを設定可能
<!-- web.xml -->
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.example.MyServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>value</param-value>
</init-param>
</servlet>
// Servlet内で初期化パラメータを取得
String configValue = getServletConfig().getInitParameter("config");
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response); // doPostに処理を委譲
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 共通処理
}
@WebServlet(urlPatterns = "/async", asyncSupported = true)
public class AsyncServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
AsyncContext asyncContext = request.startAsync();
asyncContext.start(() -> {
try {
// 長時間実行処理
Thread.sleep(3000);
ServletResponse res = asyncContext.getResponse();
res.getWriter().write("Async response");
} catch (Exception e) {
e.printStackTrace();
} finally {
asyncContext.complete();
}
});
}
}
@WebServlet("/data")
public class JsonServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Map<String, String> data = new HashMap<>();
data.put("name", "John");
data.put("age", "30");
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
// Jacksonライブラリ使用例
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(response.getWriter(), data);
}
}
@WebServlet("/dynamic")
public class DynamicContentServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String acceptHeader = request.getHeader("Accept");
if (acceptHeader.contains("application/json")) {
response.setContentType("application/json"); // JSON生成
} else if (acceptHeader.contains("application/xml")) {
response.setContentType("application/xml"); // XML生成
} else {
response.setContentType("text/plain"); // テキスト生成
}
}
}
public class CustomRequestWrapper extends HttpServletRequestWrapper {
public CustomRequestWrapper(HttpServletRequest request) {
super(request);
}
@Override
public String getParameter(String name) {
String value = super.getParameter(name);
return value != null ? value.toUpperCase() : null;
}
}
@WebServlet("/wrapped")
public class WrappingServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
CustomRequestWrapper wrappedRequest = new CustomRequestWrapper(request);
String param = wrappedRequest.getParameter("test"); // 大文字変換される
response.getWriter().write(param);
}
}
@WebServlet("/validate")
public class ValidationServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
String ageStr = request.getParameter("age");
List errors = new ArrayList<>();
if (name == null || name.trim().isEmpty()) {
errors.add("Name is required");
}
int age = 0;
try {
age = Integer.parseInt(ageStr);
if (age < 18 || age > 120) {
errors.add("Age must be between 18 and 120");
}
} catch (NumberFormatException e) {
errors.add("Age must be a number");
}
if (errors.isEmpty()) {
// 正常処理
response.getWriter().write("Valid data: " + name + ", " + age);
} else {
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
response.getWriter().write(String.join(", ", errors));
}
}
}
@WebServlet("/api/users/*")
public class UserApiServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// GET /api/users - ユーザー一覧取得
// GET /api/users/123 - ID123のユーザー取得
response.setContentType("application/json");
// 実装...
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// POST /api/users - 新規ユーザー作成
response.setContentType("application/json");
// 実装...
}
protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// PUT /api/users/123 - ID123のユーザー更新
response.setContentType("application/json");
// 実装...
}
protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// DELETE /api/users/123 - ID123のユーザー削除
response.setContentType("application/json");
// 実装...
}
}