Java Web之路(五)JSP
一、jsp的3个指令
JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。
在JSP 2.0规范中共定义了三个指令:
page指令
1、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
<%@ page pageEncoding="gbk" %>
2、include:
静态包含:把其它资源包含到当前页面中。
<%@ include file="/include/header.jsp" %>
动态包含:
<jsp:include page="/include/header.jsp"></jsp:include>
两者的区别:翻译的时间段不同
前者:在翻译时就把两个文件合并
后者:不会合并文件,当代码执行到include时,才包含另一个文件的内容。
原则:能用静的就不用动的。
3、taglib
作用:在JSP页面中导入JSTL标签库。替换jsp中的java代码片段。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
二、jsp的6个动作
使用标签的形式来表示一段java代码。
如: <jsp:include page="2.jsp"></jsp:include>
<jsp:include > 动态包含
<jsp:forward> 请求转发
<jsp:param> 设置请求参数
<jsp:useBean> 创建一个对象
<jsp:setProperty> 给指定的对象属性赋值
<jsp:getProperty> 取出指定对象的属性值
<% Student stu = new Student(); stu.setName("tom"); out.print(stu.getName()); //request.getRequestDispatcher("/7.jsp").forward(request, response); %> <jsp:useBean id="stu1" class="com.itheima.entity.Student"></jsp:useBean> <jsp:setProperty property="name" name="stu1" value="jerry"/> <jsp:getProperty property="name" name="stu1"/> <!-- http://localhost:8080/day11_02_jsp2/6.jsp?name=123 --> <jsp:forward page="/7.jsp"> <jsp:param value="123" name="name"/> <jsp:param value="333" name="pwd"/> </jsp:forward>
三、jsp的9个内置对象(指在JSP的<%=%> 和<% %>中可以直接使用的对象)
1.request
2.response
3.config
4.application
5.exception
6.Session
7.page
8.out
9.pageContext
1、本身也是一个域对象:它可以操作其它三个域对象(request session application)的数据
void setAttribute(String name,Object o);
Object getAttribute(String name);
void removeAttribute(String name);
操作其它域对象的方法
void setAttribute(String name,Object o,int Scope);
Object getAttribute(String name,int Scope);
void removeAttribute(String name,int Scope);
scpoe的值:
PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext.SESSION_SCOPE
PageContext.APPLICATION_SCOPE
findAttribute(String name); 自动从page request session application依次查找,找到了就取值,结束查找。
<body> <% //pageContext.setAttribute("p", "pp"); pageContext.setAttribute("p", "pp", PageContext.PAGE_SCOPE); //pageContext.setAttribute("p", "pp", PageContext.REQUEST_SCOPE); request.setAttribute("p", "request"); //pageContext.setAttribute("p", "pp", PageContext.SESSION_SCOPE); //session.setAttribute("p", "session"); //pageContext.setAttribute("p", "pp", PageContext.APPLICATION_SCOPE); application.setAttribute("p", "application"); //request.getRequestDispatcher("/2.jsp").forward(request, response); //response.sendRedirect(request.getContextPath()+"/2.jsp"); pageContext.forward("/2.jsp"); %> </body>
<body> <% /* String p = (String)pageContext.getAttribute("p"); out.print(p); */ //out.print(request.getAttribute("p")); %> <%-- <%=session.getAttribute("p") %> --%> <%-- <%=application.getAttribute("p") %> --%> <%=pageContext.findAttribute("p") %> </body>
四、四大域对象:实际开发
PageContext : pageConext 存放的数据在当前页面有效。开发时使用较少。
ServletRequest: request 存放的数据在一次请求(转发)内有效。使用非常多。
HttpSession: session 存放的数据在一次会话中有效。使用的比较多。如:存放用户的登录信息,购物车功能。
ServletContext: application 存放的数据在整个应用范围内都有效。因为范围太大,应尽量少用。
五、EL表达式
1、EL概述和基本语法
EL表达式:expression language 表达式语言
要简化jsp中java代码开发。
它不是一种开发语言,是jsp中获取数据的一种规范
2、EL的具体功能
a、获取数据
EL表达式只能获取存在4个作用域中的数据
${u} 原理: pageContext.findAttribute("u");
url?name=tom ${param.name}
EL获取对于null这样的数据,在页面中表现为空字符串
${u.name} == u.getName()方法
点(.) 运算符相当于调了getter方法,点后页面跟的是属性名。
属性导航
[]运算符:点能做的,它也能做; 它能做的,点不一定能做
${student.name}== ${student['name']} == ${student["name"]}
b、运算
empty
判断null,空字符串和没有元素的集合(即使集合对象本身不为null)都返回true
三元运算符
c、隐式对象:11个
EL隐式对象引用名称 类型 JSP内置对象名称 说明
EL隐式对象引用名称 |
类型 |
JSP内置对象名称 |
说明 |
pageContext |
javax.servlet.jsp.PageContext |
pageContext |
一样的 |
pageScope |
java.util.Map<String,Object> |
没有对应的 |
pageContext范围中存放的数据,页面范围 |
requestScope |
java.util.Map<String,Object> |
没有对应的 |
请求范围数据 |
sessionScope |
java.util.Map<String,Object> |
没有对应的 |
会话范围数据 |
applicationScope |
java.util.Map<String,Object> |
没有对应的 |
应用范围数据 |
param |
java.util.Map<String,String> |
没有对应的 |
一个请求参数 |
paramValues |
java.util.Map<String,String[]> |
没有对应的 |
重名请求参数 |
header |
java.util.Map<String,String> |
没有对应的 |
一个请求消息头 |
headerValues |
java.util.Map<String,String[]> |
没有对应的 |
重名请求消息头 |
initParam |
java.util.Map<String,String> |
没有对应的 |
web.xml中全局参数 |
cookie |
java.util.Map<String,Cookie> |
没有对应的 |
key:cookie对象的name值
|
${param.userName } 等价于${param.userName }==request.getParamemter("userName"); ${paramValues.hobby[0] } 取数组的第一个 ${header["User-agent"] } ${cookie.JSESSIONID.value }
<form action="${pageContext.request.contextPath }/success.jsp" method="post"> 用户名:<input type="text" name="userName" /><br /> 密码:<input type="password" name="pwd" /><br /> <input type="submit" value="登录" /><br /> </form>
六、JSTL
1、什么是JSTL
JSTL(JavaServerPages Standard Tag Library)JSP标准标签库
2、JSTL的作用
使用JSTL实现JSP页面中逻辑处理。如判断、循环等。
3、使用JSTL
1)在JSP页面添加taglib指令
2)使用JSTL标签
4、常用标签介绍
核心标签库:
> 通用标签: set、 out、 remove
> 条件标签:if choose
> 迭带标签:foreach