概念:
1)JSP(Java Server Page)是Java服务器端动态页面技术。是sun公司制订的一种服务器端的动态页面生成技术规范。
2)为什么要使用JSP:因为直接使用Servlet,虽然也可以生成动态页面。但是,编写繁琐(需要使用out.println来输出),并且维护困难(如果页面发生了改变,需要修改Java代码),所以sun指定了JSP规范。
3)与Servlet的关系:JSP其实是一个以.jsp为后缀的文件,容器会自动将.jsp文件转换成一个.java文件(其实就是一个Servlet),然后调用该Servlet。所以,从本质上讲,JSP其实就是一个Servlet。
4)编写:
① 创建一个以“.jsp”为后缀的文件。
②在该文件里面,可以添加如下的内容:
—> HTML(CSS、JS):直接写即可
—> Java代码:
形式一:Java代码片段:<% Java代码 %>
形式二:JSP表达式:<%= Java表达式 %>
形式三:JSP声明:<%! %>
③指令:通知容器,在将.jsp文件转换成.java文件时,作一些额外的处理,比如导包。
—> 语法:<%@指令名称 属性名=属性值 %>
—> import属性:导包。
—> contenType属性:设置response.setContentType的内容。
—> pageEncoding属性:告诉容器.jsp的文件的编码格式,这样,容器在获取jsp文件的内容(即解码)时,不会出现乱码。最好加入,有些容器默认以ISO-8859-1编码。
—> session属性:true/false,缺省值true,如果值为false,则容器不会添加获得session的语句。
—> isELIgnored属性:true/false,缺省值true,如果值为false,则告诉容器不要忽略el表达式。J2EE5.0需要使用isELIgnored=“false",否则EL表达式无效
—> isErrorPage属性:true/false,缺省值false,如果值为true,表示这是一个错误处理页面(即专门用来处理其他JSP产生的异常,只有值为true时,才能使用exception隐含对象去获取错误信息)。
—> include指令:<%@include file="head.jsp" %>
file属性:
①对于页面的公共部分,我们可以使用相同的jsp文件,并使用include指令导入,如此实现代码的优化。
②告诉容器,在将.jsp文件转换成.java文件时,在指令所在的位置插入相应的文件的“内容“(由file属性来指定)。插入的页面并未运行,而是机械的将内容插入。
—> errorPage属性:设置一个错误处理页面。<%@page errorPage="a4.jsp" %>
—> taglib指令:<%@taglib uri="命名空间" prefix="前缀" %>
①uri:在standard.jar/META-INF/c.tld中查找,
②prefix:前缀,用于代表命名空间。
—> jsp:include: <jsp:include page="common/base.jsp" flush=“false"/>
【flush:默认为 false。在同一个 JSP 中,如果不断 include 自己(源文件),在逻辑上会形成死循环。若默认情况下,服务器会等待该文件被读到底端,然后才输出到客户端,并且销毁该次访问的 request 和 response。而当把flush 属性赋为真值时,在缓存累积了一定数据时,服务器会先提供一部分数据给浏览器,并等待后续内容。
由此可以得出结论,在简单页面中,该属性不纳入考虑,而在页面包含大量数据时,为缩短客户端延迟,可将一部分内容先行输出。该属性在 Servlet 中也有对应的应用。】
5)如何运行:
①容器依据.jsp文件生成.java文件(也就是先转换成一个Servlet):
1)HTML(CSS、JS)放到service方法里,使用out.write输出
2)<% %>也放到service方法里,照搬,不改动。
3)<%= %>也会放到service方法里,使用out.print输出。
4)<%! %>给Servlet添加新的属性或者新的方法(转成.java文件后,声明内的部分添加在service方法之外)。 这样就把一个JSP变成了一个Servlet容器。
②容器接下来就会调用Servlet来处理请求了(会将之前生成的.java文件进行编译、然后实例化、初始化、调用相应的方法处理请求)
③隐含对象:
—> 所谓隐含对象(共9个),指的是在.jsp文件里面直接可以使用的对象,比如out、request、response、session、application(ServletContext上下文)、exception、pageContext、config、page。
**exception **:当jsp页面运行时发生了异常,容器会将异常信息封装到该对象,可以使用该对象提供的方法来输出异常的信息。另外,必须在页面设置isErrorPage=“true"指令才能使用该隐含对象。
**pageContext **:容器会为每一个JSP实例(JSP所对应的那个Servlet对象)创建唯一的一个符合pageContext接口的对象,称之为page上下文。该对象会一直存在,除非JSP实例被销毁。它作用:
①绑定数据(绑定的数据只有对应的JSP实例才可以访问):setAttribute、removeAttribute、getAttribute。
②找到其他八个隐含对象
—> 之所以能直接使用这些对象,是因为容器会自动添加创建这些对象的代码。(JSP仅仅是个草稿,最终会变为一个Servlet。)
**注释: **
<c:when test="">
</c:when>
...
<c:otherwise>
</c:otherwise>
</c:choose>
【注意:when和otherwise必须要放到choose标签里面才能使用;when可以出现1次或者多次,otherwise可以出现0次或者1次,表例外】
—> forEach :
1)遍历集合: <c:forEach var="" items="" carStatus=""></c:forEach>
① items 属性:用来指定要遍历的集合,可以使用EL表达式。
② var 属性:指定绑定名,绑定范围是pageContext,绑定值是从集合中取出的某个元素。
③ carStatus 属性:指定绑定名,绑定范围是pageContext,绑定值是一个由容器创建的一个对象,该对象封装了当前迭代的状态。比如,该对象提供了getIndex、getCount方法,其中,getIndex会返回当前迭代的元素的下标(从0开始),getCount会返回当前迭代的次数(从1开始)。
2)指定位置迭代: <c:forEach var="" begin="" end=“"></c:forEach>
① begin :如果指定了items,那么迭代就从items[begin]开始进行迭代;如果没有指定items,那么就从begin开始迭代。它的类型为整数。
② end :如果指定了items,那么就在items[end]结束迭代;如果没有指定items,那么就在end结束迭代。它的类型也为整数。
【注意:forEach还一个属性为 step=“" :迭代的步长。】
—> url : <c:url value="">
①当用户禁止cookie以后,会自动在地址后面添加sessionId。
②当使用绝对路径时,会自动在地址前添加应用名。
③ value 属性:指定地址,在表单提交、链接当中,可以使用该标签。
—> set : <c:set var="" scope="" value=“”> , 绑定一个对象到指定的范围。
// value 属性:绑定值。
—> remove : <c:remove var="" scope=“"> , 解除绑定。
—> catch : <c:catch var=“"> , 处理异常,会将异常信息封装成一个对象,绑定到pageContext对象上。
—> import : <c:import url=“">
* url 属性:指定一个 jsp 文件的地址, jsp 会在运行时调用这个 jsp 。
—> redirect : <c:redirect url=“"> ,重定向到另外一个地址。
* url 属性:指定重定向的地址。
—> out : <c:out value="" default="" escapeXml=“"> , 用于输出 el 表达式的值。
* value 属性:指定输出的值。
* default 属性:指定缺省值
* escapeXml 属性:设置成 true ,会将 value 中的特殊字符替换成相应的实体。缺省值就是 true 。
**JSP标签运行原理:**
容器依据命名空间找到标签的描述文件( .tld 文件),接下来,依据标签的名称找到标签类的类名,然后将该标签实例化,最后,调用标签实例的相应的方法。
【注意:容器会从 WEB-INF 下查找,如果找不到,还会查找 WEB-INF\lib 下的 jar 文件。】
** 自定义标签:**
1) 写一个 Java 类(标签类),且必须继承 SimpleTagSupport 类
2)在 doTag 方法里面(覆盖 doTag 方法),编写相应的处理逻辑。标签有哪些属性,则标签类也有哪些属性,并且类型要匹配。此外,这些属性必须提供相应的 set 方法
3)在 .tld 文件当中,描述该标签。 .tld 文件可以放在 WEB-INF 下(或它的子文件夹下),也可以放到 META-INF 下,可以参考 c.tld 文件来写。
博客地址:[JavaWeb之JSP](http://xinping.me/#/post/49)