Hello World(ウェブアプリケーション)
Hello World(ウェブアプリケーション)のソースを実行結果を以下に示す。
index.html
<HTML>
<head><title>hello</title></head>
<BODY>
<h4>hello</h4>
<span id="message">message</span><br/>
日本語が表示されるかのテスト。
</BODY>
</HTML>
HelloComponent.java
package woolpack.samples.hello;
import java.util.Date;
public class HelloComponent {
  public String getMessage(){
    return "hello " + new Date();
  }
}
HelloServlet.java
package woolpack.samples.hello;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import woolpack.action.ActionDef;
import woolpack.action.ActionInvoker;
import woolpack.action.ForwardDef;
import woolpack.container.ComponentDef;
import woolpack.container.ComponentScope;
import woolpack.container.ScopeContainer;
import woolpack.dom.DelegateDomExpression;
import woolpack.dom.DomContext;
import woolpack.dom.DomExpression;
import woolpack.dom.DumpIfCatch;
import woolpack.dom.FormatId;
import woolpack.dom.ResetId;
import woolpack.dom.Serial;
import woolpack.dom.XmlToNode;
import woolpack.ee.ActionBuilder;
import woolpack.ee.HttpSessionMap;
import woolpack.ee.ServletContextMap;
import woolpack.ee.ServletInputStreamFactory;
import woolpack.ee.ServletRequestAttributeMap;
import woolpack.el.ELConstants;
import woolpack.el.PathEL;
import woolpack.html.HtmlConstants;
import woolpack.samples.ActionDefMaker;
import woolpack.text.RegExpFormat;
import woolpack.utils.InputStreamReaderFactory;
import woolpack.utils.UtilsConstants;

/**
* Hello World Web アプリケーション。
* @author nakamura
*
*/
public class HelloServlet extends HttpServlet {

  /**
   *
   */
  private static final long serialVersionUID = 1L;

  public final Map<String,ComponentDef> componentDefMap;
  public final DelegateDomExpression toNode;
  public final DomExpression domExpression;
  
  public HelloServlet(){
    // コンテナの定義。
    componentDefMap = new HashMap<String,ComponentDef>();
    componentDefMap.put("helloComponent", new ComponentDef(ComponentScope.REQUEST){
      @Override
      protected Object newInstance() {
        return new HelloComponent();
      }
    });

    // アクションの定義
    final ActionDefMaker maker = new ActionDefMaker();
    maker.put("index", new ActionDef(ELConstants.NULL, new ForwardDef("index", new PathEL("container.helloComponent"))));
    final ActionBuilder actionBuilder = new ActionBuilder(new ActionInvoker(maker.get()), Arrays.asList("name", "id"));
    
    // サーブレットを使用せずにテストを可能にするため、 HTML ファイルを読む込む定義を後で設定するための定義。
    toNode = new DelegateDomExpression();

    // コンストラクタツリー
    domExpression = new DumpIfCatch(new Serial(
        // id から無駄な情報を削除する。
        new FormatId(new RegExpFormat("^.*/([^/]+)$", "$1")),
        // Model を呼び出す。
        actionBuilder.getActionExpression(),
        // HTML ファイルを読み込む。
        toNode,
        HtmlConstants.NORMALIZE_CASE,
        // Modelの出力を HTML に流し込む。
        actionBuilder.getAutoUpdateExpression()
    ));
  }


  @Override public void init(final ServletConfig servletConfig) throws ServletException {
    super.init(servletConfig);
    
    // サーブレットのリソースから HTML ファイルを読み込む定義。
    toNode.setExpression(new ResetId(new Serial(
        new FormatId(new RegExpFormat("^(.*)$", "/html/sample/hello/$1.html")),
        new XmlToNode(new InputStreamReaderFactory(new ServletInputStreamFactory(
            servletConfig.getServletContext()), "UTF-8")))));
  }

  @Override protected void service(
      final HttpServletRequest request,
      final HttpServletResponse response)
  throws ServletException, IOException{
    // リクエストごとに Context 役を生成する。
    final DomContext domContext = new DomContext();
    
    // URI を id として Context 役に設定する。
    domContext.setId(request.getRequestURI());

    // 入力値を Context 役に設定する。
    domContext.setInput(request.getParameterMap());
    
    // 各スコープを Context 役に設定する。
    domContext.setRequest(new ServletRequestAttributeMap(request));
    domContext.setSession(UtilsConstants.concurrentMap(new HttpSessionMap(
        request.getSession()), request.getSession()));
    domContext.setApplication(UtilsConstants.concurrentMap(new ServletContextMap(
        request.getSession().getServletContext()), request.getSession().getServletContext()));
    
    // コンテナを Context役に設定する。好みのコンテナで置き換えることができる。
    domContext.setContainer(new ScopeContainer(domContext.getRequest(), domContext.getSession(),
        domContext.getApplication(), componentDefMap));
    
    // Context 役を Expression 役に作用させる。
    domExpression.interpret(domContext);
    
    // HTMLを出力する。
    final Writer w = new BufferedWriter(new OutputStreamWriter(response.getOutputStream(), "UTF-8"));
    try{
      UtilsConstants.TRANSFORMER_FACTORY.newInstance().transform(
          new DOMSource(domContext.getNode()),
          new StreamResult(w)
      );
    }finally{
      w.close();
    }
  }
}
web.xml
<?xml version="1.0"?>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>woolpack.samples.hello.HelloServlet</servlet-class>
    <load-on-startup>10</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello/*</url-pattern>
  </servlet-mapping>
</web-app>
実行結果
<HTML>

<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>hello</TITLE>
</HEAD>

<BODY>

<H4>hello</H4>

<SPAN id="message">hello Mon Jul 17 18:23:32 JST 2006</SPAN>
<BR>
日本語が表示されるかのテスト。
</BODY>

</HTML>
トップに戻る
Copyright (C) 2006 Takahiro Nakamura. All rights reserved.