JSP、EL、JSTL
一、JSP
1、什么是JSP
从用户角度来看,就是一个网页,从程序员角度看待,其实是一个Java类,它继承了servlet,所以可以直接说jsp就是一个servlet
2、为什么有JSP
html多数情况下用来显示静态内容,一成不变的。但是有时候我们需要在网页上显示一些动态数据,比如:查询所有学生的信息,根据姓名去查询某个具体学生。这些动作都需要去查询数据库,然后在网页上显示。html是不支持写Java代码的,JSP里面可以写Java代码。
3、怎么用JSP
3.1、三个指令
指令写法: <%@ 指令名字 %>
1、page指令:
*language:表示JSP可以写Java代码
*contentType:说明文件是什么类型,告诉浏览器是什么内容类型以及用什么编码
contentType="text/html;charset=UTF-8"
text/html MIMEType 这是一个文本,html网页
*pageEncoding JSP内容编码
*extends用于指定JSP翻译成Java文件后,继承的父类是谁,一般不用该
*import导包使用的,一般不用手写
*session
可选值有true or false
用于控制在这个JSP页面里面,能够直接用session对象
具体的区别是:查看翻译后的Java文件,如果该值是true,那么在代码里面会有getSession()的调用,
如果是false:那么就不会有该方法的调用,也就是没有session对象。在页面上自然就不能使用session了。
*errorPage
指的是错误的页面,值需要给错误的页面路径
*isErrorPage
上面的errorPage指定错误的时候跑到哪一个页面去。这个isErrorPage是用于声明某个页面到底是不是错误的页面。
2、include指令:
包含另外一个JSP的内容进来:<%@ include file="other.jsp"%>把另外一个页面的内容拿过来,所有元素标签都包含进来
3、taglib指令:
<%@ taglib prefix="" uri=""%> uri:标签库路径,prefix:标签库的别名(固定搭配)
3.2、三个动作标签
<jsp:include page=""></jsp:include>
<jsp:param value="" name=""/>
<jsp:forward page=""></jsp:forward>
jsp:include
包含指定的页面,这里是动态包含,也就是把包含的页面所有元素标签全部
jsp:forword
前往哪一个页面。
和<% request.getRequestDispatcher("").forward(request,response); %>效果相同
jsp:param
意思是:在包含某个页面的时候,或者在跳转到某个页面的时候,加入这个参数。
<jsp:forward page="03.jsp"> <jsp:param value="address" name="beijing"/> </jsp:forward>
<%= request.getParameter("address")%>//在03.jsp中获取传入的值
3.3、九个内置对象
所谓内置对象,就是我们可以直接在jsp页面中使用这些对象。不用创建
- pageContent
- request
-session
-application
以上是四个作用域对象(作用域:表示这些对象可以存值,我们的取值范围有限定。setAttribute和getAttribute)
使用作用域来存储数据<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")%>
作用域范围大小:pageContext(作用域仅限于当前页面,还可以获取到其他八个内置对象) -- request(作用域仅限于一次请求,
只要服务器对该请求做出了响应。这个值域中存的值就没了) -- session(作用域仅限于一次会话(多次请求与响应)当中) 。
-- application(整个工程都可以访问,服务器关闭后就不能访问了)
-out
-response
-exception
-page
-config
二、EL表达式
是为了简化JSP代码,具体一点就是为了简化在JSP里面写的那些Java代码。
*写法格式:${表达式}
如果从作用域中取值,会先从小的作用域开始取,如果没有就往下一个作用域取,一直把四个作用域取完都没有,就没有显示。
1、如何使用
1.1、取出四个作用域中存放的值
<% 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 } <br>
1.2、如果域中所存的是数组
<% String [] a = {"aa","bb","cc","dd"}; pageContext.setAttribute("array", a); %> 使用EL表达式取出作用域中数组的值<br> ${ array[0] },${ array[1] },${ array[2] },${ array[3] }
1.3、如果如果域中锁存的是集合
<% Map map=new HashMap(); map.put("name", "zhangsan"); map.put("age", 18); map.put("address", "北京.."); map.put("address.aa", "深圳.."); pageContext.setAttribute("map", map); %>
1.4、取出Map集合的值
<br>--------------Map数据--------------<br> <% Map map=new HashMap(); map.put("name", "zhangsan"); map.put("age", 18); map.put("address", "北京.."); map.put("address.aa", "深圳.."); pageContext.setAttribute("map", map); %> ${ map.name },${ map.age },${ map.address },${ map["address.aa"] }
2、取值细节
2.1、从域中取值。得先存值
<% session.setAttribute("name", "张三"); %> <b>通过pageScorpe查找的结果为:</b> ${pageScorpe.name}<!-- 直接指定去pageScropename作用域找name --> <br> <b>直接查找结果为:</b> ${ name }<!-- 从page里找,如果没有去request中找,如果没有去session找,如果还没有去application中找 --> <br> <b>通过sessionScorpe查找的结果为:</b> ${ sessionScope.name }
2.2、取值方式
如果这份值是有下标的,那么直接使用[],如果没有下标,直接使用.的方式去取。
<% String[] array = {"aa","bb","cc","dd"}; session.setAttribute("array", array); %> <% User user = new User("zhangsan",18); session.setAttribute("u", user); %> <b>这是用下标取到的内容:</b> ${ array[0] },${ array[1] },${ array[2] },${ array[3] } <br> <b>这是没有下标的情况</b> ${ u.name },${ u.age }
以上代码运行效果如下:
一般使用EL表达式,用的比较多的,都是从一个对象中取出它的属性值,比如取出某个学生的姓名
3、EL表达式11个内置对象
${对象名.成员}
-pageContext
作用域相关的对象
-pageScope
-requestScope
-sessionScope
-applicationScope
头信息相关对象
-header
-headerValues
参数相关对象
-param
-paramValues
-cookie
全局初始化参数
-initParam
三、JSTL
全称:JSP Standard Tag Library(JSP标签标准库)
简化JSP的代码编写。替换了<% %>写法。一般与EL表达式配合
1、怎么使用
1.1、导入jar文件到工程的WebContent/Web-Inf/bin jstl.jar standard.jar
1.2、在JSP页面上使用taglib指令来引入标签库
2、常用标签
<c:set></c:set>
<c:if test=""></c:if>
<c:forEach></c:forEach>
*c:set
<!-- 声明一个对象name,对象的值zhangsan,存储到page(默认),指定是session --> <c:set var="name" value="zhangsan" scope="session"></c:set>
${sessionScope.name}
*c:if
判断test里面的表达式是否满足,如果满足,就执行c:if标签中的输出,c:if是没有else的
<c:if test="${age>16 }" var="flag"> 年龄大于16岁...... </c:if> <c:if test="age>=26"> 年龄大于26岁... </c:if>
*c:forEach
<!-- 从1开始遍历到10,步长为2,得到的结果赋值给i,存储到page区域 --> <c:forEach begin="1" end="10" var="i" step="2"> ${i } </c:forEach> <% List list = new ArrayList(); list.add(new User("zhangsan",18)); list.add(new User("lisi",28)); list.add(new User("wangwu",38)); list.add(new User("maliu",48)); pageContext.setAttribute("list", list); %> <!-- var:遍历出来的每个元素用user去接收。item:表示遍历哪一个对象,注意,这里写的必须是EL表达式 --> <c:forEach var="user" items="${list }"> ${user.name }--------${user.age }<br>