(一)JSP定义
- JSP可以简单的理解为在HTML中插入Java代码
- jsp本质上是一个Servlet
(二)JSP生命周期
- JSP执行过程
- 浏览器访问jsp页面
- 服务器将对应的jsp文件转换为java文件
- jvm进行编译生成.class文件,服务器运行,生成动态内容,返回给浏览器
- JSP生命周期
- 编译阶段:解析JSP文件,将其转换成servlet然后再进行servlet的编译
- 初始化阶段:调用jspInit()方法
- 执行阶段:调用_jspService()方法
- 销毁阶段 :调用jspDestroy()方法
(三)JSP基本语法
(1)JSP指令
<%@ 指令配置%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
(2)脚本程序
<% Java代码 %>
(3)JSP申明
<%! 申明语句%>
(4)JSP表达式
<%= 表达式%>
(5)JSP注释
- JSP注释的内容不会发往客户端,客户端是无法感知的(不同于<!-- -->的HTML代码注释,查看源代码的时候能够看到)
<%-- 注释内容 --%>
(6)If-else语句
- 可以使用Java脚本代码和HTML混合使用的模式,比如:
<body>
<% if(day==1 || day==7) {%>
<p>今天是周一、周末</p>
<% } else {%>
<p>今天不是周一、周末</p>
<% } %>
</body>
(7)for循环
<%! int fontSize; %>
<body>
<h3>For循环实例</h3>
<%for (fontSize=1; fontSize < 25; fontSize++) {%>
<font color="red" size="<%= fontSize%>">
尝试font
</font>
<%}%>
</body>
(四)JSP指令
(1)include
- include指令
- 将其他页面或者Servlet包含在当前页面(最后会一起编译运行,只生成一个.java文件)
- 比如在JSP页面中插入<%@include file="/jsp/include/page1.jsp"%>(格式:<%@include file=“相对路径或者内部路径”%>)
- 相当于把jsp页面当做一个模块来使用,减少重复编码
(2)taglib
(3)ErrorPage
- errorPage
- 当jsp页面中出现异常(比如除零异常)时跳转到指定页面
- isErrorPage
- 值为true时,可以在jsp页面中使用exception内置对象,输出错误信息
(五)JSP内置对象
(1)内置对象
- JSP九个内置对象:不用声明,可以直接在JSP页面内使用的对象
- out:JspWriter类
- request:HttpServletRequest类
- response:HttpServletResponse类
- session:HttpSession类
- exception :Throwable类(只有声明isErrorPage时才能使用的对象)
- page:Servlet类
- config:ServletConfig类
- application:ServletContext类
- pageContext
(2)域对象
- JSP的域对象(Field Object):
- application
- session
- request
- pageContext
- 域对象
- setAttribute()方法
- getAttribute() 方法
(六)动作标签
(1)页面跳转
<jsp:forward>
:请求转发(相当于Java中的request.getRequestDispatcher(…).forward(…))
(2)动态包含
<jsp:include page="文件名"/>
:在一个jsp页面中引入其他的jsp页面
- 和
<%@ include file="page2.jsp" %>
这种用法不同的jsp:include是会生成多个.java文件,后者jsp编译之后只会产生一个.java文件
(七)el表达式
- el(Expression Language)
- 作用
- 使用:
${el表达式}
(1)获取域中的数据
//设置
request.setAttribute("requestKey","requestValue");
//获取
JSP表达式:<%=request.getAttribute("requestKey")%>
EL表达式:${requestScope.get("requestKey")}
${requestKey}
(2)获取域中的集合数据
- 对于存放在域对象中的list、map、array
- 可以使用
${变量名.变量方法()}
直接获取对应的值
<%
Map map = new HashMap<String,Integer>();
map.put("mio",20);
request.setAttribute("map",map);
%>
获取request域中的map:
JSP表达式:<%=((Map)request.getAttribute("map")).get("mio")%>
EL表达式:${map.get("mio")}
(3)四则运算
<%
request.setAttribute("a",1);
request.setAttribute("b","2");
%>
${a+b}<br/>
- empty运算符:判断对象是否为空或者容器的长度是否为零
${empty list}
//如果List list = null 则返回true
(4)el内置对象
//链接:jsp/el/demo5.jsp?username=mio&password=123
username:${param.username} <br/>
password:${param.password} <br/>
param:${param}
${cookie.Cookie名.value}
获取特定Cookie的值${pageContext.request.getContextPath}
:获取项目名
(八)JSTL
- JSTL(JavaServer Pages Standard Tag Library):JSP标准标签库,封装了JSP的核心功能
- 存在的意义:替代java脚本
- 使用方式
-
- 导入jar包(jstl.jar和standard.jar)
-
<@taglib prefix="" uri="">
(1)Core
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
(1)if
<c:if test="${3 < 4}">
3 < 4
</c:if>
(2)forEach
- forEach用于在JSP中循环
- begin 起始位置
- end 结束位置
- step 步长
- var 变量
<c:forEach begin="1" end="20" step="2" var="i">
${i}
</c:forEach>
<%
List list = new ArrayList<>();
list.add(11);
list.add(22);
list.add(33);
request.setAttribute("list",list);
%>
<c:forEach items="${list}" var="i">
${i}
</c:forEach>
(2)函数库
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
${fn:toUpperCase("hello")}