JSP学习笔记(1)

运行在服务器端的动态网页技术–JSP


JSP简介

JSP全称为Java Server Pages,是基于Servlet建立的一种动态网页技术标准,相比传统的HTML页面,使用JSP技术可以在HTML页面中嵌入Java代码。点击此处了解更多关于JSP技术的信息。


JSP脚本

想要使用JSP脚本,有三种方式,其语法如下:

  1. <% java代码 %>
  2. <%= java表达式 %>
  3. <%! java代码 %>

关于三种语法形式的区别如下表,

语法形式 区别
<% java代码 %> 代码在服务器端执行时会被放到service()方法内部执行
<%= java表达式 %> 代码会被放到service()方法内部的out.print(java表达式)中执行
<%! java代码 %> 代码会被放到service()方法的外部,类的内部,作为成员内容执行

JSP注释

JSP文件中有三种注释方式

  1. HTML注释:
  2. Java注释:由于使用Java作为脚本语言,所以JSP文件支持Java的注释方式,包括单行(//)、多行(/**/)与文档注释(/** */)
  3. JSP注释:<%– JSP注释 –%>

在JSP文件中,不同的注释其可见范围是不一样的

JSP支持的注释 可见范围
HTML注释 JSP源码、翻译后的Servlet、HTML源码
Java注释 翻译后的Servlet、HTML源码
JSP注释 JSP源码

JSP运行原理

jsp文件在第一次被访问时会Web容器翻译成Servlet程序并编译运行。编译运行后的文件存放在Tomcat安装目录/work/Catalina/localhost/项目名称/org/apache/jsp路径下。


JSP指令

JSP指令用来设置整个页面的相关属性,比如页面编码、引入标签库等。JSP文件中可以设置三个指令,每个指令有不同的属性。

指令:

JSP指令 描述
<%@page …%> 定义网页的一些基本属性,例如:编码、错误页面、是否使用session等
<%@include …%> 页面包含
<%@taglib …%> 引入标签库

Page指令常用属性:

Page指令属性 描述
pageEncoding 当前jsp文件的编码
import 导入java包
language jsp文件中嵌入的语言类型
contextType 指定当前JSP页面的MIME类型和字符编码
session 指定JSP页面是否使用session
errorPage 指定当前JSP页面发生异常时需要跳转到的错误处理页面
isErrorPage 指定当前页面是否可以作为另一个JPS页面的错误页面
extends 指定JSP页面翻译后的Servlet要继承的类

include指令:文件包含指令或者说页面包含指令(静态页面),即可以将一个JSP页面包含到另一个JSP页面中,其语法如下:<%@include file=”文件地址” %>,此处的地址是一个相对的地址。

taglib指令:此指令用于引入自定义的标签库,其语法如下:<%@taglib uri="标签库地址" prefix="标签前缀">标签前缀可以自由定义。


JSP隐式对象

JSP中的隐式对象由容器负责创建,因此可以直接使用。

对象 类型 描述
request ServletRequest 获取用户请求信息
response ServletResponse 服务器响应信息
config ServletConfig 服务器配置,获取初始化参数
page Object 指定当前页面转换后的Servlet类实例
session HttpSession 保存用户信息
pageContext PageContext JSP页面容器
application ServletContext 所有用户的共享信息
out JspWriter 页面输出
exception Exception JSP页面所发生的异常,只在错误页面起作用

四个作用域的范围

page域:当前JSP页面
session域:一次会话
application域:整个web应用
request域:一次请求

部分示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<%@ page language="java" contentType="text/html; charset=UTF-8" session="true"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- html注释 -->
<%-- JSP注释 --%>
// 单行注释
/* 多行注释 */
/** 文档注释 */
<!-- 文本最终会由out.write()方法输出 -->
this is a test !
<%
// 九大隐式对象,由容器自动创建
// 由于Out缓冲区中的数据最终会被加载到response缓冲区中,所以out.write()输出的数据会在response.getWriter().write()之后
// 1.out对象
out.write("-- 隐式对象:Out") ;
// 2.response对象
response.getWriter().write("隐式对象:response --") ;
// 3.request对象
request.setAttribute("JSESSIONID", request.getSession().getId()) ;
// 4.pageContext域对象,此对象可以向其他指定的域中存取数据
// 向请求域中设置属性
request.setAttribute("age", "17");
// page域
pageContext.setAttribute("age", "16");
// request域
pageContext.setAttribute("age", "18", PageContext.REQUEST_SCOPE);
// session域
pageContext.setAttribute("age", "19", PageContext.SESSION_SCOPE);
// application域
pageContext.setAttribute("age", "20", PageContext.APPLICATION_SCOPE);
%><br />
<%="JSESSIONID: " + (String)request.getAttribute("JSESSIONID")%>
<%-- findAttribuite()方法默认会从小到大搜索域范围中的age,其大小关系为 page域<request域<session域<application域 --%>
<%=pageContext.findAttribute("age") %>
<%= "age= " + pageContext.getAttribute("age", PageContext.REQUEST_SCOPE)%>
<%-- pageContext对象可以获得其他八个隐式对象 --%>
<%
pageContext.getException();
pageContext.getOut();
pageContext.getPage();
pageContext.getRequest();
pageContext.getResponse();
pageContext.getServletConfig();
pageContext.getServletContext();
pageContext.getSession();
%>
<%!
int i = 8 ;
%>
<%-- 转发指令 --%>
<jsp:forward page="/include.jap" ></jsp:forward>
</body>
</html>

EL表达式

EL表达式的作用主要就是简化JSP代码的编写,提高代码的可维护性。

内置对象

对象 描述
pageScope 用于获取JSP域中的数据
requestScope 用于获取JSP域中的数据
sessionScope 用于获取JSP域中的数据
applicationScope 用于获取JSP域中的数据
parma 接收参数
parmaValues 接收参数
header 获取请求头部信息
headerValues 获取请求头部信息
initParma 获取全局初始化参数
cookie 获取Cookie数据
pageContext 获取其他8个隐式对象

JSTL

所谓JSTL即JSP标准标签库,是一个JSP标签集合,在JSP页面中使用JSTL可以完成一些业务逻辑代码的编写。根据JSTL标签的功能可以分五部分,核心标签(core)格式化标签(I18N)SQL标签XML标签JSTL函数标签(functions)。目前最新的是2015年发布的Standard 1.2.3,下载地址

下面是一些代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ page import="com.my.domain.*" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
// 模拟list<String>,输出集合中的数据
List<String> strList = new ArrayList<String>() ;
strList.add("Alibaba") ;
strList.add("Amazon") ;
strList.add("Google") ;
strList.add("Apple") ;
strList.add("Baidu") ;
strList.add("Tencent") ;
request.setAttribute("strList", strList) ;

// 遍历List<User>中的所有数据
List<User> userList = new ArrayList<User>() ;
// User为实体类
User user1 = new User() ;
user1.setId("1") ;
user1.setName("Tom");
user1.setPassword("123") ;
userList.add(user1) ;
User user2 = new User() ;
user2.setId("1") ;
user2.setName("Jerry");
user2.setPassword("123") ;
userList.add(user2) ;
application.setAttribute("userList", userList) ;

// 遍历Map<String, String>中的所有数据
Map<String,String> strMap = new HashMap<String, String>();
strMap.put("name","Jerry") ;
strMap.put("email","jerry@163.com") ;
strMap.put("addr","guangzhou") ;
strMap.put("age","20") ;
session.setAttribute("strMap", strMap) ;
%>

<%-- 取出strList中的数据 --%>
<h3>forEach取出strList中的数据</h3>
<c:forEach items="${strList}" var="str">
<!-- 换行是为了避免字符串覆盖 -->
${str}<br />
</c:forEach>

<h3>forEach取出userList中的数据</h3>
<c:forEach items="${userList}" var="user">
Username:${user.name}--
Password:${user.password}<br />
</c:forEach>
<h3>forEach取出strMap中的数据</h3>
<c:forEach items="${strMap}" var="map">
${map.key}:
${map.value}<br />
</c:forEach>
</body>
</html>

如果您觉得我的文章对您有帮助,请随意赞赏,您的支持将鼓励我继续创作!
0%