环境搭建
在进入实例具体开发前,需要先配置一下工作环境,其中包括数据库表的创建、项目工程的创建、规划Spring配置文件等工作
(一)数据库的搭建
项目中简单的搭建了一个登陆功能,所以在数据库的搭建上创建了两张表,一张存放用户名、密码、最后登陆日期、最后登陆的ip以及一张登陆日志表存放用户登录的ip、日期。
(二)工程搭建
这里我用的是MyEclipse创建了一个web project,并且导入了spring-framework-3.2.0.RELEASE相关jar包,并且还有第三方依赖包,commons-dbcp.jar为数据源类库;commos-pool.jar为对象池类库,commons-loggging.jar和log4j.jar为日志类库还有junit4.jar为单元测试类库。
(三)Spring配置文件
在src下创建了一个applicationContext.xml配置文件,这个文件中引用了Spring的多个Schema空间的格式定义文件
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:jdbc="http://www.springframework.org/schema/jdbc
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd"></beans>
持久层
我们通过@Repository定义了一个Dao Bean,使用@Autowired将Spring容器中的Bean注入进来。在持久层利用了Spring JDBC框架,这样我们可以减少一些不必要的代码,传统的JDBC API执行的过程是:获得连接–创建Statement–执行数据操作–获得结果–关闭Statement–关闭结果集–关闭连接,除此之外还要进行异常处理,传统的数据库访问操作存在一些重复性代码。所以在这里Spirng JDBC就方便了对数据库的操作,Spring JDBC通过模板类org.springframework.jdbc.core.jdbctemplate封装了样板式的代码,这样我们在代码中只要提供SQL语句,利用封装好的方法进行数据库操作,这样方便了开发过程。
在这里记录一下这个回调函数,RowCallbackHandler():查询结果的处理回调接口,该回调接口有一个方法processRow(ResultSet rs)负责将查询的结果从ResultSet装载到对象实例中。
在Spring中装配DAO
通过使用Spring的<context:component-scan>扫描指定类包下的所有类,这样在类中定义的Spring注解(@Autowired、@Repository等)才能够起作用。与此同时,通过数据库驱动类进行与数据库的连接,再定义一个数据源datasource,并将数据源注入到JdbcTemplate中,这个JdbcTemplate Bean将通过@Autowired自动注入到UserDao的Bean中,Spring很好地将XML配置与注解配置统一起来。
业务层
通过@Service标注为一个服务层的Bean,然后再注入在DAO层的两个bean,在业务方法中就直接调用在DAO层写好的功能。从UserService中看不出任何事物操作的影子,只是专注于完成业务工作。
Spring中装配Service
在基于数据源的DataSourceTransactionManager事务管理器,该事务管理器负责声明式事物的管理,该管理器需要引用dataSource Bean。通过aop及tx命名空间的语法,以aop的方式为service包下所有类的所有方法都添加了事物增强,即它们都工作于事务环境中。
完成了DAO层与SERVICE层此时进行单元测试。
@RunWith注解指定SpringJUnit4ClassRunner.class的测试运行器,该运行器是Spring提供的,可以将Spring容器和Junit4测试框架整合,@ContextConfiguration指定Spring的配置文件,@Autowired将Spring容器中的Bean注入到测试类中。
页面层
配置Spring MVC框架
首先配置web.xml文件,这样以便Web容器启动时能够自动启动Spring容器。
接下来配置Spring MVC相关的信息,它通过一个servlet截获url请求,在进行处理。
在这里声明了一个Servlet,该配置文件的文件名在此处定义的servlet名有一个契约:即采用<servlet 名>-servlet.xml的形式,我们在/WEB-INF目录下必须提供一个xxx-servlet.xml的Spring MVC配置文件,但这个配置文件无须通过web.xml的contextConfigLocation上下文参数进行声明,因为Spring MVC的servlet会自动将xxx-servlet.xml和Spring的其他配置文件(xxx-dao.xml,xxx-service.xml)进行拼装。在这里Spring MVC处理的URL都是以.html为后缀的URL都能被Demo servlet截获,进而转由Spring MVC框架进行处理。(使用.html后缀,一方面用户不能通过url地址知道我们采用了何种服务端技术,另一方面,.html是静态网页,可以骗过搜索引擎,增加被收录的概率。)
请求被Spring MVC截获,首先根据请求的URL查找到目标的处理控制器,并将请求参数封装成一个“命令”对象一起传给控制器处理,控制器调用Spring容器中的业务Bean完成业务处理功能并返回结果视图。
POJO控制器类
编写一个LoginController,它负责处理登录请求,完成登录业务,并根据登录成功与否转向欢迎页面或失败页面。
通过Spring MVC的@controller注解可以将任何一个POJO的类标注为Spring MVC的控制器,处理HTTP的请求。一个控制器可以拥有多个对应不同的HTTP请求路径的处理方法,通过@RequestMapping指定方法如何映射请求路径。
Spring MVC配置文件
通过使用InternalResourceViewResolver为视图逻辑名添加前后缀的方式进行解析,如视图逻辑名为“login”,将解析为/WEB-INF/jsp/login.jsp。
login.jsp
JSTL标签中引用了error变量,这个变量是在LoginController中返回的ModelAndView(“login”,“error”,“用户名或密码错误”)对象所声明的error参数,这里类似于kv关系,以键值对的方式来操作。
由于login.jsp放置在WEB-INF/jsp目录下,无法直接通过URL进行调用,它由LoginController控制类中标注的@RequestMapping(value="/index.html")的loginPage()进行转发,故在网页输入地址栏应该为index.html。
运行结果
将项目部署于tomcat上运行。