JSP 详解
简介
JSP(全称Java Server Pages)是一种使软件开发者可以响应客户端请求,而动态生成 HTML、XML 或其他格式文档的Web网页的技术标准。是运行在服务端的语言。
JSP文件后缀名为 .jsp
。
JSP开发的WEB应用可以跨平台使用,既可以运行在 Linux 上也能运行在 Windows 上。
JSP输出Hello World
<html>
<head>
<title>第一个 JSP 程序</title>
</head>
<body>
<%
out.println("Hello World!");
%>
</body>
</html>
JSP 语法
脚本程序
脚本程序可以包含任意量的Java语句、变量、方法或表达式,只要它们在脚本语言中是有效的。
方式一
<% 代码片段 %>
方式二
<jsp:scriptlet>
代码片段
</jsp:scriptlet>
声明
一个声明语句可以声明一个或多个变量、方法,供后面的Java代码使用
方式一
<%! int i = 0; %>
<%! int a, b, c; %>
<%! Circle a = new Circle(2.0); %>
方式二
<jsp:declaration>
代码片段
</jsp:declaration>
表达式
方式一
<%= 表达式 %>
<%= (new java.util.Date()).toLocaleString()%>
方式二
<jsp:expression>
表达式
</jsp:expression>
注释
JSP注释的语法格式
<%-- 该部分注释在网页中不会被显示--%> jsp
<!-- 注释 --> Httml
指令
JSP指令用来设置与整个JSP页面相关的属性
定义页面
<%@ page errorPage="/error/500.jsp" %> //指向自定义的报错页面
<%@ page isErrorPage="true" %> //是否为错误页面
引入文件
<%@ include file="common/header.jsp"%> //在该位置包含jsp文件
引入标签库的定义
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> //导入JSTL核心标签库
行为
行为标签基本上是一些预先就定义好的函数,下表罗列出了一些可用的JSP行为标签
语法 | 描述 |
---|---|
jsp:include | 用于在当前页面中包含静态或动态资源 |
jsp:useBean | 寻找和初始化一个JavaBean组件 |
jsp:setProperty | 设置 JavaBean组件的值 |
jsp:getProperty | 将 JavaBean组件的值插入到 output中 |
jsp:forward | 从一个JSP文件向另一个文件传递一个包含用户请求的request对象 |
jsp:plugin | 用于在生成的HTML页面中包含Applet和JavaBean对象 |
jsp:element | 动态创建一个XML元素 |
jsp:attribute | 定义动态创建的XML元素的属性 |
jsp:body | 定义动态创建的XML元素的主体 |
jsp:text | 用于封装模板数据 |
<jsp:include page="common/footer.jsp"></jsp:include>
指令和标签引用的区别
指令标记是静态包含所包含的文件没有经过转译运行,静态插入。在JSP页面编译生成java代码时,变成了一个方法调用每次运行这个jsp页面,这个方法都会被执行一次。
动作标签在运行时才加入被包含文件,在JSP页面编译生成java代码时将JSP中内容作为自己一部分直接编译了
隐含对象
JSP支持九个自动定义的变量,又称内置变量
对象 | 描述 |
---|---|
request | HttpServletRequest类的实例 |
response | HttpServletResponse类的实例 |
out | PrintWriter类的实例,用于把结果输出至网页上 |
session | HttpSession类的实例 |
application | ServletContext类的实例,与应用上下文有关 |
config | ServletConfig类的实例 |
pageContext | PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问 |
page | 类似于Java类中的this关键字 |
exception | exception 类的对象,代表发生错误的 JSP 页面中对应的异常对象 |
存储属性
<%--内置对象--%>
<%-- 4个存东西的对象--%>
<%
//保存的数据在一个页面中有效
pageContext.setAttribute("name1", "value");
//保存的数据在一次请求中有效,请求转发会携带这个数据
request.setAttribute("name2", "value");
//保存的数据在一次会话中有效,从打开浏览器到关闭
session.setAttribute("name3", "value");
//保存的数据在服务器中有效,服务器崩了才丢数据
application.setAttribute("name4", "value");
%>
<%
//通过find寻找到Attribute
String name1 = (String) pageContext.findAttribute("name1");
String name2 = (String) pageContext.findAttribute("name2");
String name3 = (String) pageContext.findAttribute("name3");
String name4 = (String) pageContext.findAttribute("name4");
String name5 = (String) pageContext.findAttribute("name5"); //不存在
%>
<%--EL表达式输出 ${}}--%>
<h1>取出的值为:</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3>${name5}</h3>
其中 pagecontext的作用域是在当前页面上下文,request的作用域是一次请求中,后面的session和application算是最大的了
作用域从低到高:pageContext ==> request ==> session ==> application
EL
EL(Express Lanuage)表达式将自动搜索四大作用域并获得数据。可以减少繁琐的JSP小脚本片段的书写。
需要添加头部信息
<%@ page isELIgnored="false" %>
使用格式:
${key};
JSTL
JSTL (Java server pages standarded tag library,即JSP标准标签库),它封装了JSP应用的通用核心功能。
常用核心标签
输入标签
//相当于<%= %> 当value为空时,输出默认值;escapeXml为判断是否可识别转义符(<)
<c:out value="${null}" default="000" escapeXml="true" ></c:out>
设置/移除标签
//默认域为page
<c:set var="salary" scope="session" value="${2000*2}"/>
//也可执行scope
<c:remove var="salary" />
判断标签
<c:if test="${salary>300}">test is true</c:if>
选择标签
<c:choose>
<c:when test="${salary==100}">Pay is equal to 100</c:when>
<c:when test="${salary>100}">Pay is more than 100</c:when>
<c:otherwise>this is the third option</c:otherwise>
</c:choose>
循环标签
// items循环体 step步长 特别说明status还具有current 当前值相当于num;index从0开始迭代;count从1开始迭代,以及其它循环体可选参数
<c:forEach items="${numbers}" var="num" step="2" varStatus="status" >
<c:out value="${num}"></c:out>
</c:forEach>
非数组定义循环
//items为内容 delims为分割符 name是临时变量
<c:forTokens items="google,runoob,taobao" delims="," var="name">
<c:out value="${name}"/><p>
</c:forTokens>
跳转
//会直接跳转到指定网页
<c:redirect url="http://www.runoob.com"/>
格式化标签
处理数字
//具体使用 https://www.runoob.com/jsp/jstl-format-formatnumber-tag.html
<fmt:formatNumber value="${salary}" type="currency"></fmt:formatNumber>
处理日期
//2019-12-28 13:50:30 type="time、date、both" 分别显示时间、日期、两者
<c:set var="date" value="<%=new java.util.Date()%>"></c:set>
//2016年6月26日 上午11时19分43秒 E显示星期
<fmt:formatDate value="${date}" type="both" pattern="yyyy-MM-dd HH:mm:ss E"/>