JSP_EL_JSTL概述
JSP:(Java Server Page)
1、什么是jsp:
用于角度来说就是一个网页页面。实际上时一个继承了Servlet的java类。
2、为什么需要jsp:
HTML通常显示的内容都是一成不变的静态页面,但是实际情况中我们所需要的数据都应该是动态生成的,所以需要jsp生成动态页面
3、jsp三大指令介绍:格式:<%@ 指令名字 %>
1)<%@page %>属性介绍:
language:表示jsp页面可以写入什么样的代码,比如java代码
contentType:说明这个文件是什么类型,以及内容是什么样的编码方式
pageEncoding:jsp内容编码
extends:用于指定jsp翻译成java文件后,继承的父类是谁,一般不用改(Servlet)
import: 导包使用的,一般不用手写
session:true/false,用于说明当前页面是否可以直接使用session对象。
底层实现:true,调用getSession()创建内置的session对象;false,不创建session所以用不了
errorPage: 指的是错误的页面, 值需要给错误的页面路径
isErrorPage:上面的errorPage 用于指定错误的时候跑到哪一个页面去。 那么这个isErroPage , 就是声明某一个页面到底是不是错误的页面。
2)<%@include %>:包含另外一个jsp的内容进来
<%@ include file="xxxx.jsp"%>
背后实现:将另一个jsp页面的所有内容拿过来一起输出。
3)<%@taglib %>:
<%@ taglib prefix="" uri=""%>:uri: 标签库路径 prefix : 标签库的别名
4、jsp动作标签:
1)<jsp:include page=""></jsp:include>
包含指定的页面,这里是动态包含。
背后实现:不是把另一个jsp页面所有内容拿过来,而是把另一个jsp页面运行后的结果拿过来
2)<jsp:param value="" name=""/>
包含在某个页面或者跳转到某个页面时候,加入这个参数
<jsp:forward page="xxx.jsp"> <jsp:param value="beijing" name="address"/> </jsp:forward> <%= request.getParameter("address")%>
3)<jsp:forward page=""></jsp:forward>
跳转到另外的一个页面,类似于<% request.getRequestDispatcher("XXX.jsp").forward(request, response);%>
5、jsp九大内置对象:(pageContext、request、session、application,page、response、out、exception、config)
1)四大作用域对象:(pageContext,request,session,application)
这些对象可以存取值,表示它们由一定的范围限定。
a:存值,取值
使用作用域来存储数据<br> <% pageContext.setAttribute("name", "page"); request.setAttribute("name", "request"); session.setAttribute("name", "session"); application.setAttribute("name", "application"); %> 取出四个作用域中的值<br> <%=pageContext.getAttribute("name")%> <%=request.getAttribute("name")%> <%=session.getAttribute("name")%> <%=application.getAttribute("name")%>
b:四大作用域对象的区别:
* pageContext 【PageContext】
> 作用域仅限于当前的页面。
> 还可以获取到其他八个内置对象。
* request 【HttpServletRequest】
> 作用域仅限于一次请求, 只要服务器对该请求做出了响应。 这个域中存的值就没有了。
* session 【HttpSession】
> 作用域限于一次会话(多次请求与响应) 当中。
* application 【ServletContext】
> 整个工程都可以访问, 服务器关闭后就不能访问了。
2)其他内置对象:
exception 【Throwable】
page 【Object】 ---就是这个jsp翻译成的java类的实例对象
config 【ServletConfig】
out 【JspWriter】
response 【HttpServletResponse】
EL表达式:${表达式 }
1、作用:
是为了简化jsp页面中的那些java代码的书写
2、默认的取值顺序
如果从作用域中取值,会先从小的作用域开始取,如果没有,就往下一个作用域取。 一直把四个作用域取完都没有, 就没有显示。
3、使用:
取出作用域普通的值
<% pageContext.setAttribute("name", "page"); request.setAttribute("name", "request"); session.setAttribute("name", "session"); application.setAttribute("name", "application"); %> 按普通手段取值<br> <%= pageContext.getAttribute("name")%> <%= request.getAttribute("name")%> <%= session.getAttribute("name")%> <%= application.getAttribute("name")%> <br>使用EL表达式取出作用域中的值<br> ${ pageScope.name } ${ requestScope.name } ${ sessionScope.name } ${ applicationScope.name }
作用域存储的是数组
<% String [] a = {"aa","bb","cc","dd"}; pageContext.setAttribute("array", a); %> 使用EL表达式取出作用域中数组的值<br> ${array[0] } , ${array[1] },${array[2] },${array[3] }
作用域存储的集合
<% List list = new ArrayList(); pageContext.setAttribute("li", list); %>
${li[0] } , ${li[1] },${li[2] },${li[3] }
<% Map map = new HashMap(); map.put("name", "zhangsna"); map.put("age",18); map.put("address","北京.."); map.put("address.aa","深圳.."); pageContext.setAttribute("map", map); %> 使用EL表达式取出作用域中Map的值<br> ${map.name } , ${map.age } , ${map.address } , ${map["address.aa"] }
4、取值:注意如果取值可以用下标的时候,就用下标。不可以则用.的方式
${ array[1] } ${ u.name }
5、使用场景
一般使用EL表达式比较多的地方,是从一个对象中取值
6、EL表达式的11个内置对象
1)作用域相关内置对象
pageScope、requestScope、sessionScope、applicationScope
2)头信息相关对象
header、headerValues
3)参数相关对象
param、paramValues
4)其他
pageContext、cookie、initParam(全局初始化参数)
JSTL:
JSP Standard Tag Library jsp标准标签库
1、作用:
简化jsp代码编写,替换<%%>写法,一般与EL表达式一起使用
2、使用步骤:
导入jar包;在jsp的taglib中引入标签库;
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
注意:如果想支持 EL表达式,那么引入的标签库必须选择1.1的版本,1.0的版本不支持EL表达式。
3、常用标签:
1)<c:set></c:set>
<!-- 声明一个对象name, 对象的值 zhangsan , 存储到了page(默认) , 指定是session --> <c:set var="name" value="zhangsan" scope="session"></c:set> ${sessionScope.name }
2)<c:if test=""></c:if>
判断test里面的表达式是否满足,如果满足,就执行c:if标签中的输出 , c:if 是没有else的。 注意:test里面要使用EL表达式 <c:set var="age" value="18" ></c:set> <c:if test="${ age > 26 }"> 年龄大于了26岁... </c:if> <c:if test="${ age <= 26 }"> 年龄小于了26岁... </c:if> 定义一个变量名 flag 去接收前面表达式的值,然后存在session域中 <c:if test="${ age > 26 }" var="flag" scope="session"> 年龄大于了26岁... </c:if>
3)<c:forEach></c:forEach>
从1 开始遍历到10 ,得到的结果 ,赋值给 i ,并且会存储到page域中, step , 增幅为2, <c:forEach begin="1" end="10" var="i" step="2"> ${i } </c:forEach> ----------------------------------------------- <!-- items : 表示遍历哪一个对象,注意,这里必须写EL表达式。 var: 遍历出来的每一个元素用user 去接收。 --> <c:forEach var="user" items="${list }"> ${user.name } ----${user.age } </c:forEach>