一、JSP脚本元素:
由于都是在一定的格式里起纳入Java代码,因此经常把“表达式”、Scriptlet、“声明”都称为脚本元素。
1.1、JSP表达式:
JSP表达式是对数据的表示,系统将其作为一个值进行计算和显示。示例代码如下所示:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> |
1.2、JSP Scriptlet:
JSP Scriptlet就是在JSP页面里面嵌入一段Java代码,也成为脚本代码段,它在JSP页面中的表现形式为:<% Java代码 %>,代码示例如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> |
1.3、JSP声明:
JSP声明就是在JSP页面中声明Java方法或变量等(用于定义JSP代表的Servlet类的成员变量和方法)。JSP声明在JSP页面中的表现形式为:<%! Java 代码 %>,实例代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> |
有个问题:
当两个或多个线程同时访问同一个共享的变量时,并且一个线程需要修改这个变量时,我们应对这样的问题做出处理,否则可能发生混乱。根据Tomcat服务器的机制,Tomcat会为每个访问网站的用户开启一个新的线程,当多个用户同时请求一个JSP页面时,JSP页面的程序片(<% %>中的)就会被多次调用运行,分别运行在不同的线程中,JSP页面的成员变量和方法(<%! %>)会被多个用户共享和访问。有些JSP页面的方法在操作成员变量,可能不需要被其他用户影响,以免产生不利影响,那么就要使用线程同步了,相当于加了一把锁。这样就能保障不同的用户对于同一个数据的处理时,不会发生混乱。
synchronized修饰的作用为:当一个线程在执行被synchronized修饰的方法时,其他线程想在程序片中调用这个synchronized修饰的方法时就必须等待,直等到方法执行完。
关于线程同步的方法有两种:
1.使用同步块进行线程同步:synchronized(object){要同步的语句}
,实例代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> |
2.使用同步方法进行线程同步:synchronized void methodA(){}
,实例代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> |
二、JSP指令:
(编译指令)相当于在编译期间的命令(换句话说jsp转换成Servlet过程期间需要用到的指令),其中JSP指令包括page、include、taglib等。
2.1、page指令:
Page指令用来定义整个JSP页面的一些属性和这些属性的值。属性值总是用单引号或双引号括起来,可以用一个page指令制定多个属性的值,也可以用多个page为单个属性指定值。
//一个page指令制定多个属性的值 |
另外page指令常用与进行错误页面的跳转,这其中一定会包括两个页面,一个是出错的页面,一个是出错后要跳转到的页面,部分代码如下:
//出错页面的page指令信息 |
2.2、include指令:
include指令用于在运行时将html文件或者jsp页面嵌入到另一个jsp页面(为了代码的复用,写好的jsp页面可以被所有的其他jsp页面进行银行用),部分代码如下所示:
<%-- |
2.3、taglib指令:
taglib指令的作用是在jsp页面中,将标签库描述符文件
引入到该页面中,并设置前缀,而去利用标签的前缀
去使用标签库表述文件中的标签。部分代码如下所示:
<!-- 引入JSTL标签 --> |
三、JSP动作
jsp动作包括include,param,forward,plugin,useBean等动作,详细介绍如下所示:
3.1、param动作:
param标签以“名字–值”对的形式为其他标签提供附加信息,这个标签与jsp:include、jsp:forward、jsp:plugin标签一起使用。param动作标记语法格式如下:
<jsp:param name="名字" value="指定param的值" /> |
3.2、include动作:
include动作的特点为:
- 先处理后包含,生成多个servlet类。即能自动区分包含的文件是静态文件还是动态文件;执行时,如果为静态文件,直接将资源包含处理,与静态包含相同;如果为动态文件,则选各自处理资源,之后将处理后的结果包含在一起。
- 生成多个class文件
- 能传参数
- 不同一个request对象,可以取得包含它的页面的参数,并添加了自己的参数
include动作的标记语法格式如下:
<jsp:include page="文件的URL" /> |
3.3、动态include和静态include的区别如下:
<%@ include file="date.jsp" %>
- include编译指令是在jsp程序的转换时期就将file属性所制定的程序内容嵌入,然后再编译执行;
- 只生成一个class文件
- include不能带参数
- 同一个request对象
<jsp:include page="date.jsp" flush="true" />
- 而include指令在转换期间是不会被编译的,只有在客户端请求时期如果被执行到才会被动态的编译载入。
- 生成多个class文件
- jsp:include可以
- 不同的request对象,可以去的包含他的页面的参数,并添加了自己的参数。
3.4、forward动作:
forward的动作标记语法格式:
<jsp:forward page="文件的URL" /> |
3.5、plugin动作:
plugin标签只是jsp文件加载java plugin,该插件由客户负责下载,并使用该插件负责下载,并使用该插件来运行java applet,其中plugin动作标记语法格式如下:
<jsp:plugin type="applet" code="小应用程序的字节码文件" jreversion="java虚拟机版本号" width="小程序宽度值" height="小程序口高度值"> |
3.6、useBean动作:
useBean标签用来创建并使用一个java beans,是非常重要的一个动作标签。sun公司的倡导是:用html完成jsp页面的静态部分,用javabeans完成动态部分,实现真正意义上的静态和动态分割。