第01章:JSP入门
-
什么是JSP
JSP(Java ServerPage)是原SUN公司开发的一款运行在Web服务器中的动态Web技术之一,属于JavaEE体系架构之一。 -
为什么要用JSP
用Servlet来做Web页面显示比较烦麻,难以后期维护,这时就需要一个新的技术来替代Servlet在显示页面方面的不足,且又必须是一种动态Web技术,于是原SUN制定的JSP规则,用于替代Servlet在显示界面的不足。
注意,初学者不要认为JSP可以完全取代Servlet,只是弥补了Servlet。(JSP本质还是还是Servlet–>编译时JSP会打包成Servlet) -
在哪里用JSP
做Web页面显示,包括静态页面显示和动态页面显示。
JSP = HTML技术 + Java技术 + JSP特有技术 -
我的第一个JSP程序
01_date.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<title>My JSP 'date.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
当前时间:<%=new Date().toLocaleString()%><br/>
第02章:JSP运行原理
-
谈Web服务器是如何调用并执行一个JSP页面的
参见JSP运行原理图 -
谈JSP页面中的HTML标签是如何被发送到客户端的
JSP中的HTML标签(静态内容)通过JspWriter.write()方法输出到客户端的 -
谈JSP页面中的Java代码服务器是如何执行的
JSP中的Java代码(动态内容)通过JspWriter.print()方法输出到客户端的 -
谈Web服务器在调用JSP时,会给JSP提供一些什么Java对象
因为Web服务器会将JSP页面翻译成Java代码,其实这个Java代码就是
我们的Servlet代码,会向service()方法传入一些对象,例如:request和response对象
这些对象我们不需要创建,直接用就可以,我们称其为JSP内置对象/隐式对象
注意:观察以下目录,是JSP引擎/容器翻译JSP为Servlet的源代码位置:
E:\apache-tomcat-7.0.64\work\Catalina\localhost\day14\org\apache\jsp\jsp
第03章:JSP最佳实践,即MVC模式
-
在长期的实战中,人们得出如下习惯用法:
显示View:JSP适合做页面的显示,例如:显示登录成功界面
控制Controller:Servlet适合做业务控制操作,例如:接收用户请求,
将用户请求的参数值封装到JavaBean对象中去,调用其它Java类处理,
如果有结果,将结果放入到域对象中去,转发或重定向到显示结果的JSP页面
功能Model:Bean,即就是普通Java类,该类中封装大量的业务操作 -
画图演示MVC
参见MVC运行图
第04章:JSP基础语法
-
JSP模版元素
就是HTML标签,在JSP中一样可以书写HTML标签,就些标签就叫模版元系,
属于静态内容 -
JSP输出表达式
<%= “xx” %>
主要用于向浏览器输出变量的值
注意:<%=和%>不可分隔
注意:后面无分号
Response.getWriter().write(); -
JSP脚本片断
<% Java代码; %>
书写一行或多行Java代码
多个脚本片段可以相互访问,
注意:后面有分号
为什么多个脚本片段之间可以相互调用呢?
答案:查看JSP翻译后的Servlet源文件便知
-
JSP声明
<%! java代码 %>
JSP声明的变量或方法,会被翻译成Servlet的实例变量和成员方法 -
JSP注释
JSP中可以书写Java代码,所有Java代码的注释在JSP同样可以使用//
JSP中可以书写HTML代码,所有HTML代码的注释在JSP同样可以使用
JSP也有自已特有的注释,<%-- xxxxxx -->,不能嵌套
JSP引擎将 当作有效内容,翻译进Servlet源文件
JSP引擎将<%-- --%>当作无效内容,忽略,不翻译进Servlet源文件,推荐使用
02_random.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%-- JSP声明 --%>
<%!
int global;
public int getNumber(){
return new Random().nextInt(10);
}
%>
<%-- JSP脚本 --%>
<%
for(int i=1;i<=6;i++){
int number = getNumber();
%>
<%-- JSP输出表达式 --%>
<h4><%=number%></h4>
<%
}
%>
03_font.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import=“java.util.*” %>
<%
for(int i=1;i<=6;i++){
%>
<h<%=i%>>哈哈</h<%=i%>>
<%
}
%>
第05章:JSP指令
-
什么是JSP指令
JSP指令是通知JSP引擎如何处理该JSP页面,
例如:通知JSP引擎加载java.util.*包中的类 -
谈JSP共有三种指令
- page指令
- include指令
- taglib指令
-
谈JSP指令语法
<%@ page 属性名=”属性值” %>
一个指令可以有多个属性,属性名=“属性值”
指令通常放在JSP的第一行,第一行前不要有任何空白符和注释 -
谈page指令
<%@page
[ language="java" ] 默认java
在JSP的脚本片段只能书写java代码
[import="{package.class|package.*},..]
%>
默认java.lang,javax.servlet,javax.servlet.http,javax.servlet.jsp
向jsp翻译后的servlet源码导入包
[session=“true | false” ] 默认true
true表示一旦访问jsp页面,自动创建HttpSession,false表示不自动创建HttpSession
[ autoFlush=“true | false” ] 默认true
jsp页面有缓存,在默认情况下,autoFlush=true表示缓存满后自动强行输出到浏览器,
如果设置为false的话,得通过人工调用flush()方法才可以输出到浏览器
[ isThreadSafe=“true | false” ] 默认true
jsp页面是否被多个线程同时访问安全?
如果设置为true,表示多个线程来访问jsp是安全的。如果设置为false的话,就表示该jsp页面在没有加锁的情况下,多个线程来访问,可能会出现安全问题
[ info=“这是我的第一个jsp程序” ] 默认""
表示给该jsp页面记录一些附加的信息
[errorPage=“relative_url” ] 无默认值
表示该jsp页面出错后,转发到指定的jsp页面进行错误消息的显示
/表示当前web应用的根目录,即/day14
否则表示当前jsp页面
[ isErrorPage=“true | false” ] 默认false
如果是用于错误消息的显示jsp页面,要加上isErrorPage=true这个属性,这样jsp引擎就会创建exception内置对象,该exception内置对象中封装了出错的原因
如果设置为false的话,jsp引擎不会将exception内置对象翻译到servlet代码中,即无法在jsp页面中用exception对象来获取出错原因
500:表示服务器执行代码时,出错了,即属于服务器出错
404:表示客户端访问服务器资源时,路径错了,即属于客户端出错
04_error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page errorPage="/WEB-INF/message.jsp" %>
<!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>errorPage+isErrorPage</title>
</head>
<body>
<%
int i = 1/0;
%>
</body>
</html>
message.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page isErrorPage="true"%>
<!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>errorPage+isErrorPage</title>
</head>
<body>
出错了<br/>
<%=exception.getMessage()%>
</body>
</html>
[ contentType=“mimeType [;charset=characterSet ]” | “text/html ; charset=ISO-8859-1” ]
默认ISO-8859-1
对内(开发工具):表示设置该jsp文件采用的编码方式,推荐用UTF-8
对外(浏览器):表示浏览器采用什么解码方式,推荐用UTF-8
[ pageEncoding=“characterSet | ISO-8859-1” ] 默认ISO-8859-1
对内:表示设置该jsp文件采用的编码方式,推荐用UTF-8
对外:表示浏览器采用什么解码方式,推荐用UTF-8
如果在jsp页面中,同时存在contentType和pageEncoding的话,会有如下结果:
对内:pageEncoding来决定
对外:contentType来决定
建议都用contentType = pageEncoding = UTF-8
对于MyEclipse工具而言,只需设置pageEncoding=UTF-8即可
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'date.jsp' starting page</title>
</head>
<body>
当前时间:<%=new Date().toLocaleString()%><br/>
</body>
</html>
[isELIgnored=“true | false” ] ,默认支持,即false
如果JSP引擎支持EL的话,即为false,就会将${}符号中的内容运算出来,再显示
如果选用true的话,表示JSP引擎会忽略EL,将EL做为一个普通字符串来输出
05_el.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page isELIgnored="false" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'date.jsp' starting page</title>
</head>
<body>
10+3=${10+3}
</body>
</html>
可以配置一个全局的出错处理,在web.xml文件中配置,
<error-page>
<error-code>500</error-code>
<location>/WEB-INF/03_globalerror.jsp</location>
</error-page>
只要当前web应用下的所有jsp或servlet资源,出现了500错误,都会转发到
/WEB-INF/03_globalerror.jsp页面
如果既有局部出错处理,又有全局出错处理,局部优先
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<error-page>
<error-code>500</error-code>
<location>/WEB-INF/globalerror.jsp</location>
</error-page>
- 谈include指令
在一个JSP页面中包含多个其它的JSP页面
<%@include file=”被包含的jsp页面的路径” %>
在翻译成Servlet时,就将被包含的JSP页面中的内容翻译成Servlet中了,即多个JSP只会翻译成1个Servlet,静态包含。
06_include.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ include file="/jsp/date.jsp"%>
<%@ include file="/jsp/el.jsp"%>
- 谈taglib指令
在JSP页面中需要引用第三方的标签
<%@ taglib uri=”名称空间” prefix=”标签的前缀”%>
我们在《JSP之JSTL标签库》中再讲
第06章:JSP九大内置/隐式对象
-
什么是内置对象
由JSP引擎将JSP翻译成Servlet时,自动创建的对象,无需程序员创建的对象,直接使用即可,这些对象就叫内置对象。 -
谈JSP中有9个内置对象,分别是
JSP叫法 | 功能等价 | 部份Servlet叫法 |
request | HttpServletRequest | 请求对象,请求域对象 |
response | HttpServletResponse | 响应对象 |
session | HttpSession | 会话域对象 |
application | ServletcContext | 应用域对象 |
config | ServletConfig | 获取某个Servlet的初始化参数 |
out | JspWriter(带缓冲的PrintWriter) | JSP专用的字符输出对象 |
exception | (特殊情况下使用) | 异常对象 |
page | this(本JSP页面) | JSP页面自己 |
pageContext | 无 | 当前域对象 |
pageContext功能强大,其中有一个findAttribute()这个API,它会
依次从page->request->session->application这几个域对象,例如:
如果在request中找到了,就不会再去其它域对象中找了
如果在JSP中的上述四个域对象都没找到,返回null
07_getData.jsp
<%@ page language=“java” import=“java.util.*” pageEncoding=“UTF-8”%>
<title>演示pageContext从JSP四个域对象中取数据</title>
<%
//pageContext.setAttribute("NAME","pageContext");
//request.setAttribute("NAME","request");
//session.setAttribute("NAME","session");
//application.setAttribute("NAME","application");
%>
<%= pageContext.findAttribute("NAME")%>
JSP中
pageContext 生命周期:页面范围有效
request 生命周期:请求范围有效
session 生命周期:会话范围有效
application 生命周期:应用范围有效
Servlet中:
HttpServletRequest 请求范围内有效
HttpSession 会话范围内有效
ServletContext 应用范围内有效
第07章:JSP之EL表达式
-
什么是EL(Expression Language)
EL是一种在JSP中使用的,由JSP引擎解析的特殊字符串 -
谈EL有什么作用
2.1 获取域对象数据(包括JavaBean,数组,集合)
EL会依次从page->request->session->application中依次查找字符串对应的值,
如果EL找不到,返回空白字符串””,不是null
EL底层就是pageContext.findAttribute()这个API
${NAME}找不到返回””
findAttribute(“NAME”)找不到返回null
08_el_1.jsp
<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>
<%@ page import=“cn.itcast.android.javaweb.servlet.User” %>
<%
User user = new User("赵君");
pageContext.setAttribute("USER",user);
%>
姓名:${USER.name}<br/>
2.2 执行运算 算术(+-*/),关系(>>=<<=!=和==),逻辑(&&||!)
09_el_2.jsp
<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>
一天有${1*24*60*60}秒<br/>
10>3吗?${10>3?"是":"不是"}<br/>
true && false 结果为:${true && false}<br/>
2.3 获取web开发常用11个内置对象
3. 谈EL中有11个内置(隐式)对象
pageContext | 当前域对象 |
pageScope/requestScope/sessionScope/applicationScope | 域对象中key=value形式的Map对象,不是域对象 |
param/paramValues | 用于获取请求行和体中的内容 |
header/headerValues | 用于获取请求头中的内容 |
cookie | 用于获取浏览器中Cookie的名和值 |
initParam | 用户获取整个Web应用初始化参数 |
10_el_3.jsp
<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>
<a href="${pageContext.request.contextPath}/Demo01">获取web应用的名字</a><br/>
<%
pageContext.setAttribute("location","深圳");
request.setAttribute("location","广州");
%>
${requestScope.location}<br/>
${param.id}<br/>
第08章:JSP之动作标签
-
什么是动作标签
是JSP内置标签,无需导入第三方的jar包,
该标签封装了一定的业务逻辑 -
常用的动作标签
1. <jsp:forward page=””/>
2. <jsp:include page=””/>,属于动态包含
静态包含:将多个JSP翻译成一个Servlet
动态包含:将多个JSP翻译成多个Servlet
3. <jsp:param name="" value=""/>
from.jsp
<%@ page language=“java” import=“java.util.*” pageEncoding=“UTF-8”%>
<title>My JSP 'date.jsp' starting page</title>
<jsp:forward page="/jsp/to.jsp">
<jsp:param value="jack" name="name"/>
<jsp:param value="123" name="pass"/>
</jsp:forward>
to.jsp
<%@ page language=“java” import=“java.util.*” pageEncoding=“UTF-8”%>
<title>My JSP 'date.jsp' starting page</title>
to.jsp<br/>
${param.name}<br/>
${param.pass}<br/>
第09章:JSP之JSTL标签
-
什么是JSTL标签
JSTL(JSP Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的,在所有支持JSP的Web服务器中都可以运行。 -
为什么要用JSTL标签
其实不管是动作标签,EL,还是JSTL,他们都是为了在JSP中,封装业务操作,但又不想在JSP中书写大量的<%%>符号,达到页面的整体统一,让人觉得JSP页面都是由标签组成。
但jsp:forward/这个标签本质上还是与标签有区别的。 -
常用的JSTL标签
- c:if
- c:choose/c:when/c:otherwise
- c:forEach
要在jsp声明一个指令:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core"prefix=“c” %>
jstl.jsp
<%@ page language=“java” import=“java.util.*” pageEncoding=“UTF-8”%>
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>
<title>My JSP 'date.jsp' starting page</title>
<%
List<String> list = new ArrayList<String>();
list.add("HTML");
list.add("CSS");
list.add("JS");
list.add("XML");
list.add("AJAX");
list.add("TOMCAT");
request.setAttribute("LIST",list);
%>
<c:if test="${!empty LIST}">
<c:forEach var="course" items="${LIST}">
${course}<br/>
</c:forEach>
</c:if>
<hr/>
<c:choose>
<c:when test="${!empty LIST}">
<c:forEach var="course" items="${LIST}">
${course}<br/>
</c:forEach>
</c:when>
<c:otherwise>
查无数据
</c:otherwise>
</c:choose>
练习:购物车V2