まずは、TOMCATとScalaとの関係を築くことから。
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して、
- ssp.html関数を呼び出してHTMLファイルを読み出し
- ssp.toString関数で、String化します。
- それを、 response.getWriter関数で出力すればレスポンスの出来上がり。
クラスの仕様はこんな感じ
package ews trait TemplSp { def html : String override def toString :String }
最後に、テスト用に org.apache.log4j.Logger でログ出力するようにします。
コメントを残す
コメントを投稿するにはログインしてください。