今天介绍最后一部分:

rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cyc%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> 
 
 

开发服务器端脚本
 有兴趣的朋友可以去一下网址阅读原文
 http://www.ibm.com/developerworks/java/library/wa-aj-javaee/index.html?S_TACT=105AGX02&S_CMP=EDU开发服务器端脚本 



 rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cyc%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml">

这节包含了几个服务器端的脚本,它向你展示了一下内容:

1.怎样取得请求参数;

2.访问JavaBeans的属性;

3.生成JSON响应。

4.预处理和后处理

   在前一节中,我们看到了JSServlet类在执行被请求的脚本前调用了init.jss(代码16)如果想要记录脚本执行了多长时间,就可以向下面的代码那样,把开始时间保存到一个变量中。

rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cyc%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> 
  
 代码16:init.jss脚本
 
1. var debug = true;
2. var
3. 
 
 rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cyc%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml">

然后可以在finalize.jss的脚本中计算执行的时间(代码17),这个时间被作为脚本注释输出,这样便于JSServlet能够生成JSON响应。

代码17:finalize.jss脚本


1. var
2. if
3. "// Time: " + (debugEndTime - debugStartTime) + " ns");
4. 
 
 rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cyc%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml">

通过下面的系列讲解会有更多的代码被添加到init.jss中

取得请求参数

用JSServlet调用的脚本能够访问用request.getParameter()和request.getParameterValues()方法返回的java对象的请求参数。你可以选择更简洁的语法,而且可以用JavaScript对象来代替Java的strings和arrays来工作,通过在init.jss文件中(代码18)追加下列代码就可以很容易的做到这件事情。

代码18:在init.jss中获得请求参数


1. var param = new
2. var paramValues = new
3. 
4. function
5. var
6. while
7. var
8.         param[name] = String(request.getParameter(name));
9. new
10. var
11. for (var
12.             paramValues[name][i] = String(values[i]);
13.     }
14. }
15. 
16. initParams();
17. 
 
 rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cyc%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml">

我们假定用下面的URL请求一个叫做ParamDemo.jss的脚本


在ParamDemo.jss中(代码20),能够用param.firstName和param.lastName来获得两个请求参数。

代码20:ParamDemo.jss例子


    1. println("Hello " + param.firstName + " "
     
     rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cyc%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml">


    访问JavaBeans

    在Web应用程序的application、session和request范围内保存bean的实例,能够分别通过ServletContext、HttpSession和HttpServletRequest的getAttribute()和setAttribute()方法来取得和设定。也可以使用getBean()和setBean()函数(代码21)来进行设定,不过这两个方法必须放到init.jss文件中,以便于任意脚本能够调用它们。范围参数应该是下列之一的字符串:

    ”application”
    “session”
    “request”
    代码21:init.jss中的getBean()和setBean()方法
    
     
    1. function
    2. return
    3. }
    4. 
    5. function
    6. if
    7.         bean = eval(id);
    8. return
    9. }
    10. 
     
     rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cyc%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> 
     
     
    现在,可以在Session范围内保持一个DemoBean的实例(代码22)
     
    代码 
    22 
    : 
    DemoBean.java 
    例子 
    1. package
    2. 
    3. public class
    4. private int
    5. 
    6. public int
    7. return
    8.     }
    9. 
    10. public void setCounter(int
    11. this.counter = counter;
    12.     }
    13. 
    14. }
    15. 
     
     rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cyc%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> 
     
     
    BeanDemo.jss(代码23)脚本用importPackage(Packages.jsee.demo)方法引入了包含JavaBean的包,然后,脚本试着用getBean()方法从session中取得bean的实例。如果bean不存在,BeanDemo.jss就会创建者个对象,并且用setBean()方法把它放到session中,最后脚本对Bean的counter属性进行了累加并且打印了这属性的结果。
     
    代码 
    23 
    : 
    BeanDemo.jss 
    例子 
     
    1. importPackage(Packages.jsee.demo);
    2. var bean = getBean("session", "demo");
    3. if
    4. new
    5. "session", "demo", bean);
    6. }
    7. bean.counter++;
    8. println(bean.counter);
    9. 
     
     rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cyc%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> 
     
     
    如果导入的包是用java、javax、org、edu、com或net开头的,那么在importPackage()方法中不必使用包的前缀,还可以使用importClass()方法导入单独的类。
     
      
          
      
    返回JSON响应
     
      
          
      
    代码24展示了一个包含生成JavaScript引擎和脚本的URI信息的JSON响应的例子。这个例子用Javascript语法来创建JSON对象的源代码,被作为一个String用toSource()方法来获得。
    代码24:JsonDemo.jss例子
    
     
    1. var
    2.     engine: { 
    3.         name: String(factory.engineName),
    4.         version: String(factory.engineVersion),
    5. "THREADING"))
    6.     }, 
    7.     language: { 
    8.         name: String(factory.languageName),
    9.         version: String(factory.languageVersion)
    10.     },
    11.     script: {
    
    12.         uri: String(request.requestURI)
    13.     }
    14. };
    15. 
    16. println(json.toSource());
    17. 
     
     rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cyc%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> 
     
     
    在这个例子中所有的从factory和request中取得的java对象,都必须被转化成JavaScript对象以便于toSource()方法能够正常工作,下面是JsonDemo.jss的输出结果
    ({language:{name:"ECMAScript", version:"1.6"}, 
    engine:{name:"Mozilla Rhino", threading:"MULTITHREADED", 
    version:"1.6 release 2"}, script:{uri:"/jsee/JsonDemo.jss"}})

     

    结论

    在这篇文章中,我们学习以下内容:

    怎样使用javax.script API来编译和执行JavaScript文件

    基于java.util.LinkedHashMap,怎样实现LRU缓存;

    怎样把Java对象作为脚本变量输出;

    怎样实现一个RUL-script映射;

    怎样创建在服务器端执行的脚本文件;