spring

上一篇 / 下一篇  2008-06-26 17:12:50 / 个人分类:JAVA相关

1.前言

此文档讲述的内容适合于对Spring MVC和数据持久层ORM概念有一定基础的开发者,着重于讲述基于Spring框架基础之上进行Java开发的其中一种技术解决方案,而不是讲述相关技术的原理,想要了解技术原理内容请参考相关文档资料。
 
  现在,网络上流传的Spring+Struts+Hibernate用得非常火,几乎成为很多对技术痴迷的人的技术架构标准,可是在我看来,也许是因为项目都不算大,人力也不够多,这个技术架构太复杂了。从Spring本身来讲,从MVC到数据操作,都可以不需要其他附加组件即可实现,并且结构清晰,使用简单,功能还更加强大,本文讲述的重点就是单独使用Spring来建立一个简易的开发框架。
 
  首先说,为什么选择Spring呢?大概在2003年的时候,Struts已经开始流行了,但是在学习Struts的时候感觉这个技术框架比原始的JSP+JavaBean的方式复杂了很多,后来2004年做新项目时在论坛上看到推荐Spring,下载一试,上手非常的容易,结构也很清晰,支持的功能也非常多,所以决定用它了(其实那时候对于依赖注入和AOP代理还不甚了解,也很少用到接口)。

  在
2001-2003年的时候都是自己封装了JavaBean做为公共模块来访问数据库的,后来ORM兴起了,先是看了Hibernate的,3.0版还没用出,还不支持存储过程,因为那时候也做Delphi相关开发,用惯了SQL语句,始终觉得HQL这样的东东增加了开发的复杂度和不可控制性,原生的复杂SQL语句无法使用,不喜欢。后来看到了iBATIS,经过试用,正是我所需要的,SQL语句配置简单,基本不会破坏SQL语句的结构,这样将SQL语句Copy到外部数据库工具中进行调试也非常的方便,加上SQL语句可以使用很多的特定数据库的函数,执行效率和简洁性也非常好,修改了SQL又不需要重新编译程序。

  
有网友说Hibernate支持多个数据库移值啊,我认为这个就不仅仅是SQL语句的问题了,还有很多其他方面的因素,大多数项目都可以不用考虑。又有网友说Hibernate对于数据库结构修改的影响比较小,这种情况影响的也不仅仅是几句代码的问题,涉及到界面表现、业务流程等很多重要方面,相对说来修改代码倒是小Case了。


  说完了上面的
ORM组件,再说说JDBCSpringJdbcTemplate将我们常用的JDBC流程封装起来,使用非常简单,一般执行的SQL就是一句话,构造SQL随着业务的复杂而复杂,并且也支持PrepareStatement的执行模式避免SQL注入漏洞发生,同样具备完整的数据操作功能如查询、更新、存储过程、异常捕捉等等,经过几年的使用比较,我认为轻型的项目使用JdbcTemplate是非常不错的选择。

  由于能力所限,其中细节如有欠缺之处,请多多批评指正。

2.参考资料

² Spring官方网站:http://www.springframework.org/

² Spring 2.0中文参考手册:http://spring.jactiongroup.net/

² Apache Jakarta官方网站:http://jakarta.apache.org/

² JSTL官方网站:http://java.sun.com/products/jsp/jstl/

² Intellij IDEA官方网站:http://www.jetbrains.com/

3.架构概览

MVC层在SpringAbstractController类基础上进行了继承和重构,使整个框架仅使用单一的公共控制器,数据操作采用SpringJdbcTemplate,在逻辑层中直接集成了Spring Jdbc能力,可直接操作数据,表现层Jstl,除此之外,未定义任何的表单对象、数据库表映射对象和其他ORM的配置文件,在保留对关键功能的集成度的基础上技术入门度极低,重点关注业务功能和优化SQL语句

请求处理流传如图所示:



1)     用户访问http://www.fyyk.com/a.do

2)     Web应用服务器(如tomcat)解析扩展名为*.do的请求,通过Spring分发器org.springframework.web.servlet.DispatcherServlet读取servlet-do.xml中的配置,将请求转发给公共控制器类LogicController.java

3)     公共控制器类LogicController.java根据servlet-do.xml文件中的配置信息调用DoLogicImpl.java类中相对应名称的方法;

4)     DoLogicImpl.java类中的方法在处理完成业务逻辑后,将数据内容ModelAndView返回给公共控制器类LogicController.java

5)     公共控制器类LogicController.java处理ModelAndView信息,执行b.jsp将结果数据显示出来;

3.1.控制器Controller




  控制器类配置在

servlet-xxx.xml文件中,封装后的Controller特点如下:

1)   继承AbstractController类,便于调用应用环境的Web特性;

2)  只用控制器做请求的转发,业务实现全部在逻辑层;

3)     采用反映射机制(reflect),运行期调用逻辑类中的方法,而请求URI、逻辑类和方法名之间的对应关系只需要在servlet-xxx.xml中配置,这样,控制器实现就只有唯一的一个类文件;

3.2.逻辑层Logic




  逻辑层类在

applicationContext-xxx.xml文件配置Bean定义中,主要实现两项功能:一是处理业务逻辑,二是操作数据库;

逻辑层类首先需要定义一个接口类,统一以xxxLogic.java命名,实现类命名为xxxLogicImpl.java,并继承JdbcDaoSupport类,这样逻辑类便具有了数据库访问能力。

逻辑类的方法如果被公共控制器类LogicController.java的反映射机制直接调用,则其接口类需要继承空的公共接口类BasicLogic,定义方法时参数和返回值是固定的,如果是被其他逻辑类调用则不需要。

public ModelAndView initLogin(HttpServletRequest request, HttpServletResponse response, ServletContext servletContext);

控制器层直接将请求的requestresponseservletContext全部传递过来交由逻辑层自由控制,对于request中的表单数据,未采用SimpleFormController的模式定义表单对象,建议手工获取,从代码量本身来将并不复杂,反而更加灵活。在业务处理完成后,必须构造一个ModelAndView对象,作为方法返回值回传给控制器。

范例代码如下:

public class AdminLogicImpl extends JdbcDaoSupport implements AdminLogic

{

 

public ModelAndView insertUser(HttpServletRequest request, HttpServletResponse response,

   ServletContext servletContext) throws DataAccessException

   {

       String userId = request.getParameter("userId");

       String userName = request.getParameter("userName");

       int age = Integer.parseInt(request.getParameter("age"));

       double weight = Double.parseDouble(request.getParameter("weight"));

 

       String sqlStr = "insert into testuser (userId,username,age,weight,updatetime) values (?,?,?,?,?)";

       Object[] ōbject = new Object[]{userId, userName, age, weight, new Date()};

       getJdbcTemplate().update(sqlStr, object);

 

      Map<String, Object> model = new HashMap<String, Object>();

       model.put("msg", "插入用户成功!");

       model.put("url", "pageForm.user");

       String view = "admin/message.jsp";

       return new ModelAndView(view, model);

   }

}

3.3.表现层Jstl

表现层采用Jstl taglib 1.2,在*.jsp页面中加入taglib引用即可使用Jstl标签的大部分功能了,标签的具体使用方法请参考相关文档。

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

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

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

4.开发准备

4.1.开发工具

Ø Java编辑器Intellij IDEA 6.0.5Eclipse WTP 3.2

Ø JDK5.0 Update 11

Ø Web服务器Tomcat 5.5.20

Ø 数据库Oracle10g

4.2.支撑库文件

spring.jar

spring2.0.3

jstl.jar

standard.jar

Jstl 1.2

commons-io-1.3.1.jar

commons-fileupload-1.2.jar

文件上传组件

commons-logging-1.1.jar

log4j-1.2.14.jar

日志组件

mail.jar

activation.jar

邮件组件

quartz-1.5.2.jar

时序调度组件

aspectjweaver.jar

AOP组件

commons-lang-2.3.jar

Apache公共包

commons-codec-1.3.jar

commons-collections-3.2.jar

commons-httpclient-3.0.1.jar

Httpclient组件

4.3.系统目录结构

s004.gif

TAG: java相关 JAVA相关

 

评分:0

我来说两句