概述
jsp全名为Java Server Pages,由于servlet展示信息的不方便,引入了jsp,jsp本质上也是一个servlet。通俗的说法是jsp是嵌入了java代码的html文件
Jsp如何嵌入java代码
通过三种标签,在jsp文件里嵌入java的代码,实现动态网页
声明标签 <%!变量或者方法声明%>
表达式标签 <%= 表达式%> 在页面上显示的效果
程序代码标签 <%java代码%> 页面上动态展示内容
内部原理
jsp文件在被访问时,服务器识别到jsp的后缀,会将jsp文件翻译成java文件,再将java文件编译成class文件,因此jsp的本质也是一个servlet,同时,class文件被JVM加载完还会返回一个响应,将jsp里的html代码以流的形式返回给浏览器,最终呈现出效果
由此可以联想到tomcat,启动tomcat访问jsp文件时,产生的java与class文件都被存在了tomcat安装目录的work文件夹下
Jsp的九大内置对象
- request;代表客户端请求信息,作用域为一次请求
- response;代表服务器发送给客户端的响应,只在jsp页面有效
- session;服务器给每个用户都生成一个session对象
- application;比session的生命周期更长,服务器不关闭存储的数据不会丢失
- out;用于在浏览器内输出信息,甚至可以输出一段html语句以弹窗警告
- pageContext;存取数据,只作用于当前页面,离开当前页面数据即丢失
- config;获取服务器的配置信息,web.xml里配置的信息通过这个对象获取
- page;类似this,代表当前jsp页面的这个对象
- exception;在当前页面定义为error页面时才出现,显示异常信息
四个用于存取数据的对象的作用域范围比较:
pageContext < request < session < application
以上分别代表了当前页面,单次请求,一次会话,服务器运行期间,注意pageContext的值只在当前页面有效,而request如果不进行重定向,地址栏不改变,通过转发跳转到其他页面,request对象里存的值还是可以保留的,因此它的范围大于pageContext
Jsp的指令
Page:定义网页的依赖属性,比如脚本语言、error页面、缓存器等,在jsp页面的最顶端即可看到该指令<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Page指令里可供设置的的属性名:
Include:包含其他文件,当某个网站里的页面都有大量重复的内容时,可以通过这个指令来进行包含共同的内容,以避免程序员复制粘贴重复的代码
使用方法:<%@ include file="文件相对 url 地址" %>
Taglib:引入标签库的定义,具体在JSTL里说明
使用方法:<%@ taglib uri="uri" prefix="" %>
网页状态码
20开头的状态码主要与请求相关,30开头的状态码主要与被请求的页面相关,40、50开头的状态码都与服务器的状态相关,其中比较重要的有200、400、404、405、500
EL表达式
EL表达式的主要作用是简化对象和变量的访问,简单来说EL只负责取值而不是存值
使用方法:${需要获取的值的名称}
没有给定范围时,EL表达式会默认按照pageContext→request→session →application的顺序进行取值,如果要给定范围按照这个格式${sessionScope.value}
同理类推其他的
EL表达式的基础操作符:
JSTL
JSTL是jsp标准标签库,一个jsp标签的集合,它封装了jsp应用的通用核心功能。JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,SQL标签
使用方法:<%@ taglib prefix=”页面使用的名称” uri=”功能范围的路径”%>
core核心标签,最常用的JSTL标签
使用方法:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
core里用于存取值的标签主要有set、out与remove这三个
// set标签把值存入request
<c:set value="request的值" var="str" scope="request"></c:set>
// el表达式将值取出
str=${request.str}<br>
// out标签将值取出
str=<c:out value="${request.str}"></c:out>
// remove标签将值移除
<c:remove var="str" scope="request"></c:remove>
core里还有用于流程控制的标签,主要有if,choose,when,otherwise与forEach
<c:set value="20" var="age" scope="request"></c:set>
// 如果test里的内容为true,输出c:if框内的内容
<c:if test="${request.age<18}">
未成年人,小于18岁
</c:if>
// c:choose内添加c:when,通过test条件输出内容
<c:choose>
<c:when test="${age<18}">
未成年人
</c:when>
<c:when test="${age>18}">
成年人
</c:when>
</c:choose>
<%
List list = new ArrayList();
list.add(100);
list.add("冠军");
request.setAttribute("alist",list);
%>
// forEach遍历list集合里的元素
<c:forEach items="${alist}" var="va">
${va}<br>
</c:forEach>
fmt格式化标签,主要用于进行日期或者数字的格式化
使用方法:<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
fmt:formatDate 作用:将日期类型格式化为指定模式的字符串
<%
request.setAttribute("day",new Date());
%>
// 将Date类型的日期转换为yyyy-MM-dd的格式
<fmt:formatDate value="${day}" pattern="yyyy-MM-dd" >
</fmt:formatDate>
fmt:parseDate 作用:将指定字符串转化为日期类型
fmt:formatNumber 作用:按照指定格式对数字进行格式化