JavaWeb核心技术四

第01章:JSP入门

  1. 什么是JSP
    JSP(Java ServerPage)是原SUN公司开发的一款运行在Web服务器中的动态Web技术之一,属于JavaEE体系架构之一。

  2. 为什么要用JSP
    用Servlet来做Web页面显示比较烦麻,难以后期维护,这时就需要一个新的技术来替代Servlet在显示页面方面的不足,且又必须是一种动态Web技术,于是原SUN制定的JSP规则,用于替代Servlet在显示界面的不足。
    注意,初学者不要认为JSP可以完全取代Servlet,只是弥补了Servlet。(JSP本质还是还是Servlet–>编译时JSP会打包成Servlet)

  3. 在哪里用JSP
    做Web页面显示,包括静态页面显示和动态页面显示。
    JSP = HTML技术 + Java技术 + JSP特有技术

  4. 我的第一个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运行原理

  1. 谈Web服务器是如何调用并执行一个JSP页面的
    参见JSP运行原理图

  2. 谈JSP页面中的HTML标签是如何被发送到客户端的
    JSP中的HTML标签(静态内容)通过JspWriter.write()方法输出到客户端的

  3. 谈JSP页面中的Java代码服务器是如何执行的
    JSP中的Java代码(动态内容)通过JspWriter.print()方法输出到客户端的

  4. 谈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模式

  1. 在长期的实战中,人们得出如下习惯用法:
    显示View:JSP适合做页面的显示,例如:显示登录成功界面
    控制Controller:Servlet适合做业务控制操作,例如:接收用户请求,
    将用户请求的参数值封装到JavaBean对象中去,调用其它Java类处理,
    如果有结果,将结果放入到域对象中去,转发或重定向到显示结果的JSP页面
    功能Model:Bean,即就是普通Java类,该类中封装大量的业务操作

  2. 画图演示MVC
    参见MVC运行图

第04章:JSP基础语法

  1. JSP模版元素
    就是HTML标签,在JSP中一样可以书写HTML标签,就些标签就叫模版元系,
    属于静态内容

  2. JSP输出表达式
    <%= “xx” %>
    主要用于向浏览器输出变量的值
    注意:<%=和%>不可分隔
    注意:后面无分号
    Response.getWriter().write();

  3. JSP脚本片断
    <% Java代码; %>
    书写一行或多行Java代码
    多个脚本片段可以相互访问,
    注意:后面有分号

为什么多个脚本片段之间可以相互调用呢?
答案:查看JSP翻译后的Servlet源文件便知

  1. JSP声明
    <%! java代码 %>
    JSP声明的变量或方法,会被翻译成Servlet的实例变量和成员方法

  2. 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指令

  1. 什么是JSP指令
    JSP指令是通知JSP引擎如何处理该JSP页面,
    例如:通知JSP引擎加载java.util.*包中的类

  2. 谈JSP共有三种指令

    1. page指令
    2. include指令
    3. taglib指令
  3. 谈JSP指令语法
    <%@ page 属性名=”属性值” %>
    一个指令可以有多个属性,属性名=“属性值”
    指令通常放在JSP的第一行,第一行前不要有任何空白符和注释

  4. 谈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>
  1. 谈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"%>
  1. 谈taglib指令
    在JSP页面中需要引用第三方的标签
    <%@ taglib uri=”名称空间” prefix=”标签的前缀”%>
    我们在《JSP之JSTL标签库》中再讲

第06章:JSP九大内置/隐式对象

  1. 什么是内置对象
    由JSP引擎将JSP翻译成Servlet时,自动创建的对象,无需程序员创建的对象,直接使用即可,这些对象就叫内置对象。

  2. 谈JSP中有9个内置对象,分别是

JSP叫法功能等价部份Servlet叫法
requestHttpServletRequest请求对象,请求域对象
responseHttpServletResponse响应对象
sessionHttpSession会话域对象
applicationServletcContext应用域对象
configServletConfig获取某个Servlet的初始化参数
outJspWriter(带缓冲的PrintWriter)JSP专用的字符输出对象
exception(特殊情况下使用)异常对象
pagethis(本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表达式

  1. 什么是EL(Expression Language)
    EL是一种在JSP中使用的,由JSP引擎解析的特殊字符串

  2. 谈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之动作标签

  1. 什么是动作标签
    是JSP内置标签,无需导入第三方的jar包,
    该标签封装了一定的业务逻辑

  2. 常用的动作标签
    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标签

  1. 什么是JSTL标签
    JSTL(JSP Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的,在所有支持JSP的Web服务器中都可以运行。

  2. 为什么要用JSTL标签
    其实不管是动作标签,EL,还是JSTL,他们都是为了在JSP中,封装业务操作,但又不想在JSP中书写大量的<%%>符号,达到页面的整体统一,让人觉得JSP页面都是由标签组成。
    但jsp:forward/这个标签本质上还是与标签有区别的。

  3. 常用的JSTL标签

    1. c:if
    2. c:choose/c:when/c:otherwise
    3. 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