Hibernate による O/R マッピング(その 5)
いよいよ Controller の作成です。
package jp.mydns.akanekodou; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.annotation.WebServlet; import java.util.List; import jp.mydns.akanekodou.dao.CustomerDAO; import jp.mydns.akanekodou.model.Customer; @WebServlet("/customer/list") public class CustomerListServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { List<Customer> list = new CustomerDAO().all(); request.setAttribute("items", list); request .getRequestDispatcher("list.jsp") .forward(request, response); } }
WebServlet
アノテーションが Servlet 3.0 からの新機能の一つです。従来は web.xml に記述する必要がありましたが、Servlet 3.0 からはこのアノテーションを付けるだけで良くなりました。引数の文字列は、特に明記しなければ URL パターンと解釈されますので、この servlet は /customer/list という URL でアクセスすることができます。request.getRequestDispatcher
については前に少し書きましたが、dispatch 先を相対パスで指定できます。他の servlet も作っていきましょう。
package jp.mydns.akanekodou; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.annotation.WebServlet; import jp.mydns.akanekodou.dao.CustomerDAO; import jp.mydns.akanekodou.model.Customer; @WebServlet("/customer/search") public class CustomerSearchServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { request .getRequestDispatcher("search.jsp") .forward(request, response); } protected void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { int id = Integer.parseInt(request.getParameter("id")); Customer cust = new CustomerDAO().find(id); request.setAttribute("item", cust); doGet(request, response); } }
package jp.mydns.akanekodou; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.annotation.WebServlet; import java.util.List; import jp.mydns.akanekodou.model.Product; import jp.mydns.akanekodou.dao.ProductDAO; @WebServlet("/product/search") public class ProductSearchServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { request .getRequestDispatcher("search.jsp") .forward(request, response); } protected void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { String keyword = request.getParameter("keyword"); List<Product> list = new ProductDAO().like(keyword); request.setAttribute("items", list); doGet(request, response); } }
最後にお約束の web.xml を。
<?xml version="1.0"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>HibernateSample</display-name> <filter> <filter-name>EncodingFilter</filter-name> <filter-class>jp.mydns.akanekodou.filter.EncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> <init-param> <param-name>language</param-name> <param-value>ja</param-value> </init-param> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
フィルターにも WebFilter
というアノテーションが用意されているのですが、初期化パラメータをプログラム本体に書かずに外部から与えたいので敢えて使っていません。従前のものをそのまま流用しています。