javaWeb核心技术四

来源:互联网 发布:达达主义摄影知乎 编辑:程序博客网 时间:2024/06/07 01:33

第01章:JSP入门

1.01 什么是JSP

JSP(Java ServerPage)是原SUN公司开发的一款运行在Web服务器中的

动态Web技术之一,属于JavaEE体系架构之一。

1.02 为什么要用JSP

     用Servlet来做Web页面显示比较烦麻,难以后期维护,这时就需要一个新

的技术来替代Servlet在显示页面方面的不足,且又必须是一种动态Web技术

于是原SUN制定的JSP规则,用于替代Servlet在显示界面的不足。

注意,初学者不要认为JSP可以全全取代Servlet,只是弥补了Servlet。

1.03 在哪里用JSP

     Web页面显示,包括静态页面显示和动态页面显示。

       JSP = HTML技术 + Java技术 + JSP特有技术

1.04 我的第一个JSP程序

      01_date.jsp

<%@ 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>

     <metahttp-equiv="pragma"content="no-cache">

     <metahttp-equiv="cache-control"content="no-cache">

     <metahttp-equiv="expires"content="0">   

     <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">

     <metahttp-equiv="description"content="This is my page">

  </head>

  <body>

     当前时间:<%=new Date().toLocaleString()%><br/>

  </body>

</html>

 

 

第02章:JSP运行原理

2.01 谈Web服务器是如何调用并执行一个JSP页面的

     参见JSP运行原理图

2.02 谈JSP页面中的HTML标签是如何被发送到客户端的

     JSP中的HTML标签(静态内容)通过JspWriter.write()方法输出到客户端的

2.03 谈JSP页面中的Java代码服务器是如何执行的

     JSP中的Java代码(动态内容)通过JspWriter.print()方法输出到客户端的

2.04 谈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模式

3.01 在长期的实战中,人们得出如下习惯用法:

     显示View:JSP适合做页面的显示,例如:显示登录成功界面

    控制Controller:Servlet适合做业务控制操作,例如:接收用户请求,

将用户请求的参数值封装到JavaBean对象中去,调用其它Java类处理,

如果有结果,将结果放入到域对象中去,转发或重定向到显示结果的JSP页面

     功能Model:Bean,即就是普通Java类,该类中封装大量的业务操作

3.02 画图演示MVC

     参见MVC运行图

 

 

第04章:JSP基础语法

4.01 JSP模版元素

    就是HTML标签,在JSP中一样可以书写HTML标签,就些标签就叫模版元系,

   属于静态内容

4.02 JSP输出表达式

    <%=   ”xx”   %>

    主要用于向浏览器输出变量的值

      注意:<%=和%>不可分隔

注意:后面无分号

Response.getWriter().write();

4.03 JSP脚本片断

    <%         Java代码;    %>

    书写一行或多行Java代码

    多个脚本片段可以相互访问,

注意:后面有分号

为什么多个脚本片段之间可以相互调用呢?

答案:查看JSP翻译后的Servlet源文件便知

4.04 JSP声明

    <%!  java代码     %>

    JSP声明的变量或方法,会被翻译成Servlet的实例变量和成员方法

4.05 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.*"%>

<!DOCTYPEhtml PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<metahttp-equiv="Content-Type"content="text/html; charset=UTF-8">

<title>产生随机整数</title>

</head>

<body>

    <%-- 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>

    <%

        }

    %>

</body>

</html>

 03_font.jsp

<%@ page language="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>

<%@ page import="java.util.*"%>

<!DOCTYPEhtml PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<metahttp-equiv="Content-Type"content="text/html; charset=UTF-8">

<title>循环输出h1-h6字体</title>

</head>

<body>

    <%

        for(int i=1;i<=6;i++){

    %>

             <h<%=i%>>哈哈</h<%=i%>>

    <%

        }

    %>

</body>

</html>

 

 

第05章:JSP指令

5.01 什么是JSP指令

     JSP指令是通知JSP引擎如何处理该JSP页面

例如:通知JSP引擎加载java.util.*包中的类

5.02 谈JSP共有三种指令

     01——page指令

02——include指令

03——taglib指令

5.03 谈JSP指令语法

     <%@   page 属性名=”属性值”    %>

     一个指令可以有多个属性,属性名="属性值"

指令通常放在JSP的第一行,第一行前不要有任何空白符和注释

5.04 谈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"%>

<!DOCTYPEhtml PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<metahttp-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"%>

<!DOCTYPEhtml PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<metahttp-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"%>

<!DOCTYPEHTML 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"%>

<!DOCTYPEHTML 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应用下的所有jspservlet资源,出现了500错误,都会转发到

 /WEB-INF/03_globalerror.jsp页面

 如果既有局部出错处理,又有全局出错处理,局部优先

web.xml

 <?xmlversion="1.0"encoding="UTF-8"?>

<web-appxmlns: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>

</web-app>

5.05 谈include指令

     在一个JSP页面中包含多个其它的JSP页面

     <%@include     file=”被包含的jsp页面的路径”       %>

     在翻译成Servlet时,就将被包含的JSP页面中的内容翻译成Servlet中了,

即多个JSP只会翻译成1Servlet,静态包含。

     06_include.jsp

<%@ page language="java"pageEncoding="UTF-8"%>

<%@ include file="/jsp/date.jsp"%>

<%@ include file="/jsp/el.jsp"%>

5.06 谈taglib指令

    JSP页面中需要引用第三方的标签

    <%@ taglib         uri=”名称空间”         prefix=”标签的前缀”%>

     我们在《JSP之JSTL标签库》中再讲

 

 

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

6.01 什么是内置对象

     JSP引擎将JSP翻译成Servlet时,自动创建的对象,

无需程序员创建的对象,直接使用即可,这些对象就叫内置对象。

6.02 谈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"%>

<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>演示pageContext从JSP四个域对象中取数据</title>

  </head>

  <body>

     <%

           //pageContext.setAttribute("NAME","pageContext");

           //request.setAttribute("NAME","request");

           //session.setAttribute("NAME","session");

           //application.setAttribute("NAME","application");

     %>

     <%= pageContext.findAttribute("NAME")%>

  </body>

</html>

JSP

pageContext                         生命周期:页面范围有效

request                                 生命周期:请求范围有效

session                          生命周期:会话范围有效

application                           生命周期:应用范围有效

 

Servlet中:

HttpServletRequest             请求范围内有效

HttpSession                          会话范围内有效

ServletContext                     应用范围内有效

 

第07章:JSP之EL表达式

7.01 什么是EL(Expression Language)

     EL是一种在JSP中使用的,由JSP引擎解析的特殊字符串

 7.02 谈EL有什么作用

      01——获取域对象数据(包括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"%>

<!DOCTYPEhtml PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<metahttp-equiv="Content-Type"content="text/html; charset=UTF-8">

<title>获取域对象数据</title>

</head>

<body>

    <%

        User user = new User("赵君");

        pageContext.setAttribute("USER",user);

    %>

    姓名:${USER.name}<br/>

</body>

</html>

02——执行运算

                  算术(+-*/),关系(>>=<<=!=和==),逻辑(&&||!)

                    09_el_2.jsp

<%@ page language="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>

<!DOCTYPEhtml PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<metahttp-equiv="Content-Type"content="text/html; charset=UTF-8">

<title>执行运算</title>

</head>

<body>

    一天有${1*24*60*60}秒<br/>

    10>3吗?${10>3?"是":"不是"}<br/>

    true && false 结果为:${true && false}<br/>

</body>

</html>

03——获取web开发常用11个内置对象

7.03 谈EL中有11个内置(隐式)对象

pageContext                                                                                    当前域对象

pageScope/requestScope/sessionScope/applicationScope       域对象中key=value形式的Map对象,

不是域对象

param/paramValues                                                                        用于获取请求行和体中的内容

header/headerValues                                                                       用于获取请求头中的内容

cookie                                                                                                用于获取浏览器中Cookie的名和值

initParam                                                                                         用户获取整个Web应用初始化参数

10_el_3.jsp?id=2016

<%@ page language="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>

<!DOCTYPEhtml PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<metahttp-equiv="Content-Type"content="text/html; charset=UTF-8">

<title>获取web开发常用11个内置(隐式)对象</title>

</head>

<body>

    <ahref="${pageContext.request.contextPath}/Demo01">获取web应用的名字</a><br/>

    <%

        pageContext.setAttribute("location","深圳");

        request.setAttribute("location","广州");

    %>

    ${requestScope.location}<br/>

    ${param.id}<br/>

</body>

</html>

 

 

第08章:JSP之动作标签

8.01 什么是动作标签

         JSP内置标签,无需导入第三方的jar包,

         该标签封装了一定的业务逻辑

8.02 常用的动作标签

         01——<jsp:forward  page=””/>

         02——<jsp:include   page=””/>,属于动态包含

                    静态包含:将多个JSP翻译成一个Servlet

                    动态包含:将多个JSP翻译成多个Servlet

         03——<jsp:param    name=””               value=””/>

     from.jsp

<%@ page language="java"import="java.util.*"pageEncoding="UTF-8"%>

<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>My JSP 'date.jsp' starting page</title>

  </head>

  <body>

     <jsp:forwardpage="/jsp/to.jsp">

           <jsp:paramvalue="jack"name="name"/>

           <jsp:paramvalue="123"name="pass"/>

     </jsp:forward>

  </body>

</html>

 

     to.jsp

<%@ page language="java"import="java.util.*"pageEncoding="UTF-8"%>

<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>My JSP 'date.jsp' starting page</title>

  </head>

  <body>

     to.jsp<br/>

     ${param.name}<br/>

     ${param.pass}<br/>

  </body>

</html>

 

 

第09章:JSP之JSTL标签

9.01 什么是JSTL标签

         JSTLJSP Standard Tag LibraryJSP标准标签库)是一个不断完善的开放源代码的JSP标签库,

是由apachejakarta小组来维护的,在所有支持JSPWeb服务器中都可以运行。

9.02 为什么要用JSTL标签

         其实不管是动作标签,EL,还是JSTL,他们都是为了在JSP中,封装业务操作,但又不想

     JSP中书写大量的<%%>符号,达到页面的整体统一,让人觉得JSP页面都是由标签组成。

         <jsp:forward/>这个标签本质上还是与<html>标签有区别的。

9.03 常用的JSTL标签

     01——c:if

     02——c:choose/c:when/c:otherwise

     03——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"%>

<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>My JSP 'date.jsp' starting page</title>

  </head>

  <body>

     <%

           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:iftest="${!emptyLIST}">

           <c:forEachvar="course"items="${LIST}">

                ${course}<br/>

           </c:forEach>  

     </c:if>             

     <hr/>

     <c:choose>

           <c:whentest="${!emptyLIST}">

                <c:forEachvar="course"items="${LIST}">

                     ${course}<br/>

                </c:forEach>

           </c:when>

           <c:otherwise>

                查无数据

           </c:otherwise>

     </c:choose>

  </body>

</html>

    

    

     练习:购物车V2

 

 

 

0 0
原创粉丝点击