Day9 JSP
JSP概述
JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。JSP实际上就是Servlet。
jsp = html + java
html:静态内容
servlet:服务器端的小应用程序。适合编写java逻辑代码,如果编写网页内容--苦逼。
jsp:适合编写输出动态内容,但不适合编写java逻辑。
JSP运行原理
a)当访问index.jsp时,数据是如何进行返回的?
经过翻译和编译的过程,通过流将数据写回。
b)html代码部分
JspWriter.write()
c)java代码部分
原样
d)9大内置对象(service方法)
JSP基本语法
a) jsp指令 <%@ %>
b) jsp模板 html代码
c) jsp的脚本片段
<% java %>
部分脚本片段的代码可以不完整,但是作为整体必须完整。
脚本片段之间可以互相访问。
d) 脚本表达式:输出
<%=表达式|变量 %>
但是不能出现;等字符
e) jsp声明
<%! java %>
翻译到成员位置。
定义成员变量,成员方法,静态方法等
不能使用内置对象。
JSP的指令
控制jsp执行。<%@ page %>
a) page:页面行为
作用:用于定义JSP页面的各种属性
属性
1.1、 import 和java代码中的import是一样的 <%@ page import="java.util.Date,java.util.List"%> 或者: <%@ page import="java.util.Date"%> <%@ page import="java.util.List"%> JSP会自动导入以下的包: import java.lang.*; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; 1.2、 session: 是否会自动创建session对象。默认值是true; 1.3、 buffer: JSP中有javax.servlet.jsp.JspWriter输出字符流。设置。输出数据的缓存大小,默认是8kb. 1.4 errorPage: 如果页面中有错误,则跳转到指定的资源。 errorPage="/uri" 如果写“/”则代表当前应用的目录下,绝对路径。 如果不写“/”则代表相对路径。 1.5、 isErrorPage: 是否创建throwable对象。默认是false; 1.6、 contextType: 等同于response.setContextType("text/html;charset=utf-8"); 1.7、 pageEncoding: 告诉JSP引擎要翻译的文件使用的编码。 1.8、 isELIgnored: 是否支持EL表达式。 默认是false
<error-page> <error-code>500</error-code> <location>/error.jsp</location> </error-page> <error-page> <exception-type>java.lang.Exception</exception-type> <location>/error.jsp</location> </error-page> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.io.File" %>
b) include:包含(静态包含)
<%@include file="header.jsp" %> 文件在翻译的时候进行合并
c) taglib: 导入标签库(jstl)
作用:在JSP页面中导入JSTL标签库。替换jsp中的java代码片段。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
JSP标签
使用标签的形式来表示一段java代码。
如: <jsp:include page="2.jsp"></jsp:include>
<jsp:include > 动态包含
<jsp:forward> 请求转发
<jsp:param> 设置请求参数
<jsp:useBean> 创建一个对象
<jsp:setProperty> 给指定的对象属性赋值
<jsp:getProperty> 取出指定对象的属性值
JSP的内置对象
指在JSP的<%=%> 和<% %>中可以直接使用的对象
对象名 |
类型 |
说明 |
request |
javax.servlet.http.HttpServletRequest |
|
response |
javax.servlet.http.HttpServletResponse |
|
session |
javax.servlet.http.HttpSession |
由session="true"开关 |
application |
javax.servlet.ServletContext |
|
exception |
java.lang.Throwable |
由isErrorPage="false"开关 |
page |
java.lang.Object当前对象this |
当前servlet实例 |
config |
javax.servlet.ServletConfig |
|
out |
javax.servlet.jsp.JspWriter |
字符输出流,相当于 printWriter对象 |
pageContext |
javax.servlet.jsp.PageContext |
|
pageContext
本身也是一个域对象:它可以操作其它三个域对象(request session application)的数据
//设置其他域的数据 pageContext.setAttribute("user", "request", PageContext.REQUEST_SCOPE); <!-- 获取其他域的数据 --> <%-- <%=pageContext.getAttribute("user", PageContext.SESSION_SCOPE) %> --%> pageContext.findAttribute("user") 遍历所有的域获取数据 page request session application
四大域对象
PageContext : pageConext 存放的数据在当前页面有效。开发时使用较少。
ServletRequest: request 存放的数据在一次请求(转发)内有效。使用非常多。
HttpSession: session 存放的数据在一次会话中有效。使用的比较多。如:存放用户的登录信息,购物车功能。
ServletContext: application 存放的数据在整个应用范围内都有效。因为范围太大,应尽量少用。
最佳实践
servlet
java代码方便(数据),展示数据(printWriter)不方便
jsp
java繁琐,展示数据方便
servlet获取数据;
jsp展示数据。
EL表达式
EL表达式:expression language 表达式语言
要简化jsp中java代码开发。
它不是一种开发语言,是jsp中获取数据的一种规范
获取域中的值
pageContext.findAttribute()
${book.bname } <!--获取对象属性 --> ${books[1].bname } <!-- 获取集合中的数据 --> ${maps.name } <!-- 获取map中的值 -->
实现计算
<%-- ${sum + 2 } ${sum >= 1 } ${1>2 and 2>3 } --%> ${empty books } <!--判断是否为空 null "" -->
JSTL标签库
标签库的jar
standard.jar jstl.jar
导入标签库
<%@taglib %>
core:标准标签库
fmt:格式化标签库
%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"% <!-- 页面输出 value:输出的值 支持el表达式 default:默认值 escapeXml:是否转义(默认转义) --> <% request.setAttribute("name", "<p>aa</p>"); %> <%-- <c:out value="${name }" default="aaa" ></c:out> --%> <!-- 用于判断 test:支持el表达式 --> <%-- <c:if test="${1 == 1 }"> 哈哈 </c:if> --%> <c:choose> <c:when test="${1 == 1 }"> 哈哈 </c:when> <c:otherwise> 呵呵 </c:otherwise> </c:choose> <% List<Book> books = new ArrayList(); Book book = new Book(); book.setBname("ls"); books.add(book); book = new Book(); book.setBname("ww"); books.add(book); request.setAttribute("books", books); %> <!-- 用于遍历 items:遍历的内容 支持el表达式 var:每一项的name值 varStatus:状态信息的保存变量 begin:开始的位置 end:结束的位置 step:步长 --> <c:forEach var="book" items="${books }" varStatus="status" > bname=${book.bname } ${status.index }<br/> </c:forEach> <% Date date = new Date(); request.setAttribute("date", date); %> <fmt:formatDate value="${date }" pattern="yyyy-MM-dd HH:mm:ss" />