|
|
連載
ASP→ASP.NET移行テクニック
第1回 ASP.NET移行へのプロローグ
山田 祥寛
2004/04/21 |
 |
|
○ページ内で使用できる言語は1つ
レガシーASPでは、1つの「.asp」ファイルの中で複数のスクリプト言語を混在させることが可能であった。例えば、レガシーASPにおいては、以下のような記述をしてもエラーにはならない。Languageディレクティブで指定された以外の言語を使用する場合には、<script>ブロックで使用する言語を明示的に宣言すればよかったのだ。
<%@ Language="VBScript" %>
<% Response.Write("VBScript<br />") %>
<script language="JScript" runat="Server">
Response.Write("JScript<br />");
</script> |
|
レガシーASPにおける複数言語の混在利用 |
一見無意味にも思えるこの仕様も、スクリプト言語の間に機能上の差異があった当初は有効なものであった。例えば、VBScriptが正規表現機能をサポートしたのはScript Engine 5.0からであるが、JScriptは3.0からサポートしている。そこで、通常はVBScriptを使用しているが、正規表現を利用する局面でのみJScriptを使用するという選択肢もあったわけだ。
しかし、言語のバージョン・アップが重ねられるに従い、言語間の機能差がほとんどなくなった昨今では、レガシーASPでも言語を混在させる意味はなくなった。そもそも、1つのページを処理するために、複数のスクリプト・エンジンを繰り返し切り替えなければならないのは、処理上のオーバーヘッドを考えてみても決して好ましいことではない。
そこで、ASP.NETでは1つの「.aspx」ファイル内で複数の言語は混在できないように改められた。CLS(Common Language Specification:共通言語仕様)によって、言語間の差異がほとんどなくなった.NET環境において、この変更は当然ともいえる。また、レガシーASPからASP.NETへの移行に際しても、恐らくこの変更が与える影響はほとんど皆無だろう(少なくとも筆者は実稼働のASPアプリケーションで、ページ内に複数言語が混在しているものを見たことがない)。
なお、この制限はあくまで1つのWebフォーム内においてのみの制限で、アプリケーション内で複数の言語が混在するのは(混在の是非はさておくとして)何ら問題ない。また、ASP.NETのユーザー・コントロールやカスタム・コントロールで使用する言語も、呼び出し元のWebフォームで使用している言語と異なっていても構わない。よって、万が一、複数言語を使用したページを移行しなければならない場合にも、異なる言語を使用したコード・ブロックをユーザー・コントロール化することで、比較的簡単に移行することができるだろう。例えば、上記の例をASP.NETに移行したい場合、以下のように記述することができる。
<%@ Page ContentType="text/html" Language="VB" %>
<%--ユーザー・コントロールctrl.ascxを有効化--%>
<%@ Register Tagprefix="wings" Tagname="Sample" Src="ctrl.ascx" %>
<% Response.Write("VBScript<br />") %>
<%--ctrl.ascxの呼び出し--%>
<wings:Sample id="obj" runat="Server" /> |
|
異なるスクリプト言語のコードをユーザー・コントロール化して利用するサンプル(sample.aspx) |
<%@ Control Language="JScript" %>
<% Response.Write("JScript<br />"); %> |
|
ユーザー・コントロール化されたコード(ctrl.ascx) |
○グローバル変数は<script>ブロックで宣言する
ASP.NETにおいて、グローバル変数は、必ず<script>ブロック内で宣言しなければならない。<%〜%>ブロックで宣言された変数は、<%〜%>ブロックからはアクセスすることができるが、<script>ブロックからアクセスすることはできない。
例えば、レガシーASPでは認められていた以下のようなコードは、ASP.NETでは正しく実行されない。変数iが宣言されていない、というエラーに遭遇するはずだ。
<% Dim i As Integer=108 %>
<script runat="Server">
Response.Write(i)
</script> |
|
変数が<script>ブロック内で宣言されていないためにASP.NETではエラーとなるレガシーASPのサンプル・コード |
もしもこのコードを、開発者が意図したように動作させたいという場合には、以下のように修正する必要がある。
<script runat="Server">
Dim i As Integer=108
Response.Write(i)
</script> |
|
変数が<script>ブロック内で宣言されているので正常実行できるASP.NETのサンプル・コード |
なお、これは余談であるが、コードを記述するに際してグローバル変数は限りなく少なくすることが好ましい。ことさらに必要ない限り、変数宣言はプロシージャの中にカプセル化するのが、変数の競合を防ぐという意味でも、リソースの浪費を抑えるという意味でも、あるべき姿であろう。
○すべてのプロシージャは<script>ブロックに記述する
ASP.NETにおいては、すべてのプロシージャは<script>ブロックの中で宣言しなければならない。例えば、レガシーASPでは許されていた以下のコードは、ASP.NETではエラーとなる。
<%
Sub Display()
Response.Write("OK")
End Sub
%> |
|
プロシージャが<script>ブロック内で宣言されていないためにASP.NETではエラーとなるレガシーASPのサンプル・コード |
ASP.NETでは以下のように記述しなければならない。
<script runat="Server">
Sub Display()
Response.Write("OK")
End Sub
</script> |
|
プロシージャが<script>ブロック内で宣言されているので正常実行できるASP.NETのサンプル・コード |
○表示関数をサポートしない
<%〜%>ブロックでのプロシージャ宣言が認められなくなった以上、もはやASP.NETでは表示関数(レンダリング関数という場合もある)もサポートしない。表示関数とは、本体にコンテンツを含んだプロシージャである。例えば、以下は表示関数の典型的な例だ。
<% Sub Display() %>
Render
<% End Sub %> |
|
ASP.NETではサポートされていない表示関数の典型的な例 |
このような表示関数は、<script>ブロックの中で以下のように書き直す必要がある。
<script runat="Server">
Sub Display()
Response.Write("Render")
End Sub
</script> |
|
ASP.NETでレンダリング処理を行うサンプル・コード |
■
以上、今回は移行方式について類型化することで、レガシー資産をどのように移行していくべきか、そもそも移行するべきかどうか、さらには共存(相互運用)の可能性についても簡単な指針を示した。また、移行に当たって、最初に注目すべきレガシーASP/ASP.NETの構造的な変更点にフォーカスしてみた。これで、まずは移行と相互運用に関する概要については把握できたと思う。
次回は、レガシーASPにおける主要な構成要素である「組み込みオブジェクト」や「ディレクティブ」、「Global.asa」などの個別要素までブレイク・ダウンしていき、移行時のインパクトについても考察する。どうぞお楽しみに。