Web フレームワークを作る!!  1日目

Posted 2011年8月20日 by

まずは、TOMCATScalaとの関係を築くことから。

Servletのソースコードです。

package ews
import org.apache.log4j.Logger
import javax.servlet._
import javax.servlet.http._
/**
 * The dynamic page is made by HttpServlet.
 */
class htmlSrv extends HttpServlet {
	lazy val logger = Logger.getLogger(classOf[ewsSrv])
	var context : ServletContext = null
	var htmlPath : String = null
	var message = "Not Found The requested URL was not found on this server."	// Not Found
	override def init(config : ServletConfig) : Unit = {
		super.init(config)
		context = config.getServletContext
		htmlPath = config.getInitParameter("html")	// WEB-INF/web.xml
	}
	override def doGet(request : HttpServletRequest, response : HttpServletResponse) : Unit = {
		gen(request, response)
	}
	override def doPost(request : HttpServletRequest, response : HttpServletResponse) : Unit = {
		gen(request, response)
	}
	// generate HTML
	def gen(request : HttpServletRequest, response : HttpServletResponse) : Unit = {
		logger.debug("htmlSrv ################# start")
		println("htmlSrv ################# start")
		var htmlFile = ""
		request.setCharacterEncoding("utf-8")
   		val url = request.getRequestURL
		val uri = request.getRequestURI
		var spth:String = request.getServletPath
		// Parametrical information is taken out of URL.
		spth = spth.replace("/","")
		val ur = uri.split("/")
		var fg = false
		ur.foreach({v =>
			if(fg){
				htmlFile += "/" + v
			}
			if(v.equals(spth))
				fg = true
		})
		logger.debug("uri="+uri+" htmlFile="+htmlFile)
		response.setContentType("text/html; charset=utf-8")
		var out = response.getWriter

		val ssp = new StraightSp(request, response, htmlPath + htmlFile)	// It outputs including reading a file.
//		val ssp = new XmlSp(request, response, htmlPath + htmlFile)			// HTMLファイルをXMLローダで読み込み、文字列変換して出力
//		val ssp = new HtmlparseSp(request, response, htmlPath + htmlFile)	// HTMLパーサーの解析結果を、文字列変換して出力
//		val ssp = new Ssp(request, response, htmlPath + htmlFile)			// SEEDOによるクラス生成し、その出力結果を置換して出力

   		val re = if(ssp.html != null){ssp.toString}else{message}
		out.println(re)	// output html data
		out.flush
		out.close
		logger.debug(" #### End")
		println(" #### End")
	}
}

このコードは、ScalaでServletを書いているので、TOMCATでも問題なく動きます。

これをTOMCATで動かすためには、

プロジェクトを作ります。

このあたりの手順はTOMCAT開発のページがいろいろあると思いますし、書店のコンピュータのコーナにも解説本があるでしょうし省略。

大事なことは、
WEB-INFフォルダにある、web.xml ファイルにServletの定義を追加します。
TOMCATを使ってStrutsした経験があればわかってもらえるでしょう。

		html
		ews.htmlSrv

html
C:\tomcat7_scala\webapps\toro\WEB-INF\html

		1

		html
		/html/*

Servletの名前は、とりあえず、html 。
クラスは先のプログラムの、ews.htmlSrv です。
初期化パラメータに、HTMLファイルを置くディレクトリを定義します。

TOMCATは、Version 7.0.19。
8月20日現在は、Version 7.0.20がリリースされていますが、
それでも動くでしょう。
忘れてならない Scala 2.9.0

JDKは、JAVA SE7。 JAVA SE6でも問題なし。
WEB-INFディレクトリの下にlibディレクトリを作成して、ここに置く必要なJarファイルは、

  • log4j-1.2.15.jar
  • scala-library.jar

web.xmlファイルの定義に戻って、

Servletマッピングは、/html/* です。
この * には大いに意味ありです。

というのは、新しいページを追加するたびに、web.xml ファイルにServletの定義を追加したくないから。

ソースコードの中の、
request.getServletPath によって返ってくるパスをパラメータとして使おうという作戦です。

URLが

http://www.ewavesolutions.com/hoge/html/abc/index.html

なら、/abc/index.html はServletの引数になります。

URLだけ見ると、静的なHTMLファイルで構成するURLの見えてしまいます。

http://www.ewavesolutions.com/hoge/html/abc/index.html?xyz=123456789&id=KABA

としてURLを作ってもOKです。
Scalaプログラムの中は、

Servletの初期化処理は、

override def init(config : ServletConfig)
ここでは、web.xml で定義した init-param の、html の値を読み出します。
HTMLファイルが置かれるパスです。

doGet関数 と doPost関数は、おなじみの関数。

HTMLコンテンツを生成する gen関数を定義します。
この中では、

val ssp という変数に、Servletのリクエストとレスポンス、HTMLファイルのあるフルパスを引数にしてたクラスを定義します。

このクラスをNewして、

  1. ssp.html関数を呼び出してHTMLファイルを読み出し
  2. ssp.toString関数で、String化します。
  3. それを、 response.getWriter関数で出力すればレスポンスの出来上がり。

クラスの仕様はこんな感じ

package ews

trait TemplSp {
  def html : String
  override def toString :String
}

最後に、テスト用に org.apache.log4j.Logger でログ出力するようにします。

Post Details

  • Post Title: Web フレームワークを作る!!  1日目
  • Author: admin
  • Filed As: Framework, Scala
  • Tags:
  • You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

コメントを残す