引入
- jsp文件相对路径引用
// 例如访问:http://localhost:8080/user/users
// 引用到:http://localhost:8080/user/js/layui/layui.js
<script src="../js/layui/layui.js"></script>
- web工程的相对路径
// 例如访问:http://localhost:8080/user/users
// 引用到:http://localhost:8080/user/users/js/layui/layui.js
<script src="js/layui/layui.js"></script>
- web工程的绝对路径
// 例如访问:http://localhost:8080/user/users
// 引用到:http://localhost:8080/js/layui/layui.js
<script src="/js/layui/layui.js"></script>
jsp指令
page指令
定义网页依赖属性,比如脚本语言、error页面、缓存需求等等
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
属性:
属性 描述 | header |
---|---|
buffer | 指定out对象使用缓冲区的大小 |
autoFlush | 控制out对象的 缓存区 |
contentType | 指定当前JSP页面的MIME类型和字符编码 |
errorPage | 指定当JSP页面发生异常时需要转向的错误处理页面 |
isErrorPage | 指定当前页面是否可以作为另一个JSP页面的错误处理页面 |
extends | 指定servlet从哪一个类继承 |
import | 导入要使用的Java类 |
info | 定义JSP页面的描述信息 |
isThreadSafe | 指定对JSP页面的访问是否为线程安全 |
language | 定义JSP页面所用的脚本语言,默认是Java |
session | 指定JSP页面是否使用session |
isELIgnored | 指定是否执行EL表达式 |
isScriptingEnabled | 确定脚本元素能否被使用 |
taglib指令
引入标签库
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix='fmt' %>
include指令
包含其他jsp页面
index.jsp包含foot.jsp页面
<body>
<%@include file="common/foot.jsp" %>
</body>
foot.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<div class="layui-footer">
<!-- 底部固定区域 -->
© layui.com - 底部固定区域
</div>
jsp动作元素
隐式对象
jsp九个隐式对象
对象 | 描述 |
---|---|
request | HttpServletRequest 接口的实例 |
response | HttpServletResponse 接口的实例 |
out | JspWriter类的实例,用于把结果输出至网页上 |
session | HttpSession类的实例 |
application | ServletContext类的实例,与应用上下文有关 |
config | ServletConfig类的实例 |
pageContext | PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问 |
page | 类似于Java类中的this关键字 |
Exception | Exception类的对象,代表发生错误的JSP页面中对应的异常对象 |
作用域
对象 | 作用域 |
---|---|
pageContext | 当前页面 |
request | 一次请求 |
session | 当前会话 |
application | 全局,所有用户共享 |
jsp执行过程
- 浏览器访问jsp页面,tomcat将jsp翻译成java源文件(hello_jsp.java)
- tomcat将字节码翻译成class字节码文件(hello_jsp.class)
- tomcat构造生成的类对象(hello_jsp对象)
- 调用类对象中方法
再次访问就直接调用方法,无需构造类对象
work目录: 存放jsp运行时的临时文件
jsp中嵌入java源码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<div class="layui-footer">
<%
java代码
%>
</div>
服务端跳转
<jsp:forward page="path"/>
客户端跳转
<%response.sendRedirect("path");%>
自定义标签
导包
<!-- jsp自定义标签 -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
定义标签类
- 继承OutSupport类
- 重写doStartTag方法
- 页面属性需要类中相应成员及setter方法
- setter中处理el表达式
public class MyTag extends OutSupport {
// 页面标签中的属性,必须包含set方法
private String number;
public void setNumber(String number) throws JspException {
// 对el表达式的处理
Object num = ExpressionEvaluatorManager.evaluate("number", number.toString(), Object.class, this, pageContext);
String number1 = (String) num;
StringBuffer buffer = new StringBuffer(number1);
int length = buffer.length();
// 每隔4位数字插入一个空格
for (int cnt = 4;cnt < length;cnt+=4){
buffer.insert(cnt, ' ');
cnt++; //插入空格时,需要偏移一位
length++; //插入时长度也会改变
}
this.number = buffer.toString();
}
StringWriter sw = new StringWriter();
@Override
public int doStartTag() throws JspException {
JspWriter out = pageContext.getOut();
try {
out.write(number);
} catch (IOException e) {
e.printStackTrace();
}
return SKIP_BODY;
}
}
tld文件
- 文件位置在WEB-INF中,需要在jsp页面中引用
属性 | 描述 |
---|---|
name | 定义属性的名称。每个标签的是属性名称必须是唯一的 |
required | 指定属性是否是必须的或者可选的,如果设置为false为可选。 |
rtexprvalue | 声明在运行表达式时,标签属性是否有效。 |
type | 定义该属性的Java类类型 。默认指定为 String |
description | 描述信息 |
fragment | 如果声明了该属性,属性值将被视为一个 JspFragment。 |
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>Example TLD</short-name>
<tag>
<name>Hello</name>
<tag-class>com.hd.tag.MyTag</tag-class>
<attribute>
<name>number</name>
<!--定义此属性必须存在-->
<required>true</required>
<!--EL表达式支持-->
<rtexprvalue>true</rtexprvalue>
<!--类型,默认String-->
<type>java.lang.String</type>
<!--说明-->
<description>This is number attribute.</description>
</attribute>
<body-content>empty</body-content>
</tag>
</taglib>
jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%--引用WEB-INF下custom.tld标签,前缀xyg--%>
<%@ taglib uri="/WEB-INF/custom.tld" prefix="xyg"%>
<html>
<head>
<title>VMDS</title>
</head>
<body>
<%--在标签中name属性为Hello的类作为处理--%>
<xyg:Hello number="${num}"></xyg:Hello>
</body>
</html>
JSTL
引入
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
设值
<c:set var="" value="" scope="作用域"/>
输出
<c:out value=""/>
删除
<c:remove var="" scope="作用域">
判断
<c:if test="逻辑表达式"></c:if>
<!-- var: 保存var表达式结果的值-->
<!-- socope:指定var作用域 -->
<c:if test="${!empty sessionScope.param2}" var="result" scope="page">
<div style="color:red;">in session: ${sessionScope.param2 } </div>
</c:if>
循环
<c:forEach items="es" var="e" varStatus="status">
</c:forEach>
status.index行数0开始
status.count行数1开始
字符串拆分
<!-- 字符串拆分 -->
<c:set var="str" value="page|requst|session" ></c:set>
<!-- !!var标签使用param会导致取不出值 -->
<c:forTokens items="${str}" delims="|;" var="p">
<p style="color:green;"><c:out value="${p}"></c:out></p>
</c:forTokens>
choose/when/otherwise
<c:set var="varTemp" value="5" ></c:set>
<c:choose>
<c:when test="${varTemp==1 }">
varTemp is 1
</c:when>
<c:when test="${varTemp==2 }">
varTemp is 2
</c:when>
<c:otherwise>
varTemp is ${varTemp }
</c:otherwise>
</c:choose>
格式化
引入
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix='fmt' %>
格式化日期
<%
Date now = new Date();
pageContext.setAttribute("now", now);
%>
<fmt:formatDate value="${now}" pattern="yyyy年MM月dd日 HH时mm分ss秒"/>
处理字符串
${fn:length()}
${fn:join()}