1,什么是jsp?
一种动态网页技术。一种专门用于进行数据展示的Servlet,普通的Servlet是用于完成业务逻辑处理的。
一样的单例多线程。
2,jsp 的注释
1,<%-- --%> 网页查看源码时不可见
2,<!-- --> 网页查看源码时可见
3,JSP的Java代码块(jsp小脚本)
1,在<% %>中进行编写。
执行顺序与其放置的顺序相关。
2,需要注意的是,jsp小脚本是被翻译到Servlet的_jspService方法中。(相当于Java中的局部变量)
故在JSPJava代码块中,不能出现一些内容:
1,声明的变量不能添加权限访问控制符
2,不能定义方法。
3,不能定义静态语句块。
4,JSP的声明语句块
1,在<%! %>中声明。
2,在这个块的内容,将被翻译到Servlet的实体中,没用包含到所谓的哪个方法中,相当于Java中的成员变量和成员方法。
3,故在这个块中,可以出现。成员变量,静态变量,静态方法,静态代码块,但是不能出现普通的Java语句。
4,值得注意的是,JSP是一种单例多线程的模式,所以成员变量尽量不要声明与使用,因为比较危险。
5,JSP的表达式块
1,<%= %>
2,在JSP页面中输出变量,常量,及它们组成的各种表达式的值。(无分号)
3,翻译到_jspService方法中的out.write()中输出。
6,JSP内置对象(9个)
1,pageContext(最小的那个域)
其所含有的set,get,remove Parameter()的方法基本没用。、
但是其含有的部分get方法可以获得其他8个内置对象。
2,servletContext(application)
Servlet中详细阐述过,不过多阐述。
3,out
4,page(不常用)
即Servlet对象本身。
5,exception
配合page指令使用,当页面中的page指令的isErrorPage属性被指定为true,exception会展示出来。
6,request
7,response
8,session
9,config
7,JSP两大编译指令
关于指令格式:
<%@ 指令名称 属性=属性值 属性2=属性值2 属性3=属性值3 .。。。。。%>
1,page指令(具体变化需要参照Servlet的_jspService方法)
1,pageEncoding 配置当前页面使用的编码格式
2,contentType 配置当前页面的MIME格式和编码格式,一般与1不同时使用
3,import 配置当前页面需要使用的类,可以导入多个类,类与类之间用“,”逗号隔开。
4,errorPage 配置当前页面发生错误后,需要跳转的页面,毕竟总是跳转至404,客户体验感会不好。
5,iserrorPage 配置当前页面是否为错误页面
6,session
2,include指令 <%@ include file="文件名" %>
1,配置指定的文件插入当前页面,值得注意的是,如果插入的是错误页面,那么include将会出现只存在错误页面的问题。
2,file为唯一的属性,专门用来指定要插入的文件。
3,这种include指令引入文件,又称为静态联编,被引入的文件不会生成新的Servlet,而是直接被翻译到_jspService方法。与此同时,局部变量将会共享。
4,使用include可以达到一改全改的效果。
8,jsp动作指令
1,关于指令格式:<jsp:动作名称 属性名=属性值 属性名=属性值 属性名=属性值 。。。。。></jsp:动作名称>
或<jsp:动作名称 属性名=属性值 属性名=属性值 属性名=属性值 。。。。。/>
2,重要的动作名称
1,include 请求转发至对应的page页面
2,forward 请求转发至对应的page页面
以上两个动作均为请求转发,底层调用的是RequestDispatacher的两个方法。
动作指令的include引入文件,称为动态联编,相当于在_jspService方法去调用该类中的其他方法。
动态联编一般应用于文件中重名问题的解决。
3,useBean
4,setProperty
5,getProperty
以上方法与Java类有关,后边阐述
9,EL表达式
1,Expression Language 表达式语言。
一种在JSP文件中获取数据的方式。在JSP页面的任何静态部分(即非代码块,声明块,表达式块)都可以使用${expression}获取数据。
唯一的小缺点,不支持字符串的操作。
2,从域空间中获得数据
在这个板块中,我们用到了在servlet中的相关Attribute方法。
1,四大域
1>pageContext 在该域获取对象,pageScope.属性名
2>requestContext 在该域获取对象,requestScope.属性名
3>sessionContext 在该域获取对象,sessionScope.属性名
4>applicationContext (又名servletContext),application无需创建,故方便使用。 在该域获取对象,applicationScope.属性名
2,访问Bean属性
域名Scope.Bean名.属性名,需要注意的是,在Bean中需要提供对应的get方法,否则无法获取。
eg:${pageScope.student.name},底层调用的是name的get()方法。
3,访问数组,List,Map中的数据
与上述的2的访问基本没啥差别。值得注意的是数组,List的下标越界,不会报错,只是不显示而已。
4,运算符
与Java中的运算符没有什么差别,值得注意的是,empty 这个运算符(布尔类型)。
empty 判断当前对象,字符串,集合等是否定义,是否为空,若是,则为true;
5,EL内置对象(11个,前10个map类型,最后一个为域)
1>pageScope
2>requestScope
3>sessionScope
4>applicationScope
5>param 地址栏请求参数
6>paramValues 地址栏请求参数值
7>initParam servletContext的初始化参数
8>heard 请求头
9>heardValue 请求头的值
10>cookie
11>pageContext
10,EL自定义函数
1,定义函数
定义一个类,通过类中的某个方法(静态,static 公共 piblic)实现所需要的功能
2,注册函数
1>/WEB-INF下添加一个扩展名为.tld的文件,将定义好的函数在这个文件中进行注册。
2>添加约束条件,可在tomcat/weabapps/examples/WEB-INF/jsp2/jsp2-example-taglib中复制。
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
</taglib>
3><tlib-version>1.0</tlib-version> 指定函数库版本号
<short-name>myfunction</short-name> 指定函数库名称,一般与tld文件名一致
<uri>http://www.sxflow.cn/jsp/mytig</uri> 指定所对应函数库的url
4><function>
<name>hello</name> 对应的函数名称
<function-class>cn.sxflow.tiglib.Test01</function-class> 实现功能的类的全名
<function-signature>java.lang.String hello()</function-signature> 实现功能的方法的描述 类的返回值类型(全名) 类名( 参数的类型(全名) )
</function>
3,使用函数
1,<%@ taglib uri = "http://www.sxflow.cn/jsp/mytig" prefix = "myfunction" %>
2,${myfunction:hello() }
11,自定义标签
1,定义标签处理器,实现javax.servlet.jsp.tagext.SimpleTag接口,或者继承javax.servlet.jsp.tagext.SimpleTagSupport(官方的,更为强势)
其中的几个重要方法:
dotag() 服务器端自动调用,核心方法。自定义标签功能的实现均在这个方法中。
getParent() 获得当前标签的父标签的引用。
getJspBody()
getJspContext()
setJspBody()
getJspContext()
2,注册标签处理器,在自定义EL函数的tld文件中的<taglib/>标签下添加类似
<tag>
<name>clientIP</name> 自定义标签名字
<tag-class>cn.sxflow.tiglib.Test02</tag-class> 标签处理器完整类名
<body-content>empty</body-content> 其值有四个选项,empty只是其中一个
</tag>
的这种格式,即完成了对自定义标签的注册。
3,<body-content>的四个值的简单描述
empty 没有标签体
scriptless 自定义的标签具有标签体,但标签体文本不能含有Java脚本,但可以包含 EL表达式,并可以对其进行计算。
tagdependent 会将标签体的内容原样显示在浏览器,EL表达式也不会对其进行计算,而是被当作普通的字符串。
JSP 对继承SimpleTagSupport的标签处理器无法使用,会报错。除此之外,其功能同tagdependent
4,自定义标签的几种类型
1,无标签体
无需多言,上述的三条就是无标签体的创造步骤
2,有标签体
1>定义标签处理器
通过jspBody()获得当前标签的标签体,之后对标签体进行处理,如需将其写入浏览器对应的位置,则需要使用带有缓冲区的字符流,如StringWriter
将jspBody写入输出流中,然后获得JSP的标准输出流对象,然后对从缓存中获取的标签文本进行处理,然后输出给浏览器
2>注册标签浏览器,根据需求选择body-content的类型
3,带属性的标签
1>标签处理器的属性,在其的标签处理器中对应的是一个具有set方法的属性。
2>在标签处理器中,根据标签属性的值进行判断,该执行哪些动作与方法。
3>注册标签处理器的时候,需要在<tag>标签下加入<attribute>自标签,
如:<attribute>
<name>id</name> 属性的名称
<required>true</required> 属性是否必须
<rtexprvalue>true</rtexprvalue> 属性是否支持动态语句,如EL表达式,JSP表达式块。(runtime expression value)
</attribute>
4,以上三种的自由组合
5,自定义标签库的打包发行
12,JSTL
1,JSTL(JavaServer Pages Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,16个对字符串进行处理的函数标签库
2,EL函数标签库
fn:contains(string, substring) 如果参数string中包含参数substring,返回true
fn:containsIgnoreCase(string, substring) 如果参数string中包含参数substring(忽略大小写),返回true
fn:endsWith(string, suffix) 如果参数 string 以参数suffix结尾,返回true
fn:escapeXml(string) 将有特殊意义的XML (和HTML)转换为对应的XML实体字符,并返回转义后的字符
fn:indexOf(string, substring) 返回参数substring在参数string中第一次出现的位置
fn:join(array, separator) 将一个给定的数组array用给定的间隔符separator串在一起,组成一个新的字符串并返回。
fn:length(item) 返回参数item中包含元素的数量。
fn:replace(string, before, after)返回一个String对象。用参数after字符串替换参数string中所有出现参数before字符串的地方,并返回替换后的结果
fn:split(string, separator) 返回一个数组,以参数separator 为分割符分割参数string,分割后的每一部分就是数组的一个元素
fn:startsWith(string, prefix) 如果参数string以参数prefix开头,返回true
fn:substring(string, begin, end)返回参数string部分字符串, 从参数begin开始到参数end位置,包括end位置的字符
fn:substringAfter(string, substring)返回参数substring在参数string中后面的那一部分字符串
fn:substringBefore(string, substring)返回参数substring在参数string中前面的那一部分字符串
fn:toLowerCase(string) 将参数string所有的字符变为小写,并将其返回
fn:toUpperCase(string) 将参数string所有的字符变为大写,并将其返回
fn:trim(string) 去除参数string 首尾的空格,并将其返回
3,核心标签库 http://java.sun.com/jsp/jstl/core
4,格式化标签库 http://java.sun.com/jsp/jstl/fmt
13,关于EL的一些特性
1,不能出现在JSP 动态部分
2,只允许在四大域中获取数据
3,不能抛出空指针异常,不会出现数组下标越界异常
4,不具有处理字符串的能力。