通过前面的分析,我们根据动网论坛的源代码,写一个等笑的JSP源代码应该是很简单的了。但是,还存在一些问题:在ASP中,不管在哪个类哪个函数中,都可以自由使用application,session,request,response等固有对象,而且对于在页面中定义的全局变量,函数中也都可以自由访问。但是JSP中不行,JSP中的Script都属于是servlet类的service方法的代码,而定义的方法都是servlet类的方法,所以,在页面中定义的变量,都不能当全局变量使用,而且Java中没有全局变量这个概念。怎么办?
我的解决办法是这样的,把所有需要在页面中定义的变量都封装到一个类Scriptlet中,然后在每个类的构造函数中传递pageContex,request,response和Scriptlet的一个实例作为参数,根据pageContext又可以得到application,session和JspWriter,那么这个类的成员函数就可以自由的使用这些固有对象了。同理,每一个自定义函数都接受如上同样的参数。
下面,我们看一下index.jsp的代码:
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="javabbs.ConnectionPool" %>
<%@ page import="javabbs.Scriptlet" %>
<%@ page import="javabbs.Forum" %>
<%@ page import="javabbs.Templates" %>
<%@ page import="javabbs.UserOnline" %>
<%@ page import="java.sql.*" %>
<%@ page import="java.util.Date" %>
<jsp:useBean class="javabbs.ConnectionPool" id="objConnectionPool" scope="application" />
<%
//Scriptlet是一个类,用来封装每一个页面中的变量,以便作为参数传递给各个类和函数
Scriptlet objScriptlet = new Scriptlet();
//获取页面运行的开始时间:
objScriptlet.startTime = (new Date()).getTime();
Forum objForum = new Forum(pageContext,request,response,objScriptlet);
Templates objTemplates = new Templates(pageContext,request,response,objScriptlet);
UserOnline objUserOnline = new UserOnline(pageContext,request,response,objScriptlet);
objForum.getForumSetting();
objForum.checkUserLogin();
if(request.getParameter("w") !=null && request.getParameter("w").equals("1")){
passportMain(pageContext,request,response,objScriptlet);
}
if(request.getParameter("action") != null && request.getParameter("action").equals("xml")){
showxml(pageContext,request,response,objScriptlet);
}else{
main(pageContext,request,response,objScriptlet);
}
try{
Thread.sleep(1234);
}catch(Exception e){
}
//获取页面运行结束时的时间
objScriptlet.endTime = (new Date()).getTime();
%>
该页面的运行时间为:<br>
<%=(objScriptlet.endTime - objScriptlet.startTime)*0.001%>秒
<%!
//定义函数
public void passportMain(PageContext pageContext,HttpServletRequest request,HttpServletResponse response,Scriptlet objScriptlet){
JspWriter out = pageContext.getOut();
try{
out.println("调用passportMain()...<br>");
}catch(Exception e){
}
}
public void showxml(PageContext pageContext,HttpServletRequest request,HttpServletResponse response,Scriptlet objScriptlet){
JspWriter out = pageContext.getOut();
try{
out.println("调用showxml()...<br>");
}catch(Exception e){
}
}
public void main(PageContext pageContext,HttpServletRequest request,HttpServletResponse response,Scriptlet objScriptlet){
JspWriter out = pageContext.getOut();
try{
out.println("调用main()...<br>");
}catch(Exception e){
}
}
%>
运行结果如下:
构造objForum对象...
构造objTemplates对象...
构造objUserOnline对象...
调用objForum.getForumSetting()...
调用objForum.checkUserLogin()...
调用main()...
该页面的运行时间为:
1.234秒
其中用到的几个类的源代码列出如下:
Scriptlet.java
package javabbs;
/**
*
* @author 京山游侠
*
* 该类用来封装教本文件中使用的变量
*/
public class Scriptlet {
//页面开始执行的时间:
public long startTime;
//页面结束执行时间
public long endTime;
public Scriptlet(){
}
}