JSP(Java Server Pages) ,是一个用于展现数据的页面. 本质是Servlet
HTML : 静态资源
JSP : 模板引擎,动态页面 , 适合用于展现数据 , 不适合写java逻辑代码
Servlet : 适合写java逻辑代码 , 不合适写html展现数据
语法
1 jsp文件可以写所有的html标签,css样式,js代码 (与之前html的用法一致)
2 写java代码
使用<% java代码 %> ,在jsp中写java脚本
3 java代码的简化输出的写法
4 设置三大指令
5 写六个动作
6 使用9个内置对象
三大指令
JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。
在JSP 2.0规范中共定义了三个指令:
page指令
Include指令
taglib指令
page指令
<%@ page 属性=”属性值” 属性=”属性值” %>
属性 :
1 import 导包
2 session: 是否会自动创建session对象。默认值是true; <%@ page session=”false” %>
3、 buffer: JSP中有javax.servlet.jsp.JspWriter输出字符流。设置。输出数据的缓存大小,默认是8kb.
4 errorPage: 如果页面中有异常,则跳转到指定的资源。
errorPage="/uri" 如果写“/”则代表当前应用的目录下,绝对路径。
如果不写“/”则代表相对路径。
5、 isErrorPage: 是否创建throwable对象。默认是false;
6、 contextType: 等同于response.setContextType("text/html;charset=utf-8");
告诉浏览器如何解析,以及编码格式
7、 pageEncoding: 告诉JSP引擎要翻译的文件使用的编码。
告诉服务器使用什么编码格式解析
8、 isELIgnored: 是否忽略EL表达式。 默认是false既支持使用
include指令
让当前的jsp包含另外一个文件
位置 : 在当前jsp需要使用的任意地方
格式 : <%@ include file=”路径” %>
作用 : 将引入的文件内容,合并到当前的jsp中, 即将两个文件,变为一个文件 —— 静态包含/引入 : 可以使代码复用
taglib指令
主要用于在当前jsp页面引入 jstl标签库
JSP中动态include和静态include的区别?
答 : a、静态include:语法:<%@ include file="文件名" %>,相当于复制,编辑时将对应的文件包含进来,当内容变化时,不会再一次对其编译,不易维护。
b、动态include:语法:<jsp:include page="文件名">,能够自动检查被包含文件,当客户端对JSP文件进行请求时,会重新将对应的文件包含进来,进行实时的更新
六个动作
动作的标签 : <jsp:动作名 属性=”属性值”> </jsp:动作名>
使用标签的形式来表示一段java代码。
- <jsp:include > 动态包含:
程序运行到此处,才会去加载引入的其他文件,并没有将文件二合一
- <jsp:forward> 请求转发:<jsp:forward page="TestJSP03.jsp"></jsp:forward>等价与
request.getRequestDispatcher("TestJSP03.jsp").forward(request, response);
- <jsp:param> 设置请求参数
<jsp:forward page="TestJSP03.jsp">
<jsp:param value="123" name="tom"/>
</jsp:forward>
- <jsp:useBean> 创建一个对象stu <jsp:useBean id="stu" class="com.zhiyou.entry.Student"></jsp:useBean>
- <jsp:setProperty> 给指定的对象属性赋值<jsp:setProperty name="stu" property="name" value=”张三” />
- <jsp:getProperty> 取出指定对象的属性值<jsp:getProperty name="stu" property="name" />
九大内置对象
内置对象 : 在每个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 |
|
四大作用域
域 : 一片区域,用来存储数据
一下四个域中的数据的作用范围不同
page域 : 此域中的数据,只在当前页面有效
request域 : 数据在一次请求中可以共享
session域 : 数据在一次会话内有效
与服务器的交互就是会话.
即使是重定向, 在两个Servlet类或者是两个jsp中数据都可以共享
application 域 : 数据在整个应用程序中有效果. 只有应用程序不宕机,就可以一直使用
四大域作用范围 :
page < request < session < application
四大域都有各自的getAttribute()方法.从域中获得值.
pageContext.findAttribute(key) ; 从四大域依次查找值,找到了即输出
按照 pageà request à session à application的顺序查找
<h1>index4.jsp</h1>
<%
// 设置所有域 : 给page域设置值
// pageContext.setAttribute("key", "pageValue", PageContext.PAGE_SCOPE);
// 请求域设置
// request.setAttribute("key", "reqVal");
// 请求转发
//request.getRequestDispatcher("index5.jsp").forward(request, response);
// 重定向
//response.sendRedirect("index5.jsp");
//Object obj = pageContext.getAttribute("pageKey");
//out.write((String)obj);
// 设置session域
// session.setAttribute("key", "seValue");
session.invalidate();
// request.getRequestDispatcher("index5.jsp").forward(request, response);
// response.sendRedirect("index5.jsp");
// 设置 application域
application.setAttribute("key", "appValue");
// request.getRequestDispatcher("index5.jsp").forward(request, response);
// response.sendRedirect("index5.jsp");
Object obj = pageContext.findAttribute("key");
out.print(obj);
%>
<body>
<h1>index5.jsp</h1>
<%=(String)application.getAttribute("appKey")%>
</body>
EL
JSP表达式语言(EL)使得访问存储在JavaBean中的数据变得非常简单。JSP EL既可以用来创建算术表达式也可以用来创建逻辑表达式。在JSP EL表达式内可以使用整型数,浮点数,字符串,常量true、false,还有null。
作用
简化jsp页面中的取值操作
语法
${expr}
本质
pageContext.findAttribute(“expr”)
EL中的基础操作符
EL表达式支持大部分Java所提供的算术和逻辑操作符:
操作符 | 描述 |
---|---|
. | 访问一个Bean属性或者一个映射条目 |
[] | 访问一个数组或者链表的元素 |
( ) | 组织一个子表达式以改变优先级 |
+ | 加 |
- | 减或负 |
* | 乘 |
/ or div | 除 |
% or mod | 取模 |
== or eq | 测试是否相等 |
!= or ne | 测试是否不等 |
< or lt | 测试是否小于 |
> or gt | 测试是否大于 |
<= or le | 测试是否小于等于 |
>= or ge | 测试是否大于等于 |
&& or and | 测试逻辑与 |
|| or or | 测试逻辑或 |
! or not | 测试取反 |
empty | 测试是否空值 |
JSTL
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
根据JSTL标签所提供的功能,可以将其分为5个类别。
- 核心标签
- 格式化标签
- SQL 标签
- XML 标签
- JSTL 函数
理解 : 将java代码标签化, 更符合前端的写法.
使用
1 先将jstl.jar + standard.jar包导入项目
2 哪个jsp页面需要使用jstl标签,就在哪个页面使用taglib指令引入jstl标签库
3 使用jstl的标签
演示
<!-- 1 设置域变量-->
<c:set var="k11" value="v13" scope="request"></c:set>
<!-- 3 移除变量 -->
<%-- <c:remove var="k11"/> --%>
<!--2 输出-->
<c:out value="${k11 }"></c:out>
<!-- 4 判断 -->
<c:if test="${1 < 0}">
<p>正确1</p>
</c:if>
<c:if test="${k11 == 'v11'}">
<p>正确2</p>
</c:if>
<!-- 5 判断 : 类似ifelse -->
<c:choose>
<c:when test="${k11 == 'v11' }"><!-- 相等于if -->
值是v11
</c:when>
<c:when test="${k11 == 'v12' }"><!-- 相等于else if -->
值是v12
</c:when>
<c:otherwise> <!-- 相等于else -->
值是不知道
</c:otherwise>
</c:choose>
<!-- 6 循环
begin 开始的值
end 结束的值
step 步长
-->
<c:forEach begin="1" end="5" step="2">
<p>p</p>
</c:forEach>
<%
ArrayList<String> list = new ArrayList<String>();
list.add("二");
list.add("一");
list.add("四");
list.add("三");
request.setAttribute("list", list);
%>
<!-- 7 迭代
items 要遍历的对象
var 遍历得到的值
-->
<c:forEach items="${list }" var="i">
${i }
</c:forEach>
<br>
<!-- 8 路径标签
<c:url value="路径"></c:url>
<c:url value="路径"/>
-->
<a href="<%=request.getContextPath() %>/login">点击1</a><br>
<a href="<c:url value="/login" />">点击2</a><br>