一、JSP页面的基本结构

1、一个JSP页面=传统的页面文件+Java程序片+JSP标签。

2、JSP页面的五种元素组成:

(1)普通的HTML标记符;(2)JSP标记,如指令标记、动作标记;(3)变量和方法的声明;

(4)Java程序片;(5)Java表达式;

3、当服务器上的一个JSP页面被第一次请求执行时:服务器上的JSP引擎首先将JSP页面文件转译成一个Java文件,再将这个Java文件编译生成字节码文件,然后通过执行字节码文件响应用户的请求。    

      当多个用户请求一个JSP页面时:JSP引擎为每个用户启动一个线程,该线程负责执行常驻内存的字节码文件来响应相应用户的请求。这些线程由Tomcat服务器来管理,将CPU的使用权在各个线程之间快速切换,以保证每个线程都有机会执行字节码文件。

 

二、变量和方法的声明

1、在“<%!”和“%>”标记符之间声明变量,即在“<%!”和“%>”之间放置Java的变量声明语句。

2、声明变量:

(1)变量的类型可以是Java语言允许的任何数据类型,将这些变量称为JSP页面的成员变量。

(2)“<%!”和“%>”之间声明的变量在整个JSP页面内都有效,与“<%!”、“%>” 标记符在JSP页面中所在的书写位置无关。JSP引擎将JSP页面转译成Java 文件时,将“<%!”、“%>” 标记符之间声明的变量作为类的成员变量,这些变量占有的内存空间直到JSP引擎关闭才释放。

3、定义方法:

(1)在“<%!”和“%>”标记符号之间定义方法,所定义的方法在整个JSP页面有效,可以在Java程序片中被调用。      

(2)方法内声明的变量只在该方法内有效,当方法被调用时,方法内声明的变量被分配内存,方法被调用完毕即可释放这些变量所占的内存。

 

三、Java程序片

1、在“<%”和“%>”之间插入Java程序片。

2、一个JSP页面可以有许多程序片,这些程序片将被JSP引擎按顺序执行。

3、JSP页面的局部变量:程序片中声明的变量。

4、多个客户请求一个JSP页面时,Java程序片将被执行多次,分别在不同的线程中执行 。

5、Java程序片执行的特点:

jsp页面编写实现组织架构图_属性值

6、 synchronized关键字修饰:如果一个用户在执行Java程序片时调用JSP页面的方法操作成员变量,可能不希望其他用户也调用该方法操作成员变量,可以免对其产生不利的影响。

7、一个JSP页面中的Java程序片会按其在页面中的顺序被执行,而且某个Java程序片中声明的局部变量在其后继的所有Java程序片以及表达式部分内都有效。利用Java程序片的这个性质,有时候可以将一个Java程序片分割成几个Java程序片,然后在这些Java程序片之间再插入其他标记元素。

jsp页面编写实现组织架构图_java_02

 

四、Java表达式

1、在“<%=”和“%>”之间插入一个表达式,但是这个表达式必须能求值

2、表达式的值由服务器负责计算,并将计算结果用字符串形式发送到用户端显示。    

      注意:不可插入语句,“<%=”是一个完整的符号,“<%”和“=”之间不要有空格。

3、在JSP页面中,表达式的值被表示成一个字符串的形式,即Tomcat引擎将表达式的结果转换成字符串,然后发送给用户的浏览器。因此,在编写JSP页面时,要把Java表达式按普通的文本来使用。

 

五、JSP中的注释

1、JSP注释的种类:

(1) HTML注释:在标记符号“<!--”和“-->”之间加入注释内容:  <!--    注释内容     -->

                 JSP引擎把HTML注释交给用户,因此用户通过浏览器查看JSP页面的源文件时,能够看到HTML注释。

(2)JSP 注释:在标记符号“<%--”和“--%>”之间加入注释内容:<%--  注释内容  --%>          

                 JSP引擎忽略JSP注释,即在编译JSP页面时忽略JSP注释。

 

六、JSP指令标记

1、page指令标记:

(1) page 指令:用来定义整个JSP页面的一些属性和这些属性的值,属性值用单引号或双引号括起来。可以用一个page指令指定多个属性的值 ,也可以使用多个page指令分别为每个属性指定值 。

(2)  page指令的作用:对整个JSP页面有效,与其书写的位置无关,习惯把page指令写在JSP页面的最前面。

                 例如:       <%@ page   属性1=“属性1的值”  属性2= “属性2的值”  ……%>

                  或           <%@ page   属性1="属性1的值"  %>    

                                 <%@ page   属性2="属性2的值"  %>  

                                 … …  

                                 <%@ page   属性n=“属性n的值”  %>

(3)page 指令标记可以指定如下属性的值contentType、import、language、session、buffer、auotFlush 、isThreadSafe。

2、 当用户请求一个JSP页面时,Tomcat服务器负责解释执行JSP页面,并将某些信息发送到用户的浏览器,以便用户浏览这些信息。Tomcat服务器同时负责通知用户的浏览器使用怎样的方法来处理所接收到的信息。

(1)contentType属性值:确定JSP页面响应的MIME(Multipurpose Internet Mail Extention)类型和JSP页面字符的编码。属性值的一般形式是"MIME类型”或 "MIME类型;charset=编码"。

         例如:用户的浏览器启用HTML解析器来解析执行所接收到的信息:      

                              <%@ page contentType="text/html;charset=GB2312" %>

         注意: 如果不使用page指令为contentType指定一个值,那么contentType属性的默认值是  "text/html ; charset=ISO-8859-1"

   强调:不允许两次使用page 指令给contentType属性指定不同的属性值 。下列用法错误:  

               <%@ page contentType="text/html;charset=GB2312" %>      

               <%@ page contentType="application/msword" %>

(2)language属性值:定义JSP页面使用的脚本语言,该属性的值目前只能取"java"。

          例如:   <%@ page  language="java" %>            

          注意:JSP页面默认有如上page指令 。      

(3)import属性:该属性的作用是为JSP页面引入Java运行环境提供的包中的类,这样就可以在JSP页面的程序片部分、变量及函数声明部分、表达式部分使用包中的类。    

  使用page指令可以为import属性指定多个值,这些值用逗号分隔。该属性的值可以是某包中的所有类或一个具体的类。

         例如:    <%@ page  import="java.io.*", "java.util.Date" %> 

         注意:JSP页面默认import属性已经有" java.lang.*"、"javax.servlet.*"、"javax.servlet.jsp.*"、"javax.servlet.http.*"等值  。

          当为import指定多个属性值时,比如:

                        <%@ page  import="java.util.*" %>

                        <%@ page  import="java.io.*"  %>

         那么,JSP引擎把JSP页面转译成的Java文件中会有如下的import语句:import java.util.*;   import java.io.*;    

(4)session属性:session 属性用于设置是否需要使用内置的session对象。 session的属性值可以是true或false。session属性默认的属性值是true。 

(5)buffer属性:内置输出流对象out负责将服务器的某些信息或运行结果发送到用户端显示。buffer属性用来指定out设置的缓冲区的大小或不使用缓冲区。

           例如:  <%@ page buffer= "24kb" %>        

buffer属性的默认值是8kb 。buffer属性可以取值" none",即设置out不使用缓冲区。

(6)autoFlush属性: autoFlush 属性指定out的缓冲区被填满时,缓冲区是否自动刷新。        

         autoFlush可以取值true或false。autoFlush属性的默认值是true。当autoFlush属性取值false时,如果out的缓冲区填满,就会出现缓存溢出异常。当buffer的值是"none"时,autoFlush的值就不能设置成false。

(7)isThredSafe属性:isThreadSafe属性用来设置JSP页面是否可多线程访问。    

         isThreadSafe的属性值可取true或false。当isThreadSafe属性值设置为true时,JSP页面能同时响应多个用户的请求;当isThreadSafe属性值设置成false时,JSP页面同一时刻只能响应一个用户的请求,其他用户须排队等待。isThreadSafe属性的默认值是true。

         注: isThreadSafe属性的默认值是true。

(8)info属性:info属性的属性值是一个字符串,其目的是为JSP页面准备一个常用且 可能要经常修改的字符串。

         例如: <%@ page info= "we are students" %>

      可以在JSP页面中使用方法:getServletInfo();  获取info属性的属性值。

      注意:当JSP页面被转译成Java文件时,转译成的类是Servlet的一个子类,所以在JSP页面中可以使用Servlet类的方法:getServletInfo()。

3、include指令标记:语法格式       <%@ include file= "文件的URL " %>

(1) include指令标记的作用:是在JSP页面出现该指令的位置处,静态插入一个文件。

(2)静态插入:就是当前JSP页面和插入的文件合并成一个新的JSP页面,然后JSP引擎再将这个新的JSP页面转译成Java文件。因此,插入文件后,必须保证新合并成的JSP页面符合JSP语法规则,即能够成为一个JSP页面文件。

            比如,被插入的文件是一个JSP页面,该JSP页面使用page指令为contentType 属性设置了的值: 

                               <%@ page contentType="application/msword" %>  

            那么,合并后的JSP页面就两次使用page指令为contentType属性设置了不同的属性值,导致出现语法错误。因为JSP页面中的page指令只能为contentType指定一个值。          

(3)使用include指令可以实现代码的复用。

 

七、JSP动作标记

       动作标记是一种特殊的标记,它影响JSP运行时的功能。

1、include动作标记

(1)include 动作标记语法格式为:<jsp:include page= "文件的URL"/>

                                                      或  <jsp:include page= "文件的URL">          

                                                                            param子标记      

                                                            </jsp:include>    

(2)include动作标记告诉JSP页面动态包含一个文件,即JSP页面运行时才将文件加入。    

(3)与静态插入文件的include指令标记不同,当JSP引擎把JSP页面转译成Java文件时,不把JSP页面中动作指令include所包含的文件与原JSP页面合并为一个新的JSP页面,而是告诉Java解释器,这个文件在JSP运行时才包含进来。    

(4)如果包含的文件是普通的文本文件,就将文件的内容发送到用户端,由用户端的浏览器负责显示;如果包含的文件是JSP文件,JSP引擎就执行这个文件,然后将执行的结果发送到用户端,并由用户端的浏览器负责显示这些结果。 

2、param动作标记:

(1)param标记以“名字—值”对的形式为其他标记提供附加信息,param标记不能独立使用,需作为jsp:include、jsp:forward、jsp:plugin标记的子标记来使用。

(2)param动作标记语法格式是: <jsp:param  name= "名字"  value= "指定给param的值">      

          当该标记与jsp:include动作标记一起使用时,可以将param标记中的值传递到include动作标记要加载的文件中去,被加载的JSP文件可以使用Tomcat服务器提供的request内置对象获取include动作标记的param子标记中name属性所提供的值,因此include动作标记通过使用param子标记来处理加载的文件,比include指令标记更为灵活。

3、forward动作标记:

(1)forward动作标记的语法格式是: <jsp:forward page="要转向的页面" />

                                                         或 <jsp:forward page="要转向的页面" >      

                                                                     param子标记      

                                                              </jsp:forward>  

(2)该指令的作用是:从该指令处停止当前页面的执行,而转向执行page属性指定的JSP页面。需要注意的是,当forward动作标记不需要param子标记时,必须使用第一种形式。      

(3)forward标记可以使用param动作标记作为子标记,向转向的页面传送信息。forward动作标记指定的要转向的JSP文件可以使用Tomcat服务器提供的request内置对象获取param子标记中name属性所提供的值。

(4)注意:当前页面使用forward动作标记转向后,尽管用户看到了转向后的页面的效果,但浏览器地址栏中显示的仍然是转向前的JSP页面的URL地址,因此,如果刷新浏览器的显示,将再次执行当前浏览器地址栏中显示的JSP页面。

4、useBean动作标记: 该标记用来创建并使用一个Javabean,是非常重要的一个动作标记。      Sun公司倡导的是:Javabean负责存储数据,JSP页面显示Javabean中的数据,而servlet负责管理Javabean中的数据。

 

八、总结:

1、一个JSP页面可由普通的HTML标记、JSP标记、成员变量和方法的声明、Java程序片和Java表达式组成。JSP引擎把JSP页面中的HTML标记交给用户的浏览器执行显示,负责处理JSP标记、变量和方法,同时负责运行Java程序片、计算Java 表达式,并将需要显示的结果发送给用户的浏览器。 

2、JSP页面中的成员变量是被所有用户共享的变量。Java程序片可以操作成员变量,任何一个用户对JSP页面成员变量操作的结果,都会影响到其他用户。

3、如果多个用户访问一个JSP页面,那么该页面中的Java程序片就会被执行多次,分别运行在不同的线程中,即运行在不同的时间片内。运行在不同线程中的Java程序片的局部变量互不干扰,即一个用户改变Java程序片中的局部变量的值不会影响其他用户的Java程序片中的局部变量。

4、page指令用来定义整个JSP页面的一些属性和这些属性的值。比较常用的两个属性是contentType和import。page指令只能为contentType指定一个值,但可以为import属性指定多个值。

5、include指令标记是在编译阶段就处理所需要的文件,被处理的文件在逻辑和语法上依赖于当前JSP页面,其优点是页面的执行速度快;而include动作标记是在JSP页面运行时才处理文件,被处理的文件在逻辑和语法上独立于当前JSP页面,其优点是可以使用param子标记更灵活地处理所需要的文件。