【IT168 专稿】摘要:第三部分(共5部分)介绍了本JSP HTTP
服务器实现的以下特性:
对JSP的支持,包括自定义JSP语法,JSP源文件解析等。本部分为全文之核心
对Java Class Loader技术的使用技巧
相关文章:自行开发JSP HTTP服务器的绝对秘籍(一) 自行开发JSP HTTP服务器的绝对秘籍(二) 自行开发JSP HTTP服务器的绝对秘籍(三) 自行开发JSP HTTP服务器的绝对秘籍(四) 自行开发JSP HTTP
服务器的绝对秘籍(五)
4.对JSP的支持 4.1 设计思路 通过HTTP服务器对本地的JSP源文件进行解释,生成中间java源文件。继而调用javac编译工具将java源文件编译成为class文件。HTTP服务器对class文件中定义的类进行载入并运行。
4.2 设计要点 (1)对JSP文件语法的定义
(2)将JSP文件转换为java源文件
(3)编译java源文件
(4)载入java class并执行类对象的实例对象
4.3 设计实施 (1)制定JSP文件语法,并根据JSP语法形式将代码解释为java源文件
考虑到JSP文件解释工作的简化,设计中主要考虑三种JSP语法形式:
A)JSP编译语句块
语法如下:
形式一:语句块开始标志(<%@)和结束标志(%>)在同一行。
<%@ 语句 %>
例如:<%@ import java.io.*; %>
形式二:语句块开始标志(<%@)和结束标志(%>)不再同一行,且开始标志和结束标志都独占一行。
<%@
语句块
%>
例如:
<%@
import java.io.*;
import java.lang.*;
%>
本设计中,对JSP文件中编译语句块的解释处理代码如下:
//Current line contain JSP compile block start flag
if(line.indexOf("<%@") >= 0)
{
//file .jsp contains compiled header
is_has_compiled_header = true;
//Those statements in same line.
if(line.indexOf("%>") >= 0) //JSP cimpile block end flag
{
int start = line.indexOf("<%@");
int end = line.indexOf("%>");
fout.println(line.substring(start + 3, end) );
}
else //Those statements no in same line.
{
while(true)
{
line = fin.readLine();
if(line == null) //The compiled header is broken
{
return (false);
}
if(line.equals("%>") == true) //JSP compiled block end flag
{
break;
}
else
{
fout.println(line); //Output the middle statements of compiled header
}
}//while(true)
}
}//if(line.indexOf("<%@") >= 0)
以上处理代码是将JSP文件中编译语句块解释成java源文件。
如果编译语句存在于一行之中,则将语句开始标志和结束标志中间的编译语句取出形成java代码。
如果编译语句块存在于多行之中,则将语句开始标志行和结束标志行之间的编译语句行取出形成java代码。
B)JSP表达式
语法为:语句块开始标志(<%=)和结束标志(%>)在同一行。且同一行中只限制存在一个表达式。
<%= 表达式 %>
例如:<%= Request.getParameter(“UserID”) %>
本设计中,对JSP表达式语句解释处理代码如下:
//Current line contain JSP expression (mark "<%=" and "%>" must be in same line)
if(line.indexOf("<%=") >= 0)
{
//Get start flag position
int start = line.indexOf("<%=");
//Get end flag position
int end = line.indexOf("%>");
//Get frontal part of JSP expression block
String pre = line.substring(0, start);
//Get expression from line
String exp = line.substring(start + 3, end);
//Get back part of JSP expression block
String back = line.substring(end + 2);
//Replace character " of frontal part and back part with character '
pre = pre.replace('\"', '\'');
back = back.replace('\"', '\'');
//Output the new line (java statement)
fout.println("outln(\"" + pre + "\" + " + exp + " + \"" + back + "\");");
}
以上代码中,首先是将JSP表达式所在的行按照表达式前部分,表达式和表达式后部分提取出来,经过符号替换之后再合成java语句。
C)JSP语句块约定
语法为:语句块开始标志(<%)和结束标志(%>)不在同一行,且开始标志和结束标志都独占一行。
<%
语句块
%>
例如:
<%
int i = 0;
for(; page_info[i] != null; ++i)
{
outln(page_info[i]);
}
%>
本设计中,对JSP语句块解析处理如下:
//As to JSP statements block, mark "<%" and "%>" must be in sigle line
while(true)
{
//Read next line
line = fin.readLine();
if(line == null || line.equals("%>") == true) //JSP statements block end flag is "%>"
{
break;
}
fout.println(line);
}
以上代码中,将语句块开始标志行(<%)和结束标志行(%>)之间的编译语句行取出形成java代码。