此博客用于个人学习,来源于网上,对知识点进行一个整理。
一,JSP:
Java Server Page
1.什么是 JSP:
从用户角度看待,就是是一个网页,从程序员角度看待,其实是一个 java 类,它继承了 servlet,所以可以直接说 JSP 就是一个 Servlet。
2.为什么会有 JSP:
html 多数情况下用来显示静态内容,一成不变的。但是有时候我们需要在网页上显示一些动态数据,比如:查询所有的学生信息,根据姓名去查询具体某个学生。这些动作都需要去查询数据库,然后在网页上显示。html 是不支持写 java 代码,jsp 里面可以写 java 代码。
3.怎么用 JSP:
指令写法:<%@ 指令名字 %>
- 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,那么就不会有该方法调用,也就是没有 sessio n对象了,在页面上自然也就不能使用 session了
-
errorPage
指的是错误的页面,值需要给错误的页面路径
-
isErrorPage
上面的 errorPage 用于指定错误的时候跑到哪一个页面去。那么这个 isErroPage , 就是声明某一个页面到底是不是错误的页面。
-
include 指令:
<%@ include file=“文件名”%>
包含另外一个 jsp 的内容进来,把另外一个页面的所有内容拿过来一起输出,所有的标签元素都包含进来
-
taglib指令:
<%@ taglib prefix="" uri=""%>
uri: 标签库路径
prefix : 标签库的别名
4.JSP动态标签:
-
jsp:include:
<jsp:include page=""></jsp:include>
包含指定的页面,这里是动态包含。也就是不把包含的页面所有元素标签全部拿过来输出,而是把它的运行结果拿过来
-
jsp:forword:
<jsp:forward page=""></jsp:forward>
前往哪一个页面,类似于 servlet 中的请求转发
//请求转发 request.getRequestDispatcher("other.jsp").forward(request, response);
-
jsp:param:
在包含某个页面的时候,或者在跳转某个页面的时候,加入这个参数
在 dome1.jsp 中:
<jsp:forward page="demo2.jsp"> <jsp:param value="beijing" name="address"/> </jsp:forward>
在 demo2.jsp 中获取参数:
<br>收到的参数是:<br> <%= request.getParameter("address")%>
5.JSP 内置对象:
所谓内置对象,就是我们可以直接在 jsp 页面中使用这些对象,不用创建。
-
作用域对象
表示这些对象可以存值,他们的取值范围有限定。setAttribute 和 getAttribute
这是demo01的页面<br> <% pageContext.setAttribute("name", "pageContext"); request.setAttribute("name", "request"); session.setAttribute("name", "session"); application.setAttribute("name", "application"); %> 输出四个内置对象<br> <%=pageContext.getAttribute("name") %><br> <%=request.getAttribute("name") %><br> <%=session.getAttribute("name") %><br> <%=application.getAttribute("name") %><br>
作用域大小排列:
pageContext > request > session > appliaction-
以上四个作用域的区别
- pageContext 【PageContext】
作用域仅限于当前的页面
还可以获取到其他八个内置对象
- request 【HttpServletRequest】
作用域仅限于一次请求,只要服务器对该请求做出了响应,这个域中存的值就没有了
- session 【HttpSession】
作用域限于一次会话(多次请求与响应)当中
- application 【ServletContext】
整个工程都可以访问,服务器关闭后就不能访问了
-
out 与 response 的区别
-
out 【JspWriter】
-
response 【HttpServletResponse】
-
-
- 另外三个
- exception【Throwable】
- page【Object】 —就是这个jsp翻译成的java类的实例对象
- config 【ServletConfig】
二,EL 表达式:
是为了简化咱们的 jsp 代码,具体一点就是为了简化在 jsp 里面写的那些 java 代码。
写法格式:{表达式}
如果从作用域中取值,会先从小的作用域开始取,如果没有,就往下一个作用域取。一直把四个作用域取完都没有,就没有显示。
1.如何使用:
-
取出四个作用域的值:
先在作用域里面存值<br> <% pageContext.setAttribute("name", "pageContext"); request.setAttribute("name", "request"); session.setAttribute("name", "session"); application.setAttribute("name", "application"); %> <br>通过普通手段进行取值<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>如果存的是数组<br> <% String[] aa = {"pageContext","request","session","application"}; pageContext.setAttribute("aa", aa); %> ${aa[0]},${aa[1]},${aa[2]},${aa[3]}
-
如果域中的是集合:
<br>如果存的是集合<br> <% List list = new ArrayList(); list.add("pageContext"); list.add("request"); list.add("session"); list.add("application"); pageContext.setAttribute("list", list); %> ${list[0]},${list[1]},${list[2]},${list[3]}
-
如果域中的是Map集合:
<br>如果存的是Map集合<br> <% Map map = new HashMap(); map.put("one", "pageContext"); map.put("two", "request"); map.put("three", "session"); map.put("four", "application"); pageContext.setAttribute("map", map); %> ${map.one},${map.two},${map.three},${map.four}
2.取值细节:
-
从域中取值,得先存值:
<% pageContext.setAttribute("name", "pageContext"); request.setAttribute("name", "request"); %> ${name},${pageScope.name},${requestScope.name}
结果为:pageContext,pageContext,request
<% //pageContext.setAttribute("name", "pageContext"); request.setAttribute("name", "request"); %> ${name},${pageScope.name},${requestScope.name}
结果为:request,request
- 如果直接是 name,按照 pageContext > request > session > appliaction 的顺序进行查询,如果都没有,那就没有输出
- 可以通过直接指定获取具体的值
-
取值方式:
-
如果是有下标:
<br>如果是有下标的<br> <% String[] a = {"aa","bb","cc","dd"}; pageContext.setAttribute("a", a); %> ${a[0]},${a[1]},${a[2]},${a[3]}
-
如果没有下标:
<br>如果是没有下标的<br> <% User user = new User("zhangsan","18"); pageContext.setAttribute("user", user); %> ${user.name},${user.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.怎么使用:
- 导入 jar 文件到工程的 WebContent/Web-Inf/lib jstl.jar standard.jar
- 在 jsp 页面上,使用 taglib 指令,来引入标签库
- 注意:如果想支持 EL 表达式,那么引入的标签库必须选择1.1的版本,1.0的版本不支持 EL 表达式
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
2.常用标签:
<c:set></c:set>
<c:if test=""></c:if>
<c:forEach></c:forEach>
- c:set:
<!-- 定义一个变量,其中,var:变量,value:变量的值,scope:取出的工作域,默认为pageContext -->
<c:set var="name" value="zhangsan" scope="session"></c:set>
${sessionScope.name}
- c:if:
<!-- 判断语句,如果成立,执行if便签内的内容,test里面写的是if语句的判断条件,要用EL语句 -->
<c:set var="age" value="18"></c:set>
<c:if test="${age > 20}">
年龄大于20...
</c:if>
<c:if test="${age <= 20}">
年龄小于等于20...
</c:if>
- c:forEach:
<!-- 普通遍历,begin为初始值,end为末尾值,var为循环数的变量名,step为增加的大小 -->
<c:forEach begin="0" end="10" var="i" step="2">
${i}
</c:forEach>
<br>
<%
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("zhaoliu","48"));
list.add(new User("qianqi","58"));
pageContext.setAttribute("list", list);
%>
<!-- forEach也可以用来循环输出集合,其中var为集合的每个值赋予的对象名,items为遍历的集合,要用EL语句 -->
<c:forEach var="user" items="${list}">
${user.name}----${user.age}
</c:forEach>