1、JSP(JavaServer page)Java服务器页面,从名字上看,它类似于ASP,并且是在服务端编写的一种技术。
2、用于开发动态web页面的技术
为什么它可以用来开发动态web页面呢?这与它在编写时用到的技术有关。它采用HTML来定义页面的结构,但是在jsp中允许编写Java代码,并且允许开发人员在页面中使用request,response,out等对象实现与浏览器的交互,所以jsp也是一种动态web页面开发技术。
举个例子:
输出当前的时间,在html中嵌套Java代码,用<%%>括起来的代码片段
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-size:18px;"><html> <head> <title>jsp中输出当前时间</title> </head> <body> 当前的时间: <% Date date =new Date(); <!--此处实际为Java代码--> Out.write(date.toLocateString()); %> </body> </html> </span></span>
3、经过上面的一段代码后,你是不是会产生这样的疑问呢?为什么在web页面中既有html存在,又有Java代码存在,那jsp在运行时,服务器是如何调用它的呢?它的工作原理是什么呢?
前一篇文章关于Java servlet中已经介绍了servlet的生命周期,也就是它的工作流程,每当在给客户端响应的时候,都是有server来调用service这个方法来对客户端进行响应,而在这里jsp中写的Java代码也可以给客户端进行响应,那么它们二者之间有没有什么必然的联系呢?
其实,jsp经过编译后,被编译成一个jspServlet,也属于一种servlet。而在这个类中,有一个jspService方法,来对客户端的请求进行处理和响应。就拿上面的例子来说,被服务器翻译后的代码如下:
大家从图中可以看到,所有jsp中的内容都会作为service方法中响应给客户端的内容在jspService中进行翻译。
这样就和前面servlet的工作原理对应起来了,我们可以看到在翻译后的jspService中会把客户端可能用到的对象提前准备好,以备客户端随时调用。这就是为什么我们可以直接在JSP中进行调用request和response等这些隐式对象了。
1、JSP页面中的HTML内容称之为模板元素
2、定义了网页的基本骨架,即定义了页面的基本结构和外观
1、用于将程序数据输出到客户端
2、语法<%=变量表达式%>
举例:
<span style="font-family:KaiTi_GB2312;font-size:18px;">当前时间:<%=new Java.util.Date()%></span>
3、JSP引擎在翻译脚本表达式时,会将程序数据转成字符串,然后在相应的位置用out.print()将数据输给客户端
4、jsp脚本表达式中的变量或表达式后面不能有分号(;)
脚本片段即上文中提到的<%%>括起来的Java代码片段,为了与html进行区分,用<%%>进行标识。JSP引擎在翻译Java代码时,会原封不动的讲代码放进jspService方法中,因此,在这里不能出现模板元素的代码。
在这里需要注意的是:
1、一个JSP页面中可以有多个脚本片段,在两个或多个脚本片断直接可以嵌入文本、html标记和其他jsp元素
<span style="font-family:KaiTi_GB2312;font-size:18px;"><% Int x=10; Out.printIn(x); %> <p>这是JSP页面文本</p> <% Int y=20; Out.prinln(x); %> </span>
2、多个脚本片断的代码可以相互访问,犹如所有的代码放在一对<%%>之中的情况。
3、单个脚本片断中的Java语句可以是不完整的,但是,多个脚本片断组合后的结果必须是完整的Java语句
<span style="font-family:KaiTi_GB2312;font-size:18px;"><% For(int i=1;i<5;i++) { %> <H1>www.baidu.com</H1> <% } %> </span>
但如果想要在jsp中为servlet类再声明一个额外的方法,可以采用如下的语法:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><%! public void run(){}%></span>
<%-JSP注释信息-%>
<!--HTML注释信息-->
JSP指令(directive)是为JSP引擎而设计的,他们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。
JSP有三种指令分别是:
1、Page指令
用于定义JSP页面的各种属性,无论Page指令出现在页面的什么地方,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,一般放在JSP页面的起始位置。
<%@page
[language="java"]
[extends="package.class"]
[import="{package.class}"]
[session="true|false"]
[buffer="none|8kb|sizekb"]
[autoFlush="true|false"]
[isThreadSafe="true|false"]
[info="text"]
[errorPage="relative_url"]
[contentType="mimeType[;charset=characterSet]"|"text/html;charset=ISO-8859-1"]
[pageEncoding="characterSet|ISO-8859-1"]
[isEl Ignored="true|false"]
%>
2、Include指令
在一个页面中包含其他页面的指令
<%@include file="/public/head.jsp"%>
上述为静态包含,会将整个页面都包含在当前页面中,所以使用时应慎重,通常将被包含的页面中多余的声明去掉。
另外,还存在一种动态包含指令,在页面中的脚本片段中进行动态声明要包含的内容:
<% Request.getRestDispatcher("/public/head.jsp").include(request,response); %>
用来在页面中导入标签库的一种技术
Request
Response
Session
Application
Config
Page
Out
Exception
pagecontext
再次回顾JSP工作原理:
说起这九大隐式对象,就要回到最开始说的JSP运行原理, JSP在被访问时,web容器会把请求交给JSP引擎,JSP引擎会将JSP翻译成一个JSPServlet,然后按照调用servlet的调用方式进行调用。、
在jspService方法中,会把在JSP页面中所需要的所有的方法全部准备好,以便在JSP页面中进行调用。这些对象就是上面这九大隐式对象。但Exception对象只有在JSP页面中声明后才会在jspService方法中提供,否则默认是没有Exception对象的。
之前我们对request和response对象有了一定的了解,接下来重点了解一下out和PageContext这两个对象
out对象用于向客户端发送文本对象
out对象是通过调用pageContext对象的getOut()方法返回的。其作用和方法与ServletResponse.getWriter方法返回的PrintWriter对象类似。
pageContext对象是JSP技术中最重要的一个对象,它代表了JSP页面的运行环境
1、这个对象不仅封装了对其他8大隐式对象的引用
2、它自身还是一个一个于对象,可以用来保存数据
3、并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如引入和跳转其他资源,检索其它域对象中的属性等。
通过pageContext获得其他八大对象:
为了移除JSP中的Java代码,使用自定义标签技术,此时要新建一个Java类,那么就得传递所有的隐式对象,此时只需要传递一个pageContext对象即可。
以上是关于JSP的一些总结,关于JSP,容易把它认为是一种web客户端开发技术,其实它是在服务器端编写代码的,这一点要区分清楚。此外,JSP中的重点在于理解它的工作原理及他工作中用到的一些隐式对象。当然剩下的还有很多关于JSP技术如JSP映射和自定义标签技术等,还是离不开实践!