JSP概述
由sun公司提供的动态web资源的开发技术。本质上是一个servlet.
[toc]
1.JSP由来
JSP的出现是为了解决Servlet在响应时不适合向外输出页面的问题.
- Servlet本质上是一段java代码,非常适合处理逻辑,但是处理的结果不太适合由Servlet向外输出(不适合输出完整的html页面)。
- HTML是用于开发网页的一门技术,可以用来展示数据。但是HTML开发出来的页面本质上就是一个文档(静态资源),无法展示动态的数据
- JSP非常适合编写HTML代码,适合作为响应页面向外输出,同时JSP里可以写java代码,也可以展示动态的数据
- 所以JSP的出现既可以解决Servlet不适合向外响应一个完整的页面又可以解决html无法展示动态数据的问题
- JSP在第一次访问时,会被翻译成一个Servlet,对JSP访问后看到的页面 其实就是翻译后的Servlet在向外输出
2.JSP执行过程
3.JSP语法
模板元素
直接写在jsp页面中的html内容称之为jsp页面的模板元素
模板元素在翻译后的Servlet中,直接被out.write原样输出到浏览器。
JSP表达式
格式: ==<%= 表达式 %>== 其中可以书写常量、变量、表达式
作用:JSP表达式在翻译后的Servlet中是执行表达式的值再原样输出到浏览器
<%= "Hello JSP" %>
<%= 153+231 %>
JSP脚本片段
格式:==<% java语句 %>==
作用:在翻译过来的servlet中,脚本片段中的Java代码被复制粘贴到对应的位置执行
<% for(int i = 0;i<10;i++){ %>
Hello JSP...<br/>
<% } %>
JSP注释
格式:==<%-- JSP注释 --%>==
注意: 注释不能交叉嵌套!!
JSP指令
用于指挥JSP解析引擎如何来翻译当前JSP页面中其它部分的内容
(1)page指令
用来声明当前JSP页面的基本属性的,page指令可以写在JSP页面的任意位置,但是为了可读性考虑,一般情况下最好放在JSP页面的最前面
格式:==<%@ page ... %>==
(1)<%@ page language="java" %> -- 指定当前JSP使用的语言是java.(了解即可)
(2)<%@ page pageEncoding="UTF-8"%> -- 用来通知JSP解析引擎使用指定的编码来翻译JSP。如果想防止JSP乱码,应该要保证JSP文件保存时的编码和pageEncoding指定的编码保持一致。
(3)<%@ page session="true"%> -- 用来指定当前页面是否使用session,如果设置为true,则翻译过来的servlet中将会有对session对象的引用,于是可以直接在JSP中使用session隐式对象。但
是这将导致一旦访问JSP就会调用request.getSession()方法,可能导致不必要的空间浪费。如果确定JSP中不需要session可以设为false.
(4)<%@ page errorPage="filepath"%> -- 为当前JSP页面指定友好错误提示页面,即当前JSP如果抛出了异常,将会跳转到errorPage属性指定的页面。
(5)<%@ page import="..."%> -- 为JSP翻译后的Servlet指定所依赖的jar包
<%@page import="java.util.Date"%>
<%@page import="java.io.File" %>
<%@page import="java.sql.DriverManager"%>
(2)include指令
可以实现页面包含的效果
格式: ==<%@ include file="" %>==
(3)taglib指令
引入JSTL标签库
4.JSP的九大隐式对象
JSP翻译引擎在将JSP翻译成servlet的过程中,在servlet里预先定义了九个对象,因此我们可以在JSP页面中直接使用这九个对象
隐式对象 | info |
---|---|
page | this |
request | ServletRequest |
response | ServletResponse |
application | ServletContext |
config | ServletConfig |
session | HttpSession |
exception | |
out | 等价于response.getWriter() |
pageContext |
pageContext
代表当前JSP页面的运行环境的对象,通过该对象可以访问页面中的共享数据
(1).pageContext对象可以获取其他八大隐式对象
(2).pageContext是一个域对象
方法 | 相关描述 |
---|---|
setAttribute(String name,Object value) | 添加一个域属性 |
getAttribute(String name) | 根据指定的属性名获取属性值. |
removeAttribute(String name) | 根据指定的属性名删除一个属性. |
生命周期:当访问JSP开始时创建pageConext对象,当访问JSP结束时销毁pageContext对象.
作用范围: 整个JSP页面
主要功能: 在整个JSP页面中实现数据的共享
四大作用域范围: ServletContext > Session > Request > pageContext
5.JSP标签技术
于是在JSP的2.0版本中,sun提出了JSP标签技术,推荐使用标签来代替JSP页面中java代码,并且推荐,JSP2.0以后不要在JSP页面中出现任何一行java代码
EL表达式
EL表达式在JSP中可以非常方便的获取数据,可以代替JSP页面中的JSP表达式(<%= %>)
基本结构: ${ 表达式 }
EL只能获取不能设置!!!
EL只能获取不能遍历!!!
(1) 获取常量/变量(必须存入域中)/表达式的值
${ "Hello EL" }
${ 123+456 }
<br/>
<%= "Hello EL" %>
<%= 123+456 %>
<hr/>
<% String name = "赵云"; %>
<%= name %>
<%-- 上面通过JSP表达式获取name, 是在当前JSP运行环境
中获取名称为name的变量的值 --%>
<%
request.setAttribute("name", "request张飞");
session.setAttribute("name", "session张飞");
%>
${ name }
<%-- 通过EL获取name, 是在四大域中寻找名称为name的属性
值, 如果找到就返回name属性的值, 如果找不到就什么
也不输出!!
在寻找时, 是按照从小到大的顺序到四大域中寻找指定
名称的属性值!!
--%>
(2)获取域中数组或集合中的数据
<%
String[] names =
{ "王海涛", "齐雷", "陈子枢", "刘沛霞" };
request.setAttribute("names", names);
%>
${ names[0] }
${ names[1] }
${ names[2] }
${ names[3] }
(3)获取域中map集合中的数据
<%
Map map = new HashMap();
map.put("name", "刘德华");
map.put("age", 18);
map.put("nickname", "Andy");
request.setAttribute("map", map);
%>
${ map.name }
${ map.age }
${ map.nickname }
JSTL标签库
(1)c:set标签
- 往域中添加一个域属性
<c:set var="name" value="张三丰" scope="request"/>
${ name }
- 修改域中已有的域属性
<c:set var="name" value="张无忌" scope="request"/>
${ name }
- 修改域中map集合中的元素
<%
Map map = new HashMap();
map.put("name", "刘德华");
map.put("age", 18);
map.put("nickname", "Andy");
request.setAttribute("map", map);
%>
修改前:
${ map.name }
${ map.age }
${ map.nickname }
<hr/>
<c:set target="${map}" property="name" value="阿凡达"/>
<c:set target="${map}" property="nickname" value="小达达"/>
修改后:
${ map.name }
${ map.age }
${ map.nickname }
(2)c:if标签
<c:if test="${ 3>5 }">yes</c:if>
<c:if test="${ !(3>5) }">no</c:if>
<!-- 模拟判断用户是否登录 -->
<%
session.setAttribute("user", "张三");
session.removeAttribute("user");
%>
<c:if test="${ user == null }">
<a href="#">您好, 请登录...</a>
</c:if>
<c:if test="${ user != null }">
欢迎, ${ user } 回来...
</c:if>
(3)c:forEach标签
- 遍历域中的数组或集合中的元素
<%
List list = new ArrayList();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("刘能");
request.setAttribute("list", list);
for(Object o : list){
System.out.println(o);
}
%>
<c:forEach items="${list}" var="o">
${ o }<br/>
</c:forEach>
- 遍历域中的map集合中的元素
<%
Map<Object, Object> map = new HashMap();
map.put("name", "刘德华");
map.put("age", 18);
map.put("nickname", "Andy");
request.setAttribute("map", map);
for(Map.Entry<Object,Object> e : map.entrySet()){
System.out.print(e.getKey() + " : ");
System.out.println(e.getValue());
}
%>
<c:forEach items="${map}" var="entry">
<%-- ${ entry.getKey() } : ${ entry.getValue() } <br/> --%>
${ entry.key } : ${ entry.value } <br/>
</c:forEach>
- varStatus 用于指定表示循环状态信息的对象
参数 | 相关描述 |
---|---|
first | Boolean,当前被遍历元素是否是第一个 |
last | Boolean,当前被遍历的元素是否是最后一个 |
count | 数值,当前被遍历元素是第几个 |
index | 索引,当前被遍历元素的索引值() |
网友评论