• 1. JSP基本语法
  • 2. JSP语法指令元素(DIRECTIVE) 例如: <%@ page import=“java.io.*” %>脚本元素(SCRIPTING)动作元素(ACTION) 例如: JSP语法分为三种不同的类型
  • 3. 4.1 JSP文件的结构 4.2 JSP的脚本 4.3 JSP指令元素 4.4 JSP动作元素
  • 4. 4.1 JSP文件的结构在传统的的网页HTML(*.htm、*.html)中加入Java程序片断,就构成了JSP网页(*.JSP)。Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序片断,然后将执行结果以HTML格式返回给客户端。
  • 5. <%@ page contentType="text/html; charset=GBK" %> <%@ page import="java.io.*" %> <%-- 这是注释的方法 --%> <%//当然这样也是可以的%> <%! private static int Num; public void jspInit(){ Num = 0; }; %> 我的第一个JSP程序!!! 4.4.1 创建第一个JSP文件
  • 6.

    <%= "欢迎!" %> <% Num ++; %>
    <%= "您是第" + Num + "个客人!" %>

  • 7. JSP原始代码中包含了JSP元素和Template(模板) data两类 Template data指的是JSP引擎不处理的部分,即标记<%……%>以外的部分,例如代码中的HTML的内容等 ,这些数据会直接传送到客户端的浏览器 JSP元素则是指将由JSP引擎直接处理的部分,这一部分必须符合JSP语法,否则会导致编译错误。
  • 8. 4.2 JSP的脚本JSP的脚本,即Scripting Elements,包含以下4部分 (1)隐藏注释(Hidden Comment) <%-- 这是客户端不可见的注释 --%> (2)声明(Declaration) <%!这是声明%> (3)脚本段(ScriptLets) <%这是脚本段 %> (4)表达式(Expression) <%=这是表达式 %>
  • 9. 4.2.1隐藏注释 JSP 语法格式如下: <%-- 注释 --%>  不发送到客户端。 <%--comment for server side only--%> 注意:隐藏注释内容可以写任意字符串,但是在注释内容中不能使用“--%>”,如果要使用“--%>”,则必须写成“--%\>”
  • 10. <%@ page contentType="text/html; charset=GBK" %> 隐藏注释示例

    隐藏注释测试

    <%-- 这行注释将不显示在客户端的浏览器上 --%>
  • 11. (本页无文本内容)
  • 12. (本页无文本内容)
  • 13. 隐藏注释和HTML注释的比较 JSP 语法格式如下: 这种注释发送到客户端,但不直接显示,在源代码中可以查看到。
  • 14. HTML注释(hide1.jsp) <%@ page contentType="text/html; charset=GBK" %> HTML注释 未显示上一行的注释。
  • 15. HTML注释
  • 16. HTML注释(hide2.jsp)<%@ page contentType="text/html; charset=GBK" %> 要多加练习 在源文件中包括当前时间。
  • 17. HTML注释
  • 18. IE中的源程序有注释
  • 19. Scriptlets中的注释由于Scriptlets包含Java代码,所以Java中的注释规则在Scriptlets中也适用。常用的Java注释使用“//”表示单行注释,使用“/* */”表示多行注释。例如 <% …… //color表示颜色,通过它来动态控制颜色。 String color1="99ccff"; …… %> 也可以这样 <% …… /* color表示颜色,通过它来动态控制颜色。 */ String color1="99ccff"; …… %>
  • 20. 4.2.2 声明语句(Declaration)可以在JSP页中定义方法或变量,这些方法和变量可被同一页面的其他代码访问。在大多数情况下,应该在JavaBean中定义方法,然而有时候在网页内定义方法可能更方便一些,尤其是当代码只用于一页时。 JSP 语法格式如下: <%! 声明; [声明; ] ... %> 在JSP里,声明是一段Java代码,它用来定义在产生的类文件中类的属性和方法。声明后的变量和方法可以在JSP的任意地方使用,可以声明方法,也可以声明变量。
  • 21. 声明(declartion.jsp)<%@ page contentType="text/html; charset=GBK" %> <%@ page language="java" import="java.util.*" %> declartion.jsp <%! int i = 0; %> <%! int a, b, c; %> <%! Date date; %>
  • 22. 注意:声明并不在JSP页内产生任何输出。 它们仅仅用于定义,而不生成输出结果。 要生成输出结果,应该用JSP表达式或脚本段
  • 23. 4.2.3 脚本段(Scriptlets) JSP 语法格式如下: <% Scriptlets %> 脚本段内还能定义局部变量。 注意:脚本段内不能定义方法,这与声明不同,这是因为JSP引擎会把脚本段内的代码放到Servlet内的方法内,而方法时不能被嵌套定义的。 如果要使用“%>”,则必须写成“%\>”
  • 24. <%@ page contentType="text/html; charset=GBK" %> <%@ page language="java" import="java.util.*" %> scriptlets.jsp <%if(Calendar.getInstance().get(Calendar.AM_PM)==Calendar.AM){%> 早上好! <%}else{ %> 下午好! <%} %> <% int Num; Num=0; Num++; %> scriptlets.jsp
  • 25. (本页无文本内容)
  • 26. 4.2.4 表达式(Expression)用于在页面上输出信息,语法格式如下: <%= Java Expression %> 计算Java表达式得到的结果被转换成字符串,然后插入到页面。表达式值页面被请求时进行,例如的下面代码显示页面被请求时的日期时间: Current time:<%=new java.util.Date()%> 表达式的值在执行后会被自动转化为字符串,然后显示出来。
  • 27. 注意: (1)在表达式结束处不可以使用分号。 如Current time:<%=new java.util.Date();%> (2)表达式可以包含其它的表达式,有时候也能作为其它JSP元素的属性值。 错误
  • 28. 表达式(expression.jsp)<%@ page contentType="text/html; charset=GBK" %> <%@ page language="java" import="java.util.*" %> test
    <%! Date date=new Date(); %> <%! int a, b, c; %>
  • 29. <% a=12;b=a; c=a+b;%> <%=date.toString()%>

    Current time:<%=new java.util.Date()%>  
    a=<%= a %>
    b=<%= b %>
    c=<%= c %>

  • 30. expression.jsp执行结果
  • 31. 提示: 表达式实际上是被转换成out.println()方法中的内容。如: <%=“hello world”%> 相当于JSP页面中的: <%out.println(“hello world”); %> 例如threetest.jsp。
  • 32. 4.3 JSP指令元素JSP有三个指令元素,page,include和taglib。这些指令元素是针对JSP引擎的,并不会直接产生任何看得见的输出。它们包含在“<%@ %>”里。两个主要的指令是page与include,taglib指令只有在使用标签库编程时才使用。
  • 33. 4.3.1 Page指令“Page”指令用于定义JSP文件中的全局属性。  JSP 语法格式如下: <%@ page [ language="java" ] [ extends="package.class" ] [import="{package.class | package.*},..." ] [ session="true | false" ] [ buffer="none | 8kb | sizekb" ]          
  • 34. Page指令[ autoFlush="true | false" ]  [ isThreadSafe="true | false" ]  [ info="text" ]  [ errorPage="relativeURL" ] [ contentType="mimeType [;charset=characterSet]" | "text/html ; charset=ISO-8859-1" ] [ isErrorPage="true | false" ] %>  
  • 35. Language属性 language属性用来设定编写JSP网页使用的程序语法,目前处理JSP网页服务器中的JSP引擎都只支持Java,因此这个属性的默认值为Java。 Extends属性 extends=“package.class”,extends属性定义了由JSP页面产生的servlet的父类,一般来说,这个属性不会用到,但是当需要实现一些特殊功能时,也是比较方便的。 Import属性 import属性用来指定所要加载的非预设Java包或类 。 默认加载的包类有java.lang.*、javax.servlet.*、javax.servlet.jsp.*和javax.servlet.http.* 载入非预设包,如 <%@page import = "java.util.*,java.io.*"%> 加载了2个包java.util.*和java.io.*,以逗号作分隔。
  • 36. Session属性 session属性的属性值可为true或false,用来设定JSP网页是否使用内建的session对象与功能,默认值为true。Session对象的类型是javax.servlet.http.HttpSession。 Buffer属性 设定JSP网页所使用的缓冲区大小。 缓冲区是用来暂存一些要传送給客户端的数据,默认值为8kb。 设定值none,表示不使用缓冲区的功能。 设定缓冲区的大小值必须大于8kb: <%@page buffer = "24kb"%> autoFlush 说确定是否自动刷新输出缓冲,如果设成true,则当输出缓冲区满的时候,刷新缓冲区而不是抛出一个异常
  • 37. isThreadSafe属性 isThreadSafe属性的属性值可为true或false缺省值是true,用来设置JSP文件是否能多线程使用。如果被设置为true,那么多个客户请求发向JSP引擎时,可以一次被处理。JSP程序员要处理同步时共享的状态,以保证同步时确实是安全的。如果设置成false,则采用单线程模式控制客户端访问该页。 Info属性 设定一个代表当前这个JSP网页的信息。 设定內容可在程序中使用getServletInfo()方法来取得。 设定info属性: <%@page info = “网页信息说明 … ”%>
  • 38. contentType=“mineType” 定义MIME类型和JSP网页的编码方式 ErrorPage 设定当前网页产生例外错误时,可取得与显示这个例外错误信息的另一个网页地址: <%@page errorPage="error.jsp"%> 当目前的网页发生例外错误时,在error.jsp中可直接使用exception对象来获取相关的错误信息。 isErrorPage 用來设定网页是否可显示其它网页所产生的例外信息,此属性的默认值为false。
  • 39. page指令详说“<%@ page %>”指令作用于整个JSP页面,同样包括静态的包含文件。但是“<%@ page %>”指令不能作用于动态的包含文件,比如 “”。 可以在一个页面中用上多个“<%@ page %>”指令,但是其中的属性只能用一次,不过也有例外,那就是import属性。因为import属性和Java中的import语句类似(参照Java Language,import语句引入得是Java语言中的类),所以此属性就能多用几次。 无论把“<%@ page %>”指令放在JSP的文件的哪个地方,它的作用范围都是整个JSP页面。不过,为了JSP程序的可读性,以及好的编程习惯,最好还是把它放在JSP文件的顶部。
  • 40. PageExample.jsp<%@ page contentType="text/html; charset=GBK" %> <%@ page import="java.util.Date" %> Page指令示例

    <% Date date=new Date(); out.println("Time:"+date); %>

  • 41. PageExample.jsp执行结果
  • 42. page指令示列2(page.jsp)<%@ page contentType="text/html; charset=GBK" %> <%@ page import="java.util.*, java.lang.*" %> <%@ page buffer="24kb" autoFlush="false" %> <%@ page errorPage="error.jsp" %> page Test for using 'Page'.
  • 43. page指令例子运行结果
  • 44. 4.3.2 include指令include指令:向当前页中插入一个静态文件的内容。 JSP 语法格式如下: <%@ include file="relativeURL" %> 或 <%@ include file="相对位置" %> include指令将会在JSP编译时插入被包含文件的内容,被包含的文件内容常常时代码段,因此代码片断的后缀名最好时以“f”(fragment的第一个字母)结尾,例如,“.htmlf”、”.jspf”等,这么做的好处是避免JSP编译器对该文件内容进行语法检查。 需要注意的是,一经编译,内容不可变,如果要改变filename的内容,不需重新编译JSP文件。但是它的执行效率高。
  • 45. include指令将会在JSP编译时插入一个文件,而这个包含过程是静态的。所谓静态的是指file属性值不能是一个变量,例如,下面为file属性赋值方式是不合法的。 <%String url=“header.htmlf”%> <% @include file=“<%=url%>”%> 也不可以在file所指定的文件后添加任何参数,下面为这行代码是不合法的。 <% @include file=“query.jsp?name=browser”%>
  • 46. 由于使用include指令,可以把一个复杂的JSP页面分成若干简单的部分,这样大大增加了JSP页面的管理性。当要对页面进行更改时,只需要更改对应的部分就可以了。 这个包含文件可以是JSP文件、HTML文件、文本文件、inc文件等。如果包含的文件包含可执行代码,那么这个包含的文件的代码将会被执行。 在通常情况下把页面分成多个区,典型的JSP分区方法如图所示。
  • 47. 头部Header.jsp ,LOGO左边side.jsp菜单页面主体:body.jsp 功能区尾部:footer.jsp版权声明等例如 include.jsp中插入三个文件
  • 48. 程序执行结果如下:
  • 49. include指令 例子
  • 50. include指令例子执行结果
  • 51. 4.3.3 taglib指令taglib指令是能够让用户自定义新的标签。 JSP语法 <%@ taglib uri="URIToTagLibrary" prefix="tagPrefix" %> 用于引入定制标签库
  • 52. taglib指令属性 1.uri="URIToTagLibrary" Uniform Resource Identifier (URI)根据标签的前缀对自定义的标签进行唯一的命名,URI可以是以下的内容: 一个相对或绝对的路径   可以是标签库描述文件
  • 53. 2.prefix="tagPrefix" 表示标签在JSP中的名称。比如,在中的public,如果这里不写public,那么这就是不合法的。 注意:(1)必须在使用自定义标签之前使用<%@tag%>指令。 (2)一个页面中多次使用taglib指令,但是前缀只能使用一次。 (3)请不要用jsp, jspx, java, javax, servlet, sun, 和sunw做为你的前缀,这些已被Sun公司声明保留。
  • 54. 以上指令,声明此JSP文件使用了自定义标签库,同时引 用标签库,并且指定了它们的标签前缀。例如,使用 JSTL中数据库标签库的例子: <%@ taglib uri="http://www.sun.com.jsp/jstl/sql" prefix=“sql" %> select * from books
  • 55. 动作语法包括。 4.4 JSP动作元素
  • 56. 分类 项目 功能说明 JavaBean 使用JavaBean 设定JavaBean的属性值 取得JavaBean的属性值 设定传送参数 一般元素 载入Java Applet或JavaBean 网页重新导向 载入HTML或JSP文件 XML(2.0新增) 设定卷标属性 动态设定XML卷标主体 动态设定XML卷标
  • 57. 4.4.1 所谓JavaBean,其实是一个Java类,封装了一些常用的复杂的操作,一般可以使用JavaBean进行数据库连接、实现业务逻辑等,可以使得前台显示和后台业务逻辑更好地分离。使用JavaBean有利于代码重用,提高程序结构清晰性,这些Java类放在“WEB-INF/classes”目录内,可以使用进行实例化,并指定一个名字和作用域。  JSP 语法格式如下:     optional properties tags                        
  • 58. 属性以及用法 1.id="bean_Name" 在所定义的范围中确认Bean的变量,使之能在后面的程序中使用此变量名来分辨不同的Bean ,这个变量名对大小写敏感,必须符合所使用的脚本语言的规定,这个规定在Java Language 规范已经写明。如果Bean已经在别的“”标记中创建,则当使用这个已经创建过Bean时,id的值必须与原来的那个id值一致;否则则意味着创建了同一个类的两个不同的对象。 
  • 59. 2.scope="page | request | session | application" Bean存在的范围以及id变量名的有效范围。缺省值是page,以下是详细说明: page - 能在包含“”元素的 JSP文件以及此文件中的所有静态包含文件中 使用这个Bean,直到页面执行完毕向客户端发 回响应或转到另一个文件为止。
  • 60. request - 在任何执行相同请求的JSP文件中使用这个Bean,直到页面执行完毕向客户端发回响应或转到另一个文件为止。能够使用Request对象访问这个Bean,比如request.getAttribute(bean_Name)。其中 bean_Name是Bean实例化的名字。 session - 从创建Bean开始,就能在任何使用相同session的JSP文件中使用这个Bean。这个Bean存在于整个Session生存周期内,任何在分享此Session的JSP文件都能使用同一Bean。注意在创建这个Bean的JSP文件中“<% @ page %>”指令中必须指定“session=”true“”,否则可能会导致致命错误发生。可以使用session 对象访问Bean 。session.getValue (bean_Name);其中 bean_Name是Bean实例化的名字。
  • 61. application - 从创建Bean开始,就能在任何使用相同application的JSP文件中使用Bean。这个Bean存在于整个application生存周期内,任何在分享此application的Jsp文件都能使用同一Bean。能够使用application对象访问这个Bean,比如application.getAttribute(bean_Name)。其中 bean_Name是Bean实例化的名字。  
  • 62. 3.class="package.class" 使用new关键字以及class构造器从一个class中实例化一个bean。这个class不能是抽象的,必须有一个公用的,没有参数的构造器。这个package的名字区别大小写。 如果该Bean不在作用域内,则将它实例化。也可以使用type属性并结合class属性来指定要将何种类型的Bean实例化。如果使用类属性,不要同时指定Bean_name属性。
  • 63. <% /* *实例化bean: com.myco.Customer,并把对象存放在页面上下文(PageContext)中, *该实例对象只能在当前页面通过customer访问 */ %> … <%=customer.getName()%>
  • 64. 4 .beanName .class文件的名称、Bean包名或者包含该Bean的串行化文件(.ser文件)。仅当Bean不存在域指定的作用域时,才使用此属性。还必须使用类型属性来指定要将何种类型的Bean实例化。 BeanName属性不能与class属性一起使用。此值区分大小写。
  • 65. 5.type 如果此属性与class或者beanName属性一起使用,它指定要实例化的Bean的类或接口。如果type属性未能与class或者beanName属性一起使用,则不将新的Bean实例化,而且type属性指的是已在作用域内的Bean。此值区分大小写。
  • 66. 6. Properties tags 标记列表,它设置实例化的Bean的初始特性值。
  • 67. 4.4.2 设置Bean的属性值.  JSP 语法格式如下:
  • 68. 属性1.name="beanInstanceName" 该属性对应中的id,因此name要和的id一样 。 2.property="*" 这是一种设置Bean属性的快捷方式。储存用户在JSP输入的所有值,用于匹配Bean中的属性。JSP解释器将把系统Request对象中的参数一个一个的列举出来,检查这个JavaBean的属性是否和Request对象中的参数有相同的名称。如果有,就自动将Request对象中参数值传递给相应的JavaBean属性。 在Bean中,属性的名字、类型必须和request对象中的参数名成相匹配。由于表单中传过来的数据类型都是String类型的,JSP内在机制会把这些参数转化成Bean属性对应类型。
  • 69.  property="propertyName" [ param="parameterName" ] 用一个参数值来指定Bean中的一个属性值,一般情况下是从request对象中获得的。其中property指定Bean的属性名,param指定request中的参数名。 在Bean属性的名字和request中参数名字不同时使用这个方法。 Param指定request中的参数名。
  • 70. property="propertyName" value="{string | <%= expression %>}" 使用指定的值来设定Bean属性。这个值可以是字符串,也可以是表达式。如果这个字符串,那么它就会被转换成Bean属性的类型。如果是一个表达式,那么它的类型就必须和将要设定的属性值的类型一致。 如果参数值为空值,那么对应的属性值也不会被设定。此外,不能在同一个“”中同时使用param和value参数 。
  • 71. 下面两行使用请求参数值来匹配Bean中的属 性值。 假设上面两行所在的JSP文件是action-setproperty.jsp。 访问该页面的URL是http://localhost:8080/action- setproperty.jsp?username=liuyongpo。则该URL中的 参数username的值liuyongpo就会自动赋予给user中的属 性username.
  • 72. 下面两各元素使用指定的值来设定Bean属性: />
  • 73. 4.4.3 主要用于获得JavaBean中的属性值 使用之前,必须用创建它。 JSP 语法格式如下:  属性: 1.name="beanInstanceName" 该属性对应中的id,因此name要 和的id一样 。  2.property="propertyName" propertyName是想要取得的属性值。
  • 74. 使用上述三个标签的例子actions-javaBean.jsp <%--设置编码方式--%> <%@ page contentType="text/html;charset=GB2312" %> <%request.setCharacterEncoding("gb2312");%> <%--实例化Student类--%> <%--匹配请求参数中的值--%> <%--age属性被赋指定值--%> 使用存取JavaBean的三个action元素
  • 75. <%if(student.getQuery()){%>

    查询结果:


    <%--取bean中的属性值--%> 姓名:
    学号:
    年龄: <%}%>

    学生

    <%--注意此处的隐藏文本框--%>

    姓名:

    学号:

  • 76.

    Student.java package ch04; public class Student { private String name; private String stuCode; private int age; private boolean query;
  • 77. public Student(){ name="liuyongpo"; stuCode="BY010226"; age=25; query=false; } public void setName(String name){ this.name = name; } public void setStuCode(String stuCode){ this.stuCode = stuCode; } public void setAge(int age){ this.age=age; } public void setQuery(boolean query){ this.query=query; }
  • 78. public String getName(){ return name; } public String getStuCode(){ return stuCode; } public int getAge(){ return age; } public boolean getQuery(){ return query; } }
  • 79. (本页无文本内容)
  • 80. 4.4.4 包含一个静态或动态文件.  JSP 语法格式如下: 1. 的属性1.page="{relativeURL | <%=expression %>}" 参数为一相对路径,或者是代表相对路径的表达式。  2.flush="true" 这里必须使用flush="true",不能使用false值。而缺省值为false 。 
  • 81. 例:下面的例子表示将hello.jsp包含到当前的页面中来。 下面的例子表示将login.jsp包含到当前的页面中 来,同时设置参数username=myvalue:
  • 82. 子句能让你传递一个或多个参数给动态页面。 标签允许你包含动态文件和静态文件,但是这两种包含文件的结果是不同的,如果文件仅仅是静态文件,那么这种包含仅仅是把包含文件的内容加到JSP文件中去,这个被包含的文件不会被JSP编译执行。相反地,如果被包含文件是动态文件,那么这个被包含文件会被JSP编译器执行。 如果被包含文件是动态的,那么还可以用传递参数名和参数值。
  • 83. 和<%@include%>指令不同的是, 包含的内容可以是动态改变的,它在执行时才确定,而前者包含的内容是固定不变的,一经编译,就不能改变 表两种include指令的异同语法状态对象描述<%@include file=“......”%> 编译时包含静态JSP引擎将对所包含的文件进行语法分析 运行时包含静态和动态JSP引擎将不对所包含的文件进行语法分析例jsp_include.jsp传递参数
  • 84. 主要用于将客户端的请求从一个JSP页面跳转到另一个JSP页面。 JSP 语法格式如下: 1."} /> 2."} > [] (“[]”指可以有多个“”标记。) 4.4.5
  • 85. 属性:1、page="{relativeURL | <%= expression %>}" 这里是一个表达式或是一个字符串用于说明你将要定向的文件或URL。这个文件可以是JSP,程序段,或者其它能够处理request对象的文件(如asp,cgi,php)。 
  • 86. 2. 向一个动态文件发送一个或多个参数,这个文件必须是动态文件。如果想传递多个参数,可以在一个JSP文件中使用多个“”;“name”指定参数名,“value”指定参数值。
  • 87. 注意“”标签从一个JSP文件向另一个文件传递一个包含用户请求的request对象。“”标签以后的代码,将不能执行。
  • 88. 例子 (action-forwardTo.jsp)<%@ page contentType="text/html;charset=gb2312" %> test
  • 89. forwardTo.jsp<%@ page contentType="text/html;charset=gb2312" %> <% String useName=request.getParameter("userName"); String outStr= "谢谢光临!"; outStr+=useName; out.println(outStr); %>
  • 90. 运行结果(TOMCAT)
  • 91. 操作典型的使用就是登录。如进行权限验证的页面。当验证通过后,就把页面forword到登录成功的页面;当验证不通过时,就把页面forword到登录页面。 例checklogin.jsp,登录验证界面,如果验证成功,它把页面forword到success.jsp页面,如果不成功,它把页面forword到logion.jsp页面进行重新验证。
  • 92. 4.4.6 传递参数給JSP程序。 语法: 元素使用时必须要设定其name属性表示传递参数的名称,value属性用來设定该参数的值。 JSP操作元素和HTML不同,设定元素的属性时必须加上双引号 ""。 在JSP程序中以如下的程序代码來获取该参数的值。 request.getParameter(“参数名称"); 操作元素的使用必须配合以及等元素。
  • 93. 小结本局面集中介绍了JSP的各种语法,掌握这些语法使读者进行JSP开发的基本要求,于一般的网页开发不同,JSP对大小写是敏感的,这一点要注意,尤其是对曾使用过其他开发语言的读者。 与Bean相关的几种语法的使用将在“Bean的使用”一章中专门进行讲解,因此可对照学习。熟练使用这些语法是必须的,因此读者应该多加练习,观察不同用法所产生的效果上的差异。对于给出的例子最好是自己敲入文件并观察执行结果。 随后的几章将各有重点的讲述与语法相关的一些问题。