在服务器端运行JavaScript文件(三)

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

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

1.怎样取得请求参数;

2.访问JavaBeans的属性;

3.生成JSON响应。

4.预处理和后处理

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

代码16init.jss脚本

  1. var debug = true;
  2. var debugStartTime = java.lang.System.nanoTime();

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

代码17finalize.jss脚本

  1. var debugEndTime = java.lang.System.nanoTime();
  2. if (debug)
  3.     println("// Time: " + (debugEndTime - debugStartTime) + " ns");

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


取得请求参数

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

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

  1. var param = new Object();
  2. var paramValues = new Object();

  3. function initParams() {
  4.     var paramNames = request.getParameterNames();
  5.     while (paramNames.hasMoreElements()) {
  6.         var name = paramNames.nextElement();
  7.         param[name] = String(request.getParameter(name));
  8.         paramValues[name] = new Array();
  9.         var values = request.getParameterValues(name);
  10.         for (var i = 0; i < values.length; i++)
  11.             paramValues[name][i] = String(values[i]);
  12.     }
  13. }

  14. initParams();

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

http://localhost:8080/jsee/ParamDemo.jss?firstName=John&lastName=Smith

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

代码20ParamDemo.jss例子

  1. println("Hello " + param.firstName + " " + param.lastName);

访问JavaBeans

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

”application”

“session”

“request”

代码21init.jss中的getBean()setBean()方法

  1. function getBean(scope, id) {
  2.     return eval(scope).getAttribute(id);
  3. }

  4. function setBean(scope, id, bean) {
  5.     if (!bean)
  6.         bean = eval(id);
  7.     return eval(scope).setAttribute(id, bean);
  8. }

现在,可以在Session范围内保持一个DemoBean的实例(代码22

代码22DemoBean.java例子
  1. package jsee.demo;

  2. public class DemoBean {
  3.     private int counter;

  4.     public int getCounter() {
  5.         return counter;
  6.     }

  7.     public void setCounter(int counter) {
  8.         this.counter = counter;
  9.     }

  10. }

BeanDemo.jss(代码23)脚本用importPackage(Packages.jsee.demo)方法引入了包含JavaBean的包,然后,脚本试着用getBean()方法从session中取得bean的实例。如果bean不存在,BeanDemo.jss就会创建者个对象,并且用setBean()方法把它放到session中,最后脚本对Beancounter属性进行了累加并且打印了这属性的结果。

代码23BeanDemo.jss例子

  1. importPackage(Packages.jsee.demo);
  2. var bean = getBean("session""demo");
  3. if (!bean) {
  4.     bean = new DemoBean();
  5.     setBean("session""demo", bean);
  6. }
  7. bean.counter++;
  8. println(bean.counter);

如果导入的包是用javajavaxorgeducomnet开头的,那么在importPackage()方法中不必使用包的前缀,还可以使用importClass()方法导入单独的类。

 

返回JSON响应

 

代码24展示了一个包含生成JavaScript引擎和脚本的URI信息的JSON响应的例子。这个例子用Javascript语法来创建JSON对象的源代码,被作为一个StringtoSource()方法来获得。

代码24JsonDemo.jss例子

  1. var json = {
  2.     engine: { 
  3.         name: String(factory.engineName),
  4.         version: String(factory.engineVersion),
  5.         threading: String(factory.getParameter("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. println(json.toSource());

在这个例子中所有的从factoryrequest中取得的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映射;

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


posted @ 2008-12-25 19:06  andriod2012  阅读(219)  评论(0编辑  收藏  举报