jsp笔记
1、java脚本
<%=...%>: java表达式,用于输出一条表达式(或变量)的结果
<%--...--%>: 注释,不会发送到客户端
<%!...%>: 声明,用来创建类的成员变量和成员方法
<%...%>: java代码片段,用于输出java语句
九个内置对象
- out: jsp的输出流,用来向客户端响应(等同于response.getWriter())
- page: 当前jsp对象! 它的引用类型是Object,即真身中有如下代码:Object page = this;
- config: ServletConfig对象!
- pageContext: 一个顶9个!域对象
- request: HttpServletEequest对象
- response: HttpServletResponse对象
- exception: Throwable对象
- session: HttpSession对象
- application: ServletContext对象
- pageContext
- Servlet中有三大域,而JSP中有四大域,它就是最后一个域对象!
- ServletContext:整个应用程序
- session:整个会话(一个会话中只有一个用户)
- request:一个请求链!
- pageContext:一个jsp页面!(通常在使用el的时候使用此对象)这个域是在当前jsp页面和当前jsp页面中使用的标签之间共享数据!
- 域对象
- 代理其他域:pageContext.setAttribute("xxx", "XXX", PageContext.SESSION_SCOPE);
- 全域查找:pageContext.findAttribute("xxx");从小到大,依赖查找!
- 获取其他8个内置对象:
- Servlet中有三大域,而JSP中有四大域,它就是最后一个域对象!
2、jsp三指令
- page: 比较复杂:<%@page language="java" info="xxx"...%>
- pageEncoding和contentType:(不设置,默认编码为iso)
- pageEncoding:设置响应头,(直接指定编码,默认MIME类型)等同与response.setContentType("text/html;charset=utf-8");
- contentType:添加一个响应头:Content-Type!(可以指定其他文本编码)等同与response.setContentType("text/html;charset=utf-8");
- import:导包!可以出现多次
- errorPage和isErrorPage
- errorPage:当前页面如果抛出异常,那么要转发到哪一个页面,由errorPage来指定
- isErrorPage:它指定当前页面是否为处理错误的页面!当该属性为true时,这个页面会设置状态码为500!而且这个页面可以使用9大内置对象中的exception!
- autoFlush和buffer
- autoFlush:指定jsp的输出流缓冲区满时,是否自动刷新!默认为true,如果为false,那么在缓冲区满时抛出异常!
- buffer:指定缓冲区大小,默认为8kb,通常不需要修改!
- isELIgnored:是否忽略el表达式,默认值为false,不忽略,即支持!
- pageEncoding和contentType:(不设置,默认编码为iso)
- include:静态包含
- 将另一个jsp文件搬过来
- <%@include%> 它是在jsp编译成java文件时完成的!他们共同生成一个java(就是一个servlet)文件,然后再生成一个class!
- 作用:把页面分解了,使用包含的方式组合在一起,这样一个页面中不变的部分,就是一个独立jsp,而我们只需要处理变化的页面。
- taglib:
- 两个属性:
- prefix:指定标签库在本页面中的前缀!由我们自己来起名称!
- uri: 指定标签库的位置!
- <%@taglib prefix="s" uri="/struts-tags"%> 前缀的用法<s:text>
- 两个属性:
3、JSP动作标签
这些jsp的动作标签,与html提供的标签有本质的区别。
动作标签是由tomcat(服务器)来解释执行!它与java代码一样,都是在服务器端执行的!
html由浏览器来执行!
- <jsp:forward>:转发!它与RequestDispatcher的forward方法是一样的,一个是在Servlet中使用,一个是在jsp中使用!
- <jsp:include>:包含:它与RequestDispatcher的include方法是一样的,一个是在Servlet中使用,一个是在jsp中使用!
- <jsp:param>:它用来作为forward和include的子标签!用来给转发或包含的页面传递参数!
4、EL表达式(在页面中使用)
EL替代的是<%= ... %>,也就是说,EL只能做输出!
EL表达式读取数据
- EL表达式只能读取四大域的对象(pageContext,request,sission,application)
- 若对象为空,不显示也不报错
- ${xxx},全域查找名为xxx的属性,如果不存在,输出空字符串,而不是null。
- ${pageScope.xxx}、${requestScope.xxx}、${sessionScope.xxx}、${applicationScope.xxx},指定域获取属性!
- ${xxx.name}、${xxx['name'} 调用xxx对象的getname()方法
- ${xxx[0]} 访问数组或List(不能访问Set,因为Set无序,没有索引)
- ${xxx.student.name} 访问Map,student为键,访问Map中的student的name
- ${empty name}: name为未定义变量、null、空字符串、没有元素的数组后List,返回true
EL可以输出的东西都在11个内置对象中
- 11个内置对象,其中10个是Map! pageContext 不是map,它就是 PageContext 类型
- pageScope
- requestScope
- sessionScope
- applicationScope
- param: 对应参数,它是一个Map,其中key参数名,value是参数值,适用于单值的参数。底层调用request.getParameter();
- paramValues: 对应参数,它是一个Map,其中key参数名,value是多个参数值,适用于多值的参数。返回的是数组。底层调用request.getParameterValues();
- initParam: 获取<context-param>内的参数!底层调用servletContext.getInitParameter();
- header: 对应请求头,它是一个Map,其中key表示头名称,value是单个头值,适用于单值请求头
- headerValues: 对应请求头,它是一个Map,其中key表示头名称,value是多个头值,适用于多值请求头
- cookie
- pageContext: 它是PageContext类型!项目名: ${pageContext.request.contextPath}
EL函数库(由JSTL提供的)
- 导入函数库:<%@ tablib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
- String toUpperCase(String input):把参数转换成大写
- String toLowerCase(String input):把参数转换成小写
- int indexOf(String input, String substring):从大串,输出小串的位置!
- boolean contains(String input, String substring):查看大串中是否包含小串
- boolean containsIgnoreCase(String input, String substring):忽略大小写的,是否包含
- boolean startsWith(String input, String substring):是否以小串为前缀
- boolean endsWith(String input, String substring):是否以小串为后缀
- String substring(String input, int beginIndex, int endIndex):截取子串(前闭后开)
- String substringAfter(String input, String substring):获取大串中,小串所在位置后面的字符串
- substringBefore(String input, String substring):获取大串中,小串所在位置前面的字符串
- String escapeXml(String input):把input中“<”、">"、"&"、"'"、""",进行转义
- String trim(String input):去除前后空格
- String replace(String input, String substringBefore, String substringAfter):替换
- String[] split(String input, String delimiters):分割字符串,得到字符串数组
- int length(Object obj):可以获取字符串、数组、各种集合的长度!
- String join(String array[], String separator):联合字符串数组!
自定义函数库
- 写一个java类,类中可以定义0~N个方法,但必须是static,而且有返回值的!
- 在WEB-INF目录下创建一个tld文件
- 文件约束可以参考 jsp2-example-taglib.tld 文件
- 也可以参考 jsp2.tld笔记.txt
- 在jsp页面中导入函数库
- <%@ taglib uri="<uri>" prefix="<tlib-version>" %>
- 在jsp页面中使用自定义的函数:${<short-name>:<name>() }
5、自定义标签
自定义标签:
- 自定义java类,继承SimpleTag接口,或继承其实现类SimpleTagSupport,重写doTag()方法,需要在tld文件中声明
- SimpleTagSupport
- public void doTag(): 子类重写该方法,实现对标签的操作
- protected JspContext getJspContext(): 获取PageContext对象
- protected JspFragment getJspBody(): 获取标签体
- JspFragment:
- public abstract void invoke(java.io.Writer out): 输出到指定输出流(如果给的是null,则默认PageContext.getOut()流)
- 可以将其输出到StringWriter流中,然后调用StringWriter.toString()方法得到字符串
- JspFragment:
- 标签的属性反映到标签处理器中就是一个变量,为变量添加setxxx()方法即可得到属性值
- SimpleTagSupport
核心标签库(由JSTL提供的)
- 导入标签库: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
- <c:set>: 存储变量
- 属性:
- var: 变量名
- property:要修改的变量名
- value: 变量值
- target:修改的属性所属的对象
- scope: 指定存放的域(默认pageContext)
- 属性:
- <c:out>:输出
- 属性:
- value:要输出的内容
- default:输出的默认值
- escapeXml:是否忽略XML特殊字符(默认true)
- 属性:
- <c:remove>:删除变量
- 属性:
- var: 变量名
- scope: 变量所属的域(默认所有域)
- scope: 指定域(默认删除所有域)
- 属性:
- <c:url>:将URL格式化为一个字符串,然后存储在一个变量中
- 属性:
- value:指定路径(以'/'开头会自动添加项目名)
- var:变量名(指定后就不会输出到页面,而是保存到变量中)
- 子标签
- <c:param>:给url添加参数
- 属性:
- name:参数名
- value:参数值
- 属性:
- <c:param>:给url添加参数
- 属性:
- <c:catch>:标签体中若发生异常,则将错误信息保存到标签属性var中
- <c:if>:判断表达式的值,如果表达式的值为真则执行
- 属性:
- test:条件
- var:用于存储条件结果的变量
- scope:var属性的作用域
- 属性:
- <c:choose>:与if()else if()else语句的功能一样(无属性)
- 子标签:
- <c:when>:与else if语句一样(属性:test 条件)
- <c:otherwise>:与else语句一样(无属性)
- 子标签:
- <c:forEach>:迭代一个集合、数组中的对象。
- 在标签体中对var对象进行操作,var要用el表达式取出
- 属性:
- items:要被循环的信息
- begin:开始的元素
- end:最后一个元素
- step:每一次迭代的步长
- var:代表当前条目的变量名称
- varStatus:代表循环状态的变量名称
- 属性:
- count: 当前已遍历元素个数
- index: 当前元素下标
- first: 是否为第一个元素
- last:是否为最后一个元素
- current: Object,表示循环的变量
- 属性:
- <c:forEach var="i" begin="1" end="10"></c:forEach>其等同于for(int i = 1; i <= 10; i++);
- <c:forEach items="${strs }" var="str"></c:forEach>等同于for(Object str : strs){}
格式化标签库:(由JSTL提供的)
- 导入标签库:<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
- <fmt:formatDate>:使用不同的方式格式化日期
- 属性:
- value: 要显示的日期
- pattern: 自定义格式模式(yyy-MMM-dd)
- var: 存储格式化日期的变量名(默认显示在页面)
- scope: 存储变量的域
- 属性:
- <fmt:parseDate>:将字符串解析成日期
- 属性:
- value:要显示的日期
- pattern:自定义格式模式
- var: 存储格式化日期的变量名(默认显示在页面)
- scope: 存储变量的域
- 属性:
- <fmt:formatNumber>:用于格式化数字、百分比、货币
- 属性:
- value:要显示的数字
- pattern: 自定义格式
- groupingUsed:是否对数字分组(TRUE或FALSE)
- maxIntegerDigits:整型数最大的位数
- minIntegerDigits:整型数最小的位数
- maxFractionDigits:小数点后最大的位数
- minFractionDigits:小数点后最小的位数
- var: 存储格式化数字的变量
- scope: var属性的作用域
- 属性:
- <fmt:parseNumber>: 用来解析数字、百分数、货币
- 属性:
- value:要解析的数字
- type: 类型(NUMBER(默认)、CURRENCY、PERCENT)
- integerOnly: 是否只解析整型数(true)或浮点数(false)
- 属性:
JSTL标签库 函数引入
以下任选一种即可:
(1)将 Tomcat\webapps\examples\WEB-INF\lib目录下的jar包复制到项目的\WEB-INF\lib目录下
(2)下载jakarta-taglibs-standard-1.1.2.zip 包并解压,
将jakarta-taglibs-standard-1.1.2/lib/下的两个jar文件:
standard.jar和jstl.jar文件拷贝到/WEB-INF/lib/下
(3)下载tomcat的Taglibs,将/lib下的文其拷贝到/WEB-INF/lib/下