一、概述
1.1 使用
1. 依赖
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>2. 脚本分类
<%...%>:内容会直接放到_jspService()方法之中
<%=…%>:内容会放到out.print()中,作为out.print()的参数
<%!…%>:内容会放到_jspService()方法之外,被类直接包含
<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %> 导入资源
1.page : 配置JSP页面的
contentType:等同于response.setContentType()
设置响应体的mime类型以及字符集
设置当前jsp页面的编码(只能是高级的IDE才能生效,如果使用低级工具,则需要设置pageEncoding属性设置当前页面的字符集)
- import:导包
- errorPage:当前页面发生异常后,会自动跳转到指定的错误页面
- isErrorPage:标识当前也是是否是错误页面。
- true:是,可以使用内置对象exception
- false:否。默认值。不可以使用内置对象exception
include : 页面包含的。导入页面的资源文件
<%@include file="top.jsp"%>taglib : 导入资源 * <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> * prefix:前缀,自定义的
3. 内置对象
在jsp页面中不需要创建,直接使用的对象 * 一共有9个: 变量名 真实类型 作用 * pageContext PageContext 当前页面共享数据,还可以获取其他八个内置对象 * request HttpServletRequest 一次请求访问的多个资源(转发) * session HttpSession 一次会话的多个请求间 * application ServletContext 所有用户间共享数据 * response HttpServletResponse 响应对象 * page Object 当前页面(Servlet)的对象 this * out JspWriter 输出对象,数据输出到页面上 * config ServletConfig Servlet的配置对象 * exception Throwable 异常对象
4. EL表达式
EL(全称Expression Language )表达式语言,用于简化 JSP 页面内的 Java 代码。主要作用是 从域对象中获取数据,然后将数据展示在页面上。语法$
作用域:page:当前页面有效>request:当前请求有效>session:当前会话有效>application:当前应用有效
${brands},el 表达式获取数据,会先从page域对象中获取数据,如果没有再到 requet 域对象中获取数据,如果再没有再到 session 域对象中获取,如果还没有才会到 application 中获取数据。
jsp默认支持el表达式的。如果要忽略el表达式,在jsp中page指令中:isELIgnored="true" 忽略当前jsp页面中所有的el表达式。或\${表达式}忽略
1. 运算:
* 运算符:
1. 算数运算符: + - * /(div) %(mod)
2. 比较运算符: > < >= <= == !=
3. 逻辑运算符: &&(and) ||(or) !(not)
4. 空运算符: empty
* 功能:用于判断字符串、集合、数组对象是否为null或者长度是否为0
* ${empty list}:判断字符串、集合、数组对象是否为null或者长度为0
* ${not empty str}:表示判断字符串、集合、数组对象是否不为null 并且 长度>0
2. 获取值
1. el表达式只能从域对象中获取值
2. 语法:
1. ${域名称.键名}:从指定域中获取指定键的值
* 域名称:
1. pageScope --> pageContext
2. requestScope --> request
3. sessionScope --> session
4. applicationScope --> application(ServletContext)
* 举例:在request域中存储了name=张三
* 获取:${requestScope.name}
2. ${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。
3. 获取对象、List集合、Map集合的值
1. 对象:${域名称.键名.属性名}
* 本质上会去调用对象的getter方法
2. List集合:${域名称.键名[索引]}
3. Map集合:
* ${域名称.键名.key名称}
* ${域名称.键名["key名称"]}
3. 隐式对象:
* el表达式中有11个隐式对象
* pageContext:
* 获取jsp其他八个内置对象
* ${pageContext.request.contextPath}:动态获取虚拟目录5. JSTL标签引用
JSP标准标签库(Jsp Standarded Tag Library) ,使用标签取代JSP页面上的Java代码
依赖
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>jsp中引用
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
常用的JSTL标签
1. if:相当于java代码的if语句
1. 属性:
* test 必须属性,接受boolean表达式
* 如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容
* 一般情况下,test属性值会结合el表达式一起使用
2. 注意:
* c:if标签没有else情况,想要else情况,则可以在定义一个c:if标签
2. choose:相当于java代码的switch语句
1. 使用choose标签声明 相当于switch声明
2. 使用when标签做判断 相当于case
3. 使用otherwise标签做其他情况的声明 相当于default
3. foreach:相当于java代码的for语句1.2 JSTL标签
1. if标签
<c:if>:相当于 if 判断
<c:if test="${flag == 1}">
男
</c:if>
<c:if test="${flag == 2}">
女
</c:if>2. choose标签
<c:choose>:相当于switch
<c:choose>
<c:when test="${number == 7}">星期天</c:when>
<c:otherwise>数字输入有误</c:otherwise>
</c:choose>3. forEach标签
<c:forEach>:相当于 for 循环。java中有增强for循环和普通for循环,JSTL 中的 <c:forEach> 也有两种用法
用法一
类似于 Java 中的增强for循环。涉及到的
<c:forEach>中的属性如下items:被遍历的容器
var:遍历产生的临时变量
varStatus:遍历状态对象
jsp<c:forEach items="${brands}" var="brand"> <tr align="center"> <td>${brand.id}</td> <td>${brand.brandName}</td> <td>${brand.companyName}</td> <td>${brand.description}</td> </tr> </c:forEach>用法二
类似于 Java 中的普通for循环。涉及到的
<c:forEach>中的属性如下begin:开始数
end:结束数
step:步长
jsp<c:forEach begin="0" end="10" step="1" var="i"> ${i} </c:forEach>
1.3 Jsp标签拓展
新建一个类继承BodyTagSupport,并重写处理方法。
新建一个tld文件,配置相关信息。
在jsp页面通过taglib标签引用
1. 处理类
public class AccessDecisionTag extends BodyTagSupport {
private static final long serialVersionUID = -1074584292778101850L;
private String url;//资源地址
private HttpServletRequest request;
private static Logger logger = LoggerFactory.getLogger(AccessDecisionTag.class);
private IAccessDecision accessDecision;
@Override
public int doStartTag() throws JspException {
request = (HttpServletRequest)pageContext.getRequest();
accessDecision = SpringContext.getBean("accessDecision");
Subject subject = SessionUtil.getInstance().getSubject(request);
int bodyIsShow = SKIP_BODY;
if(ErrorCodeUtil.isSucc(accessDecision.isAllow(subject, url))){
bodyIsShow = EVAL_BODY_INCLUDE;
}else {
//无权限访问.
String fullurl = "url:" + url;
logger.debug(SessionUtil.getInstance().getUsername(request)+" refuse to visit "+fullurl);
}
return bodyIsShow;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}2. 配置标签
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>2.3</tlibversion>
<jspversion>1.1</jspversion>
<shortname>auth</shortname>
<info>访问权限标签</info>
<tag>
<name>acl</name>
<tagclass>com.commnetsoft.acl.tag.AccessDecisionTag</tagclass>
<bodycontent>JSP</bodycontent>
<attribute>
<name>url</name>
<required>true</required>
</attribute>
</tag>
</taglib>3. jsp页面引用
<%@ taglib uri="/WEB-INF/auth.tld" prefix="auth" %>