标签:
一个JSP页面可以被分为以下几部份:1)静态数据,如HTML;
2)JSP指令,如include指令;
3)JSP脚本元素和变量;
4)JSP动作;
5)用户自定义标签;
静态数据在输入文件中的内容和输出给HTTP响应的内容完全一致。此时,该JSP输入文件会是一个没有内嵌
Java或动作的HTML页面。而且,客户端每次请求都会得到相同的响应内容。
这个静态数据的本质就是HTML文档。
JSP指令控制JSP编译器如何去生成servlet,以下是可用的指令:
page指令通常位于JSP页面的顶端,同一个页面可以有多个page指令。需要注意的是在同一个JSP文件中只
有"import"导入页面指令可以被多次使用。
page指令语法格式为
<%@ page 属性1="属性值" 属性2="属性值1,属性值2"... 属性n="属性值n" %>
page指令有以下几个选项:
page指令使用样例:
<%@ page import="java.util.*" %> //example import导入样例
<%@ page contentType="text/html" %> //example contentType页面类型样例
<%@ page isErrorPage=false %> //example for non error page无错页面样例
<%@ page isThreadSafe=true %> //example for a threadsafe JSP安全线程JSP样例
我们来看一个样例:在JSP页面中输出当前日期
date.jsp页面源码:
<%@page import="java.text.SimpleDateFormat"%> <%@page import="java.util.Date"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>date页面</title> </head> <body> <% Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日"); String string = sdf.format(date); out.println(string); %> </body> </html>
运行结果:
上面的代码中我们使用page指令分别导入了java.text.SimpleDateFormat和java.util.Date,也是使用page指令指定
当前页面的字符编码格式以及使用的默认脚本语言Java等。
对于更多的page指令,我们深入学习JSP后,会使用得到,逐渐的学习过程就会用到很多的page指令。
include指令是指将一个外部文件嵌入到当前JSP文件中,同时解析这个页面中的JSP语句。include指令,用来向
当前页面插入一个静态文件的内容。这个文件可以是JSP、HTML、文本或是Java程序。
include指令 示包含指令通知JSP编译器把另外一个文件完全包含入当前文件中。效果就好像被包含文件的内容直
接被粘贴到当前文件中一样。这个功能和C语言预处理器所提供的很类似。被包含文件的扩展名一般都是"jspf"(即
JSPFragment,JSP碎片):
include指令语法格式为:
<%@ include file="somefile.jsp" %>
我们来看一个实例:
我们使用上面显示当前日期的页面date.jsp作为被嵌入的J文件。
测试include指令的include.jsp页面的代码:
测试结果:
深入JSP以后我们会比较include指令和include动作的区别。
taglib指令指的是使用标签库定义新的自定义标签,在JSP页面中启用定制行为。taglib指令是标签库指令描述了
要使用的JSP标签库。该指令需要指定一个前缀prefix(和C++的命名空间很类似)和标签库的描述URI。声明用户使用
自定义的标签,将标签库描述符文件导入到JSP页面。
taglib指令的语法格式为:
<%@ taglib prefix="myprefix" uri="taglib/mytag.tld" %>
uri属性:定位标签库描述符的位置。唯一标识和前缀相关的标签库描述符,可以使用绝对或相对URL。
tagDir属性:指示前缀将被用于标识在WEV-INF/tags目录下的标签文件。
prefix属性:标签的前缀,区分多个自定义标签。不可以使用保留前缀和空前缀,遵循XML命名空间的命名约定。
这个我目前还没有使用过,不过可以借鉴别人的文章:JSP中使用taglib。
在JSP页面包含三种注释:
1)HTML注释:
<!--HTML注释--> //客户端可见,通过查看源代码
2)JSP注释:
<%--JSP注释--%> //客户端不可见,服务器端注释
JSP脚本注释:
//单行注释
/**/多行注释 //客户端不可见,在java语句中:服务器端注释客户端看不到
我们还是在JSP页面演示一下:
结果:
JSP脚本是指在JSP页面执行的java代码。
以下是永远可用的脚本变量:
out – JSPWriter用来写入响应流的数据
page – Servlet自身
pageContext –一个PageContext实例包括和整个页面相联系的数据,一个给定的HTML页面可以在多个JSP之间
传递。
request –HttpRequest对象
response –HttpResponse对象
session –用于保持客户端与服务器连接的对象
上述的对象变量我们会在以后经常使用到。后续会详细讲解。
有三个基本的脚本元素,作用是使Java代码可以直接插入Servlet。
1)JSP声明
在JSP页面中定义变量或者方法。声明标签在Java Servlet的类体中放入一个变量的定义。静态的数据成员也可以
如此定义。
JSP声明语法格式为:<%! Java代码 %>
样例:<%! int serverInstanceVariable = 1; %>
实例:
2)JSP脚本
JSP脚本是指在JSP页面执行的Java代码。在Java Servlet的类的_jspService()方法中放入所包含的语句。
JSP脚本语法格式为:<% Java代码 %>
样例:<% int localStackBasedVariable = 1; out.println(localStackBasedVariable); %>
实例:
JSP表达式是在JSP页面中执行的表达式。在Java Servlet的类中放入待赋值的表达式,表达式注意不能以分号结
尾。
JSP表达式语法格式:<%=表达式 %> //注意:表达式不以分号结束
样例:<%= "expanded inline data " + 1 %>
实例:
上述实例的最后浏览器查看结果:
JSP动作是一系列可以调用内建于网络服务器中的功能的XML标签。JSP提供了以下动作:
对于JSP动作,我们在后面会详细的讲解。
JSP页面流程:
JSP生命周期
jspService()方法被调用来处理客户端的请求。对每一个请求,JSP引擎创建一个新的线程来处理该请求。如果有
多个客户端同时请求该JSP文件,则JSP引擎会创建多个线程,每个客户端请求对应一个线程。以多线程方式执行可
以大大降低对系统的资源请求,提高系统的并发量及响应时间。但也要注意多线程的编程带来的同步的问题,由于该
servlet始终驻于内存,所以响应是非常快的。
实例:
结果:
解释:
第一次请求时JSP引擎解析后生成字节码文件时同时执行jspinit()方法:
1)JSP引擎先把该JSP文件转换成一个Java源文件(Servlet),在转换时如果发现JSP文件有任何语法错误,转换过
程将中断,并向服务端和客户端输出出错信息。
2)如果转换成功,JSP引擎用javac把该Java源文件编译成相应的class文件。
3)创建一个该Servlet(JSP页面的转换结果)的实例,该Servlet的jspInit()方法被执行,jspInit()方法在Servlet的生命
周期中只被执行一次。
4)jspService()方法被调用来处理客户端的请求。对每一个请求,JSP引擎创建一个新的线程来处理该请求。如果
有多个客户端同时请求该JSP文件,则JSP引擎会创建多个线程。每个客户端请求对应一个线程。以多线程方式执行
可以大大降低对系统的资源需求,提高系统的并发量及响应时间。但不过也应该注意多线程的编程限制,由于该
Servlet始终驻于内存,所以响应是非常快的。
标签:
原文地址:http://blog.csdn.net/erlian1992/article/details/51887887