Java Web

来源:互联网 发布:2016黄石房地产数据 编辑:程序博客网 时间:2024/06/05 01:14

第一章:JSP简介

   WWW服务具有的特点:

  • 以超文本,超媒体的方式组织网络内的消息资源
  • 用户可以通过WWW浏览器获取Internet上任意网址的信息
  • 提供直观,易于使用的图形用户界面

         WWW服务的核心技术是超文本语言HTML,信息资源的统一定位格式URL和超文本传送协议HTTP

 

后缀名为htm或者html的网页时静态网页,其不足:

  • 不能及时更新信息,页面上提供的内容都是一成不变的
  • 当需要修改或者添加新的信息时,必须重写HTML文件,缺乏扩展性
  • 不能根据用户的需求提供不同的信息,不能满足多样性的需求

HTML语言由一系列标记组成的,所有标记都必须用角括号"<"和“>"括起来。大部分标记都是成对出现的,包括开始标记和结束标记。同时每个标记包含若干个属性来定制网页。例如标记<font size="12" coler="red">......</font>,其中<font>是开始标记,</font>是结束标记,而size和color是font标记的属性。

HTML对大小是不敏感的<html>和<HTML>是一样的,建议用小写。

<head>和<body>标记是互相独立的标记,不能嵌套使用。

HTML中,大部分标记的属性都可以分为可选属性,标准属性和事件属性3类

文字内容通常被直接写在标记中,一个空格符号使用一个”&nbsp”表示,特殊字符用”&。。。”表示

文字标题标记<h>,从<h1>到<h6>文字的字体大小依次递减,每个标题标记所标记的文字将独占一行且上下均留一行空白,aligh属性用于定义标题的对齐方式。

注释标记:<comment>注释内容</comment>,       ,        , <!--注释内容-->

CSS弥补HTML的不足,使HTML页面更美观:

  • 将显示格式和文档结构分离
  • 弥补HTML在显示属性设定上的不足,如字体,段落间隔。。。
  • 使网址的体积更小,网页的下载速度更快
  • 实现网页的动态更新。可以通过简单地更改CSS文件,改变网页的整体表现形式,减少工作量

动态网页技术

        常用的动态网页技术有ASP,PHP和JSP

        JSP特点:

     1.将内容的生成和显示进行分离

     2.强调可重用的组件

     3.一次编写,各处运行

     4.移植性强

     5.多样化和功能强大的开发工具支持

WWW服务的概念及WWW服务的工作原理:C/S模式

静态网页与动态网页的区别:是否在服务器端执行

HTML通过<form></form>标记对实现动态功能

JSP页面结构:HTML语言中嵌入java代码

JSP执行的过程和基本原理:JSP页面先被转化为Servlet代码,然后被编译成class文件,最后加载到内存运行,给客户端提供服务

第二章:搭建JSP运行环境

       安装和配置JDK

       下载安装MyEclipse

        下载安装Tomcat

       安装配置MySQL

第三章:JSP基本语法

      面向对象程序设计有3大特征:封装,继承,多态

输出注释<!--comment [ <%= expression %> ] -->

隐藏注释<%--comment--%>

在JSP的page指令中,除了import属性能多次出现之外,其他的page指令所定义的属性都只能出现一次,import导入需要使用的包或类

与Java类似,在默认情况下,JSP页面会自动导入一些常用的包:java.lang.*;javax.servlet.*;javax.servlet.jsp;javax.servlet.http.*

buffer(输出流的缓冲模式)属性与autoflash(缓冲已满是,是否刷新缓冲区)属性通常放在一起使用,而且当buffer属性设置为none时,不能将autoflash属性设置为false

Servlet采用ThreadSafe机制来控制多线程的处理,当Servlet需要同时处理多个用户的请求时,并不会创建新的进程,而只是在当前的Servlet进程中创建一个新的线程来处理客户端的请求,这样可以减少同时运行的进程数,从而减轻服务器端的压力。

通常我们不建议使用extends属性,因为JSP容器会自动提供转换后的servlet类的父类,默认的父类是HttpJspBase类,而且使用extends属性可能会影响JSP容器的性能

file属性指定的相对路径如果以”/"开头,则表示使用的将是相对于JSP服务器应用的根目录的路径;如果直接使用文件名或“文件夹/文件名”的形式,则表示使用的是相对于当前JSP页面文件所在的目录

     表达式<%=expression %>

    scriptlet 脚本程序<% code fragment %>        在scriptlet的语法式中,并没有等号的出现,而且,scriptlet中的java代码,都是需要分号作为结束符的,这是与表达式的一个重要区别。

      一个scriptlet能够包含多个Java语句,包括方法,变量等内容。

  • 声明将要用到的变量或方法
  • 编写JSP表达式
  • 使用任何隐含的对象和任何用<jsp:useBean>声明过得对象
  • 编写Java程序语句

由于scriptlet中包含的是Java程序代码段,所以其他任何文本,HTML标记,JSP元素都必须编写在scriptlet之外。

JSP中的声明:  <%! declaration; [ declartion; ]+... %>

一次性声明多个变量和方法,只要以“ ;”(分号)结尾就可以

这些声明,它们只在网页被加载时被计算一次。这一点就像在Visual C++中创建一个类并定义变量的初始化值,所以,无论如何加载页面,执行结果都是相同的

一个声明仅在一个页面中有效,如果有多个页面都需要用到同样的声明,最好把它们写成一个单独的文件,然后用<%@ include %>或<jsp:include>元素包含进来,实现代码的复用

当我们使用标准动作元素时,格式里的前缀应该使用"jsp"

<jsp:param>动作是用来追加参数的标记。通常,在单独使用<jsp:param>动作时,是没有任何意义的,而且编译器在编译JSP页面时将会出错并提示你应该将<jsp:param>动作与<jsp:include>或<jsp:forward>等动作一起使用

 include指令和include动作的区别,通过指令元素与动作元素的区别可以得出:include指令静态地引用其他文件的内容,组合成一个新的文件,然后在编译时一起被编译;而include动作则是动态地引用其他文件,在运行时才会进行引用

     <jsp:include>动作通常与<jsp:param>动作一起使用,但是只有当<jsp:include>动作引用动态文件时,才需要通过<jsp:param>动作传递参数及其值

     <jsp:forward>动作用来重定向页面,即允许将请求发送到另一个JSP页面,Servlet或一静态资源文件

     <jsp:forward  page=" ... " />page属性用来定位将要跳转的页面的相对路径

<jsp:useBean>中的scope取值范围page,request,session,application

由于application对象是在应用服务器启动时创建的,且直到应用服务器被关闭才销毁,因此当scope属性的取值为application时,该JavaBean对象应该存在于整个application的生命周期中,任何共享一个application的JSP页面均能使用该JavaBean

      虽然在JSP页面的表单中传递的参数的数据类型都是String型的,但是在使用<jsp:setProperty>动作中的property属性时,JSP的内在机制会将String型的参数转化为与JavaBean中的属性相对应的数据类型。。。当JavaBean中的属性为基本数据类型时,<jsp:getProperty/>动作将其转化为String类型的值

      <jsp:plugin>动作用来在JSP页面中加载Java小程序,并在客户端的浏览器产生特殊标签,例如<object>或<embed>标签

 

JSP页面的基本组成内容包括JSP的注释,脚本元素,指令元素和动作元素

page指令用来定义JSP页面的全局属性,我们通常将其放在JSP页面的源代码首部

include指令用来在使用该指令的地方静态地引用其他文件的内容

taglib指令用来指定页面定义一个标记库和自定义标签的前缀

JSP中的动作元素包括自定义动作元素和标准动作元素

<jsp:param>动作用来追加参数

<jsp:include>动作用来在JSP页面的动态地包含其他的文件

<jsp:forward>动作用来重定向页面

<jsp:useBean>动作用来在JSP页面中创建并使用一个JavaBean,同时指定它的名字和作用范围

<jsp:setProperty>动作用来设置JavaBean的简单属性和索引属性

<jsp:getProperty/>动作用与<jsp:setProperty/>动作相对应,用来获取一个JavaBean中的各属性值

<jsp:plugin>动作用来在JSP页面中加载Java小程序

<jsp:fallback>动作用来在Java插件无法正常启动时,向客户端显示一段提示性文字内容

<jsp:fallback>动作必须与<jsp:plugin>动作一起使用

JSP页面是在页面被编译时起作用,而JSP动作元素则是在页面请求的处理阶段才起作用,它将影响JSP页面的运行时的功能

第四章:JSP的内置对象

Web交互的最基本单位为HTTP请求。每个用户从进入网站到离开网站这段过程称为一个HTTP会话,一个服务器的运行过程中会有多个用户访问,就是多个HTTP会话。作用域如下:

  • application:服务器启动到停止这段时间
  • session:HTTP会话开始到结束这段时间
  • request:HTTP请求开始到结束这段时间
  • page:当前页面从打开到关闭这段时间

在JSP服务器的运行过程中,仅有一个application对象,application对象是由服务器创建的,由服务器自动清除它,不能被用户创建,用户也不能清除application对象,我们只能创建这个application对象的同步副本。application就是由JSP引擎自动创建的第一个application对象的同步副本。特别需要注意的是这些副本是同步的,任何一个副本上发生的变化都会影响到其他的副本

setAttribute()方法把参数和对象绑定在一起,getAttribute()和getAttributeNames()方法获取它们的值

application对象和session对象并非不能被创建,但是,它们只能由JSP引擎自动创建。application对象在服务器启动时被创建,在服务器关闭时被删除,session对象在新的HTTP连接产生时被创建,在HTTP连接中断或者超时的时候被删除,同时,JSP程序员也可以调用invalidate()方法强行删除session对象,中断HTTP连接,这是application对象和session对象的不同点之一

      能够和application对象或者session对象绑定的只能够是Java对象,如String,Integer,Vector等,而不能是普通的数据类型,如int,double,float等,如果真的需要将它们绑定到application对象或者session对象上,那么它们必须首先转化为相应的Java对象

  • application对象用于在多个程序中保存信息,用来在多个程序中共享信息,并在Web应用程序运行期间持久地保持数据
  • session对象用于分别保存每一个用户信息的对象,以便于跟踪用户的操作状态。注意,不同的用户对应的session对象是不同的
  • request对象用于接收所有从浏览器发送到服务器的请求内的所有信息
  • page对象代表JSP对象本身,或者说代表编译后的servlet对象
  • config对象用于配置处理JSP程序的句柄,而且只在JSP页面范围内合法
  • exception对象代表JSP应用中的错误对象,只有在JSP页面的page指令中指定isErrorPage=true后,才可以在本页面中使用exception对象
  • out对象用于向客户端输出数据
  • respose对象的作用是处理HTTP连接信息,如cookie,HTTP文件头信息等,它有很多功能和request对象相匹配
  • pageContext对象用于管理属于JSP中特殊可见部分中的已经命名对象的访问。它是JSP内置对象中的集成者

第五章:使用JDBC连接数据库

      关系的结构加上域的说明,以及对取值的所有约束,统称为关系的内涵(intension),它通常是固定的。除非关系的意义发生变化,需要加入新的属性。元组称为关系的外延(extension)或状态(state),它通常会发生改变

       一个关系通常具有如下性质:

  • 有一个唯一的关系名称
  • 关系中的每一个单元格都包含且仅包含一个单一值
  • 每个属性都有一个唯一的名称
  • 同一属性中的各个值都取自相同的域
  • 各个元组互不相同,即不存在重复元组
  • 属性的顺序并不影响关系
  • 理论上来说,元组的顺序并不重要。但实际上,这个顺序会影响对元组的访问效率

     为什么在有了关系表之后,还要引进视图的概念呢?这是因为视图能为我们提供以下用途:

  • 提供对特殊用户隐藏部分数据库信息,提供一个强大而灵活的安全机制
  • 允许用户根据自己的需要自定义访问数据的方法,因此不同的用户可以通过不同的路径同时看到相同的数据信息
  • 可以简化用户对基本关系的复杂操作

      SQL语言包括以下几个部分:

  • 数据定义语言。提供定义关系模式,删除关系及修补关系模式的命令
  • 交互式数据操纵语言。包括基于关系代数和元组关系演算的查询语言,还包括在数据库中插入,删除和修改元组的命令
  • 完整性。包括定义保存在数据库中的数据必须满足的完整性约束条件的命令。破坏完整性约束条件的更新操作都将被禁止
  • 视图定义。包括定义视图的命令
  • 事务控制。提供定义事务的开始和结束的命令
  • 嵌入式SQL和动态SQL。将SQL语句嵌入到通用或高级编程语言中
  • 授权。包括说明对关系和视图的访问权限的命令

   MySQL语句的一些特性:

  • 一条命令通常由SQL语句组成,以分号结束(有些特例不需要分号结束,例如QUIT命令)
  • MySQL将命令发送给服务器,随后显示结果,同时准备接收新的命令
  • MySQL通常以一张表格来显示输出结果。第一行包含列标签,随后的行即为输出结果。通常列标签是数据库表中列的名称,但是当查询请求是一个表达式而非表的列值,那么MySQL将使用表达式本身作为列的标签
  • MySQL每次输出结果时都会显示有多少个元组被返回,以及查询所消耗的时间值。但是由于它表示时钟时间,而不是CPU或机器时间,并且可能受到诸如服务器和网络延时的影响,所以这个值是不精确de

一些字段属性的说明:

  • 如果不为某一字段指定null或not null的完整性的约束说明,那么它将被默认为null
  • 如果一个字段的数据类型为整型,那么可以为其加上auto_increment的附加属性。在进行值的插入操作时,可以不指定该列所对应的值,或者可以指定为null或0,其自动被赋予当前该列的最大值value再加1的值。需要注意的是,每个数据表中,都只能有一个auto_increment的列,而且它必须被索引。同时MySQL为了与一些ODBC或JDBC应用程序兼容,可以认为最后插入的元组的auto_increment列值为null,并且可以通过下面的语句对其进行查询:select * from tbl_name where auto_col is null
  • 当列的数据类型为TIMESTAMP时,对null值的处理与其他数据类型不同。无论你对该列赋予null或not null的完整性约束说明,都将被忽视。如果将该列设为null,那么MySQL自动将其转化为当前的日期和时间。在对该列进行赋值时,如果赋予了null值,虽然MySQL服务器不会提示非法错误的信息,但实际上TIMESTAMP是不可能包含一个null值的。但是,你可以为该列赋0值,因为0是一个有效的TIMESTAMP值
  • 如果没有为列指定default值,那么MySQL将自动为其分配。如果其数据类型允许它取值为null,那么该列的默认值则为null。如果该列已被声明为not null,那么其默认值则需要取决于它的数据类型:1.如果该字段是数字类型,且没有声明附加属性auto_increment,那么其默认值为0.如果声明了auto_increment附加属性,那么其默认值是自增序列中的下一个值  2.日期和时间类型中,除TIMESTAMP外,其默认值均为该类型适当的零值。而对于TIMESTAMP类型,其默认值则为当前的日期和时间
  • 字符串类型中,除ENUM外,其默认值均为空字符串。而ENUM类型的默认值则是第一个枚举值
  • key是index的一个同义词,在MySQL中发挥同样的作用
  • primary key(主键)可以是一个多列索引,但是所有的主键列都必须被定义为not null,且一个表只能有一个主键 

 JDBC中的url要与各种不同的驱动程序一起使用,因此关于它的约定非常灵活:

  • 允许不同的驱动程序使用不同的方案对数据库进行命名,例如ODBC子协议允许url中含有属性值
  • JDBC的url允许开发人员将一切需要的信息加入其中,使得与特定数据库连接的Applet能够直接打开数据库连接,而无须要求用户去进行任何系统管理操作
  • JDBC的url允许一定程度的间接性,即url指向逻辑主机或数据库名,而这种逻辑主机或数据库名将由网络命名系统动态地转换为 实际的名称。使得系统管理员不必将特定主机声明为JDBC名称的一部分

Absolute()方法中的int型参数row可以为正数或负数

  • 为正数时:从记录的第一条数据开始移动指定的个数
  • 为负数时:则表示倒数,从最后一条数据向前进行移动

通过JSP对数据库进行连接访问及操作的一般步骤:

  • 导入java.sql包。java.sql包中包含了Java语言中提供的所有与数据库相关的对象及其方法,并且包含了使用Java语言操作数据库的类和接口
  • 加载JDBC驱动程序。在这里我们通过使用Class.forName()方法显示地加载指定的JDBC驱动程序,这种方式与外部数据库设置无关
  • 指定数据库的连接所需信息。数据库的url对象与网络资源的统一定位方式类似。另外,根据需要,指定适当的数据库用户名和密码的信息
  • 建立与数据库的连接。在创建数据库连接时,首先需要提供数据库的url地址和JDBC的驱动程序类型,然后通过DriverManager类的getConnection()方法建立连接
  • 对数据库进行访问及操作。使用Connection类的creatStatement()方法从指定的数据库连接得到一个Statement类的实例对象,再通过这个实例对象来执行指定的SQL语句
  • 关闭数据库的连接。这一步至关重要,在数据库的访问结束后,需要及时关闭数据库的连接,释放其所占的资源

 

  • 一个典型的关系型数据库通常由一个或多个被称为表的对象组成,数据库中的所有数据或信息都被保存在这些数据库表中。关系型数据库是具有不同关系名称的规范化关系的一个集合
  • 关系数据库中的基本概念:表,属性,域,元组,维和基数等
  • 大部分数据库系统通常提供两类数据库语言:数据定义语言和数据操纵语言
  • SQL语言集数据定义语言DDL,数据操纵语言DML,数据控制语言DCL等功能于一体,语言风格统一
  • MySQL数据库的相关管理操作。MySQL数据库中的数据库类型和语言规范基本符合ANSI/ISOSQL92规范
  • JDBC主要包括3个部分:Connection(连接),Statement(语句)和ResultSet(结果集)
  • JDBC提供4类驱动程序:JDBC-ODBC桥驱动,JDBC-Native桥驱动,JDBC-Net桥驱动和Pure Java JDBC驱动
  • JDBC连接数据库的基本步骤为:1.导入java.sql包 2.加载JDBC驱动程序 3.指定数据库的连接所需信息 4.建立与数据库的连接 5.对数据库进行访问与操作 5.关闭数据库连接

第六章:JSP与JavaBean

      JavaBean组件与EJB(企业级JavaBean)组件是完全不同的两个概念。EJB是J2EE的核心技术,是一个用来创建分布式,服务器端及基于Java的企业级应用程序组件的功能强大的组件模型

      JavaBean组件模型通常由3部分组成:方法,属性及事件

      JavaBean的一些基本特性:

  • 没有参数的构造函数:JavaBean类必须有一个公有的而且不具有参数的构造函数,这个构造函数将在使用<jsp:useBean>标签进行实例化JavaBean类的时候被调用。如果一个JavaBean类中没有任何构造函数,系统会默认自动生成一个没有参数的构造函数
  • 私有的属性:将属性都定义为私有的,是一种良好的编程习惯,因为这样能够使得这些属性都只能通过JavaBean中提供的方法进行间接访问或修改,较好地保证数据的完整性和封装性,也利于对某些数据进行约束,当然,这不是强制性的
  • 操作属性值的get/set方法:每一个属性均有其对应的get()方法和set()方法,来设置或获取属性的值
  • 支持自检:就是提供一种方法来获得该组件的内部信息,JavaBean API提供了很多用于自检的工具。通过自检,应用程序可以查询一个组件的功能或状态,然后与该组件进行相应的交互操作。自检功能是组件模型的一个重要因素,因为只有这样才能使得一个组件向应用程序及其他组件描述自己的功能
  • 支持定制:不同的用户对JavaBean组件模型的使用情况也不相同,因此,JavaBean组件模型要允许用户通过某些工具来定制组件的外观和行为操作
  • 支持持久化:组件被用户定制后,必须要保存其自身状态
  • 支持属性:不同的组件模型都有其自身的状态。JavaBean的属性其实就是对象的属性,只是它在此基础上提供了属性读取和设置API的支持。每个属性都要遵守一定的命名规范,这样开发工具和使用者可以按照这种规范找出JavaBean中提供的属性,继而查询或修改属性值。另外,JavaBean能够对属性值的更改做出及时的反应
  • 支持分布式计算:现在,基于互联网的B/S架构开发越来越被重视,也使得组件模型中支持分布式计算的要求越来越高
  •  
  • 软件复用是将已有的软件及其有效成分用于构造新的软件或系统。它不仅是对软件程序的复用,还包括对软件产生过程中其他劳动成果的复用
  • JavaBean是使用Java语言进行描述的,与平台无关的软件组件模型,通常用于设计可复用的组件
  • 从本质上来看,JavaBean其实就是一个遵循了某些命名方法及设计规范的类,并且用来完成特定的功能
  • JavaBean按功能可以分为可视化JavaBean和非可视化JavaBean
  • JavaBean组件模型通常由3部分组成:方法,属性及其事件
  • JavaBean的属性与普通Java程序中所指的属性是相同的概念,用来表示一些特性,共有4种:简单属性,索引属性,绑定属性和约束属性
  • JavaBean中的属性,都具有其相应的get()方法和set()方法
  • 在JSP页面中通过<jsp:useBean>动作元素使用JavaBean,通过<jsp:setProperty>动作元素和<jsp:getProperty>动作元素分别设置或获取JavaBean中的属性值

第七章:JSP与Servlet

     Servlet的描述:

  • 效率:传统的CGI对每个HTTP请求都会使用一个新的进程,这样会花费很大的额外时间,而Servlet,Java虚拟机会一直运行,并用轻量级的Java线程处理每个请求。如果对同一CGI请求多次,则CGI程序代码会被载入多次,而使用Servlet则将启动多个线程,仅载入Servlet类的单一副本,减少了服务器对内存的需求
  • 易用:Servlet提供了强大的类库,可以自动分析解码HTML的表单数据,读取和设置HTTP报头,处理cookie,跟踪会话。而对于CGI,这类工作大部分需要我们自己来完成。
  • 强大:Servlet能完成CGI不能实现的功能,它能与Web服务器对话,而CGI在不使用专门的API情况下是做不到的。如服务器通信使得将相对URL转化为绝对路径变得更容易,多个Servlet可以共享数据,从而易于实现数据库连接共享和类似的资源共享
  • 移植性:Servlet是用Java语言编写的,且遵循标准的API,所有主要的Web服务器实际上直接或通过插件支持Servlet。所以在Apache Tomcat上编写的Servlet,可以不经任何修改就可以在Macromedia JRun,IBM WebSphere,Oracle9i As等主流Web服务器上运行
  • 廉价:使用Servlet我们可以通过使用免费的服务器开始,如Apache Tomcat。在项目获得成功后,可以移植到更高性能或高级管理工具的昂贵服务器上。而CGI在初期要购买专门软件包投入大量的资金

 Servlet是运行在Web服务器上的Java程序,它是一个中间层,负责连接来自Web浏览器或其他HTTP客户程序的请求与HTTP服务器上的数据库或应用程序

           service:被Servlet容器调用,用来服务客户端的请求,Servlet是线性安全的,Servlet容器可以让多个线程调用同一个Servlet对象实例的service()方法

一般我们不应覆盖方法service,当Servlet接收到HTTP请求后会调用service方法,service方法检查HTTP请求的类型(GET,POST,PUT,DELETE)并相应地调用doGet,doPost,doPut,doDelete等方法。GET请求起因于正常的URL请求,或没有指定METHOD的HTML的HTML表单。POST请求起因于将表单中的METHOD设为POST。其他请求都可以由表单定制

        Session的默认的超时时间由Servlet容器来定义,而这个值我们可以用上述的方法getMaxInactiveInterval()获得,也可以通过setMaxInactiveInterval来设置。如果将超时时间设置为-1,则会话永远不会超时

           ServletConfig对象和ServletContext对象的区别在于,前者的参数是在Servlet启动时得到,而后者是在运行时使用

         在Servlet中得到参数的值时其参数名一定要和表单中的参数名一致,否则得不到其参数的值。如表单中name=“name”参数是指等号后面的名字,而不是前面的名字

         <load-on-startup>,此标签就是标记是否在容器启动时加载这个servlet。如: <load-on-startup>value</load-on-startup>

当value为0或者大于0时表示容器在启动时就应该加载这个Servlet,如<load-on-startup>1</load-on-startup>.如果多个Servlet都有此标签,则值的大小表示启动时的优先级,值越小,越先被启动。如果没有此标签或者此值为负数,则在被请求时才启动。当容器加载Servlet后就会为该Servlet创建一个实例

  • Servlet与CGI相比效率更高,更易用,更容易移植,更廉价
  • 与Servlet实现相关的接口和类:Servlet,GenericServlet,HttpServlet
  • 为了克服HTTP无状态的缺点,介绍了与会话相关的接口HttpSession的各方法的使用,与上下文相关的ServletContext接口
  • 为了得到服务器配置信息介绍了ServletConfig接口的使用方法
  • 在介绍了Servlet的类结构后,介绍了Servlet的运行条件,配置部署Servlet的方法
  • 介绍了Servlet的整个生命周期,使用Servlet访问request对象的方法
  • 最后介绍了MVC架构,并将JSP,Servlet,JavaBean与之对应
  • 应用MVC模式实现了购物车和网上书店的大部分功能

第八章:JSP与XML

W3C是英文World Wide Web Consortium的缩写,中文意思是W3C理事会或万维网联盟。W3C与1994年10月在麻省理工学院计算机科学实验室成立。创建者是万维网发明者Tim Berners-Lee。W3C组织是针对网络标准的一个非盈利组织,像HTML,XHTML,CSS,XML的标准就是由W3C来定制的。W3C会员包括生产技术产品及服务的厂商,内容提供商,团体用户,研究室,标准制定机构和政府部门,一起协同工作,致力在万维网发展方向上达成共识

     XML声明:<?xml version="1.0" encoding="gb2312" standalone="yes"?>

     UTF-8,它是采用一个或几个字节来表示一个字符。对Unicode字符集中代码点0~127的字符,UTF-8将该字符编码为一个字节,且高位是0,也就是说UTF-8编码保留ASCII字符的编码。对Unicode字符集中代码点为128~2047d的字符,UTF-8采用2个字节编码,且高字节以“110”作为前缀,低字节以“10”作为前缀。对于Unicode字符集中的其他字符,UTF-8采用3个字节编码,并且3个字节分别用“110”,“10”和“10”作为前缀。尽管UTF-8编码会多占用一些空间,如一个汉字需要3个字节,但UTF-8很好地解决了国际化问题,能支持多国语言

      <title>JSP开发入行真功夫</title>元素和标签具有不同的意义,元素是指开始标签,结束标签,以及两者之间的一切内容,包括属性,文本,子元素,注释及子元素。标签是一对角括号(<>)和两者之间的内容,包括元素名和所有属性

      属性和子标签可以相互转化,那么是用属性还是子标签呢?属性不体现数据的结构,只是数据的附加信息,一个信息是否作为一个元素的属性或作为该元素的子元素,取决于具体问题。一个基本原则是:不要因为属性的频繁使用破坏了XML的数据结构

       XML元素的命名规则:

  • 名称只能以字母,下划线(_),或者冒号(:),而不能以数字或标点符号开头
  • 名称中不能包含空格
  • 如果不是表示名字空间,就不要使用冒号。因为冒号是在名称空间中被用于分隔名称空间前缀和本地部分的
  • 元素的名称不能以XML(或者xml,Xml,xMl等)开头,因为XML字母组合被定为保留字
  • 名称中可以包含字母,数字,下划线及其他在XML中允许的字符
  • 名称是区分大小写的

      XML的注释:<!--......注释.......-->           注释中不能有“--”,也不能以“--->"结尾

      CDATA段中包含的但是纯字符,它主要用于需要将整个文本解释为非标签的情况下。CDATA段中的任何内容不被XML处理器分析,所以在其中可以包含任意的字符。例如:在XML文档中,我们需要包含Java代码或者其他语言的代码,而代码中有一些特殊的字符如小于(<),与(&)等。那么它与注释有什么区别呢?当解析器遇到注释时,解析器会忽视它们,而解析器遇到CDATA时,解析器会认为它的内容是字符数据,而不是标签。这样就不会与其他标签的起始定界符发生冲突了。

         如字符:&,字符引用(十进制)是&#38,字符引用(十六进制)是&#x26,实体引用是&amp

       当标签的类名和通用类同名时,标签使用的是自己标签定义的类的格式

       XSL中,用<xsl:for-each>或<xsl:apply-templates>元素可以匹配很多节点,如果我们想对它们进行排序,可以使用<xsl:sort>元素。另外,还有一种指定排序的方法,就在<xsl:for-each>元素中加入order-by属性,如:<xsl:for-each select=“book” order-by=“title”>

      CSS和XSL属于样式单的一种,都可以用来设定文档的外观,它们的主要区别:

  • 用途不同:CSS最早是针对HTML提出的,后来又将其应用于XML中,它既可以为HTML文档中的各个成分设定样式,也可以为XML中的成分设定样式。XSL是专门针对XML提出的,它不能处理HTML文档。但它有一个CSS无法达到的功能,即用一个命令行将一个XML转化为另一个文档并保存
  • 处理结果不同:XSL采用的是一种转换的思想,它将一种不含显示信息的XML文档转换为另一种可以用某种浏览器浏览的文档,转换后的输出结果或者存为一个新的文档,或者暂存于内存中,但都不能修改代码。而CSS则没有任何转换动作,只是针对结构文档的各个成分,依照样式规定:设定外观式样,再由浏览器依据这些式样显示文档,在这个过程中没有新的代码的产生
  • 表现能力不同:在XSL中定义的90%的式样规定,实际上在CSS中都有定义。但仍然有一些效果由CSS无法描述的,必须使用XSL不可。这些功能包括文本的置换,例如将一个美国的时间表示格式转换为一个中国的时间表示格式,根据文本内容决定显示方式,例如,将60分以上的分数用黑色显示,60分以下的分数用红色显示,将文档中的成分按照某一个子成分的值进行排序,例如,将书本按其排序。此外,还有对于超级链接的支持,对于FRAME的支持等,都是XSL所独有的

   生成的XML文档的默认编码格式为“UTF-8”,文档中声明encoding的值为“UTF-8”

         当我们调用parse()方法得到文档对象时,给它传递的参数是XML文件名,程序中给的是XML文件的绝对路径,因为如果不给绝对路径,而是给定相对路径的话,当执行方法parse()时,会去安装目录的bin目录中去找指定文件名的XML文件。也就是说使用相对路径时,要把文件放入服务器安装目录下的bin目录。此目录与生成XML文件的默认路径是一样的。在程序中给定路径时,要用斜杠来表示转义,加“\”(右斜杠)在程序中要用“\\"(双斜杠)来表示

  • XML是由W3C提出的,它以一种开放的,自我描述的方式定义了数据结构,体现出了数据与数据之间的关系
  • XML文档结构包括逻辑结构和物理结构。从文档的逻辑结构上来讲,每个XML文档可以分为两个部分,即序言和文档元素
  • XML文档通常都以一个XML声明开始,它能指定文档的版本,内容可以是文本,子元素,或是二者都有
  • 虽然我们可以自定义标签,也就是可以自定义元素名。但是定义元素的时候,给元素取名必须遵循一定的规范
  • XML文档必须有且仅有一个根元素,其他元素都必须被包含在根元素内
  • 层叠样式单CSS是一种样式描述规则,它能指定XMl标记的显示格式
  • 可扩展样式单语言XSL不仅能指定XML文档的显示样式,而且还能对XML文档进行变换
  • DOM的全称是Document Object Model,即文档对象模型,通过DOM接口我们可以解析和生成XML文件

第九章:EL与JSTL

       EL(Expression Language)表达式语言,是JSP的一个新特性,在JSP中使用可以简化对变量和对象的访问。所有EL表达式都是以${起始,以}结尾的

${表达式}  例如:${1+2+3}计算1+2+3的值并将结果返回       ${username}查找并返回username的值      ${user,name}访问JavaBean对象user的属性name

在EL中,允许定义和使用函数,语法 ns:func(a1,a2,......an)

前缀ns为该数据标签库的前缀,func为函数名,a1,a2,......为函数的参数

例如:比较23和45,其中较大值是${myfn:max(23,45)}

        JSTL(JavaServer Pages Standard Tag Library)标准函数库,可以简化JSP页面的设计

在使用JSTL时,可以不需要tld目录下的文件。当我们想要修改标签库的URI时,可以在web.xml文件中使用<taglib-uri>元素来设置,相应要修改<taglib-location>中TLD文件所在的位置,此时,可能将用到tld目录下的TLD文件

     在JSP中使用JSTL中的标签库时,必须使用<%@taglib%>指令,并且设定prefix和uri的值

  <%@taglib  prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%>

 所谓动态值,是指属性值可以是Java表达式,EL表达式或者通过<jsp:attribute>设置的值。一般,JSTL标签的属性值均可以指定为动态,但是保存JSTL标签结果的变量及其作用域属性,以及XML标签的select属性除外(该属性可以指定一个XPath表达式)

  <c:set>属性中的var和scope两个属性不能使用表达式来表示,我们不能写成scope=”${ourScope}"或var=“${a}”

<c:forEach>属性中的items支持的类型包括数组和各类集合类型之外,还包括以逗号分隔的字符串。在迭代时,将以逗号作为分隔符,循环进行处理

  要跨Web应用程序访问资源,需要在当前Web应用程序的context元素设置中,指定crossContext属性的值为true

例如:<context path="/ch09" docBase="F:\book\ch09" reloadable="true" crossContext="true"/>

  • 表达式语言是JSP2.0的一个新的特性,在JSP页面中使用EL,可以简化对变量和对象的访问
  • 所有EL表达式都是以“${”起始,以“}”结尾,可以使用“.”和“[]”操作符访问数据
  • EL变量的查找顺序是page,request,session,application
  • EL定义了11个隐含对象。有关请求和其他数据的所有信息都可以通过EL隐含对象来访问
  • JSTL是由JCP(Java Community Process)制定的标准规范,它为Java Web开发人员提供了一套标准通用的标签函数库
  • JSTL由5个不同的标签库组成
  • 在JSP中使用JSTL中的标签库时,必须使用<%@taglib%>指令,并且设定prefix和uri的值
  • Core标签库主要用于基本输入输出操作,条件控制,迭代操作和URL操作等通用性任务的操作
  • I18标签库主要用于编写国际化的Web应用程序,它分为2个部分,一部分是国际化标签,另一部分格式化标签
  • SQL标签提供了基本的访问关系数据库的能力,可以实现包括查询,更新,事务处理和设置数据源等强大的功能
  • XMl标签库让我们无须了解DOM和SAX,也可以对XML文档进行操作
  • Function标签库是在JSTL中定义的标准的EL函数库,主要用于对字符串进行操作,包括了16个函数

第十章:JSP聊天室的设计与实现

    synchronized(application){}可以防止多个线程同时访问这个对象实例的synchronized方法。如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其他线程不能同时访问这个对象中任何一个synchronized方法。这时,不同的对象实例的synchronized方法是不相互干扰的。也就是说,其他线程照样可以同时访问相同类的另一个对象实例中的synchronized方法

     通过JavaBean进行数据库的操作,实现了代码的复用

第十一章:基于JSP的网上购物系统

软件工程开发的一般过程包括:问题定义,可行性研究,需求分析,总体设计,详细设计,编码和单元测试,综合测试,软件维护

doGet()和doPost()方法的区别:doget在网页使用get方法时调用,dopost在接收post方法时调用。get方法在网页的地址栏显示传递参数信息,post方法将数据都打包进行传递

getServletConfig()方法,功能是在servlet初始化时,容器传递进来一个ServletConfig对象并保存在Servlet实例中,该对象允许访问两项内容:初始化参数和ServletContext对象,前者通常由容器在文件中指定,允许在运行时向Servlet传递有关调度信息,比如说getServletConfig().getInitParameter(“debug”);后者为Servlet提供有关容器的信息。此方法可以让Servlet在任何时候获得该对象及配置信息

第十二章:基于JSP的在线考试系统

UML图是软件工程设计过程中,进行可视化建模的一个重要工具。它的作用域不限于支持面向对象的分析与设计,还支持从需求分析开始的软件开发的全过程。UML适用于以面向对象技术来描述任何类型的系统,而且适用于系统开发的不同阶段,从需求规格描述直至系统完成后的测试和维护

需求分析的成果就是找出系统内的实体,实体的属性以及实体与实体之间的关系。概念结构设计的主要成果物就是通过建模工具画出E-R图。逻辑结构设计的成果物就是根据E-R图确定关系到的属性和主键。物理结构设计的成果物则是编写SQL语句,最终建立数据库

可以通过建模工具Rose或者Microsoft Visio来实现E-R图的构造。有些工具还提供了另外一种方法进行模型图的生成,在数据库中的表结构建好之后,可以利用反向工程,将数据库中的表与表之间的关系导入到建模工具中,只需要做少量的修改即可生成模型图

WebRoot文件夹下的JSP文件在访问时,不需要再加WebRoot/路径。需要访问某个页面时,直接在浏览器地址栏输入http:localhost:8080/工程名/test.jsp即可

数据库连接用完后一定要关闭,在进行数据库访问之后的finally语句里面进行关闭操作。不管try,catch内的语句执行情况如何,finally里面的内容都会执行,这样的关闭方式是最保险的

原创粉丝点击