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组件,再说说JDBC,Spring的JdbcTemplate将我们常用的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/;
MVC层在Spring的AbstractController类基础上进行了继承和重构,使整个框架仅使用单一的公共控制器,数据操作采用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将结果数据显示出来;
控制器类配置在
1) 继承AbstractController类,便于调用应用环境的Web特性;
2) 只用控制器做请求的转发,业务实现全部在逻辑层;
3) 采用反映射机制(reflect),运行期调用逻辑类中的方法,而请求URI、逻辑类和方法名之间的对应关系只需要在servlet-xxx.xml中配置,这样,控制器实现就只有唯一的一个类文件;
逻辑层类在
逻辑层类首先需要定义一个接口类,统一以xxxLogic.java命名,实现类命名为xxxLogicImpl.java,并继承JdbcDaoSupport类,这样逻辑类便具有了数据库访问能力。
逻辑类的方法如果被公共控制器类LogicController.java的反映射机制直接调用,则其接口类需要继承空的公共接口类BasicLogic,定义方法时参数和返回值是固定的,如果是被其他逻辑类调用则不需要。
public ModelAndView initLogin(HttpServletRequest request, HttpServletResponse response, ServletContext servletContext); |
控制器层直接将请求的request、response和servletContext全部传递过来交由逻辑层自由控制,对于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); } } |
表现层采用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.5、Eclipse WTP 3.2;
Ø JDK5.0 Update 11;
Ø Web服务器Tomcat 5.5.20;
Ø 数据库Oracle10g;
4.2.支撑库文件
spring.jar | spring |
jstl.jar standard.jar | Jstl 1.2 |
commons-io- commons-fileupload-1.2.jar | 文件上传组件 |
commons-logging-1.1.jar log4j- | 日志组件 |
mail.jar activation.jar | 邮件组件 |
quartz- | 时序调度组件 |
aspectjweaver.jar | AOP组件 |
commons-lang-2.3.jar | Apache公共包 |
commons-codec-1.3.jar commons-collections-3.2.jar commons-httpclient- | Httpclient组件 |
4.3.系统目录结构
清空Cookie -
联系我们 -
51Testing软件测试网 -
交流论坛 -
空间列表 -
站点存档 -
升级自己的空间
Powered by 51Testing
© 2003-2021
|