gikoha’s blog

個人的メモがわり

JSP & Servlet


いよいよJSP & ServletHibernate ORMを結合するときがきました
動的Webプロジェクト"dynWeb"を作り、Servletを追加
ライブラリとソースの配置は→のようにする
META-INF/MANIFEST.MF

Manifest-Version: 1.0
Class-Path: ../lib

WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
 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>dynWeb</display-name>
  <servlet>
  	<servlet-name>SendServlet</servlet-name>
  	<servlet-class>SendServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>SendServlet</servlet-name>
  	<url-pattern>/servlet/SendServlet</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>request.jsp</welcome-file>
  </welcome-file-list>
</web-app>

request.jsp

<%@ page contentType="text/html; charset=utf8" %>
<%@page import="java.util.*"%>

<html>
<body>
<h2>データベース検索</h2>
<form action="/dynWeb/servlet/SendServlet"  method="POST">
日付 <input type="text" name="date" 
value="<%=request.getAttribute("date")%>">
<input type="submit" name="command" value="送信">
</form>

<table border="1">
<%
	Iterator i = (Iterator) request.getAttribute("ite");
	if (i != null)
	{
		while (i.hasNext())
		{
			Map m = (Map) i.next();
%>
<tr><td bgcolor="#e0e0ff"><%=m.get("id")%></td>
<td><%=m.get("name")%></td>
<td><%=m.get("date")%></td></tr>

<%
		}
	}
%>
</table>

</body>
</html>

SendServlet.java

import gikoha.util.HibernateUtil;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.*;
import javax.servlet.http.*;

import org.hibernate.Session;
import org.hibernate.Transaction;
import gikoha.util.HibernateUtil;
import hib.Tcholdata;
import hib.TcholdataId;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

/**
 * Servlet implementation class SendServlet
 */
public class SendServlet extends HttpServlet
{
	private static final long serialVersionUID = 1L;

	protected void processRequest(HttpServletRequest request,
			HttpServletResponse response) throws ServletException,
			java.io.IOException
	{
		request.setCharacterEncoding("utf8");
		HttpSession httpsession = request.getSession();
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction transaction = null;
		ServletContext application = getServletContext();

		String date = (String) httpsession.getAttribute("date");
		if (date == null)
			date = "";

		List patients = (List) application.getAttribute("patients");

		// patientsがすでに定義されていた場合でもそれを破棄してしまいます

		patients = new ArrayList();
		application.setAttribute("patients", patients);

		if ("送信".equals(request.getParameter("command")))
		{
			date = (String) request.getParameter("date");
			httpsession.setAttribute("date", date);
			transaction = session.beginTransaction();
			List list = session.createCriteria(Tcholdata.class)
					.add(Restrictions.eq("id.date", date)).list();
			for (Iterator iterator = list.iterator(); iterator.hasNext();)
			{
				Tcholdata idcard = (Tcholdata) iterator.next();
				TcholdataId person = idcard.getId();
				Map m = new HashMap();
				m.put("id", person.getId());
				m.put("name", person.getName());
				m.put("date", person.getDate());

				patients.add(m);
			}
		}
		session.close();

		Iterator i = patients.iterator();

		request.setAttribute("date", date);
		request.setAttribute("ite", i);
		RequestDispatcher rd = request.getRequestDispatcher("/request.jsp");
		rd.forward(request, response);
	}

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException
	{
		processRequest(request, response);
	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException
	{
		processRequest(request, response);
	}

	/**
	 * Default constructor.
	 */
	public SendServlet()
	{
		// TODO Auto-generated constructor stub
	}

}

HibernateUtil.java

package gikoha.util;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil
{

	private static final SessionFactory sessionFactory;

	static
	{
		try
		{
			sessionFactory = new Configuration().configure()
			.buildSessionFactory();
		}
		catch (Throwable ex)
		{
			System.err.println("Initial SessionFactory creation failed." + ex);

			throw new ExceptionInInitializerError(ex);
		}
	}

	public static SessionFactory getSessionFactory()
	{
		return sessionFactory;
	}
}


/usr/local/tomcat/webapps/dynWeb.warに エクスポートしてから web browserからhttp://localhost:8080/dynWeb/request.jspにアクセスすると、日付入力を求められ、送信クリックで無事データが表示されました
ついでにApache2ともajpで連携をとってサーバーでの立ち上げに成功。