之前讨论的主要内容是servlet,其实我的本意是只论述一下servlet的,不过既然jsp作为java web开发中不可或缺的一环,所以多学也没有坏处。在之前的内容中我们发现,使用servlet产生动态网页的时候,需要在代码中输出html标签。另外,还不得不将静态代码和动态代码混在一起。如果使用servlet开发动态网页,那么程序员和网页编辑人员就没办法一起工作。因为网页编辑人员可能不了解java,所以没办法修改servlet代码。也正因为这样,sun公司(被甲骨文收购了,真可惜。)才推出了JSP(java server pages)。
简介
或许你了解asp,jsp和asp一样,都是在html文件中嵌入脚本代码,用于产生动态内容,只不过jsp嵌入的是java语句。jsp文件在用户第一次请求时,会被编译成servlet,然后再由这个servlet处理用户请求,所以jsp也可以看做运行时的servlet。说到这儿,你可能会有疑问,既然这样,那么为什么还要用jsp,jsp和servlet的区别在哪?
1)servlet在服务器上执行和解释浏览器的请求,作为客户端和其他应用程序的中间层。servlet主要是把动态的内容混到静态内容中以产生html。
2)jsp页面在html中嵌入java脚本代码和jsp标记,使得文件长度变短,格式更清晰。另外,jsp把静态和动态内容区分开来,实现了内容与表示的分离。
3)使用jsp,不需要单独配置每个文件,只要扩展名是.jsp,jsp容器(也就是servlet容器)就会自动识别,将其转化为servlet。
jsp的运行机制
我们来编写一个简单的jsp文件。首先在D:\apache-tomcat-7.0.33\webapps目录下新建一个文件夹Hello,然后在Hello文件夹中新建文件夹WEB-INF和文件hello.jsp。hello.jsp代码如下:
<html>
<head><title>Hello</title></head>
<body>
<%
out.println("Hello, JSP!");
%>
</body>
</html>
很简单是吧,接下来我们启动tomcat,然后在浏览器网址栏输入http://localhost:8080/Hello/hello.jsp,页面会显示Hello, JSP!。这中间到底经历了什么过程呢?我们打开D:\apache-tomcat-7.0.33\work\Catalina\localhost目录,发现其中有Hello文件夹,打开它,在Hello\org\apache\jsp文件夹中,我们看到了两个文件:hello_jsp.java和hello_jsp.class。这就是在访问hello.jsp时,由jsp容器生成的。
jsp容器管理jsp页面生命周期的两个阶段:转换阶段和执行阶段。当一个请求到来时,jsp容器首先检验jsp语法是否正确,如果正确,将jsp文件转换为servlet文件,然后调用javac编译生成.class文件,这是转换阶段。接下来,servlet容器加载转换后的servlet类,实例化一个对象处理客户端的请求,在请求完成后,响应对象被jsp容器接收,容器将html格式的响应消息发送回客户端,这是执行阶段。
我们现在来学习jsp的语法知识。
jsp页面分为两部分:元素和模板数据。元素是必须由jsp容器处理的部分,而模板数据是jsp容器不处理的部分。如jsp页面中的html语句。jsp中的元素主要有三种类型:指令元素、脚本元素和动作元素。
jsp中的元素类型
1)指令元素(directive element)
指令元素用于为转换阶段提供整个jsp页面相关的信息,指令不会产生任何的输出到当前的输出流中。语法形式为:
<%@ directive {attr="value"}* %>
指令元素主要有三种:page、include和taglib。
page指令语法为:
<%@ page attr1="value1" attr2="value2" ...%>
xml格式的语法为:
<jsp:directive.page attr1="value1" attr2="value2" .../>
page指令有15个属性。language、extends、import、session、buffer、autoFlush、isThreadSafe、info、errorPage、isError、contentType、pageEncoding、isELIgnored、deferredSyntaxAllowedAsLiteral、trimDirectiveWhitespaces。很多是吧?眼花缭乱是吧?其实可以只要大概了解就可以了。具体用的时候可以查资料。这里介绍几个。
language用于指定在脚本元素中使用的脚本语言,为java。extends用于指令jsp页面转化后的servlet类从哪个类继承。import用于指定在脚本环境中可以使用的java类,如果引用了多个类,类中间以逗号隔开。session用于指定jsp页面是否参与会话,值为true或false。errrorPage用于指定当jsp页面发生异常时,转向的错误处理页面。注意,如果使用它指定了错误处理页面,则web.xml文件中定义的错误处理页面不会被使用。contentType指定用于响应的jsp页面的MIME类型和字符编码。pageEncoding用于指定jsp页面使用的字符编码。
include指令用于在jsp页面中静态包含一个文件,该文件可以是jsp页面、html页面、文本文件或一段java代码。include指令语法为:
<%@ include file="relativeRULspec" %>
xml格式的语法为:
<jsp:directive.include file="relativeRULspec" .../>
file属性的值为相对于当前jsp文件的URL。(注:在被包含的文件中最好不要使用<html>等标签,以防和原jsp文件冲突。)
taglib指令允许页面使用用户定制的标签。taglib指令语法为:
<%@ taglib (uri="tagLibraryURI" | tagdir="tagDir") prefix="tagPrefix" %>
xml格式的语法为:
<jsp:directive.taglib (uri="tagLibraryURI" | tagdir="tagDir") prefix="tagPrefix" .../>
taglib指令有三个属性:uri、tagdir、prefix。uri唯一的标识和前缀相关的标签库描述符,可以使绝对火相对的URI。tagdir指示前缀将被用于标识安装在/WEB-INF/tags/目录或其字母下的标签文件。prefix定义一个prefix:tagname形式的字符串前缀,用于区分多个自定义标签。
2)脚本元素(scripting element)
脚本元素包括三个部分:声明、脚本段和表达式。
声明脚本元素用于声明在jsp页面脚本语言中使用的变量和方法声明必须是完整的声明语句,遵循java语言的语法。它不会在当前输出流中产生任何输出。语法如下:
<%! declaration(s)%>
xml格式的声明如下:
<jsp:declaration> declaration(s) </jsp:declaration>
注:在声明变量时,不要忘记变量后面的;号。声明只在当前jsp页面有效。
脚本段是在请求处理期间要执行的java代码段。语法格式如下:
<% scriplet %>
xml格式的脚本段如下:
<jsp:scriplet> scriplet </jsp:scriplet>
表达式脚本元素是java语言中的完整表达式,在请求处理时计算这些表达式,计算结果将被转换为字符串,插入到当前的输出流中。其语法如下:
<%= expression %>
xml格式的语法如下:
<jsp:expression> expression </jsp:expression>
注:在书写表达式时,不要在表达式后添加任何标点符号。
3)动作元素(action element)
动作元素为请求处理阶段提供信息。jsp2.0规范定义了20个标准的动作元素。
<jsp:useBean>、<jsp:setProperty>、<jsp:getProperty>用于访问javaBean。
<jsp:param>以名-值对的形式为其他标签提供附加信息,和<jsp:include>、<jsp:forward>、<jsp:plugin>一起使用。格式如下:
<jsp:param name="name" value="value" />
name给出参数名字,value给出参数值,可以是一个表达式。
<jsp:include>用于在当前页面中包含静态和动态资源,一旦被包含的页面执行完毕,请求处理将在调用页面中继续执行。
<jsp:forward>允许在运行时将当前的请求转发给一个静态的资源、jsp、页面或servlet,请求被转向到的资源必须位于同jsp发送请求相同的上下文中。
其他的动作元素在此不再赘述。有兴趣可以自己查看资料。
4)注释
html注释语法为:
<!-- comments -->
jsp注释语法为:
<%-- comments --%>
另外,还可以使用java语言本身的注释机制,如下:
<% // comments %>
<% /* comments*/ %>
JSP的隐含对象
例如我们在hello.jsp中使用的out对象就是其中之一,除了out之外,还有其他8个隐含对象。这9个隐含对象和它们的类型如表1所示:
隐含对象 | 类型 |
request | javax.servlet.http.HttpServletRequest |
response | javax.servlet.http.HttpServletResponse |
pageContext | javax.servlet.jsp.PageContext |
session | javax.servlet.http.HttpSession |
application | javax.servlet.ServletContext |
out | javax.servlet.jsp.JspWriter |
config | javax.servlet.ServletConfig |
page | java.lang.Object |
exception | java.lang.Throwable |
表1 JSP隐含对象的类型
转载请注明出处:http://blog.csdn.net/iAm333