基于JSP Servlet JavaBean的网上交易系统
Struts -- 采用Java Servlet / Java Server Pages 技术,开发Web应用程序的开放源码的框架,采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架。
Spring -- 让J2EE开发更容易的开源框架。(由容器,用于配置与装配组件的框架以及一组用来执行事务,持久化以及网页用户界面服务所组成的,本意,春天)
Hibernate -- 一个面向Java环境的对象/关系数据库映射工具。(用来把对象模型表示的对象映射到基于SQL的关系模型结构中,本意,冬眠)
Bean -- 豆,豆子
Edition -- 版本
Enterprise -- 企业
--------------------------------------------------------------------------------------------------
Service -- 服务
Content -- 内容,容量
Attribute -- 属性,特征
Redirect -- 重定向
Dispatcher -- 转发,派遣
--------------------------------------------------------------------------------------------------
Session :会话
Serializable :连接的,序列
Book :书,书籍
Copyright :版权
Publisher :出版者,发行人
Price :价格
--------------------------------------------------------------------------------------------------
Quantity : 量,数量
Set : 类似于数学中的集合
Tree : 树
Decimal : 十进制的,小数的
Format : 格式,版本
--------------------------------------------------------------------------------------------------
Current : 当前的,目前的
Validate : 验证,确认
Invalidate : 使无效
Zip Code : 邮政编码
Credit Card : 信用卡
View : 视图
Controller : 控制器
--------------------------------------------------------------------------------------------------
Cannot :不,不能
DataSource : 数据源
Naming : 命名
Directory : 目录
Active : 积极的,活动的
Properties : 属性,道具
--------------------------------------------------------------------------------------------------
Bean :豆子
Order :顺序,次序
Property :属性,特性
Scope :范围
--------------------------------------------------------------------------------------------------
Expression :表达式,符号
Standard :标准
Tag :标签
Library :库
Prefix :前缀
--------------------------------------------------------------------------------------------------
simple:简单的 Access:访问 Protocol:协议 service:服务 Proxy:代理 Factory:工厂
Client:客户,用户
--------------------------------------------------------------------------------------------------
一:JavaEE概述
1.1:为什么需要JavaEE
1.1.1:JSP的弊端
原Jsp代码,显示代码和业务混淆,彼此嵌套,难以对项目进行有效的维护和扩展。为此,需要使用JavaEE技术来进行项目开发。
1.1.2:什么是JavaEE
Java平台有三个版本:使用于小型设备和智能卡的JavaME( Java PlatForm Micro Edition ,Java微型版),适用于桌面系统的JavaSE(Java Platform Micro ,Java标准版),适用于企业级应用的JavaEE(Java Platform Edition ,Java企业版)
1.1.3:JavaEE包含的技术
JavaEE应用程序有组件构成的。J2EE组件式具有独立功能的单元,通过相关类和文件按组装成JavaEE应用程序并与其他组件交互。
javaEE技能结构图(略)
1.2:JavaEE与其他的关系
1.2.1:什么是框架
框架即Framework(某种应用的半成品,一组组件,供用户选用,完成用户自己的系统)——使用别人准备好的组件,来实施自己的项目。
1.2.2:JavaEE与框架的关系
框架技术是在JavaEE基础上形成的,而应用程序是在框架的基础上创建的。
1.3:JavaEE的体系结构
应用程序的三层结构如下:
表示层:由用户界面和用于生成界面的代码组成;中间层:包含系统的业务和功能代码。数据层:负责完成存取数据库的数据和对数据进行封装。
1,一层体系结构:表示层,中间层,数据层相关的代码耦合在一起。
2,二层体系结构:数据层的代码与中间层和比表示层分开。
3,三层结构体系:与3个组件相关的代码相互之间保持独立。中间层充当数据层和表示层之间的接口,通常表示层不能直接与数据层进行通信。
优点:一个组件的更改不会影响其他两个组件,表示层与数据层独立可以方便扩充比表示层(扩展性),代码重复减少(3个组件之间共享代码),良好的分工与协作。
1.4:JavaEE技术内容
javaEE技术是对应该体系结构的,可分为表示层技术,中间层技术,数据层技术,还有系统集成的技术。
1.4.1:表示层技术
HTML,JavaScript,Ajax
Ajax——并不是一种技术,而是几种技术的整合,主要功能是——异步的向服务器端发送请求,处理数据或根据返回的数据重新显示页面。
1.4.2:中间层技术
1,jsp——显示动态内容的服务器网页。2,Servlet——接收客户端请求,并做出响应的Java程序(控制其他组件)。3,JSTL——辅助显示动态内容的标准标签库。4,JavaBean——javaEE的模型组件。5,中间层的框架技术——Struts框架,主要扩展了Servlet。
1.4.3:数据层技术
1,JDBC技术(Java Database Connectivity)——Java数据库连接。2,数据层框架技术,数据层框架(Hibernate提供了以对象的形式操作关系型数据库数据的功能)
1.4.4:系统集成技术(Web Service)
1,JAX-WS(Java API for Xml Web Service)javaEE的重要组成部分,简化使用Java技术开发Web服务的工作。
2,JNDI(Java Naming and Directory Interface,java命名和目录接口)是一组在Java应用中访问命名和目录服务的API,命名服务和对象把名称联系在一起,并且可以通过名称找相应对象。
1.5: E-Book电子书店
1.5.1:E-Book功能介绍
实现网上购书以及结算等。
1,.5.2:E-Book电子书店所使用的技术
javaServlet,javaBean,JDBC,JNDI,JSTL等技术。
1.6:HTTP协议
1.6.1:数据的提交和接受
用户的请求和Web应用程序的响应需要通过Internet从一台计算机上发送到另一台计算机或服务器,使用的是超文本传输协议(HTTP协议——HyperText Transfer Protocol,超文本传输协议)。
HTTP是一个无状态协议,基于客户端——服务器模型。HTTP协议使用端口发送和接收消息。端口是协议发送和接受数据的信道或机制。80端口是为HTTP开放的,主要用于在WWW(Word Wide Web,万维网)服务上传输信息。【我们可以通过HTTP地址加“80”——网址,来访问网站,因为浏览网页服务的端口号是80,所以只要输入网址,不用输入80】
1.6.2:GET方法的请求格式
Eclipse提供的数据监控工具——TCP/IP Monitor;
TCP/IP Monitor的配置步骤如下:
单击“窗口”--》“首选项”--》展开右侧“运行/调试”节点,选择TCP/IP Monitor,并选中“show the TCP/IP Monitor view when there is activity”复选框--》单击“add”按钮(添加监控端口)-->>启动监控,运行程序,在地址栏把端口号8080改为8088。
添加监控端口:
Local monitoring port :8088(本机监控端口)
Monitor:
Host name:localhost;(欲监控的主机名称)
Port :8080;(欲监控的端口号)
Type:HTTP;
Timeout (in milisconds).......................................
经验:在进行监控设置时,我们已经设置了一个8088的监控端口,所以启动服务后,在地址栏内应输入“httP://localhost:8088/store”而不是“:8080”,只有这样我们才能真正监控到数据。
地址栏后追加的数据有长度限制,不能大于255个字符。
1.6.3:GET方法的响应格式
1.6.4:Post方法的请求和响应格式
Post请求和get请求的区别如下:
Post请求的数据在地址栏内不可见,理论上没有长度要求。Get请求将字符串添加到URL中,是页面可以被设置成书签或使用电子邮件发送,而post不能。
1.6.5:HTTT协议的使用
Get方法是浏览器默认的提交方法,而处于安全性和数据容量的问题,一般选用Post方法提交。
二:Servlet基础
Service : 服务
Content : 内容,容量
Attribute : 属性,特征
Redirect : 重定向
Dispatcher : 转发,派遣
2.1:为什么需要Servlet
2.1.1:使用Jsp开发Web程序
在Jsp技术出现之前,生成HTML页面——只有在服务器端运行Java程序,并输出HTML格式内容。运行在服务器端的Java程序就是Servlet。
2.1.2:什么是Servlet
Servlet是一个Java程序,是在服务器端运行以处理客户端请求并作出响应的程序。
2.1.3:初识Servlet
创建Servlet需要:
导入的包:java.io.*;javax.servlet.*;javax.servlet.http.*;
创建的Servlet类必须继承HttpServlet类。(public class HelloServlet extends HttpServlet{})
实现doGet()或者 doPost()方法。
2.1.4:Servlet和Jsp之间的关系
JSP在运行前首先将编译为一个Servlet,故Servlet是JSP的基础。
(解释:*.jsp文件在运行是首先解析为一个继承了org.apache.jasper.runtime.HttpJspBase类的*_jsp.java类文件,而HttpJspBase类又继承自HttpServlet的类)
2.2:如何创建Servlet
2.2.1:Servlet编程模式
创建Servlet必须要继承自HttpServlet。HttpServlet作为抽象类用来创建用户自己的Servlet,其的子类必须重写一个doGet()或doPost()方法,用于处理form表单的GET请求或POST请求。
2.2.2:使用向导创建Servlet
创建一个Web项目时“Context root URL”后填写的内容为创建的响应的虚拟路径名,以“/”开始。
使用Eclipse的Servlet向导创建Servlet的步骤:在一个包名上,右击,选“新建”——》“Servlet”命令,(超类(super class)为javax.servlet.http.HttpServlet)根据需要选择要创建的内容的复选框,“完成”即可。
经验:form表单的提交方法有两种,响应的在Servlet中也提供了两种接受请求数据的方法,要保证提交方法和接收方法永远对应上的处理:把处理代码都写在的doGet()方法中,在doPost()方法中调用doGet()方法即可。
2.3:Servlet生命周期
2.3.1:加载和实例化——Servlet容器创建Servlet实例
Servlet容器负载加载和实例化Servlet(客户端发出请求后,Servlet容器在内存中查找Servlet实例,若不存在就创建一个Servlet实例)
Servlet容器(Servlet引擎):是Web服务器或应用服务器的一部分,用于在发送请求和响应之间提供网络服务。
2.3.2:初始化——该容器调用init()方法
初始化Servlet时,可设置数据库连接参数,建立JDBC连接,或建立对其他资源的引用。初始化阶段,在javax.servlet.Servlet接口中的init()方法被调用。
2.3.3:服务——如果请求Servlet,则容器调用Service()方法
Servlet被初始化以后,就处于能响应请求的就绪状态。每个对Servlet的请求都由一个Servlet Request对象代表。Servlet给客户端的响应由一个Servlet Response对象代表。当客户端发出请求时,Servlet容器将Servlet Request对象和Servlet Response对象都转发给Servlet,这两个对象以参数形式传给service()方法。(service()方法中判断对应提交方法要调用的处理方法)
2.3.4:销毁——销毁实例之前调用destroy()方法
由创建Servlet实例的容器来销毁。Servlet被销毁时容器必须让其释放正在使用的任何资源。容器调用Servlet的destroy()方法指明哪些资源可以被系统回收(而不是由destroy()方法直接回收)。
2.3.5:生命周期代码示例
注意:init()方法只有在加载当前Servlet时被执行,并且只执行一次;destroy()只有在服务器停止或系统回收资源时才被执行。
2.4:Servlet的部署与配置
使用Eclipse的向导创建Web项目时,Eclipse会创建一个web.xml文件——部署描述文件(DD)。
2.4.1:web.xml文件
web.xml文件使用的两个XML元素(<servlet>和<servlet-mapping>)把用户访问的URL映射到Servlet,容器根据在url中访问的Servlet在web.xml文件中进行查找,并调用该Servlet以处理用户的请求。其中:<servlet-mapping>将用户访问的URL映射到Servlet的内部名,<servlet>元素把Servlet内部名映射到一个Servlet类名(包名+类名)。
2.4.2:常见错误
1,中文乱码:设置字符集的字符串为“charset”——response.setContentType("text/html;charset=GBK");【charset中的每个字母小写】
2,Servlet部署排错:实际访问的路径和web.xml中的<url-pattern>标签内的内容要一致。
3,servlet-name不一致:<servlet>中的<servlet-name>内容与<servlet-mapping>中的<servlet-name>内容要一致。
2.4.3:Servlet处理GET/POST请求
1,HttpServletRequest request对象常用方法:
request.getParameter("param");获取客户端请求数据——param为表单元素名称,返回String类型值。
request.setCharacterEncoding("GBK");将输入内容转换为中文。
request.setAttribute("loginname",user);在request作用域内存储数据。——参数loginname为存储数据的应用名,类型是String,user为存储的数据,类型为Object。
2,HttpServletResponse response对象常用方法:
response.setContextType("text/html;charset=GBK");设置输出为中文,解决中文乱码问题。
response.sendRedirect("url");让浏览器重定向到指定的资源。——参数Url为Servlet,Jsp,Html文件的路径。
3,转发
RequestDispatcher dispatcher=request.getRequestDispatcher(url);定义转发器——url为欲转发的页面或者Servlet的URL地址。
dispatcher.forward(request,response);实现转发功能。
小结:
实现页面跳转有两种方式:转发和重定向。转发(作用于服务器端)可以以request作用域进行数据的传递;重定(作用于用户浏览器端)向将丢失request作用域内的数据。
三:基于Servlet的会话跟踪
Session :会话
Serializable :连接的,序列
Book :书,书籍
Copyright :版权
Publisher :出版者,发行人
Price :价格
3.1:HTTP协议的无状态
HTTP协议不能够进行用户状态跟踪。
3.2:会话跟踪
3.2.1:什么是会话
Java Servlet API中引入session机制来跟踪客户的状态。session指的是在一段时间内,单个客户与Web服务器的一连串相关的交互过程。
3.2.2:如何进行会话跟踪
(在Servlet API中定义了javax.servlet.http.HttpSession接口,Servlet容器必须实现这个接口)一个session一开始,Servlet容器就创建一个HttpSession对象,同时在内存中开辟一个空间。Servlet为HttpSession分配一个唯一标识符SessionID。Servlet容器把SessionID保存在客户的浏览器中,从HttpRequest对象中读取SessionID。
3.2.3:会话的创建和使用
1,会话的创建:
HttpSession session=request.getSession(boolean value);——布尔值为True,如果存在与当前请求关联的会话,就返回该会话。否则创建一个新的会话并返回。布尔值为false,如果存在同true的情况,不存在则返回null,不再创建会话。
HttpSession session=request.getSession();——同前一种布尔值为true的情况。
2,会话的使用:
在HttpSession接口中定义的方法,常用的是数据存取的方法:
session.setAttribute(String name,Object value);——把一个对象value保存在HttpSession对象中,并为其制定引用名称为name。
session.getAttribute(String name);——取出存储在session中引用名称为name的数据,
注意:session.getAttribute(String name)方法的返回值为Object,取出时要对其进行数据类型转换并且要与存入的数据类型一致。
3.2.4:HttpSession对象的存在周期
1,HttpSession对象的创建
在浏览器第一次访问服务器时,服务器为每个浏览器创建不同的HttpSession对象。在服务器端使用request.getSession()方法获得HttpSession对象。
2,HttpSession对象的使用
void setAttribute(String name,Object value);——保存
Object getAttribute(String name);——读取
3,HttpSession对象的结束
1>关闭浏览器,关闭session
2>调用HttpSession 的 invalidate() 方法,删除HttpSession对象和数据
3>两次访问时间间隔大于session定义的非活动时间间隔
3.2.5:网页计数器
HttpSession session =request.getSession(true);
Object count=session.getAttribute("COUNTER"); int counter=0;
session.setAttribute("COUNTER",new Integer(1/counter));
3.3:实现E-Book电子书店的购物车
3.3.1:E-Book电子书店业务描述
3.3.2:E-Book数据库设计
3.3.3:E-Book实体对象的设计
java语言提供了一种序列话机制,可以把实现了Serializable接口的对象转换为一组byte数据,在用到这个对象的时候,能把这些byte数据恢复出来,重新构建那个对象。implements Serializble——标识一个类可被序列化。
序列化优势:程序运行时,会产生对象,这个对象会随着程序的停止而消失,序列化可以保存这些对象在程序终止后(让程序再次运行时使用或其他程序使用)。
3.3.4:E-Book代码实现
经验:在使用session进行数据存储时,如果是当前用户经常使用的则可存入其中。倘若只用了一次或偶尔采用,则不要使用session存储,否则会增加系统资源的浪费。
小结:
会话是Web容器创建的,而不是由程序员编码创建的。当客户端第一次访问服务器的时候,服务器为客户创建一个session,用于跟踪用户状态,并区分不同的用户。
四:基于Servlet的会话跟踪(二)
Quantity : 量,数量
Set : 类似于数学中的集合
Tree : 树
Decimal : 十进制的,小数的
Format : 格式,版本
4.1:购物车的设计分析
4.1.1:购物车对象的设计
由书籍类(BookBean.java)和购买书籍的数量--构成了-->>购物车内部商品信息的描述类(CartItemBean.java),再把CartItemBean类的对象放到HashMap中,其中HashMap对象的Key值是书籍的编号,value值是CartItemBean类对象。最后把购买书籍信息的HashMap对象保存到session中。
4.1.2:使用Servlet实现添加书籍到购物车
在创建购物车之前先判断购物车是否存在,如果存在,直接获得并使用,若不存在再重新创建。
代码:(见与本章同标题的网页)
4.1.3:使用Jsp实现查看购物车书籍列表
因为用户所购买商品的信息都保存在session中的HashMap中,故只需得到这个HashMap对象就可以了。
代码:(见与本章同标题的网页)
Set是没有重复元素的集合。Set接口继承自Collection接口,被HashSet类和TreeSet类实现。
Set接口的常用方法有:
Object[] toArray();int size();boolean add();boolean isEmpty();
HashSet:为快速查找而设计的Set,存入HashSet的对象必须定义HashCode()方法。
TreeSet:保持次序的Set,可以从Set中提取有序序列。
4.2:购物车显示功能
Map和HashMap没有整数索引,只能通过key来查找value。思路:得到Map中Key值的Set集合,再将Set转换为数组,取出Key值,寻找与
Key相对应value值。
4.3:购物车常见错误
4.3.1:404错误
注意JSP文件与Servlet的<url-pattern>之间的路径关系。
4.3.2:购买后购物车内无商品信息
使用session进行数据存取时,要注意保存和获取的名称要一致,区分大小写,否则系统会按照两个不同的对象进行处理。
4.3.3:格式化问题
java API提供的DecimalFormat类,解决十进制数字的格式化问题。例如:
price=book.getPrice();<%=new DecimalFormat("0.00").format(price)%>
4.4:常用集合类,接口
4.4.1:List接口
List接口与其实现类是容量可变的列表,可按索引访问集合中的元素,使有序集合。
ArrayList是以Array方式实现的List,允许快速随机存取,相对于LinkedList不适合进行行插入和移除元素的操作。
LinkedList提供最佳顺序存取,适合插入和移除元素。
4.4.2:Set接口
Set使一种不包含重复元素的Collection(在Set中最多只能有一个Null元素)。
HashSet能够快速定位一个元素,但要求 存入的HashSet对象必须实现HashCode()方法。
TreeSet将放入其中的元素按序存放。
4.4.3:Map接口
Map接口不继承于Collection接口。
Map是一种把键对象和值对象进行关联的容器,像Set一样,一个Map容器中的键对象不允许重复,以保证查找结果的一致性。
HashMap类是Map接口的实现类,实现一个键到值映射的哈希表,通过健取得值对象。
Properties类一般是把属性文件读入流中后以键—值对的形式进行保存,以方便程序员读取其中的数据。
小结:
集合类的选用:如果要经常遍历集合内元素,就要使用List;如果要保证集合中不存在重复的数据,就要使用Set;如果要通过某一个值来查找另一个值,考虑用Map。
五:基于Servlet的MVC设计模式
Current : 当前的,目前的
Validate : 验证,确认
Invalidate : 使无效
Zip Code : 邮政编码
Credit Card : 信用卡
View : 视图
Controller : 控制器
5.1:为什么需要MVC模式
5.1.1:JSP的缺点
1,代码的重用性差;2,页面的维护难度大(解决:将数据访问的代码单独放在一个Java类中用来完成所有有关数据访问和业务的逻辑;而在Jsp页面中只显示数据,有关程序控制的功能,由Servlet完成)
5.1.2:组件的功能区分
在程序设计中,把采用模型(Model),视图(View),控制器(Controller)的设计方案称为MVC设计模式。
5.2:MVC定义
5.2.1:什么是设计模式
设计模式是一套反复使用,成功的代码设计经验的总结。模式必须是典型问题的解决方案。(为某一类问题提供了解决方案,优化代码,使之易理解,提高重用性,保证可靠性)
5.2.2:MVC设计模式
模型(Model):对应组件为java类,分为业务模型和数据模型,代表应用程序的业务逻辑和状态。
视图(View):对应组件为Jsp或Html文件,提供交互性界面,向客户显示模型数据。
控制器(Controller):对应组件为Servlet,响应客户请求,根据客户的请求操作模型,并把模型的响应结果由视图展示给客户。
优点:3个层会不干涉,利于开发中的分工,组件的重用。——把显示与数据分离,增加各个模块的重用性。
5.3:MVC编程模式
5.3.1:MVC编程思路
5.3.2:实习基于MVC模式的应用程序
5.4:E-Book电子书店的结账功能
5.4.1:视图的创建
5.4.2:控制器的创建
5.4.3:模型的创建
小结:
MVC模式,将数据的展示,处理,存取分为了View,Controller,Model,通过Controller来连接了View和Model,使代码更优化,开发和维护更容易。
六:Model层开发:高级JDBC
Cannot :不,不能
DataSource : 数据源
Naming : 命名
Directory : 目录
Active : 积极的,活动的
Properties : 属性,道具
6.1:MVC设计模式中的Model
Model是通过访问数据库并对数据进行封装后或是通过业务逻辑处理后的数据模型。
6.2:数据库连接池
在JDBC2.0中提供了javax.sql.DataSource(数据源)接口,负责建立与数据库的连接,在应用程序中访问数据库时不必编写连接数据库的代码,可以直接从数据源获得数据库连接。
6.2.1:什么是数据库连接池
数据库连接池负责分配,管理和释放数据库连接,允许应用程序重复使用一个现有的数据库连接(而非重新建立);释放空闲时间超过最大空闲时间的数据库连接(以避免因为没有释放数据库连接而引起的数据库连接遗漏)。[最小/最大 数据库连接数,等待列队]
6.2.2:数据源与连接池(DataSource,ConnectionPool)
Java程序访问数据库时,只需从连接池中取出空闲状态的数据库连接,访问结束,再将连接放回连接池。
6.2.3:数据源与JNDI资源
DataSource对象由Web容器(Tomcat)提供,不能在程序中通过创建实例的方式来生成DataSource对象,而需要通过JNDI(Java Naming and Directory Interface)来获得其对象。
JNDI——一种将对象和名字绑定的技术,容器生产出的对象都和唯一的名字绑定,外部程序通过名字获得对象。
-----------------------------------------------------------------------------------------------------------------------------
javax.naming.Context提供了查找JNDI Resource的接口,注意:Context接口的lookup(String name),返回与指定名称绑定的对象。
示例:
1,获得名称为jdbc/books的数据源的引用:Context ctx=new InitialContext(); DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/books");(得到DataSource对象)
2,通过其getConnection()方法获得数据库连接对象Connection。Connection conn=ds.getConnection();
3,程序结束数据库访问后,将连接返回给数据库连接池,使Connection恢复空闲状态。 调用Connection的Close()方法,conn.close();
解释:
Tomcat把DataSource作为一种可配置的JNDI资源来处理。生成DataSource对象的工厂为org.apache.commons.dbcp.BasicDataSourceFactory。可以配置多个DataSource,通过context.lookup("datasourceName")访问相应名称下的数据源而或得其连接。
-----------------------------------------------------------------------------------------------------------------------------
6.2.4:JNDI的配置
数据源名称的设定:
1,context.xml文件的配置
在Tomcat根目录\conf\context.xml文件中<Context>节点中添加<Resource>信息:
<Context>
..........//原有配置
<Resource name="jdbc/books" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="1000" userName="sa" password="120010" driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver" url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=books"/>
</Context>
-----------------------------------------------------------------------------------------------------------------------------
<Resource>的属性
name :指定Resource的JNDI名字
auth :指定管理Resource的Manager,有两个可选值:Container(有容器来创建Resource)和Application(有Web应用来创建和管理Resource)。
type :指定Resource所属的Java类名。
maxAative :指定数据库连接池中处于活动状态的数据库连接的最大数目,取值为0表示不受限制。
maxIdle :指定数据库连接池中处于空闲状态的数据库连接的最大数目,取值为0表示不受限制。
maxWait :指定数据库连接池中的数据库连接处于空闲状态的最长时间(以毫秒为单位),超过这一时间将会抛出异常。取值为-1,表示可以无限制等待。
username :指定连接数据库的用户名。
password :指定连接数据库的口令。
driverClassName :指定连接数据库的JDBC驱动程序。
url :指定连接数据库的URL。
-----------------------------------------------------------------------------------------------------------------------------
2,web.xml文件的配置
在应用程序的WEB-INF\web.xml文件中<web-app>节点下添加<resource-ref>信息
<web-app>
<resource-ref>
<description>E-Books DataSource</description>
<res-ref-name>jdbc/books</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<resource-ref>
.........//其他配置信息
</web-app>
-----------------------------------------------------------------------------------------------------------------------------
<resource-ref>的属性:
description :对所引用资源的说明。
res-ref-name :指定所引用资源的JNDI名字,与<Resource>元素中的name属性相对应。
res-type :指定所引用资源的类名字,与<Resource>元素中的type属性相对应。
res-auth : 指定管理所引用资源的Manager,与<Resource>元素中的auth属性相对应。
-----------------------------------------------------------------------------------------------------------------------------
3,添加数据库驱动文件
必须把JDBC驱动程序复制到Tomcat的common\lib目录下(访问数据库所要通过的数据源由Tomcat创建并维护)。
4,JNDI常见错误
1,不能加载驱动类Cannot load JDBC driver class;--解决:把JDBC驱动程序的JAR文件复制到Tomcat的common\lib目录下。
2,由于连接路径为Null,不能创建驱动"Cannot create JDBC driver of class '' for connect URL 'null' ";--解决:保证context.xml文件中指定的数据源名称与代码中所要访问的数据源名称一样。
3,jdbc名称没有绑定到当前上下文Name jdbc is not bound in this Context;--解决:在使用lookup()方法查找数据源时,参数时“前缀+数据源名称”,必须把前缀加上。
6.3:基于属性文件的数据库配置
6.3.1:数据库配置信息
数据库访问编写在程序代码中,使得数据库发生变化则需要重新编码再发布,不方便,不灵活。
6.3.2:属性文件
java中提供了Properties类来读取.properties(属性)文件。再项目默认路径(src)下创建文件db.properties,但只能保存String类型信息。
内容:
driver=com.microsoft.jdbc.sqlserver.SQLServerDriver
url=jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=books
user=sa
password=120010
解释:在程序调用Properties类的Load()方法时,系统把db.properties文件的内容加载到内存中。Properties类继承了HashTable,它把“=”前的内容添加到HashTable对象的key值,“=”后的值为key对应的value.(使用Properties时一定要使用=将名称和值分开)
6.3.3:读取属性文件
读取配置信息时,使用类的单例模式创建,获得对象实例,并调用Properties类提供的方法getProperty("key")获得HashTable的value值,进行创建数据库连接类的操作。
6.3.4:Class与Object小结
1,Class类(2种常用方法)
Class.forName(String classname):该方法生成一个以String类型参数指定的classname的Class对象,如:Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
InputStream getResourceAsStream(String name):该方法是打开并读取一个Stirng类型参数指定的文件到系统内存中,以方便获取文件信息。
如:InputStream in=JProperties.class.getResourceAsStream(name); Properties p=new Properties(); p.load(in);
2,Object类
Object类是所有类的根类,自定义类都默认继承于这个类,所有的类(包括数组)都具有这个类的方法。
getClass();返回一个对象的运行时类。
toString();返回该对象的字符串表示,在Object类中是返回对象的地址信息。
equals(Object obj);判断obj与当前对象是否相等。
6.4:自定义异常
6.4.1:定义异常类
用户自定义异常类要继承Exception类。
6.4.2:使用自定义异常类
6.5:通用的DAO类
通用DAO类,进行数据库的访问。
6.5.1:通用DAO类的实现
1,executeQuery()方法,执行查询数据库操作,返回javax.servlet.jsp.jstl.sql.Result对象。
2,executeUpdate()方法,执行修改或删除数据库信息的操作。
3,setValues()方法,以给定的对象设定指定位置的参数值。
属性:Connection conn:连接对象;String sqlValue:SQL语句;List values:SQL语句中的参数列表;提供getter,setter方法。9
6.5.2:通用DAO类的使用
6.5.3:带参数的SQL语句测试类
小结:
在进行企业级应用开发时,对数据库性能,处理错误等方面的要求有所提高,才出现了连接池和JNDI技术,以实现对数据库的优化。
关于如何连接数据库,已学会了三种方式:
1,编码方式:把数据库配置信息直接写入Java代码中。
2,.properties文件:把数据库配置信息写在属性文件中,用程序读取。
3,数据源:使用JNDI来获取DataSource对象,从而得到Connection对象。
读取.properties文件的步骤不下:
1,创建继承自Properties的类,并以单例模式获得实例:私有静态成员,私有默认构造方法,公有的静态同步方法。
2,使用Class对象的getResourceAsStream()方法,把指定的属性文件读入输入流中,并使用Properties类的load()方法,从输入流中读取属性列表(键值对)。
3,在实现数据库连接方法时,使用Properties类的getProperty()方法,通过键读取value值,从而实现数据库连接的操作。
在使用JNDI时,步骤为:1,配置context.xml文件;2,配置web.xml文件;3,进行编码,使用lookup()方法获得数据源对象。
在编写程序的过程中,由于错误信息不够具体或准确,从而不能很快找到错误或异常,并解决错误,所以需要自定义异常。
七:View层开发:JavaBean在JSP中的使用
本章单词:
Bean :豆子
Order :顺序,次序
Property :属性,特性
Scope :范围
7.1:为什么需要JavaBean
7.1.1:面向对象思想
在业务方法于操作数据库表时,只要传递给该方法一个与表对应的实例对象就可以了。
7.1.2:什么是JavaBean
JavaBean是Java开发中开发的可以跨平台的重用组件,是一种组件体系结构。(可以重用的java类。)作用:封装数据,封装业务。
要求:是共有类,提供无参共有的构造方法,属性私有,具有公有的访问属性的getter和setter方法。
7.1.3:封装数据的JavaBean
一个封装数据的JavaBean一般情况下对应着数据库内一张表(或视图)属性与表(或视图)内字段的属性一一对应。
7.1.4:封装业务的JavaBean
相对于封装数据的JavaBean都会有一个封装业务的JavaBean——***Operation.java。
7.2:JSP与JavaBean
Jsp标准动作来实现在Jsp页面中调用JavaBean,在浏览器请求Jsp页面时调用,可使用现有的JavaBean组件和属性以及请求转发。
语法:<jsp:action_Name attribute1="value1" attribute2="value2"/>
7.2.1:<jsp:useBean>
用来装载一个将在JSP页面中使用的JavaBean
<jsp:useBean id="name" class="package.class" scope="scope"/>
<jsp:useBean id:创建JavaBean的引用名 class指定JavaBean的类 scope指定javaBean的范围>(page,request,session,application)
7.2.2:<jsp:setProperty>
用于设置useBean中指定的JavaBean的属性值
<jsp:setProperty name="BeanName" property="PropertyName" value="Value" param="Parameter"/>
<jsp:setProperty name="JavaBean的id" property="要设置值的JavaBean的属性名称" value="要为属性设置的值" param="指定用于输入数据的表单元素名称并给属性赋值"/>
注意:param属性和value属性不能一起使用。
7.2.3:<jsp:getProperty>
在useBean中id所指定的对象通过setProperty中对property指定的属性进行赋值后,可以使用getProperty动作获取JavaBean中指定的属性值。
7.2.4:JSP标准动作的使用
<jsp:useBean id="order" class="y2javaee.sg.ch07.Order" scope="request"/>
<jsp:setProperty name="order" property="username" param="username"/>
<jsp:setProperty name="order" property="total" value="23.45"/>
<jsp:getProperty name="order" property="username"/>
<jsp:getProperty name="order" property="total"/>
添加:
forward标准动作,功能是实现页面的跳转,是指为RequestDispatcher(url).forward(request,response);
<jsp:forword page="url"/>Page属性指定欲跳转到的页面路径和文件名称
7.2.5:常见错误
1,setProperty标准动作的param属性(拿到的值显示为null)----使用param属性时注意与Form表单元素的对应关系。
2,setProperty和getProperty标准动作的name属性——Status 500——name属性值与useBean中所指定的Id找不见对应关系。
7.3:JSP标准动作调用JavaBean
在执行JSP标准动作useBean时,调用JavaBean的无参构造方法,执行setProperty动作时,调用JavaBean的setter方法,执行getProperty时,调用getter方法。
7.4:使用jsp标准动作实现用户登陆验证
注意: javaScript中的with(){}——with语句通常用来缩短特定情形下必须写的代码。
7.5:Model1介绍
只使用Jsp和JavaBean来实现功能而没有使用Servlet来进行程序流程的控制的编程模式为Model1模式,相对的,MVC模式成为Model2模式。
(Model1模式用于在开发中小型项目上,而Model2用于大型项目的程序设计)
小结:
使用JSP标准动作有以下好处:
可以方便程序开发(代码重用),方便美工人员美化页面(在JSP中减少了大量的Java代码),简化数据的获取和封装过程。
常用的Jsp标准动作有以下4种:useBean,setProperty,getProperty,forward。
Model1和Model2的区别:
实现:JSP+JavaBean——JSP+JavaBean+Servlet;使用Model1设计的项目缺少控制层,不易进行扩展,只适合中小型项目。
<jsp:forward>标准动作实质是使用转发器RequestDispatcher对象的forward()方法实现转发的功能。
八:View层开发:EL和JSTL
本章单词:
Expression :表达式,符号
Standard :标准
Tag :标签
Library :库
Prefix :前缀
8.1:EL表达式
8.1.1:为什么需要EL表达式
在JSP标准动作操作JavaBean时,如果JavaBean的属性是String类型或基本数据类型,则能够实现类型的自动转换。但无法将Object类型的属性读取出来(嵌套式访问机制)
8.1.2:EL语法
不使用java来访问Java对象或者变量的一种方法。语法:${EL表达式};
1,点操作符:${JavaBean对象/EL隐式对象.JavaBean属性/映射键}
2,[]操作符(操作数组及其他):${对象/数组["属性/索引"]},注意,只有在操作数组时操作符中的双引号才可以省略。
8.1.3:EL表达式的使用
EL可以操作对象,数组,映射,进行表达式的计算,逻辑运算,(调用JavaBean的getter方法),但不能进行逻辑控制(无法实现无脚本页面)。
8.2:JSTL标准标签库
8.2.1:什么是JSTL
JSTL(Java Server Pages Standerd Tag Library, JSP标准标签库)包含用于编写和开发Jsp页面的一组标准标签,可为用户提供无脚本环境。
8.2.2:如何使用JSTL
JSTL Support: Add JSTL libraries to WEB-INF/lib folder?WEB-INF\lib目录下:两个Jar文件:jstl.jar 和 standard.jar,WEB-INF目录下生成很多.tId文件。使用taglib指令导入标签库描述文件,就可以在项目中使用JSTL了。
解释:taglib是JSP指令的一种,作用在JSP页面中,将标签库描述符文件(.tId)引入该页面,并设置前缀,利用标签的前缀去使用标签库描述符文件中的标签。taglib指令的语法如下:
<%@ taglib uri="标签库描述符文件" prefix="前缀名"%>
8.3:JSTL核心标签库(JSP页面中的常用动作)
8.3.1:通用标签
用于操作Jsp页面中创建的变量。用于 设置,删除变量,显示变量值——<c:set><c:remove><c:out>
<c:set>设置指定范围内的变量值,不存在就创建。(对于javaBean中没有的属性,只要有相应的getter方法就可以打点调用的)
<c:remove var="name" scope="page|request|session|application||">删除变量。
<c:out value="value">计算表达式并将结果显示在页面上。
8.3.2:条件标签
用于对Jsp页面中的代码进行条件判断和处理
<c:if ttest="condition" var="name" scope="page">//条件为true时执行的代码</c:if>
test指定条件,通常使用EL方式进行条件运算:${条件运算},可以使用的运算符:<,>,==,and,or,lt,gt,eq;var指定变量,并 把EL运算结果赋值给该变量;scope指定变量的范围。
8.3.3:迭代标签
多次计算标签的标签体,类似于循环遍历一个对象集合。
<c:forEach items="collection" var="name">//循环体内容</c:forEach>
<c:forEach items="指定要遍历的对象集合(数组,List,Map)" var="指定变量的名称">
8.3.4:常见错误
1,"Failed to load or instantiate TagLibraryValidator class"(加载或实例化TagLibraryValidator类时失败)——解决:在创建项目中添加JSTL的标签库文件(在项目已经创建好了再往里边添加该怎么添加?)。
2,status 500,JSTL标签的属性不支持表达式的错误。——解决:正确的路径:<%@ taglib uri="http://java.sun,.com/jst1/core" prefix="c"%>
8.4:EL隐式对象
EL隐式对象是一组标准的类,JSP容器向用户提供类中的方法和变量,
1,作用域访问对象(在JSP标准动作和JSTL中的通用标签,都要指定相应的范围(默认为page))。范围的四种选项:page,request,session,application,相应的对象为pageScope,requestScope,sessionScope,applicationScope。(返回**范围内的变量名,这些名称已映射至相应的值)
注:如果在获取变量值时,不使用作用域访问对象,系统会按照page->request->session->application的顺序来查找。
2,参数访问对象
EL提供参数访问对象来获取其他页面或Servlet传递过来的参数值。(${param.name})
param,返回客户端的请求参数的字符串值;paramValues,返回映射至客户端请求参数的一组值。
3,JSP隐式对象(jsp和EL共有的:pageContext)
pageContext,提供对用户请求和页面信息的访问。
EL通过pageContext来访问JSP中的其他隐式对象(request,response)。
8.5:SQL标签
SQL标签用于访问各种关系型数据库,基于Web的小型应用程序而设计的。(查询,修改功能)
8.5.1:使用SQL标签修改数据库中的信息
<sql:setDataSource url="jdbcurl" | DataSource="dataSource" driver="driverclass" user="username" password="userpassword" var="name" scope="page"/>
<sql:setDataSource url="与数据库关联的URL" | DataSource="指定JNDI资源的数据源名称" driver="指定驱动类" user="指定数据库的用户名" password="指定用户的密码" var="指定变量名称" scope="指定变量范围"/>
<sql:update var="name" dataSource="dataSource" scope="page">SQL语句</sql:update>
<sql:update var="指定变量的名称" dataSource="数据源名称,与<sql:setDataSource>标签中var的变量名称一致" scope="指定变量范围">SQL语句可以是增,改,删</sql:update>
<sql:param value="value"/> value指定为SQL语句中的参数中"?"处的值。
8.5.2:使用SQL标签查询数据库中的信息
<sql:query var="name" dataSource="dataSource" scope="page">SQL语句</sql:query>
<sql:query var="指定变量名" dataSource="指定使用的数据源,与与<sql:setDataSource>标签中var的变量名称一致" scope="指定变量范围">SQL语句</sql:query>
经验:
在JSP页面中可以使用SQL标签直接访问操作数据库,但不符合MVC设计模式,所以只能在中小型项目中使用。
小结:
EL表达式的语法:以"$"开头,并加以"{"开始,最终以"}"结束。
在JSP页面中使用EL和JSTL,主要目的就是实现JSP中无脚本编程,从而提高项目的可维护性(包括美工的网页维护)和扩展性。
JSTL中常用的标签有以下两类:
1,核心标签:
通用标签:set,out,remove;
条件标签:if;
迭代标签:forEach;
2,SQL标签:
setDataSource;
update;
param;
query;
使用SQL标签可以进行数据库的如下操作:
在JSP页面中使用taglib指令,导入描述符文件。
使用setDataSource标签创建数据源。
如果SQl语句中有参数,使用param标签进行参数的设置。
如果是执行查询,则使用query标签后,使用forEach标签对返回的结果集进行遍历。
注意:在使用SQL标签进行数据库的增加,删除,修改,查找时,必须定义DataSource,并且在update和query标签中指定已创建的DataSource,这样才能操作数据库。
九:Web服务
simple:简单的 Access:访问 Protocol:协议 service:服务 Proxy:代理 Factory:工厂
Client:客户,用户
9.1:软件的发展趋势
9.2:什么是Web服务
9.3:Web服务的创建和发布
9.3.1:环境配置
9.3.2:创建服务接口与实现类
9.3.3:services.xml
9.3.4:web.xml
9.3.5:xalan.jar和WSDL
9.4::创建客户端程序调用Web服务
9.4.1:客户端程序
9.4.2:完整的E-Book系统
9.5:Web服务运行原理
9.5.1:单元测试
9.5.2:Web服务的监控
小结:
Web服务把软件的重用提高到Internet层面上,因为底层是HTTP协议,以XML传递数据,所以是语言无关,平台无关的,大大提高了软件的重用性,更加有利于系统的集成。
使用XFire创建和发布Web服务的步骤如下:
添加XFire库,添加XFire-all-1.2.6.jar包,创建服务接口是实现类,配置 services.xml文件,配置web.xml文件,添加xalan.jar包,创建客户端程序访问Web服务。
测试类的规范,测试类要继承自TestCase类,测试类的类明为待测类名+Test,测试方法名为test+待测方法名。
注:本文档为学习的简单归纳,基本没有加入个人见解,可以当做纯粹的查阅资料帮助平常编程。
--------2010--08--25
Struts -- 采用Java Servlet / Java Server Pages 技术,开发Web应用程序的开放源码的框架,采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架。
Spring -- 让J2EE开发更容易的开源框架。(由容器,用于配置与装配组件的框架以及一组用来执行事务,持久化以及网页用户界面服务所组成的,本意,春天)
Hibernate -- 一个面向Java环境的对象/关系数据库映射工具。(用来把对象模型表示的对象映射到基于SQL的关系模型结构中,本意,冬眠)
Bean -- 豆,豆子
Edition -- 版本
Enterprise -- 企业
--------------------------------------------------------------------------------------------------
Service -- 服务
Content -- 内容,容量
Attribute -- 属性,特征
Redirect -- 重定向
Dispatcher -- 转发,派遣
--------------------------------------------------------------------------------------------------
Session :会话
Serializable :连接的,序列
Book :书,书籍
Copyright :版权
Publisher :出版者,发行人
Price :价格
--------------------------------------------------------------------------------------------------
Quantity : 量,数量
Set : 类似于数学中的集合
Tree : 树
Decimal : 十进制的,小数的
Format : 格式,版本
--------------------------------------------------------------------------------------------------
Current : 当前的,目前的
Validate : 验证,确认
Invalidate : 使无效
Zip Code : 邮政编码
Credit Card : 信用卡
View : 视图
Controller : 控制器
--------------------------------------------------------------------------------------------------
Cannot :不,不能
DataSource : 数据源
Naming : 命名
Directory : 目录
Active : 积极的,活动的
Properties : 属性,道具
--------------------------------------------------------------------------------------------------
Bean :豆子
Order :顺序,次序
Property :属性,特性
Scope :范围
--------------------------------------------------------------------------------------------------
Expression :表达式,符号
Standard :标准
Tag :标签
Library :库
Prefix :前缀
--------------------------------------------------------------------------------------------------
simple:简单的 Access:访问 Protocol:协议 service:服务 Proxy:代理 Factory:工厂
Client:客户,用户
--------------------------------------------------------------------------------------------------
一:JavaEE概述
1.1:为什么需要JavaEE
1.1.1:JSP的弊端
原Jsp代码,显示代码和业务混淆,彼此嵌套,难以对项目进行有效的维护和扩展。为此,需要使用JavaEE技术来进行项目开发。
1.1.2:什么是JavaEE
Java平台有三个版本:使用于小型设备和智能卡的JavaME( Java PlatForm Micro Edition ,Java微型版),适用于桌面系统的JavaSE(Java Platform Micro ,Java标准版),适用于企业级应用的JavaEE(Java Platform Edition ,Java企业版)
1.1.3:JavaEE包含的技术
JavaEE应用程序有组件构成的。J2EE组件式具有独立功能的单元,通过相关类和文件按组装成JavaEE应用程序并与其他组件交互。
javaEE技能结构图(略)
1.2:JavaEE与其他的关系
1.2.1:什么是框架
框架即Framework(某种应用的半成品,一组组件,供用户选用,完成用户自己的系统)——使用别人准备好的组件,来实施自己的项目。
1.2.2:JavaEE与框架的关系
框架技术是在JavaEE基础上形成的,而应用程序是在框架的基础上创建的。
1.3:JavaEE的体系结构
应用程序的三层结构如下:
表示层:由用户界面和用于生成界面的代码组成;中间层:包含系统的业务和功能代码。数据层:负责完成存取数据库的数据和对数据进行封装。
1,一层体系结构:表示层,中间层,数据层相关的代码耦合在一起。
2,二层体系结构:数据层的代码与中间层和比表示层分开。
3,三层结构体系:与3个组件相关的代码相互之间保持独立。中间层充当数据层和表示层之间的接口,通常表示层不能直接与数据层进行通信。
优点:一个组件的更改不会影响其他两个组件,表示层与数据层独立可以方便扩充比表示层(扩展性),代码重复减少(3个组件之间共享代码),良好的分工与协作。
1.4:JavaEE技术内容
javaEE技术是对应该体系结构的,可分为表示层技术,中间层技术,数据层技术,还有系统集成的技术。
1.4.1:表示层技术
HTML,JavaScript,Ajax
Ajax——并不是一种技术,而是几种技术的整合,主要功能是——异步的向服务器端发送请求,处理数据或根据返回的数据重新显示页面。
1.4.2:中间层技术
1,jsp——显示动态内容的服务器网页。2,Servlet——接收客户端请求,并做出响应的Java程序(控制其他组件)。3,JSTL——辅助显示动态内容的标准标签库。4,JavaBean——javaEE的模型组件。5,中间层的框架技术——Struts框架,主要扩展了Servlet。
1.4.3:数据层技术
1,JDBC技术(Java Database Connectivity)——Java数据库连接。2,数据层框架技术,数据层框架(Hibernate提供了以对象的形式操作关系型数据库数据的功能)
1.4.4:系统集成技术(Web Service)
1,JAX-WS(Java API for Xml Web Service)javaEE的重要组成部分,简化使用Java技术开发Web服务的工作。
2,JNDI(Java Naming and Directory Interface,java命名和目录接口)是一组在Java应用中访问命名和目录服务的API,命名服务和对象把名称联系在一起,并且可以通过名称找相应对象。
1.5: E-Book电子书店
1.5.1:E-Book功能介绍
实现网上购书以及结算等。
1,.5.2:E-Book电子书店所使用的技术
javaServlet,javaBean,JDBC,JNDI,JSTL等技术。
1.6:HTTP协议
1.6.1:数据的提交和接受
用户的请求和Web应用程序的响应需要通过Internet从一台计算机上发送到另一台计算机或服务器,使用的是超文本传输协议(HTTP协议——HyperText Transfer Protocol,超文本传输协议)。
HTTP是一个无状态协议,基于客户端——服务器模型。HTTP协议使用端口发送和接收消息。端口是协议发送和接受数据的信道或机制。80端口是为HTTP开放的,主要用于在WWW(Word Wide Web,万维网)服务上传输信息。【我们可以通过HTTP地址加“80”——网址,来访问网站,因为浏览网页服务的端口号是80,所以只要输入网址,不用输入80】
1.6.2:GET方法的请求格式
Eclipse提供的数据监控工具——TCP/IP Monitor;
TCP/IP Monitor的配置步骤如下:
单击“窗口”--》“首选项”--》展开右侧“运行/调试”节点,选择TCP/IP Monitor,并选中“show the TCP/IP Monitor view when there is activity”复选框--》单击“add”按钮(添加监控端口)-->>启动监控,运行程序,在地址栏把端口号8080改为8088。
添加监控端口:
Local monitoring port :8088(本机监控端口)
Monitor:
Host name:localhost;(欲监控的主机名称)
Port :8080;(欲监控的端口号)
Type:HTTP;
Timeout (in milisconds).......................................
经验:在进行监控设置时,我们已经设置了一个8088的监控端口,所以启动服务后,在地址栏内应输入“httP://localhost:8088/store”而不是“:8080”,只有这样我们才能真正监控到数据。
地址栏后追加的数据有长度限制,不能大于255个字符。
1.6.3:GET方法的响应格式
1.6.4:Post方法的请求和响应格式
Post请求和get请求的区别如下:
Post请求的数据在地址栏内不可见,理论上没有长度要求。Get请求将字符串添加到URL中,是页面可以被设置成书签或使用电子邮件发送,而post不能。
1.6.5:HTTT协议的使用
Get方法是浏览器默认的提交方法,而处于安全性和数据容量的问题,一般选用Post方法提交。
二:Servlet基础
Service : 服务
Content : 内容,容量
Attribute : 属性,特征
Redirect : 重定向
Dispatcher : 转发,派遣
2.1:为什么需要Servlet
2.1.1:使用Jsp开发Web程序
在Jsp技术出现之前,生成HTML页面——只有在服务器端运行Java程序,并输出HTML格式内容。运行在服务器端的Java程序就是Servlet。
2.1.2:什么是Servlet
Servlet是一个Java程序,是在服务器端运行以处理客户端请求并作出响应的程序。
2.1.3:初识Servlet
创建Servlet需要:
导入的包:java.io.*;javax.servlet.*;javax.servlet.http.*;
创建的Servlet类必须继承HttpServlet类。(public class HelloServlet extends HttpServlet{})
实现doGet()或者 doPost()方法。
2.1.4:Servlet和Jsp之间的关系
JSP在运行前首先将编译为一个Servlet,故Servlet是JSP的基础。
(解释:*.jsp文件在运行是首先解析为一个继承了org.apache.jasper.runtime.HttpJspBase类的*_jsp.java类文件,而HttpJspBase类又继承自HttpServlet的类)
2.2:如何创建Servlet
2.2.1:Servlet编程模式
创建Servlet必须要继承自HttpServlet。HttpServlet作为抽象类用来创建用户自己的Servlet,其的子类必须重写一个doGet()或doPost()方法,用于处理form表单的GET请求或POST请求。
2.2.2:使用向导创建Servlet
创建一个Web项目时“Context root URL”后填写的内容为创建的响应的虚拟路径名,以“/”开始。
使用Eclipse的Servlet向导创建Servlet的步骤:在一个包名上,右击,选“新建”——》“Servlet”命令,(超类(super class)为javax.servlet.http.HttpServlet)根据需要选择要创建的内容的复选框,“完成”即可。
经验:form表单的提交方法有两种,响应的在Servlet中也提供了两种接受请求数据的方法,要保证提交方法和接收方法永远对应上的处理:把处理代码都写在的doGet()方法中,在doPost()方法中调用doGet()方法即可。
2.3:Servlet生命周期
2.3.1:加载和实例化——Servlet容器创建Servlet实例
Servlet容器负载加载和实例化Servlet(客户端发出请求后,Servlet容器在内存中查找Servlet实例,若不存在就创建一个Servlet实例)
Servlet容器(Servlet引擎):是Web服务器或应用服务器的一部分,用于在发送请求和响应之间提供网络服务。
2.3.2:初始化——该容器调用init()方法
初始化Servlet时,可设置数据库连接参数,建立JDBC连接,或建立对其他资源的引用。初始化阶段,在javax.servlet.Servlet接口中的init()方法被调用。
2.3.3:服务——如果请求Servlet,则容器调用Service()方法
Servlet被初始化以后,就处于能响应请求的就绪状态。每个对Servlet的请求都由一个Servlet Request对象代表。Servlet给客户端的响应由一个Servlet Response对象代表。当客户端发出请求时,Servlet容器将Servlet Request对象和Servlet Response对象都转发给Servlet,这两个对象以参数形式传给service()方法。(service()方法中判断对应提交方法要调用的处理方法)
2.3.4:销毁——销毁实例之前调用destroy()方法
由创建Servlet实例的容器来销毁。Servlet被销毁时容器必须让其释放正在使用的任何资源。容器调用Servlet的destroy()方法指明哪些资源可以被系统回收(而不是由destroy()方法直接回收)。
2.3.5:生命周期代码示例
注意:init()方法只有在加载当前Servlet时被执行,并且只执行一次;destroy()只有在服务器停止或系统回收资源时才被执行。
2.4:Servlet的部署与配置
使用Eclipse的向导创建Web项目时,Eclipse会创建一个web.xml文件——部署描述文件(DD)。
2.4.1:web.xml文件
web.xml文件使用的两个XML元素(<servlet>和<servlet-mapping>)把用户访问的URL映射到Servlet,容器根据在url中访问的Servlet在web.xml文件中进行查找,并调用该Servlet以处理用户的请求。其中:<servlet-mapping>将用户访问的URL映射到Servlet的内部名,<servlet>元素把Servlet内部名映射到一个Servlet类名(包名+类名)。
2.4.2:常见错误
1,中文乱码:设置字符集的字符串为“charset”——response.setContentType("text/html;charset=GBK");【charset中的每个字母小写】
2,Servlet部署排错:实际访问的路径和web.xml中的<url-pattern>标签内的内容要一致。
3,servlet-name不一致:<servlet>中的<servlet-name>内容与<servlet-mapping>中的<servlet-name>内容要一致。
2.4.3:Servlet处理GET/POST请求
1,HttpServletRequest request对象常用方法:
request.getParameter("param");获取客户端请求数据——param为表单元素名称,返回String类型值。
request.setCharacterEncoding("GBK");将输入内容转换为中文。
request.setAttribute("loginname",user);在request作用域内存储数据。——参数loginname为存储数据的应用名,类型是String,user为存储的数据,类型为Object。
2,HttpServletResponse response对象常用方法:
response.setContextType("text/html;charset=GBK");设置输出为中文,解决中文乱码问题。
response.sendRedirect("url");让浏览器重定向到指定的资源。——参数Url为Servlet,Jsp,Html文件的路径。
3,转发
RequestDispatcher dispatcher=request.getRequestDispatcher(url);定义转发器——url为欲转发的页面或者Servlet的URL地址。
dispatcher.forward(request,response);实现转发功能。
小结:
实现页面跳转有两种方式:转发和重定向。转发(作用于服务器端)可以以request作用域进行数据的传递;重定(作用于用户浏览器端)向将丢失request作用域内的数据。
三:基于Servlet的会话跟踪
Session :会话
Serializable :连接的,序列
Book :书,书籍
Copyright :版权
Publisher :出版者,发行人
Price :价格
3.1:HTTP协议的无状态
HTTP协议不能够进行用户状态跟踪。
3.2:会话跟踪
3.2.1:什么是会话
Java Servlet API中引入session机制来跟踪客户的状态。session指的是在一段时间内,单个客户与Web服务器的一连串相关的交互过程。
3.2.2:如何进行会话跟踪
(在Servlet API中定义了javax.servlet.http.HttpSession接口,Servlet容器必须实现这个接口)一个session一开始,Servlet容器就创建一个HttpSession对象,同时在内存中开辟一个空间。Servlet为HttpSession分配一个唯一标识符SessionID。Servlet容器把SessionID保存在客户的浏览器中,从HttpRequest对象中读取SessionID。
3.2.3:会话的创建和使用
1,会话的创建:
HttpSession session=request.getSession(boolean value);——布尔值为True,如果存在与当前请求关联的会话,就返回该会话。否则创建一个新的会话并返回。布尔值为false,如果存在同true的情况,不存在则返回null,不再创建会话。
HttpSession session=request.getSession();——同前一种布尔值为true的情况。
2,会话的使用:
在HttpSession接口中定义的方法,常用的是数据存取的方法:
session.setAttribute(String name,Object value);——把一个对象value保存在HttpSession对象中,并为其制定引用名称为name。
session.getAttribute(String name);——取出存储在session中引用名称为name的数据,
注意:session.getAttribute(String name)方法的返回值为Object,取出时要对其进行数据类型转换并且要与存入的数据类型一致。
3.2.4:HttpSession对象的存在周期
1,HttpSession对象的创建
在浏览器第一次访问服务器时,服务器为每个浏览器创建不同的HttpSession对象。在服务器端使用request.getSession()方法获得HttpSession对象。
2,HttpSession对象的使用
void setAttribute(String name,Object value);——保存
Object getAttribute(String name);——读取
3,HttpSession对象的结束
1>关闭浏览器,关闭session
2>调用HttpSession 的 invalidate() 方法,删除HttpSession对象和数据
3>两次访问时间间隔大于session定义的非活动时间间隔
3.2.5:网页计数器
HttpSession session =request.getSession(true);
Object count=session.getAttribute("COUNTER"); int counter=0;
session.setAttribute("COUNTER",new Integer(1/counter));
3.3:实现E-Book电子书店的购物车
3.3.1:E-Book电子书店业务描述
3.3.2:E-Book数据库设计
3.3.3:E-Book实体对象的设计
java语言提供了一种序列话机制,可以把实现了Serializable接口的对象转换为一组byte数据,在用到这个对象的时候,能把这些byte数据恢复出来,重新构建那个对象。implements Serializble——标识一个类可被序列化。
序列化优势:程序运行时,会产生对象,这个对象会随着程序的停止而消失,序列化可以保存这些对象在程序终止后(让程序再次运行时使用或其他程序使用)。
3.3.4:E-Book代码实现
经验:在使用session进行数据存储时,如果是当前用户经常使用的则可存入其中。倘若只用了一次或偶尔采用,则不要使用session存储,否则会增加系统资源的浪费。
小结:
会话是Web容器创建的,而不是由程序员编码创建的。当客户端第一次访问服务器的时候,服务器为客户创建一个session,用于跟踪用户状态,并区分不同的用户。
四:基于Servlet的会话跟踪(二)
Quantity : 量,数量
Set : 类似于数学中的集合
Tree : 树
Decimal : 十进制的,小数的
Format : 格式,版本
4.1:购物车的设计分析
4.1.1:购物车对象的设计
由书籍类(BookBean.java)和购买书籍的数量--构成了-->>购物车内部商品信息的描述类(CartItemBean.java),再把CartItemBean类的对象放到HashMap中,其中HashMap对象的Key值是书籍的编号,value值是CartItemBean类对象。最后把购买书籍信息的HashMap对象保存到session中。
4.1.2:使用Servlet实现添加书籍到购物车
在创建购物车之前先判断购物车是否存在,如果存在,直接获得并使用,若不存在再重新创建。
代码:(见与本章同标题的网页)
4.1.3:使用Jsp实现查看购物车书籍列表
因为用户所购买商品的信息都保存在session中的HashMap中,故只需得到这个HashMap对象就可以了。
代码:(见与本章同标题的网页)
Set是没有重复元素的集合。Set接口继承自Collection接口,被HashSet类和TreeSet类实现。
Set接口的常用方法有:
Object[] toArray();int size();boolean add();boolean isEmpty();
HashSet:为快速查找而设计的Set,存入HashSet的对象必须定义HashCode()方法。
TreeSet:保持次序的Set,可以从Set中提取有序序列。
4.2:购物车显示功能
Map和HashMap没有整数索引,只能通过key来查找value。思路:得到Map中Key值的Set集合,再将Set转换为数组,取出Key值,寻找与
Key相对应value值。
4.3:购物车常见错误
4.3.1:404错误
注意JSP文件与Servlet的<url-pattern>之间的路径关系。
4.3.2:购买后购物车内无商品信息
使用session进行数据存取时,要注意保存和获取的名称要一致,区分大小写,否则系统会按照两个不同的对象进行处理。
4.3.3:格式化问题
java API提供的DecimalFormat类,解决十进制数字的格式化问题。例如:
price=book.getPrice();<%=new DecimalFormat("0.00").format(price)%>
4.4:常用集合类,接口
4.4.1:List接口
List接口与其实现类是容量可变的列表,可按索引访问集合中的元素,使有序集合。
ArrayList是以Array方式实现的List,允许快速随机存取,相对于LinkedList不适合进行行插入和移除元素的操作。
LinkedList提供最佳顺序存取,适合插入和移除元素。
4.4.2:Set接口
Set使一种不包含重复元素的Collection(在Set中最多只能有一个Null元素)。
HashSet能够快速定位一个元素,但要求 存入的HashSet对象必须实现HashCode()方法。
TreeSet将放入其中的元素按序存放。
4.4.3:Map接口
Map接口不继承于Collection接口。
Map是一种把键对象和值对象进行关联的容器,像Set一样,一个Map容器中的键对象不允许重复,以保证查找结果的一致性。
HashMap类是Map接口的实现类,实现一个键到值映射的哈希表,通过健取得值对象。
Properties类一般是把属性文件读入流中后以键—值对的形式进行保存,以方便程序员读取其中的数据。
小结:
集合类的选用:如果要经常遍历集合内元素,就要使用List;如果要保证集合中不存在重复的数据,就要使用Set;如果要通过某一个值来查找另一个值,考虑用Map。
五:基于Servlet的MVC设计模式
Current : 当前的,目前的
Validate : 验证,确认
Invalidate : 使无效
Zip Code : 邮政编码
Credit Card : 信用卡
View : 视图
Controller : 控制器
5.1:为什么需要MVC模式
5.1.1:JSP的缺点
1,代码的重用性差;2,页面的维护难度大(解决:将数据访问的代码单独放在一个Java类中用来完成所有有关数据访问和业务的逻辑;而在Jsp页面中只显示数据,有关程序控制的功能,由Servlet完成)
5.1.2:组件的功能区分
在程序设计中,把采用模型(Model),视图(View),控制器(Controller)的设计方案称为MVC设计模式。
5.2:MVC定义
5.2.1:什么是设计模式
设计模式是一套反复使用,成功的代码设计经验的总结。模式必须是典型问题的解决方案。(为某一类问题提供了解决方案,优化代码,使之易理解,提高重用性,保证可靠性)
5.2.2:MVC设计模式
模型(Model):对应组件为java类,分为业务模型和数据模型,代表应用程序的业务逻辑和状态。
视图(View):对应组件为Jsp或Html文件,提供交互性界面,向客户显示模型数据。
控制器(Controller):对应组件为Servlet,响应客户请求,根据客户的请求操作模型,并把模型的响应结果由视图展示给客户。
优点:3个层会不干涉,利于开发中的分工,组件的重用。——把显示与数据分离,增加各个模块的重用性。
5.3:MVC编程模式
5.3.1:MVC编程思路
5.3.2:实习基于MVC模式的应用程序
5.4:E-Book电子书店的结账功能
5.4.1:视图的创建
5.4.2:控制器的创建
5.4.3:模型的创建
小结:
MVC模式,将数据的展示,处理,存取分为了View,Controller,Model,通过Controller来连接了View和Model,使代码更优化,开发和维护更容易。
六:Model层开发:高级JDBC
Cannot :不,不能
DataSource : 数据源
Naming : 命名
Directory : 目录
Active : 积极的,活动的
Properties : 属性,道具
6.1:MVC设计模式中的Model
Model是通过访问数据库并对数据进行封装后或是通过业务逻辑处理后的数据模型。
6.2:数据库连接池
在JDBC2.0中提供了javax.sql.DataSource(数据源)接口,负责建立与数据库的连接,在应用程序中访问数据库时不必编写连接数据库的代码,可以直接从数据源获得数据库连接。
6.2.1:什么是数据库连接池
数据库连接池负责分配,管理和释放数据库连接,允许应用程序重复使用一个现有的数据库连接(而非重新建立);释放空闲时间超过最大空闲时间的数据库连接(以避免因为没有释放数据库连接而引起的数据库连接遗漏)。[最小/最大 数据库连接数,等待列队]
6.2.2:数据源与连接池(DataSource,ConnectionPool)
Java程序访问数据库时,只需从连接池中取出空闲状态的数据库连接,访问结束,再将连接放回连接池。
6.2.3:数据源与JNDI资源
DataSource对象由Web容器(Tomcat)提供,不能在程序中通过创建实例的方式来生成DataSource对象,而需要通过JNDI(Java Naming and Directory Interface)来获得其对象。
JNDI——一种将对象和名字绑定的技术,容器生产出的对象都和唯一的名字绑定,外部程序通过名字获得对象。
-----------------------------------------------------------------------------------------------------------------------------
javax.naming.Context提供了查找JNDI Resource的接口,注意:Context接口的lookup(String name),返回与指定名称绑定的对象。
示例:
1,获得名称为jdbc/books的数据源的引用:Context ctx=new InitialContext(); DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/books");(得到DataSource对象)
2,通过其getConnection()方法获得数据库连接对象Connection。Connection conn=ds.getConnection();
3,程序结束数据库访问后,将连接返回给数据库连接池,使Connection恢复空闲状态。 调用Connection的Close()方法,conn.close();
解释:
Tomcat把DataSource作为一种可配置的JNDI资源来处理。生成DataSource对象的工厂为org.apache.commons.dbcp.BasicDataSourceFactory。可以配置多个DataSource,通过context.lookup("datasourceName")访问相应名称下的数据源而或得其连接。
-----------------------------------------------------------------------------------------------------------------------------
6.2.4:JNDI的配置
数据源名称的设定:
1,context.xml文件的配置
在Tomcat根目录\conf\context.xml文件中<Context>节点中添加<Resource>信息:
<Context>
..........//原有配置
<Resource name="jdbc/books" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="1000" userName="sa" password="120010" driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver" url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=books"/>
</Context>
-----------------------------------------------------------------------------------------------------------------------------
<Resource>的属性
name :指定Resource的JNDI名字
auth :指定管理Resource的Manager,有两个可选值:Container(有容器来创建Resource)和Application(有Web应用来创建和管理Resource)。
type :指定Resource所属的Java类名。
maxAative :指定数据库连接池中处于活动状态的数据库连接的最大数目,取值为0表示不受限制。
maxIdle :指定数据库连接池中处于空闲状态的数据库连接的最大数目,取值为0表示不受限制。
maxWait :指定数据库连接池中的数据库连接处于空闲状态的最长时间(以毫秒为单位),超过这一时间将会抛出异常。取值为-1,表示可以无限制等待。
username :指定连接数据库的用户名。
password :指定连接数据库的口令。
driverClassName :指定连接数据库的JDBC驱动程序。
url :指定连接数据库的URL。
-----------------------------------------------------------------------------------------------------------------------------
2,web.xml文件的配置
在应用程序的WEB-INF\web.xml文件中<web-app>节点下添加<resource-ref>信息
<web-app>
<resource-ref>
<description>E-Books DataSource</description>
<res-ref-name>jdbc/books</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<resource-ref>
.........//其他配置信息
</web-app>
-----------------------------------------------------------------------------------------------------------------------------
<resource-ref>的属性:
description :对所引用资源的说明。
res-ref-name :指定所引用资源的JNDI名字,与<Resource>元素中的name属性相对应。
res-type :指定所引用资源的类名字,与<Resource>元素中的type属性相对应。
res-auth : 指定管理所引用资源的Manager,与<Resource>元素中的auth属性相对应。
-----------------------------------------------------------------------------------------------------------------------------
3,添加数据库驱动文件
必须把JDBC驱动程序复制到Tomcat的common\lib目录下(访问数据库所要通过的数据源由Tomcat创建并维护)。
4,JNDI常见错误
1,不能加载驱动类Cannot load JDBC driver class;--解决:把JDBC驱动程序的JAR文件复制到Tomcat的common\lib目录下。
2,由于连接路径为Null,不能创建驱动"Cannot create JDBC driver of class '' for connect URL 'null' ";--解决:保证context.xml文件中指定的数据源名称与代码中所要访问的数据源名称一样。
3,jdbc名称没有绑定到当前上下文Name jdbc is not bound in this Context;--解决:在使用lookup()方法查找数据源时,参数时“前缀+数据源名称”,必须把前缀加上。
6.3:基于属性文件的数据库配置
6.3.1:数据库配置信息
数据库访问编写在程序代码中,使得数据库发生变化则需要重新编码再发布,不方便,不灵活。
6.3.2:属性文件
java中提供了Properties类来读取.properties(属性)文件。再项目默认路径(src)下创建文件db.properties,但只能保存String类型信息。
内容:
driver=com.microsoft.jdbc.sqlserver.SQLServerDriver
url=jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=books
user=sa
password=120010
解释:在程序调用Properties类的Load()方法时,系统把db.properties文件的内容加载到内存中。Properties类继承了HashTable,它把“=”前的内容添加到HashTable对象的key值,“=”后的值为key对应的value.(使用Properties时一定要使用=将名称和值分开)
6.3.3:读取属性文件
读取配置信息时,使用类的单例模式创建,获得对象实例,并调用Properties类提供的方法getProperty("key")获得HashTable的value值,进行创建数据库连接类的操作。
6.3.4:Class与Object小结
1,Class类(2种常用方法)
Class.forName(String classname):该方法生成一个以String类型参数指定的classname的Class对象,如:Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
InputStream getResourceAsStream(String name):该方法是打开并读取一个Stirng类型参数指定的文件到系统内存中,以方便获取文件信息。
如:InputStream in=JProperties.class.getResourceAsStream(name); Properties p=new Properties(); p.load(in);
2,Object类
Object类是所有类的根类,自定义类都默认继承于这个类,所有的类(包括数组)都具有这个类的方法。
getClass();返回一个对象的运行时类。
toString();返回该对象的字符串表示,在Object类中是返回对象的地址信息。
equals(Object obj);判断obj与当前对象是否相等。
6.4:自定义异常
6.4.1:定义异常类
用户自定义异常类要继承Exception类。
6.4.2:使用自定义异常类
6.5:通用的DAO类
通用DAO类,进行数据库的访问。
6.5.1:通用DAO类的实现
1,executeQuery()方法,执行查询数据库操作,返回javax.servlet.jsp.jstl.sql.Result对象。
2,executeUpdate()方法,执行修改或删除数据库信息的操作。
3,setValues()方法,以给定的对象设定指定位置的参数值。
属性:Connection conn:连接对象;String sqlValue:SQL语句;List values:SQL语句中的参数列表;提供getter,setter方法。9
6.5.2:通用DAO类的使用
6.5.3:带参数的SQL语句测试类
小结:
在进行企业级应用开发时,对数据库性能,处理错误等方面的要求有所提高,才出现了连接池和JNDI技术,以实现对数据库的优化。
关于如何连接数据库,已学会了三种方式:
1,编码方式:把数据库配置信息直接写入Java代码中。
2,.properties文件:把数据库配置信息写在属性文件中,用程序读取。
3,数据源:使用JNDI来获取DataSource对象,从而得到Connection对象。
读取.properties文件的步骤不下:
1,创建继承自Properties的类,并以单例模式获得实例:私有静态成员,私有默认构造方法,公有的静态同步方法。
2,使用Class对象的getResourceAsStream()方法,把指定的属性文件读入输入流中,并使用Properties类的load()方法,从输入流中读取属性列表(键值对)。
3,在实现数据库连接方法时,使用Properties类的getProperty()方法,通过键读取value值,从而实现数据库连接的操作。
在使用JNDI时,步骤为:1,配置context.xml文件;2,配置web.xml文件;3,进行编码,使用lookup()方法获得数据源对象。
在编写程序的过程中,由于错误信息不够具体或准确,从而不能很快找到错误或异常,并解决错误,所以需要自定义异常。
七:View层开发:JavaBean在JSP中的使用
本章单词:
Bean :豆子
Order :顺序,次序
Property :属性,特性
Scope :范围
7.1:为什么需要JavaBean
7.1.1:面向对象思想
在业务方法于操作数据库表时,只要传递给该方法一个与表对应的实例对象就可以了。
7.1.2:什么是JavaBean
JavaBean是Java开发中开发的可以跨平台的重用组件,是一种组件体系结构。(可以重用的java类。)作用:封装数据,封装业务。
要求:是共有类,提供无参共有的构造方法,属性私有,具有公有的访问属性的getter和setter方法。
7.1.3:封装数据的JavaBean
一个封装数据的JavaBean一般情况下对应着数据库内一张表(或视图)属性与表(或视图)内字段的属性一一对应。
7.1.4:封装业务的JavaBean
相对于封装数据的JavaBean都会有一个封装业务的JavaBean——***Operation.java。
7.2:JSP与JavaBean
Jsp标准动作来实现在Jsp页面中调用JavaBean,在浏览器请求Jsp页面时调用,可使用现有的JavaBean组件和属性以及请求转发。
语法:<jsp:action_Name attribute1="value1" attribute2="value2"/>
7.2.1:<jsp:useBean>
用来装载一个将在JSP页面中使用的JavaBean
<jsp:useBean id="name" class="package.class" scope="scope"/>
<jsp:useBean id:创建JavaBean的引用名 class指定JavaBean的类 scope指定javaBean的范围>(page,request,session,application)
7.2.2:<jsp:setProperty>
用于设置useBean中指定的JavaBean的属性值
<jsp:setProperty name="BeanName" property="PropertyName" value="Value" param="Parameter"/>
<jsp:setProperty name="JavaBean的id" property="要设置值的JavaBean的属性名称" value="要为属性设置的值" param="指定用于输入数据的表单元素名称并给属性赋值"/>
注意:param属性和value属性不能一起使用。
7.2.3:<jsp:getProperty>
在useBean中id所指定的对象通过setProperty中对property指定的属性进行赋值后,可以使用getProperty动作获取JavaBean中指定的属性值。
7.2.4:JSP标准动作的使用
<jsp:useBean id="order" class="y2javaee.sg.ch07.Order" scope="request"/>
<jsp:setProperty name="order" property="username" param="username"/>
<jsp:setProperty name="order" property="total" value="23.45"/>
<jsp:getProperty name="order" property="username"/>
<jsp:getProperty name="order" property="total"/>
添加:
forward标准动作,功能是实现页面的跳转,是指为RequestDispatcher(url).forward(request,response);
<jsp:forword page="url"/>Page属性指定欲跳转到的页面路径和文件名称
7.2.5:常见错误
1,setProperty标准动作的param属性(拿到的值显示为null)----使用param属性时注意与Form表单元素的对应关系。
2,setProperty和getProperty标准动作的name属性——Status 500——name属性值与useBean中所指定的Id找不见对应关系。
7.3:JSP标准动作调用JavaBean
在执行JSP标准动作useBean时,调用JavaBean的无参构造方法,执行setProperty动作时,调用JavaBean的setter方法,执行getProperty时,调用getter方法。
7.4:使用jsp标准动作实现用户登陆验证
注意: javaScript中的with(){}——with语句通常用来缩短特定情形下必须写的代码。
7.5:Model1介绍
只使用Jsp和JavaBean来实现功能而没有使用Servlet来进行程序流程的控制的编程模式为Model1模式,相对的,MVC模式成为Model2模式。
(Model1模式用于在开发中小型项目上,而Model2用于大型项目的程序设计)
小结:
使用JSP标准动作有以下好处:
可以方便程序开发(代码重用),方便美工人员美化页面(在JSP中减少了大量的Java代码),简化数据的获取和封装过程。
常用的Jsp标准动作有以下4种:useBean,setProperty,getProperty,forward。
Model1和Model2的区别:
实现:JSP+JavaBean——JSP+JavaBean+Servlet;使用Model1设计的项目缺少控制层,不易进行扩展,只适合中小型项目。
<jsp:forward>标准动作实质是使用转发器RequestDispatcher对象的forward()方法实现转发的功能。
八:View层开发:EL和JSTL
本章单词:
Expression :表达式,符号
Standard :标准
Tag :标签
Library :库
Prefix :前缀
8.1:EL表达式
8.1.1:为什么需要EL表达式
在JSP标准动作操作JavaBean时,如果JavaBean的属性是String类型或基本数据类型,则能够实现类型的自动转换。但无法将Object类型的属性读取出来(嵌套式访问机制)
8.1.2:EL语法
不使用java来访问Java对象或者变量的一种方法。语法:${EL表达式};
1,点操作符:${JavaBean对象/EL隐式对象.JavaBean属性/映射键}
2,[]操作符(操作数组及其他):${对象/数组["属性/索引"]},注意,只有在操作数组时操作符中的双引号才可以省略。
8.1.3:EL表达式的使用
EL可以操作对象,数组,映射,进行表达式的计算,逻辑运算,(调用JavaBean的getter方法),但不能进行逻辑控制(无法实现无脚本页面)。
8.2:JSTL标准标签库
8.2.1:什么是JSTL
JSTL(Java Server Pages Standerd Tag Library, JSP标准标签库)包含用于编写和开发Jsp页面的一组标准标签,可为用户提供无脚本环境。
8.2.2:如何使用JSTL
JSTL Support: Add JSTL libraries to WEB-INF/lib folder?WEB-INF\lib目录下:两个Jar文件:jstl.jar 和 standard.jar,WEB-INF目录下生成很多.tId文件。使用taglib指令导入标签库描述文件,就可以在项目中使用JSTL了。
解释:taglib是JSP指令的一种,作用在JSP页面中,将标签库描述符文件(.tId)引入该页面,并设置前缀,利用标签的前缀去使用标签库描述符文件中的标签。taglib指令的语法如下:
<%@ taglib uri="标签库描述符文件" prefix="前缀名"%>
8.3:JSTL核心标签库(JSP页面中的常用动作)
8.3.1:通用标签
用于操作Jsp页面中创建的变量。用于 设置,删除变量,显示变量值——<c:set><c:remove><c:out>
<c:set>设置指定范围内的变量值,不存在就创建。(对于javaBean中没有的属性,只要有相应的getter方法就可以打点调用的)
<c:remove var="name" scope="page|request|session|application||">删除变量。
<c:out value="value">计算表达式并将结果显示在页面上。
8.3.2:条件标签
用于对Jsp页面中的代码进行条件判断和处理
<c:if ttest="condition" var="name" scope="page">//条件为true时执行的代码</c:if>
test指定条件,通常使用EL方式进行条件运算:${条件运算},可以使用的运算符:<,>,==,and,or,lt,gt,eq;var指定变量,并 把EL运算结果赋值给该变量;scope指定变量的范围。
8.3.3:迭代标签
多次计算标签的标签体,类似于循环遍历一个对象集合。
<c:forEach items="collection" var="name">//循环体内容</c:forEach>
<c:forEach items="指定要遍历的对象集合(数组,List,Map)" var="指定变量的名称">
8.3.4:常见错误
1,"Failed to load or instantiate TagLibraryValidator class"(加载或实例化TagLibraryValidator类时失败)——解决:在创建项目中添加JSTL的标签库文件(在项目已经创建好了再往里边添加该怎么添加?)。
2,status 500,JSTL标签的属性不支持表达式的错误。——解决:正确的路径:<%@ taglib uri="http://java.sun,.com/jst1/core" prefix="c"%>
8.4:EL隐式对象
EL隐式对象是一组标准的类,JSP容器向用户提供类中的方法和变量,
1,作用域访问对象(在JSP标准动作和JSTL中的通用标签,都要指定相应的范围(默认为page))。范围的四种选项:page,request,session,application,相应的对象为pageScope,requestScope,sessionScope,applicationScope。(返回**范围内的变量名,这些名称已映射至相应的值)
注:如果在获取变量值时,不使用作用域访问对象,系统会按照page->request->session->application的顺序来查找。
2,参数访问对象
EL提供参数访问对象来获取其他页面或Servlet传递过来的参数值。(${param.name})
param,返回客户端的请求参数的字符串值;paramValues,返回映射至客户端请求参数的一组值。
3,JSP隐式对象(jsp和EL共有的:pageContext)
pageContext,提供对用户请求和页面信息的访问。
EL通过pageContext来访问JSP中的其他隐式对象(request,response)。
8.5:SQL标签
SQL标签用于访问各种关系型数据库,基于Web的小型应用程序而设计的。(查询,修改功能)
8.5.1:使用SQL标签修改数据库中的信息
<sql:setDataSource url="jdbcurl" | DataSource="dataSource" driver="driverclass" user="username" password="userpassword" var="name" scope="page"/>
<sql:setDataSource url="与数据库关联的URL" | DataSource="指定JNDI资源的数据源名称" driver="指定驱动类" user="指定数据库的用户名" password="指定用户的密码" var="指定变量名称" scope="指定变量范围"/>
<sql:update var="name" dataSource="dataSource" scope="page">SQL语句</sql:update>
<sql:update var="指定变量的名称" dataSource="数据源名称,与<sql:setDataSource>标签中var的变量名称一致" scope="指定变量范围">SQL语句可以是增,改,删</sql:update>
<sql:param value="value"/> value指定为SQL语句中的参数中"?"处的值。
8.5.2:使用SQL标签查询数据库中的信息
<sql:query var="name" dataSource="dataSource" scope="page">SQL语句</sql:query>
<sql:query var="指定变量名" dataSource="指定使用的数据源,与与<sql:setDataSource>标签中var的变量名称一致" scope="指定变量范围">SQL语句</sql:query>
经验:
在JSP页面中可以使用SQL标签直接访问操作数据库,但不符合MVC设计模式,所以只能在中小型项目中使用。
小结:
EL表达式的语法:以"$"开头,并加以"{"开始,最终以"}"结束。
在JSP页面中使用EL和JSTL,主要目的就是实现JSP中无脚本编程,从而提高项目的可维护性(包括美工的网页维护)和扩展性。
JSTL中常用的标签有以下两类:
1,核心标签:
通用标签:set,out,remove;
条件标签:if;
迭代标签:forEach;
2,SQL标签:
setDataSource;
update;
param;
query;
使用SQL标签可以进行数据库的如下操作:
在JSP页面中使用taglib指令,导入描述符文件。
使用setDataSource标签创建数据源。
如果SQl语句中有参数,使用param标签进行参数的设置。
如果是执行查询,则使用query标签后,使用forEach标签对返回的结果集进行遍历。
注意:在使用SQL标签进行数据库的增加,删除,修改,查找时,必须定义DataSource,并且在update和query标签中指定已创建的DataSource,这样才能操作数据库。
九:Web服务
simple:简单的 Access:访问 Protocol:协议 service:服务 Proxy:代理 Factory:工厂
Client:客户,用户
9.1:软件的发展趋势
9.2:什么是Web服务
9.3:Web服务的创建和发布
9.3.1:环境配置
9.3.2:创建服务接口与实现类
9.3.3:services.xml
9.3.4:web.xml
9.3.5:xalan.jar和WSDL
9.4::创建客户端程序调用Web服务
9.4.1:客户端程序
9.4.2:完整的E-Book系统
9.5:Web服务运行原理
9.5.1:单元测试
9.5.2:Web服务的监控
小结:
Web服务把软件的重用提高到Internet层面上,因为底层是HTTP协议,以XML传递数据,所以是语言无关,平台无关的,大大提高了软件的重用性,更加有利于系统的集成。
使用XFire创建和发布Web服务的步骤如下:
添加XFire库,添加XFire-all-1.2.6.jar包,创建服务接口是实现类,配置 services.xml文件,配置web.xml文件,添加xalan.jar包,创建客户端程序访问Web服务。
测试类的规范,测试类要继承自TestCase类,测试类的类明为待测类名+Test,测试方法名为test+待测方法名。
注:本文档为学习的简单归纳,基本没有加入个人见解,可以当做纯粹的查阅资料帮助平常编程。
--------2010--08--25