J2EE Web核心技术《Web组件与框架开发技术》——第4 章 Web系统架构设计及MVC模式(第3部分)

上传人:ca****in 文档编号:73695716 上传时间:2022-04-12 格式:DOC 页数:17 大小:309KB
收藏 版权申诉 举报 下载
J2EE Web核心技术《Web组件与框架开发技术》——第4 章 Web系统架构设计及MVC模式(第3部分)_第1页
第1页 / 共17页
J2EE Web核心技术《Web组件与框架开发技术》——第4 章 Web系统架构设计及MVC模式(第3部分)_第2页
第2页 / 共17页
J2EE Web核心技术《Web组件与框架开发技术》——第4 章 Web系统架构设计及MVC模式(第3部分)_第3页
第3页 / 共17页
资源描述:

《J2EE Web核心技术《Web组件与框架开发技术》——第4 章 Web系统架构设计及MVC模式(第3部分)》由会员分享,可在线阅读,更多相关《J2EE Web核心技术《Web组件与框架开发技术》——第4 章 Web系统架构设计及MVC模式(第3部分)(17页珍藏版)》请在装配图网上搜索。

1、杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料第4 章 Web系统架构设计及MVC模式(第3/4部分)1.1 利用JSTL标签封装业务处理逻辑代码1.1.1 应用JSTL标准标签库封装业务功能代码1、JSTL的主要功能简介在Java Community Process(JSR 52)的赞助下提出了JSTL(JSP StandardTagLibrary,JSP标准标签库),为J2EE Web表现层开发中的通用功能实现提供标准的解决方案。JSTL通过使用标签(Tags)封装业务功能代码内嵌到JSP页面中,从而减少页面中的Java脚本代码量,但JSTL只能运行在支持JSP1.2和Servl

2、et2.3规范的Servlet容器中。在JSTL中包括有如下4类标签库,每一类都涵盖了一个特定的功能领域,表4.1为JSTL标签库中的4类不同的标签库的前置名称和URI的对照表。表4.1 JSTL中的4类标签库的前置名称和URIJSTL标签前置名称URI示例核心标签库c国际化标签库fmt数据库标签库sqlXML标签库xml1) 核心(Core)标签库:提供通用的功能,如显示和设置变量、重复使用一组项目、测试条件以及导入和重定向Web页面内容等方面的功能。 2) XML标签库:提供了对XML文档处理和操作方面的支持,如对XML节点的解析。3) 国际化(Internationalization)标

3、签库:格式化数字和日期,并支持使用本地化资源实现JSP页面的国际化。4) 数据库(Database)标签库:提供对数据库表数据的访问和修改方面的支持。2、应用JSTL标签可以减少页面中的脚本量下面通过两个具体的示例说明应用JSTL标签可以减少页面中的脚本量,其一是基于Java脚本实现,而另一种则是采用JSTL标签实现相同的功能。如下为采用Java脚本实现打印输出10个数字的页面代码示例:采用Java脚本打印输出10个数字% for(int index=1; index在页面中内嵌Java脚本代码将导致HTML标签和脚本语句相互混合,降低了JSP页面的可读性。如下为采用JSTL标签实现相同功能的

4、页面代码示例,简洁明了:采用JSTL标签打印输出10个数字 3、JSP页面中的taglib指令taglib指令为JSP页面引入外部标签库,以提高页面的可维护性。taglib指令的语法格式如下: 其中uri属性指定标签库描述文件的的地址,prefix属性定义在JSP页面中引用外部标签的前缀符,但这些前缀符不能为jsp、jspx、java、javax、sun、servlet和sunw等。4、在项目中添加JSTL的系统库在项目中如果要使用JSTL标签,则必须将与JSTL有关的系统库jstl.jar和 standard.jar文件放到项目的classPath路径中。对于Web应用系统,则应该要放在项目

5、中的WEB-INF/lib目录中。这可以在Sun公司提供的与Java技术有关的官方网站 图4.17 MyEclipse工具提供有对JSTL的技术支持在项目中应用JSTL能够提高Web应用系统在各种应用服务器之间的可移植性,因为JSTL在应用程序服务器之间提供了一致的接口,并且减少了JSP中的脚本代码的数量。1.1.2 JSTL核心标签库中的基本输入输出标签及应用1、标签标签主要用于在JSP页面中显示输出数据,它有如下的属性:1) value:表示待输出的信息(可以是EL表达式或常量),为必备的属性项目。2) default:value属性为空时的显示信息。3) escapeXml:为true则

6、避开特殊的XML字符集。如下为应用示例:而示例:表示从session对象中获取oneUserInfoVO 对象中的userName成员属性的值并显示输出。默认取值的顺序是首先从page作用域中获得,依次为request、session和application,如果没有取到任何的值则不显示输出。2、标签标签主要用于保存数据,它有如下属性:1) value:表示要保存的信息(可以是EL表达式或常量)。2) target:代表需要修改属性的变量名(一般为JavaBean组件的对象实例)。3) property:需要修改的JavaBean组件对象实例中的属性。4) var:需要保存信息的变量。5) s

7、cope:保存信息的变量的范围。如果在标签中指定了target属性,那么property属性也必须指定。如下示例:实现将oneUserInfoVO.userName的值保存到session的userName中,其中oneUserInfoVO是一个JavaBean组件对象的实例,而userName是oneUserInfoVO对象实例中的成员属性。而示例:实现将对象oneUserInfoVO.userName的userName属性值保存到变量userName中。3、标签标签用于删除数据,它有如下属性:1) var:表示要删除的变量。2) scope:被删除变量的范围(包括page、request、

8、session、application等)。如下示例: 表示从session对象中删除userName变量的值。4、标签主要用来捕获其中的Java脚本代码所可能产生的异常错误信息,并且将错误信息储存起来。【例4-5】中的示例为基本输入输出标签综合应用的示例:【例4-5】基本输入输出标签综合应用示例% request.setAttribute(param1,张三); request.setAttribute(testHTML,格式化标签); %$cParam $param1 / 功能语句在此省略$(error_Message)1.1.3 JSTL核心标签库中的流程控制标签及应用1、标签标签表示单

9、一条件关系,有如下属性:1) test:需要判断的条件。2) var:要求保存条件结果的变量名。3) scope:指定变量或者对象的范围。其中的var属性用来测定结果的变量名,并用来保存条件判断表达式的结果。应用该标签的主要目的,是避免在页面中多次进行相同的条件判断。如下为应用示例:登录失败而在如下的示例中,应用复合条件。其一是识别listSiz对象是否大于pageSize,另一个则是识别pageEnd是否小于listSize:但如果需要应用多种形式的条件表达式则需要使用标签。2、标签由于在JSTL标签中没有如下的条件语句:if () else ,而对于这种形式的应用要求只能使用、和标签共同来

10、完成。这个标签不接受任何的属性,其中的代表条件。并且标签有test属性,而其中的标签不接受任何属性。如下为应用示例: userInfoVO对象为空 userInfoVO对象不为空而如下的标签示例是识别某个实体对象中的userType属性的值是否为指定值,然后再显示输出不同的信息内容:其它类型的注册用户为目前未定义的用户类型【例4-6】为客户关系信息系统中的导航菜单条中的动态菜单的实现,其中应用了JSTL标签库中的条件控制标签根据实体对象中的type_User_Admin属性值(代表用户的类型)的不同显示出不同内容的导航菜单条。【例4-6】JSTL条件控制标签综合应用示例返回首页在线注销蓝梦新闻

11、业务范围产品介绍客户服务在线投诉蓝梦商场蓝梦银行蓝梦游戏 系统管理 关于我们在线帮助【例4-6】中的示例的执行结果如图4.18、图4.19和图4.20所示,其中图4.18为用户没有登录系统时的菜单条中的项目,而图4.19 为普通用户登录系统后的菜单条中的项目,图4.20则是管理员用户登录系统后的菜单条中的项目,其中增加有“系统管理”菜单项。为了节省本书的篇幅,在【例4-6】示例中没有附录出CSS样式表单文件的内容。图4.18 用户没有登录系统时的菜单条中的项目图4.19 普通用户登录系统后的菜单条中的项目图4.20 管理员用户登录系统后的菜单条中的项目(增加有“系统管理”菜单项)3、循环控制标

12、签在Web开发中,迭代是经常要使用到的操作,例如在页面中逐行显示出查询的结果等。通过JSTL中的迭代标签可以简化迭代操作,在JSTL中提供有两种形式的迭代标签,分别为和。其中标签用于通用数据,其作用就是迭代输出标签内部的内容。它既可以进行固定次数的迭代输出,也可以依据集合中对象的个数决定迭代的次数。它有以下属性:1) items:要进行迭代的集合。2) begin:开始条件。3) end:结束条件。4) step:步长。5) var:代表当前项目的变量名(在迭代体中可以使用的变量的名称,用来表示每一个迭代变量,类型为String)。6) varStatus:显示循环状态的变量(迭代变量的名称,

13、用来表示迭代的状态,可以访问到迭代自身的信息)。由varStatus属性命名的变量并不存储当前索引值或当前元素,而是赋予javax.servlet.jsp.jstl.core.LoopTagStatus类的实例。该类包含了一系列的特性,它们描述了迭代的当前状态,如下为这些属性的含义: 1) current:当前这次迭代的(集合中的)项。 2) index:当前这次迭代从0开始的迭代索引。 3) count:当前这次迭代从1开始的迭代计数。 4) first:用来表明当前这轮迭代是否为第一次迭代,该属性为boolean类型。 5) last:用来表明当前这轮迭代是否为最后一次迭代,该属性为boo

14、lean类型。 6) begin:begin属性的值。 7) end:end属性的值。8) step:step属性的值。【例4-7】为一个利用循环控制标签迭代获得查询结果对象集中的各个成员属性的代码示例,并将各个成员属性在HTML表格中显示输出,该示例执行后的结果如图4.21所示。图4.21 【例4-7】所示的页面代码执行后的结果【例4-7】利用循环控制标签迭代获得对象集中的各个成员属性代码示例 您的各个帐户信息如下 帐号 姓名; 开户时间 存期(月) 身份证ID 帐户余额(元) 状态 系统注册ID   1.2 利用JavaBean组件分离表现逻辑和业务处理代码1.2.1 MVC模型

15、层中的JavaBean组件技术1、JavaBean组件是什么?JavaBean组件是一个特殊的Java类,这个类必须要符合Sun 公司的JavaBean组件的技术规范。当时Sun公司提出JavaBean组件的技术规范的主要目的是为了能够在一个可视化的集成开发环境(IDE)中实现可视化、模块化地利用Java组件技术开发应用程序而设计的,类似于Windows系统平台中早期的ActiveX组件技术。 2、JavaBean组件的分类1)可视化软件组件(也称为Java控件)在运行过程中能够看到其图形界面的各种组件,它可以是简单的GUI元素,如按钮或滚动条;也可以是复杂的可视化软件组件,如实现数据库视图功

16、能的组件。在J2SE中的Swing GUI组件其实就是Java控件。2)非可视化软件组件(也称为业务功能组件)在系统运行过程中不能够看到其图形界面的各种组件,如Java Swing中的Timer(定时器)组件或者J2EE Web应用系统中的业务功能组件都属于这类非可视化软件组件。3、J2EE Web应用中所使用的JavaBean组件在J2EE Web应用系统中的JavaBean组件一般为不可视化的软件组件,主要封装系统中的业务逻辑处理及业务数据代码,即业务功能组件和业务实体组件而非控件类型的组件。图4.22(a)为客户关系信息系统项目中的持久层中的功能类、接口和实体的包结构图,而图4.22(b

17、)为项目中的业务服务层中的功能类、接口和实体的包结构图。 图4.22(a) 持久层中的功能类、接口和实体 图4.22(b) 业务服务层中的功能类、接口和实体4、 J2EE Web应用中所使用的JavaBean组件程序结构J2EE Web应用系统中所使用的JavaBean组件其实就是一般的Java程序类,但需要在该类中提供一个不带参数的缺省构造函数,如【例2-7】所示的包装用户基本信息的业务实体类UserInfoBaseVO代码示例;如果该组件类为实体类,需要为其中的各个成员变量提供setXXX()和getXXX()属性访问方法。其中的XXX代表大写字母开头的变量名,而setXXX()方法修改属

18、性值、getXXX()方法获得属性值。如果有一个属性访问方法为isX(),则通常暗指其中的“X”是一个布尔类型的成员属性(即X的值为true或false)。 5、在JSP页面中如何使用JavaBean组件 在JSP规范中与JavaBean组件有关的各个动作标签为标签定义JavaBean组件的对象实例,标签设置该JavaBean组件对象中的成员属性值,而标签获得该JavaBean组件对象中的某一个成员属性的值。这些标签的具体应用示例,可以参考【例1-8】、【例1-10】和【例1-11】等示例代码。6、应用接口分离MVC模型层中的各个组件之间的关系从MVC的角度来看,应用系统中的业务功能类、业务实

19、体类和数据访问功能类、持久实体类等都属于模型层组件。如何设计并决定出模型层中的各个组件之间的关系、分配各个组件各自的职责?如何保证整个应用系统最终能够达到“高内聚、低藕合”的设计效果?为此,需要将模型层中的各个功能类的接口定义和对这些接口的具体实现相互分离,并以接口作为类之间的“连接器”。该设计方案也称为“面向接口设计和实现”,其基本的设计思想是在两个类之间定义出一个抽象的接口,上层类(服务的使用者,也称为服务请求者)调用这个抽象接口中定义的方法,而下层类(服务的实现者,也称为服务提供者)具体地实现该接口中定义的各个方法。如【例4-8】、【例4-9】所示的代码示例。因为接口能够体现出对问题的抽

20、象,同时由于抽象一般是相对稳定的或者是相对变化不频繁的,而具体则是易变的。图4.23为客户关系信息系统持久层中实现用户信息数据库表功能操作的DAO组件接口UserManageDAOInterface和该DAO接口的功能实现类UserManageDAOJDBCImple之间关系的UML类图,而业务服务层中的UserInfoManageImple类应用UserManageDAOInterface接口。图4.23面向接口设计和实现设计思想在项目中的具体应用1.2.2 JavaBean组件技术在项目中的应用在【例4-3】所示的实现用户登录业务功能处理的UserInfoManageImple类中并没有通

21、过查询数据库表验证用户登录数据的合法性,下文通过代码示例介绍JavaBean组件技术在项目中的应用,同时也对【例4-3】示例进一步完善,最终达到访问数据库表中的数据。1、访问用户信息数据库表中数据的DAO接口【例4-8】所示为对用户信息数据库表中数据操作的数据访问服务接口的代码示例,为了节省本书的篇幅,在该接口中只定义一个数据查询方法,见黑体所标识的方法定义。【例4-8】对用户信息数据库表中数据操作的数据访问服务接口代码示例package com.px1987.webcrm.dao.inter;import java.util.ArrayList;import java.util.List;i

22、mport com.px1987.webcrm.model.vo.UserInfoPO;import com.px1987.webcrm.exception.WebCRMException;public interface UserManageDAOInterface public UserInfoBaseVO selectOneUserInfoData(String userName, String userPassWord) throws WebCRMException;2、UserManageDAOInterface接口的实现类【例4-9】所示为数据访问服务接口UserManageDAO

23、Interface的实现类的代码示例,在其中声明数据库连接ConnectDBInterface接口的对象实例,见黑体所标识的语句;并利用JDBC API编程实现对目标数据库表中的数据进行查询,并返回查询的结果对象。【例4-9】数据访问服务接口的实现类的代码示例package com.px1987.webcrm.dao.imple;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import com.px1987.

24、webcrm.dao.inter.ConnectDBInterface;import com.px1987.webcrm.dao.inter.UserManageDAOInterface;import com.px1987.webcrm.model.vo.UserInfoBaseVO;import com.px1987.webcrm.exception.WebCRMException;public class UserManageDAOJDBCImple implements UserManageDAOInterface private ConnectDBInterface oneConnec

25、tDBBean=null;private Connection oneJDBCConnection=null;public UserManageDAOJDBCImple() throws WebCRMException oneConnectDBBean=new ConnectDBBean(); /创建数据库连接对象实例public UserInfoBaseVO selectOneUserInfoData(String userName,String userPassWord)throws WebCRMException PreparedStatement pstmt=null;ResultSe

26、t oneResultSet=null;UserInfoBaseVO oneUserInfoVO=null;oneJDBCConnection=oneConnectDBBean.connectTODataBase();String sqlSelectStatement=select * from userInfo where userName=? +and userPassWord=?;trytry stmt=oneJDBCConnection.prepareStatement(sqlSelectStatement); catch (SQLException e) throw new WebC

27、RMException(不能正常地构建SQL语句对象);try pstmt.setString(1,userName);pstmt.setString(2,userPassWord); catch (SQLException e1) throw new WebCRMException(不能正常地对带参数的SQL语句对象进行赋值);try oneResultSet=pstmt.executeQuery(); /执行数据库查询if(!oneResultSet.next()oneUserInfoVO =null;return oneUserInfoVO; catch (SQLException e)

28、 throw new WebCRMException(不能正常地对带参数的SQL语句实现查询功能);oneUserInfoVO =new UserInfoBaseVO();try oneUserInfoVO.setUserName(oneResultSet.getString(userName);oneUserInfoVO.setUserPassWord(oneResultSet.getString(userPassWord); catch (SQLException e) throw new WebCRMException(不能正常地从结果集中获得字段的值);finallyoneConnec

29、tDBBean.closeDataBaseConnection(); /关闭数据库连接return oneUserInfoVO; /返回查询出的结果对象3、数据库连接的接口【例4-10】所示为项目中的数据库连接接口的代码示例,其中声明有连接数据库和关闭数据库连接的两个方法。【例4-10】定义数据库连接的接口代码示例package com.px1987.webcrm.dao.inter;import java.sql.Connection;import com.px1987.webcrm.exception.WebCRMException;public interface ConnectDBIn

30、terface public Connection connectTODataBase();public void closeDataBaseConnection()throws WebCRMException;public boolean isConnectionValid();4、数据库连接接口的实现类【例4-11】所示为数据库连接接口ConnectDBInterface的实现类的代码示例,通过其中的initDBConnection()方法连接MySQL数据库文件webcrm。但为了简化本示例代码,将与数据库连接有关的数据直接写在代码中,见黑体所标识的语句,在实际项目开发中应该要写入到XM

31、L配置文件中。【例4-11】数据库连接接口的实现类的代码示例package com.px1987.webcrm.dao.imple;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.util.logging.Level;import java.util.logging.Logger;import com.px1987.webcrm.dao.inter.ConnectDBInterface;import com.px1987.webcrm.except

32、ion.WebCRMException;public class ConnectDBBean implements ConnectDBInterface static String JDBC_DBDriver_ClassName = com.mysql.jdbc.Driver;String JDBC_DSN_URL = jdbc:mysql:/localhost:3306/webcrm;String JDBC_dbUserName=root;String JDBC_dbUserPassWord=root;private java.sql.Connection con = null;privat

33、e static Logger logger = Logger.getLogger(ConnectDBBean.class.getName(); statictryClass.forName(JDBC_DBDriver_ClassName); catch (java.lang.ClassNotFoundException e) logger.log(Level.INFO, 不能正确地加载JDBC驱动程序+e.getMessage();public ConnectDBBean() throws WebCRMExceptionpublic void initDBConnection() throw

34、s WebCRMExceptiontrycon = DriverManager.getConnection(JDBC_DSN_URL,JDBC_dbUserName,JDBC_dbUserPassWord);catch (java.sql.SQLException e)logger.log(Level.INFO, e.getMessage();throw new WebCRMException(不能正确地连接数据库并且出现SQLException);catch (NullPointerException e)logger.log(Level.INFO, e.getMessage();throw

35、 new WebCRMException(不能正确地连接数据库并且出现NullPointerException); public void closeDBCon() throws WebCRMExceptionif(con=null)return;try/注意:要识别是否为重复调用,否则会出现数据库连接已经关闭的状况con.close();con = null;catch (SQLException e)logger.log(Level.INFO, e.getMessage();throw new WebCRMException(不能正确地关闭数据库连接);public Connection

36、getConnection() throws WebCRMExceptioninitDBConnection();return con;/返回已创建出的数据库连接Connection类的对象实例public boolean isDBConnectionClose() /识别当前数据库连接是否处于有效状态return (con=null)?true:false;5、修改【例4-3】中的示例代码【例4-12】所示为修改后的【例4-3】中的示例代码,在其中的doUserLogin()方法内(黑体所标识的语句)创建出UserManageDAOInterface接口的对象实例,然后再利用DAO接口的实现

37、类中的selectOneUserInfoData()方法查询数据库表,验证是否存在有指定的目标数据。【例4-12】修改后的【例4-3】中的示例代码package com.px1987.webcrm.model.imple;import com.px1987.webcrm.model.vo.UserInfoBaseVO;public class UserInfoManageImple public UserInfoManageImple() public boolean doUserLogin(UserInfoBaseVO oneUserInfoBaseVO) String userName=o

38、neUserInfoBaseVO.getUserName();String userPassWord=oneUserInfoBaseVO.getUserPassWord();UserManageDAOInterface oneUserManageDAOBean=new UserManageDAOJDBCImple();UserInfoBaseVO oneReturnUserInfoVO=oneUserManageDAOBean.selectOneUserInfoData(userName,userPassWord);if(oneReturnUserInfoVO!=null)return true; elsereturn false;当然,为了能够真正地连通目标数据库,在项目中还必须要添加MySQL的JDBC驱动程序类。杨教授工作室,版权所有,盗版必究, 17/17页

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!