2009年12月6日日曜日

コンテナ管理トランザクションであそぶ - (7/10) -

検証用Webアプリを作成する

サーブレットとviewページを作成します。

Client.java
package com.mydomain.ejb;

import java.io.IOException;
import java.util.*;
import java.util.regex.Pattern;
import javax.ejb.EJB;
import javax.servlet.*;
import javax.servlet.http.*;

public class Client extends HttpServlet
{
    @EJB
    private Action action;
    
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException
    {
        HttpSession session = req.getSession();
        try
        {
            this.action.delete();
            String strRollback = req.getParameterMap().containsKey("rollback")
                ? req.getParameter("rollback").toString() : "0";
            int rollback = Pattern.matches("[^0-9]", strRollback)
                ? 0 : Integer.parseInt(strRollback);
            try
            {
                this.action.regist(session.getId(), rollback);
            }
            catch(Exception exp){}
            req.setAttribute("messages", this.action.getMessages());
            this.setMethodList(req, rollback);
        }
        catch(Exception ex)
        {
            session.invalidate();
            ex.printStackTrace();
            System.out.println("webclient servlet test failed");
            throw new ServletException(ex);
        }
    }
    
    protected void setMethodList(HttpServletRequest req, int rollback)
    {
        PageData pageData = new PageData();
        List<Map<String,String>> methodList = pageData.getMethodList();
        req.setAttribute("methodList", methodList);

        List<String> rollbacks = new ArrayList<String>();
        for(int ct=0; ct<methodList.size(); ct++)
        {
            rollbacks.add((rollback == ct) ? "checked" : "");
        }
        req.setAttribute("rollbacks", rollbacks);
    }
}
PageData.java
package com.mydomain.ejb;

import java.io.Serializable;
import java.util.*;

public class PageData implements Serializable
{
    private static final long serialVersionUID = 1L;

    public PageData(){}
    
    public List<Map<String,String>> getMethodList()
    {
        List<Map<String,String>> methods = new ArrayList<Map<String,String>>();
        String spc = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
        String pls = spc + spc + spc + "+";

        this.addMethodRow(methods, "", "");
        this.addMethodRow(methods, "+->regist( )", pls);
        this.addMethodRow(methods, spc + "+->decorateInsert( )", pls);
        this.addMethodRow(methods, spc + "+->insert( )", pls);
        this.addMethodRow(methods, spc + "&nbsp;&nbsp;&nbsp;+->decorateInsert( )", pls);
        this.addMethodRow(methods, spc + "+--------------------------", "--->decorateInsert( )");
        this.addMethodRow(methods, spc + "+--------------------------", "--->insert( )");
        this.addMethodRow(methods, "", spc + "&nbsp;&nbsp;&nbsp;+->decorateInsert( )");
        this.addMethodRow(methods, spc + "+--------------------------", "--->requiresNewInsert( )");
        this.addMethodRow(methods, "", spc + "&nbsp;&nbsp;&nbsp;+->insert( )");
        this.addMethodRow(methods, "", spc + spc + "+->decorateInsert( )");
        
        return methods;
    }

    protected void addMethodRow(List<Map<String,String>> methods, String act, String sub)
    {
        Map<String,String> row = new HashMap<String,String>();
        row.put("act", act);
        row.put("sub", sub);
        row.put("rollback", Integer.toString(methods.size()));
        methods.add(row);
    }
}
index.jsp
<%@ page language="java" pageEncoding="UTF-8" %>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page import="java.util.*,com.mydomain.ejb.*" %>
<jsp:include page="/servlet" />
<%
List<String> rollbacks = (List<String>)request.getAttribute("rollbacks");
List<Map<String,String>> methodList 
  = (List<Map<String,String>>)request.getAttribute("methodList"); 
%>
<html>
  <head>
    <title>Access Log</title>
    <style type="text/css">
      table.list, table  {font-size: 9pt;}
      table.list th {background:#FFCC66;}
      table.list td {background:#FFFFCC}
    </style>
  </head>
  <body>
    <form method="post">
      <table>
        <tr>
          <td>
            <table style="border: solid 1px;">
              <tr>
                <th>No.</th>
                <th></th>
                <th align="left" style="text-decoration: underline;">ActionImpl</th>
                <th style="text-decoration: underline;">SubActionImpl</th>
              </tr>
              <% for(int ct=1; ct<rollbacks.size(); ct++){ %>
              <tr>
                <td><%= ct %></td>
                <td align="right">
                  Rollback
                  <input type="radio" name="rollback" value="<%= ct %>" <%= rollbacks.get(ct) %>>
                </td>
                <td><%= methodList.get(ct).get("act") %></td>
                <td><%= methodList.get(ct).get("sub") %></td>
              </tr>
              <% } %>
              <tr>
                <td></td>
                <td align="right">
                  Commit
                  <input type="radio" name="rollback" value="0"  <%= rollbacks.get(0) %>>
                </td>
                <td colspan="3"></td>
              </tr>
            </table>
            <input type="submit" value="access">
          </td>
        </tr>
        <tr>
          <td>
            <table class="list">
              <tr>
                <th>No.</th>
                <th>Session ID<br /></th>
                <th>Class:Method</th>
              </tr>
              <% for(Message row : (List<Message>)request.getAttribute("messages")){ %>
              <tr>
                <td><%= row.getNo() %></td>
                <td><%= row.getText() %></td>
                <td><%= row.getBiko() %></td>
              </tr>
              <% } %>
            </table>
          </td>
        </tr>
      </table>
    </form>
  </body>
</html>


web.xmlファイルを作成します。

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
  xmlns="http://java.sun.com/xml/ns/javaee" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
                      http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>  
  <servlet>
    <servlet-name>Servlet</servlet-name>
    <servlet-class>com.mydomain.ejb.Client</servlet-class>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Servlet</servlet-name>
    <url-pattern>/servlet</url-pattern>
  </servlet-mapping>
</web-app>
サーブレットで@EJBアノテーションを使用するためServlet2.5のスキーマを宣言します。