JSP深入
之前了解了JSP的基本原理。现在开始更深入的学习
JSP的注释
支持三种注释
1,JSP注释<%-- --%>只存在JSP代码源码中,当被翻译成Servlet时,这类注释会消失,不会在编译成的文件中存在
2,java注释,/** */文档注释,生成javadoc,主要用来注释包,类,成员变量成员方法
/* */多行注释和单行注释//,注释代码实现逻辑。
该类注释在被翻译成Servlet时,注释存在,但是执行时会忽略注释,不会在生成的HTML代码中存在
3.HTML注释<!-- -->
在JSP翻译为Servlet时,会被翻译out.print打印出的语句,在HTML页面源代码该类注释是存在的。
JSP指令元素
用于指示JSP执行某些步骤和特定行为
语法格式
<%@ directive[attribute="value"]*%>
指令的分类
page指令标记
语法格式<%@ page[attribute="value"]*%>用来定义JSP文件的全局属性
常用属性
1,language;声明脚本的种类,暂时只能支持java
2,extends;表名JSP编译时需要加入的java全类名,内部的类都会继承自该类,所以一般不设置,如果设置的话改类必须是Servlet的一个实现类
3,session;指定JSP中是否可以直接使用Session对象,默认为true,编译成serlvet时会自动提供session的空引用
HttpSession session=null;
session=PageContext.getSession();
这样就可以直接在JSP文件中操作session对象
4,import属性;完成JSP翻译后Servlet的导包工作
jsp在翻译为Servlet时会默认导包
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
5,buffer autoFlush属性设置out隐含对象属性
buffer设置缓冲区大小,autoFlush设置当前缓冲区满后,自动刷出。
6,isELIgnored设置是否执行EL表达式是否解析,默认为false
7,contentType和pageEncoding设置JSP页面编码,pageEncoding是JSP文件保存在硬盘上的编码格式。contentType传递的是jsp文件编译成Servlet时所采用的编码格式
8,errorpage和isErrorpage用来设置错误页面之后的跳转,errorpage用于指定发生错误时跳转的页面
错误页面处理的方式一般不通过设置属性这种方法来完成,而是在web.xml进行配置,这种配置可以全局处理错误页面。
<error-page>
<error-code></error-code>
<location></location>
</error-page>
include指令标记
用来静态的包含页面,将页面公共部分提取出来,通过include完成页面布局
语法格式<%@ include file="url"%>
要注意include包含被包含页面的整个内容,被包含页面可以不是一个完整的HTML文件,可以只是一个HTML片段。
静态包含不管包含几个jsp页面,最终生成的目标servlet文件都是只有一个,将被包含的jsp页面翻译成的servlet语句进行了合并。
taglib指令标记
用来在jsp页面引用标签库文件
定义标签的作用是为了简化jsp页面的开发,常用标签库jstl
<%taglib uri="" prefix=""%>
uri定义标签唯一命名空间
prefix命名空间的前缀
JSP的九大内置对象
JSP文件翻译成Servlet时这些对象是默认已经创建好的
request HttpServletRequest -----请求对象
response HttpServletResponse -----响应对象
session HttpSession -----会话对象
application ServletContext -----Web应用全局唯一对象
out JSPWriter
pageContext PageContext
page this(HttpServlet) -----由当前jsp文件生成的Servlet类文件对象Object类型,一般不使用
config ServletConfig
exception Throwable
pageContext对象
JSP在Servlet的基础上又多了一种page数据范围pageContext页面上下文对象
pageContext.findAttribute("name");
该方法按照page-request-session-application的顺序根据名称就近查找数据范围
pageContext对象中封装了其他八个隐含对象,可以通过方法获得其他对象,得到了pageContext对象就相当于获得了其他对象,常应用于框架的编写
out对象
向浏览器输出信息本身是一个JSPWriter类型,内部使用PriterWriter来实现,拥有独立的缓冲区
可以通过page指令设定缓冲区大小以及是否自动刷新
与response.getWriter()的区别,response.getWriter的缓冲区与out的缓冲区是相互独立的,out缓冲区刷新数据会输出到response.getWriter的缓冲区内,所以out是必须要经过resonse对象进行回写的
JSP常用标签action元素
<jsp:useBean>
使用一个ID和一个给定作用范围和同一ID的JavaBean相关联
<jsp:setProperty>
设置JavaBean的属性值
<jsp:getProperty>
获取JavaBean的属性值
<jsp:include>
请求时文件包含,等价于request.getRequestDispatcher().include(),是动态包含,在运行时执行包含动作,编译时生成多个servlet程序
<jsp:forward>
接收用户输入并将请求分派给另一页面,等价于request.getRequestDispatcher().forward();
<jsp:param>
转发时可以传递的参数,一般嵌套于forward标签内部
EL表达式
功能
1,可以或得JSP四个数据范围内保存的数据(访问JavaBean属性)
${pageScope.属性名称}${requestScope.属性名称}${sessionScope.属性名称}${applicationScope.属性名称}
如果不指定查找范围直接${属性名称}会直接调用pageContext.findAttribute(name)在四个数据范围内一次查找,如果没有找到会返回一个空字符串而不是null
对于存放在数据域范围内的复杂对象例如JavaBean属性,也可以通过EL标签进行获取,此时是将JavaBean作为属性,对象作为属性值,访问对象中的成员直接${pageScope.person.name}获取,对于集合数组对象的获取${pageScope.list[i]}对于map结合${pageScope.map["key"]}
2,EL表达式支持运算
保留关键字and,true,instanceof,empty,div,false等,变量的命名应该避开关键字
3,EL内置11个web开发常用对象
pageScope,requestScope,sessionScope,applicationScope等十一个内置map对象
4,EL可以调用java方法
EL函数库,存在于jstl标签库中,主要是对字符串的处理函数
JSTL标签库
对于要求比较严格的时候,是不允许JSP内部定义脚本元素的,需要使用jstl标签库来实现功能,类似一种书写规范。
JSTL标签库中共分为五个方向
核心标签库(core)
国际化标签库(fmt)
数据库标签sql
XML标签xml
EL函数库fn
每个标签库在jar包中的meta-inf文件夹下都有一个对应的tld文件
通过taglib标签导入标签库
<%@taglib uri="",prefix=""%>具体的uri与prefix值在tld文件中都可以找到,对应着<uri>与<short-name>标签