写在前面,先抄一段古文,学一点哲学。
古人之观于天地、山川、虫鱼、鸟兽,往往有得,以其求思之深而无不在也。夫夷以近,则游者众;险以远,则至者少。而世之奇伟、瑰怪,非常之观,常在与险远,而人之所罕至焉,故非有志者不能至也。有志矣,不随以止也,然力不足者,亦不能至也。有志于力,而又不随以怠,至於幽暗昏惑而无物以相之,亦不能至也。然力足以至焉,於人为可讥,而在己为有悔;尽吾志也而不能至者,可以无悔矣,其孰能讥之乎?
本章内容
- JSP代码
- JSP生命周期
- JSP隐式对象
- JSP配置
JSP是为了让Servlet更好地输出html代码而发展起来的,到后来发展称为在页面中使用java代码,即在html中使用java代码。
1,JSP中的指令
JSP中的指令有三种:page、include和taglib。在JSP中指令的写法为:
<%@ page import="foo.*" %>
1.1 page指令有十三个属性,常用的6个属性如下:
- import——定义java import语句。功能是像普通servlet类一样导入包。
- isTHreadSafe——定义生成的servlet是否需要实现SingleThreadModel.默认值为true,正常情况下“应用是线程安全的”,这个值不需要改动。
- contentType——定义JSP响应的MIME类型。
- isELIgnored——定义转换这个页面是否忽略EL表达式。
- isErrorPage——定义当前页面是否是一个JSP的错误页面。默认值是false。当这个值为true时,页面能够访问JSP隐式的exception对象。
- errorPage——定义一个资源的URL,如果有未捕获的Throwable异常,就会发送到这个资源。如果这个属性指定的是一个JSP,该JSP的page指令中就会有isErrorPage=“true”属性。
1.2 include指令。
<%@ include file="wickedHeader.html" %>
include指令定义在转换时增加到当前页面的文本和代码,从而允许你建立可重用的模块(如标准页面标题或导航栏),这些可重用的模块能增加到各个页面上,而不必在每个JSP中重复写所有的这些代码。
1.3 taglib指令
<%@ taglib tagdir="WEB-INF/tags/cool", prefix="cool" %>
taglib指令定义JSP可以使用的标记库。后续补充
2,JSP中的java代码
在JSP中插入java代码很简单,插入的java代码称为scriptlet。
<% out.println("Hello, World"); %>
值得注意的是:JSP中的java代码最终会被容器转化成一个servlet。JSP的生命周期如下:
- 容器读取DD,此时对.jsp没有做任何处理。
- 第一个请求到来,该请求是一个指向jsp的请求,此时容器尝试将jsp中的scriptlet转换成一个servlet类的.java源代码,在这个过程中JSP的语法错误会被发现。
- 容器尝试编译.java文件,在这个过程中java语法错误会被发现。
- 容器加载servlet
- 容器实例化servlet,并且调用jspInit()方法,此时servlet类成为一个真正的servlet,可以接受客户请求。
- 容器创建一个新的线程处理客户的请求,servlet的_jspService()方法运行。
容器根据jsp生成的servlet有三个重要的API:
- jspInit()——这个方法由init()方法调用
- jspDestroy()——这个方法由servlet的destroy()方法调用
- _jspService()——这个方法由servlet的service()方法调用,不能覆盖
JSP中的隐式对象
- out——JspWriter。与response得到的PrintWriter基本相同,只是增加了一些缓冲功能
- request——HttpServletRequest,一个请求对象。
- response——HttpServletResponse,一个响应对象。
- session——HttpSession,一个session对象。
- ServletContext——application,应用上下文对象,可以获取应用上下文参数。
- ServletConfig——config,servlet配置参数,可以获取servlet上下文参数。
- Throwable——exception,isErrorPage=”true”的页面才能获取这个对象,用于错误处理。
- PageContext——pageContext,封装了其它所有的隐式对象,可以向一些辅助类提供pageContext引用。
- Object——page。
3,JSP声明
声明的基本语法如下:
<%! int i = 0; %>
jsp中声明的变量会映射到servlet中的实例变量;声明的方法则映射为servlet中的静态方法。
4,JSP表达式。
JSP中的表达式应该是一个可以打印的对象,因为表达式会称为out.println()方法的参数
表达式的基本语法如下:
<%= "Hello, World" %>
5,JSP的配置和属性
5.1 配置servlet初始化参数
<web-app>
some code
<servlet>
<servlet-name>JspTest</servlet-name>
<jsp-file>TestJsp.jsp</jsp-file>
<!-- 设置初始化参数 -->
<init-param>
<param-name>email</param-name>
<param-value>jsp@csdn.com</param-value>
</init-param>
</servlet>
</web-app>
5.2JSP中属性
可以使用JSP的隐式对象来得到和设置对应的4个属性作用域的属性。比如设置一个应用属性:
application.setAttribute("foo", "hello");
也可以使用pageContext这个隐式对象:
<% pageContext.setAttribute("foo", "hello", PageContext.APPLICATION_SCOPE); %>
总结
JSP实现了在html中引入java代码的功能,但是也使得页面混乱,难以维护,同时也要求页面人员也懂java,这是一个很不现实的做法。