现在的位置: 首页 > 综合 > 正文

JSP系列三:JSP脚本元素

2013年01月22日 ⁄ 综合 ⁄ 共 1911字 ⁄ 字号 评论关闭

一,脚本元素:将Java代码插入到与jsp页面对应的servlet中。
 
 脚本元素的3中形式:
  表达式,Scriptlet,声明。
  
二,表达式:将数据或数据操作后的结果转换为字符串,插入到当前servlet的输入流中(_jspService方法中)。

 1,JSP表达式标准语法:
  <%= JAVA表达式 %>

  JSP表达式xml语法:
   <jsp:expression>JAVA表达式</jsp:expression>

 2,JSP表达式后面不加分号;

 3,操作后的结果将转换为字符串,插入到当前servlet的输入流中。 

 4,JSP表达式将生成Servlet的print语句。
  HTML转换为print语句时,使用双引号将文本引起来。
  JSP表达式转换为没有双引号的print语句。

 5,这些语句都会放入_jspService方法中,无论doGet还是doPost都调用该_jspService方法。

三,Scriptlet(脚本段): 将Java代码插入到servlet的_jspService方法中。

 1,Scriptlet标准语法:
  <%  java代码 %>

 Scriptlet的xml语法格式:
  <jsp:scriptlet> scriptlet </jsp:scriptlet>

 2,scriptlet 语句后面要加分号。

 3,Scriptlet可以访问到表达式能够访问的所有自动定义变量。

 4,Scriptlet代码会按出现的次序插入到_jspService方法中。

 5,在Scriptlet中声明的变量都转译为_jspService方法中的本地变量。所以变量是线程安全的。

四,声明(declaration):将方法或字段定义插入到servlet类的主定义体中(_jspService方法除外)。

 1,声明的语法:
  <%! 域或方法的声明 %>

 声明的xml语法格式:
  <jsp:declaration> 域或方法的声明 </jsp:declaration>

 2,声明只在当前JSP页面中有效。

 3,声明不产生输出。

 4,不要使用JSP声明覆盖Servlet的(service方法)。

 5,可以使用JSP声明覆盖jspInit或jspDestroy方法来初始化和销毁JSP页面,而不要直接使用init和destroy方法。
  注意:这里是jspInit和jspDestroy而不是_jspInit和_jspDestroy方法。JSP容器会在调用_jspInit和_jspDestroy方法后调用自定义的jspInit和jspDestroy方法。
  个人认为,这里的使用了模板方法模式,jspInit和jspDestroy为模板方法_jspInit和_jspDestroy方法的钩子方法。
  既然JSP实现提供了这样的机制,那实现这些方法是理由充分的了。

  在获取初始化参数的时候,需要在web.xml中配置JSP页面的Servlet和ServletMapping。
  <servlet-name>即为带后缀的jsp文件名 xxx.jsp。
  <jsp-file>代替<servlet-class>对jsp文件做映射。
  <url-pattern>的路径要指定jsp文件的相对路径的全称包括后缀。

  重点在于 如何解决由此带来的数据并发访问的问题。
  JSP容器只有一个servlet实例,请求线程的不同会造成并发的问题。为多个线程共享,这样将造成使用声明中数据的一致问题。

 6,使用单独的Java类而非JSP声明来定义多数方法。

 7,对于并发访问,声明中的域或者变量,除非是只读 ,否则是线程不安全的。

 8,声明是产生_jspService方法之外的代码,所以在声明中是不能“直接”访问“隐含对象”。
 

五,表达式,Scriptlet,声明的比较
 
 语法:
  Scriptlet 和 声明 都是java语句,而JSP表达式只是表达式。一个完整的语句需要分号表示结束,而表达式不需要。

 Java代码插入位置:

  表达式:_jspService方法的输出流的print方法中;
  Scriptlet :_jspService方法体中对应的位置。
  声明:servlet类的主定义体中(_jspService方法除外);

 变量访问范围:
  表达式:可以访问serlvet类中的类的域和_jspService方法中的局部变量。
  Scriptlet:同表达式。
  声明:不能访问声明外的局部变量,比如_jspService方法中的局部变量(隐含对象)。

 线程安全性:
  表达式和Scriptlet是线程安全的。
  声明是线程不安全的。

抱歉!评论已关闭.