JSP(Java Server Page)Java服务端网页,是一种动态的网页技术,这和.NET中的ASP的功能是一样的。JSP是由sun规定的一套标准一套规范,也是J2EE的13规范之一。说一句不太正确的话“JSP是对HTML的一种升级,一种扩展,即由静态——>动态”。
一,好,简单了解JSP概念以后,我们来看看JSP的原理和本质:
1,先看一个实例,我们在访问主页这个Index.jsp时,程序的执行顺序:
2,由上边这个实例得出的JSP的原理和本质:
上例中的index_jsp.class类继承了HttpJspBase,而HttpJspBase继承了HttpServlet,所以JSP本质就是一个Servlet,和Servlet完全相同。Jsp有三个阶段:翻译(一次),编译(一次),运行(多次)。这也就说明了,为什么我们第一次访问Jsp页面的时候运行的比较慢,而以后访问速度都非常快的原因。但是两者是有很大的区别的:JSP提取数据做页面展示,也就是所谓的View(展示层),而Servlet主要完成业务逻辑处理和资源跳转,也就是所谓的Controller(控制层)。
二,既然是J2EE的13规范之一,那么JSP有哪些规定的基础语法呢?
这几个都是需要我们来来遵循的规范,而其中九大内置对象尤其非常的重要,下边我简单介绍一下,这几块的知识点:
1,scriptlet(小脚本):就是在jsp文件中使用<% %>,出现在该符号中的Java程序翻译之后会被放在Servlet的Service方法中。也就是说这里边可以放我们想要知识的java程序。
2,declaration(声明):就是在jsp文件中使用<%! %>出现在该符号内的java程序翻译之后会被存放在和Servlet的service方法并列的位置上。所以可以在该符号内声明静态变量、静态方法、静态代码块、实例代码块、实例变量、实例方法。
3,expression(表达式):就是在jsp文件中使用<%= %>,相当于out.print();,一般需要我们打印变量是需要在这里,因为JSP里边的全部是字符串。
4,指令(directive):为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分,例如一些编码方式,响应方式等。
a,最常见的page指令<%@page %>:
-
import属性(翻译生成java语言中的import语句)
- <%@page import=”java.util.Date,java.util.ArrayList”%>
-
contentType属性(指定JSP页面响应内容类型)
- <%@page contentType=”text/html”%>
-
pageEncoding属性(指定JSP页面响应的页面字符编码)
- <%@page pageEncoding=”GB18030”%>
-
session属性(指定当前JSP页面是否可以使用session这个内置对象)
- <%@page session=”false”%> session内置对象不可用
- <%@page session=”true”%> session内置对象可用(缺省的)
- errorPage属性(指定当前JSP页面发生错误之后跳转的资源路径)
- isErrorPage属性(指定当前JSP页面是一个错误页面,这样才能使用内置对象exception)
- isELIgnored属性指定当前页面中如果有EL表达式是否忽略,true表示忽略,false表示不忽略
b,include指令<%@include %>:
include指令表示静态包含,例如在a.jsp中编写了<%@include file=”b.jsp”%>,就表示将a.jsp翻译之后的java源程序和b.jsp翻译生成的java源程序合并在一起,然后将其编译生成一个.class文件。我们通常采用这种方式做到页面的重复使用。有点类似.NET中的母版页。
c,taglib指令 <%@taglib%>:
为了让JSP看起来更加的专业(只做页面展示),减少jsp页面中java代码的数量,我们引入了标签库。这里的标签库可以是JSTL函数库,也可以是我们自己编写的。关于JSTL参考JSTL百度科百。
5,动作(Action)
a,forward动作:
<jsp:forward page=”/2.jsp” />
转发:等同Servlet中
request.getRequestDispatcher(“/2.jsp”).forward(req,resp)方法。
b,include动作(注意和include指令的对比,一个是静态包含,一个是动态包含)
<jsp:includepage="/b.jsp"></jsp:include>
include动作表示动态包含,假如在a.jsp页面中编写了以上代码,运行原理是将a.jsp文件 翻译成java源程序并且将其编译生成a.class文件,将b.jsp文件翻译生成java源程序,编译生成b.class文件,然后通过a.class去动态包含b.class。
c,useBean、setProperty、getProperty动作
<useBean id=”c” class=”完整类名”scope=page/request/session/application” />
<setProperty name=”c” property=”name” value=”jack” />
<getProperty name=”c” property=”name” />
useBean、setProperty、getProperty动作是为了简化在JSP页面中的java代码,创建java对象为useBean动作.分别为在某个范围对象中创建某个usebean类,给摸个属性赋值,读取摸个属性的。
6,来看一下JSP中的九大内置对象吧,既然是内置对象也就是说这些对象在JSP底层的java程序中已经声明了这几个对象,我们可以直接使用的:更多九大内置对象
7,EL(Expression Language)表达式:主要也是为了减少JSP页面中的JAVA代码,使之更加专业做起页面显示作用:
表达式:${}
作用:主要是从范围对象中取数据,用来显示在JSP页面上
例子:
request.setAttribute(“sysTime”,new Date()); //存
<%=request.getAttribute(“sysTime”)%>//取数据并输出到浏览器
${sysTime} //使用EL表达式取数据并输出到浏览器
具体的EL表达式的用法,参看这篇博客:EL表达式。
综上为JSP的简单总结,JSP就是Java Web程序中的动态页面显示层,起到了与用户交互的作用,而里边这些语法也好,规范也好,都需要我们按照这些来编写。