【JSP 】第2章 jsp语法

基本结构

在传统的HTML页面文件中加入Java程序片和JSP标签,就构成了一个JSP页面。
JSP页面可由5种元素组合而成:

  • ① 普通的HTML标记符;
  • ② JSP标记,如指令标记、动作标记;
  • ③ 变量和方法的声明;
  • ④ Java程序片;
  • ⑤ Java表达式

当服务器上的一个JSP页面被第一次请求执行时

JSP引擎jsp页面文件 转译成 Java文件 再编译成 字节码文件 然后执行字节码文件响应用户请求

JSP引擎为每个用户启动一个线程, 该线程负责执行常驻内存的字节码文件来响应相应用户的请求

这些线程由Tomcat服务器来管理,将CPU的使用权在各个线程之间快速切换,以保证每个线程都有机会执行字节码文件。

下面这页面包含了五种元素
在这里插入图片描述

在“<%!”和“%>”标记符号之间声明变量和方法。

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

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

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

在“<%”和“%>”之间插入Java程序片。一个JSP页面可以有许多程序片,这些程序片将被JSP引擎按顺序执行
程序片中声明的变量称为JSP页面的局部变量 。
多个客户请求一个JSP页面时,Java程序片将被执行多次,分别在不同的线程中执行

在这里插入图片描述
通过synchronized方法操作一个成员变量来实现一个简单的计数器

<%@ page contentType="text/html;Charset=gb2312" %>
<HTML><BODY>
    <%! int count=0;                //被用户共享的count
        synchronized void setCount()  //synchronized修饰的方法
        {   count++;
        }
    %>
    <%  setCount();
         out.println("您是第"+count+"个访问本站的用户");   
    %>
</BODY></HTML>

可以在“<%=”和“%>”之间插入一个表达式,

可以在“<%=”和“%>”之间插入一个表达式,这个表达式必须能求值。表达式的值由服务器负责计算,并将计算结果用字符串形式发送到用户端显示。

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

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


<%@ page contentType="text/html;charset=gb2312" %>
<HTML><body  bgcolor=cyan><font size=3>
<%  int x=12,y=9;%>
  计算表达式x+y+x%y,<%=x%>+<%=y%>+<%=x%>%<%=y%>的值: 
  <%= x+y+x%y %>
<br>计算表达式x>y即<%=x%> > <%=y%>的值:
  <%= x>y %>
<br>计算表达式sin(<%=Math.PI %>/2)的值:
    <%= Math.sin(Math.PI/2)%>
<br> 
<%  if(x-y>=0) {%>     
	   如果<%=x%>大于<%=y%>计算<%=x%><%=y%>
       的差:<%=x-y%>的平方根:
       <%=Math.sqrt(x-y)%>
<%  }
%>
</font></body></HTML>

注释

注释可以增强JSP页面的可读性,使JSP页面易于维护。JSP页面中的注释可分为两种。

  • HTML注释:在标记符号“ ”之间加入注释内容:
    JSP引擎把HTML注释交给用户,因此用户通过浏览器查看JSP页面的源文件时,能够看到HTML注释。
  • JSP 注释:在标记符号“<%–”和“–%>”之间加入注释内容:<%-- 注释内容 --%>
    JSP引擎忽略JSP注释,即在编译JSP页面时忽略JSP注释。

配置指令

page 指令用来定义整个JSP页面的一些属性和这些属性的值,属性值用单引号或双引号括起来。可以用一个page指令指定多个属性的值 ,也可以使用多个page指令分别为每个属性指定值 .
page指令的作用对整个JSP页面有效与其书写的位置无关,习惯把page指令写在JSP页面的最前面。
例如:

  <%@ page   属性1=“属性1的值”  属性2= “属性2的值”  ……%><%@ page   属性1="属性1的值"  %>
   <%@ page   属性2="属性2的值"  %>
  … …
   <%@ page   属性n=“属性n的值”  %> 

page 指令标记可以指定如下属性的值:

contentType、import、language、session、buffer、auotFlush 、isThreadSafe.

contentType属性

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

例如:用户的浏览器启用HTML解析器来解析执行所接收到的信息
<%@ page contentType="text/html;charset=GB2312" %>
用户的浏览器启用本地的MS-Word应用程序来解析执行收到的信息
<%@ page contentType=“application/msword” %>

contentType属性的默认值"text/html ; charset=ISO-8859-1“
注:不允许两次使用page 指令给contentType属性指定不同的属性值 .

language属性

language属性定义JSP页面使用的脚本语言,该属性的值目前只能取"java"。
例如:
<%@ page language="java" %>
注:JSP页面默认有如上page指令

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.;

session属性

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

buffer属性

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

   `<%@ page buffer= "24kb" %>`

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

autoFlush属性

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

autoFlush可以取值true或false。

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

isThreadSafe属性

isThreadSafe属性用来设置JSP页面是否可多线程访问。

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

info属性

info属性的属性值是一个字符串,其目的是为JSP页面准备一个常用且可能要经常修改的字符串。例如,
<%@ page info= "we are students" %>

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

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

include 指令标记

语法格式 <%@ include file= "文件的URL " %>

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

静态插入

就是当前JSP页面和插入的文件合并成一个新的JSP页面,
然后JSP引擎再将这个新的JSP页面转译成Java文件

因此,插入文件后,必须保证新合并成的JSP页面符合JSP语法规则,即能够成为一个JSP页面文件。

比如,被插入的文件是一个JSP页面,该JSP页面使用page指令为contentType 属性设置了的值:<%@ page contentType="application/msword" %>

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

因为JSP页面中的page指令只能为contentType指定一个值。
使用include指令可以实现代码的复用

include 动作标记

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

<jsp:include page= "文件的URL">
param子标记
</jsp:include>
include动作标记告诉JSP页面动态包含一个文件,即JSP页面运行时才将文件加入。

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

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

param标记

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

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

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

在这里插入图片描述

forward动作标记

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

<jsp:forward page="要转向的页面" >
param子标记
</jsp:forward>
该指令的作用是:从该指令处停止当前页面的执行,而转向执行page属性指定的JSP页面。

需要注意的是,当forward动作标记不需要param子标记时,必须使用第一种形式

forward标记可以使用param动作标记作为子标记,向转向的页面传送信息。

forward动作标记指定的要转向的JSP文件可以使用Tomcat服务器提供的request内置对象获取param子标记中name属性所提供的值。

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

useBean 动作标记

该标记用来创建并使用一个Javabean,是非常重要的一个动作标记,将在第4章详细讨论。

Sun公司倡导的是:Javabean负责存储数据,JSP页面显示Javabean中的数据,而servlet负责管理Javabean中的数据(见第6章)

小结

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

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

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

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

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值