1 JSP指令
JSP指令标签 | ||
指令 | 属性 | 说明 |
<%@ page... %> | 定义页面的依赖属性,比如脚本语言、error页面、缓存需求等 | |
language | 指定当前JSP页面使用的脚本语言,默认Java | |
contentType | 指定当前JSP页面的MIME类型(文件类型)和字符编码 | |
pageEncoding | 指定当前JSP页面的编码格式 | |
errorPage | 指定当前JSP页面发生异常时需要转向的错误处理页面 | |
session | 指定JSP页面是否使用session缓存 | |
import | 引入要使用的java类库 | |
<%@ include... %> | 引入其他文件,包括JSP文件、html文件或文本文件; 包含的文件属于JSP页面的一部分,会被同时编译执行; | |
file | 文件相对路径 | |
<%@ taglib... %> | 引入标签库的定义,可以是自定义标签 |
2 JSP内置对象
JSP内置对象是由JSP页面的容器(tomcat)加载,不需要显式的声明就可以直接在JSP页面中使用的对象。
JSP一共有9个内置对象:
对象 | 描述 |
request | HttpServletRequest类的实例对象,用于接收服务端发送的请求数据,并修改或添加参数,返回给服务端 |
response | HttpServletResponse类的实例对象,返回给客户端的响应 |
out | PrintWriter类的实例对象,用于把数据输出到网页上 |
session | HttpSession类的实例对象,也叫会话对象,存储用户的会话状态(临时信息) |
application | ServletContext类的实例对象,应用上下文对象,作用于整个应用程序 |
config | ServletConfig类的实例对象,JSP页面的配置信息对象 |
pageContext | PageContext类的实例对象,提供对当前JSP页面所有对象以及命名空间的访问 |
page | 表示JSP页面的当前实例,类似于java中的this关键字 |
excepiton | Exception类的实例对象,异常对象,用于处理JSP页面中的异常 |
2.1 request
接收服务端发送的请求数据,同时也可以添加或修改request中的参数,并回传给服务端
示例:
<% UserInfo user = (UserInfo)request.getAttribute("user"); %>
2.1 out
输出到页面
示例:
<% String b = "abc";%>
<% out.println(b); %>
等价于
<%=b %>
2.3 session会话
一个session就是客户端。服务器有能力分辨出不同的客户端。一个session的建立是从一个客户端向服务器发第一个请求开始,以用户显式结束(如关闭浏览器)或session超时为结束。和服务器间的一系列通讯
优点:
- 缓存会话信息,减轻数据库的压力;
- session中的数据存放在服务器内存中,相比于数据库具有更快的查询速率;
缺点:
不是线程安全的,应该避免多个线程共享同一个Session实例;
示例:
服务端Servlet
//创建session会话
HttpSession session = req.getSession();
session.setMaxInactiveInterval(5);//设置session失效时间,单位秒s
//向session中添加信息
session.setAttribute("user_name", "张三");
session.setAttribute("addr", "中国,山东,青岛");
req.getRequestDispatcher("/WEB-INF/page/session.jsp").forward(req, res);
客户端JSP
<%
//获取session信息
String userName = (String)session.getAttribute("user_name");
String addr = (String)session.getAttribute("addr");
%>
3 JavaBean组件
3.1 组件定义
组件就是一个可以重复使用的软件模块。
JavaBean就是一种组件技术,简单来说,创建一个JavaBean组件就是创建一个Java类。
JavaBean需要满足以下三个要求:
- 是一个公有类,且含有公有的无参构造方法;
- 属性私有;
- 属性具有公有的set和get方法;
3.2 JavaBean示例
public class UserInfo {
//私有化属性
private String userName;
private int age;
//公有的无参构造方法
public UserInfo() {
}
//公有的set和get方法
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
4 JSP标准动作标签
JSP标准动作,在JSP中可以使用类似XML的语法格式的一些特殊标记,用来控制行为。
JSP规范定义了一系列标准动作,常用的包括:
<jsp:useBean /> | 查找或实例化一个JavaBean |
<jsp:setProperty /> | 设置JavaBean的属性 |
<jsp:getProperty /> | 输出JavaBean的属性值 |
<jsp:include /> | 用于在页面加载时引入其他文件(jsp页面) |
<jsp:forward /> | 请求转发,从一个JSP页面向另一个页面传递一个包含用户请求的request对象 |
4.1 <jsp:include />
该动作标签用于把指定文件引入到正在生成的页面中。
属性:
page | 被引入的页面文件的相对URL地址 |
flush | 定义在包含引入文件前是否刷新缓存区,布尔值 |
示例:
<jsp:include page="../page/kid.jsp" flush="true" />
被引入页面kid.jsp文件内容如下:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" %>
<html>
<body>
<p>日期:<%=(new java.util.Date()).toLocaleString() %></p>
</body>
</html>
4.2 <jsp:useBean />
用于加载一个将在JSP页面中使用的JavaBean。这个功能非常有用,因为它可以发挥Java组件复用的优势。
属性:
id | javaBean对象的唯一标识 |
class | javaBean所在的包路径 |
scope | 指定javaBean的作用范围(四大作用域),可以使用四个值: page:此javaBean只能应用于当前页 request:此javaBean只能应用于当前的请求 session:此javaBean在本次session内有效 application:此javaBean能应用于整个应用程序内 |
type | 指定javaBean对象的类型: 1 如果作用域(scope)内确定存在id相同的javaBean对象,则不产生新的对象,此时class属性可以省略; 2 如果作用域(scope)内不存在id相同的javaBean对象,则根据class属性指定的路径创建新的对象; |
示例1:
<jsp:useBean id="user" class="beans.UserInfo" scope="page"/>
示例2:
a.jsp
<!-- 查找或创建一个javaBean对象 -->
<jsp:useBean id="user" class="beans.UserInfo" scope="session"/>
<jsp:setProperty name="user" property="userName" value="李春"/>
<jsp:getProperty name="user" property="userName" />
b.jsp
<!--
查找或创建一个javaBean对象,
通过是否能取到值,判断是已有对象还是新建对象
-->
<jsp:useBean id="user" type="beans.UserInfo" class="beans.UserInfo" scope="session"/>
<jsp:getProperty name="user" property="userName" />
4.3 <jsp:setProperty />
用于设置已经实例化的Bean对象的属性。
属性:
name | 指定JavaBean的对象名,与<jsp:useBean>动作标签中的id属性对应 |
property | 指定JavaBean中需要赋值的属性名 |
value | 指定属性值 |
param | 指定request请求对象中的参数名,并将改参数的值赋值给对应的property; 注意:param不能与value属性共存 |
<jsp:setProperty>有两种使用方式:
方式1:
<jsp:useBean id="user" class="beans.UserInfo" />
<jsp:setProperty name="user" property="userName" value="jack"/>
<jsp:setProperty name="user" property="age" value="12"/>
这种方式,不管jsp:userBean是找到了一个现有的Bean对象,还是新创建了一个Bean对象,jsp:setProperty都会执行。
方式2:
<jsp:useBean id="user" class="beans.UserInfo" >
<jsp:setProperty name="user" property="userName" value="jack"/>
<jsp:setProperty name="user" property="age" value="12"/>
</jsp:useBean>
这种方式,jsp:setProperty只有在新建Bean对象时才会执行,如果是使用现有实例则不执行jsp:setProperty,即不执行赋值操作。
4.4 <jsp:getProperty />
获取指定Bean对象的属性的值,转换成字符串并输出。
属性:
name | 指定JavaBean的对象名,与<jsp:useBean>动作标签中的id属性对应 |
property | 指定JavaBean中的属性名 |
示例:
<jsp:useBean id="user" class="beans.UserInfo" />
<jsp:getProperty name="user" property="userName" />
4.3 <jsp:forward />
将请求转发到另一个页面,该动作标签只有一个属性page,用于指定转发目的页面的相对路径。
示例:
<jsp:forward page="../page/show.jsp" />
5 JSTL标签库
5.1 引入标签库
JSTL标签库需要导入两个支持jar包jstl.jar和standard.jar
<!-- JSTL标签库是一个JSP标签的集合,封装了许多jsp应用程序通用的核心功能-->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!-- JSTL格式化标签 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="f"%>
5.2 常用标签
<c:out value="输出标签,类似out内置对象" />
<!--
c:set 声明变量标签
var 变量名
value 变量值
scope 作用域page request session application
-->
<c:set var="money" value="200" scope="request" />
<c:if test="${money > 200}">
<p>满足了</p>
</c:if>
<!-- 类似于java中的switch -->
<c:choose>
<c:when test="${money > 200}">
<p>满足了</p>
</c:when>
<c:when test="${money < 200}">
<p style="color:red;">还不够!!!</p>
</c:when>
<c:otherwise>
<p>还行吧!!!</p>
</c:otherwise>
</c:choose>
<!--
items 被遍历的数据集
var 对应每一条被遍历的数据
类似于java的for(var : items){}
-->
<c:forEach items="${list}" var="str">
<p>${str}</p>
</c:forEach>
<!-- 格式化数字标签 -->
<f:formatNumber value="12.123" maxFractionDigits="2"></f:formatNumber>
<f:formatNumber value="${5 / 3}" maxFractionDigits="2"></f:formatNumber>
<c:set var="now" value="<%=new java.util.Date()%>" />
<!-- 格式化日期标签 -->
<f:formatDate value="${now}" pattern="yyyy-MM-dd HH:mm:ss:SSS"/>
5.2 EL表达式
<c:set var="money" value="200" scope="request" />
<!-- EL表达式:可以访问JavaBeans和jsp内置对象 -->
金额:${money}
//访问request中的list集合
集合:${list[0] }
//访问request对象中的user对象
用户:${user.userName }