SpringMVC、MyBatis框架整合开发项目的简单说明(使用框架说明)
2016-03-15 23:38
609 查看
最近由于项目需要,开始接触SpringMVC框架的开发。使用过之后,发现这种框架的思想 非常有利于业务型系统的开发和维护,所以想写篇博客记录下使用过程中的一些心得。 关于框架源码我还没来得及研究,因为项目比较紧,当初只是从别的项目拿来了这一套框 架使用,所以这篇博客更多的是使用该框架的心得。下面开始正题。 首先先将框架项目导编译器,我用的是Eclipse Java EE IDE for Web Developers。图标长这样:
我们需要将使用spring框架的工程导入,在项目工程栏处(最左侧)右键—>Import—>Existing Projects into Workspace —>Browse选择要导入的工程—>finish就将工程导入进来了。如图:
然后我们在tomcat中配置一下该工程,
在这个叶签中右键,new—>server—>tomcat6.0(我用的是tomcat6.0)—>
你的工程,加载到右边—>finish。这样该工程在tomcat中就配置完成了,如图:
然后我们需要在tomcat中修改数据库连接,因为是别人的项目,所以我需要连上自己的数据库。 当工程在tomcat中配置完成时,会出来一个server文件夹:
,在里面的context.xml文件中添加上连接字符串的代码:<Resource auth="Container" driverClassName="oracle.jdbc.driver.OracleDriver"
maxActive="100"
maxIdle="30"
maxWait="5000"
name="jdbc/数据库名称"
password="登录密码"
type="javax.sql.DataSource"
url="jdbc:oracle:thin:@数据库地址:1521:数据库名称"
username="登陆账户名"/>然后保存就可以了。 下面我们开始搭建框架。首先我们先找到工程里面的/WebRoot/WEB-INF/web.xml文件,在这个文件里面我们可以看到两个需要配置的文件:
找到这两个文件,一般都是在/src/config底下,我们先打开applicationContext-common.xml文件,以下几个配置很重要:<context:component-scan base-package="com.aa.bb.service.*" /><!-- 映射service接口层 --><!-- 加载properties配置文件 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations" value="classpath:config/*.properties" />
</bean><!-- 数据源 -->
<bean id="dataSource" name="dataSource"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/数据库名称" />
</bean><!-- 配置SqlSessionFactoryBean -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations"
value="classpath*:/com/aa/bb/dao/mapper/*Mapper.xml" /> <!-- 映射MyBatis数据库查询层 -->
<property name="typeAliasesPackage" value="com.aa.bb.model" /> <!-- 映射JavaBean -->
<property name="configLocation" value="/WEB-INF/classes/config/mybatis.xml"/>
</bean><!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置事务的传播特性 -->
<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="edit*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="del*">PROPAGATION_REQUIRED</prop>
<prop key="*">readOnly</prop>
</props>
</property>
</bean><!-- 通过扫描的模式,扫描Mapper -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.aa.bb.dao" /> <!-- 通过dao层映射mybatis中的查询语句 --></bean>以上这些配置现在看起来头大不要紧,一会到具体项目中的时候,就知道他们的用处了。 然后我们接着打开dispatcher-servlet.xml文件,在这个文件里面,主要配置上以下代码:<context:component-scan base-package="com.foresea-life.cc.*"(package包路径) />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
<mvc:annotation-driven />
<mvc:resources mapping="/resource/**" location="/resource/" />上面这段代码主要用于后端控制器映射到前段JSP页面的。 然后在mybatis.xml文件中就配置上数据库类型就可以了,如:<property name="databaseType" value="oracle"/> 好了,关于框架的配置现在基本完成了,咱们现在就开始来进行具体业务逻辑是如何使用该框架来实现的讲解。咱们以系统登录为例来讲解一下。 在开始之前,大家先眼熟这些词: 1、@controller 控制器(注入服务)
然后我们编写一个javabean,用来存储一些登录需要用到的字段。在src底下新建一个包com.aa.bb.model,在包中新建一个类UserBean,在类中定义两个字段:private String userCode; private String passWord; 并定义它们的get、set方法。大家注意到没有,这里的字段和页面上的字段大小写是严格对应的,这样,我们一会从页面获取用户输入的账户名密码的时候,就不用再做额外传值的操作,直接可以将页面的值映射到这个userbean中,在后台直接用userbean就可以取到值。
然后我们需要编写一个控制器来控制它跳转到这个页面(记住spring框架的实现都是通过控制器来处理各种各样的请求)。我们在src底下新建一个包:com.aa.bb.controller,然后在包中新建一个类IndexController.java: @Controller //这个就是刚才前面的applicationContext-common.xml文件配置起了作用,是一种自动扫描机制 public class IndexController {
@RequestMapping(value="/") //这个就是刚才前面的applicationContext-common.xml文件配置起了作用,是一种自动扫描机制
public String index(HttpServletRequest request,HttpServletResponse response,Model model){
return "login"; //控制页面跳转到login.jsp页面中,这个就是dispatcher-servlet.xml配置起的作用
}}这样,当我们在浏览器上输入http://localhost:8080/cc(最后这个cc需要在tomcat中配置这个地址,配置方法是:在server中双击
,
然后在弹出页面中选
红框中的path修改就好了,改成什么就在http://localhost:8080/这个后面接什么就行)时,会进入控制器IndexController.java的index()方法中,为什么呢?因为这个@RequestMapping(value="/"),一个斜杠就是项目首页的意思,就是你只要输入网址,就会自动映射到一个斜杠标记的方法,所以一个项目只能有一个首页,否则有可能会无法识别。然后在index()方法中跳转到login.jsp中,在页面上录入账号密码,点击登录,调用js方法:saveAction(){ $('#loginForm').form({ url : '/login.do',
onSubmit : function() {
return docheck();
},
success : function(data) {
$('.waitemode').hide();
if (data == "success") {
window.location.href = "/index.do";
}else{
$("#password").val("");
$("#password").focus();
return;
}
}
});
}} 大家看到这段代码,肯定会说/login.do和/index.do这是什么鬼?有经验的开发工程师应该猜到这其实又是映射,没错,这也是控制器中映射。下面我们在控制器包底下新建一个登录的控制器LoginController.java: @Controller public class UserController {
@Autowired
private UserBusinessService userBusinessService;
/**
* 用户登录
*
* @param res
* @param user
* @throws Exception
*/
@RequestMapping(value = "/login.do")
public void login(HttpServletRequest request, HttpServletResponse response,UserBean userbean) {
WebUtil.print(response, userBusinessService.login(request, userbean));
}} 大家这里可以看到/login.do又对应了控制器中login()方法,至于WebUtil.print()这个是个公共方法来的,用来返回数据给前台,大家就不要在意了,用你们自己的公共类方法就行了。而UserBusinessService这就是service层的接口,@Autowired这个东西呢,是一种spring框架的注入式,根据类型自动装配,有很多关于这方面的书籍资料,大家可以在网上和书上查阅,因为如果在这里说的话,要花很大的篇幅。所以我们新建一个com.aa.bb.service包,在包里新建一个接口UserBusinessService,在里面写一个方法public String login(HttpServletRequest request,UserBean userbean); 既然有接口,那么一定就有接口实现。新建一个包com.aa.bb.service.impl,在包中新建一个接口实现类UserBusinessServiceimpl.java,在这个实现类中,大家可以写自己项目中的具体业务逻辑,也就是业务逻辑层,像现在咱们这个登录的一些基本校验,我们就可以写在这个类中: @Component("userBusinessService") //这里的@Component同理,大家可以在网上查到资料
public class UserBusinessServiceImpl implements UserBusinessService { @Autowired private UserDao userdao;
public String login(HttpServletRequest request, UserBean userbean) { //从userbean中取出userCode和passWord判断是否为空,如果不为空,则将账号密码放到数据库 //中判断,看用户名密码是否正确。 List<UserBean> listUser=userdao.queryUser(userbean); //这里的userdao就是数据库接口层,新建com.aa.bb.dao包,新建一个接口UserDao.java,定义一个 //方法public List<UserBean> queryUser(UserBean userbean); } } 然后我们新建一个包com.aa.bb.dao.mapper。在包中新建一个xml文件UserDaoMapper.xml: <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC
"-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.foresealife.cc.dao.UserDao"> <select id="queryUser" parameterType="UserBean" resultMap="userResultMap"> SELECT userCode,passWord FROM hjuser t where 1=1 <if test="userCode!=null and userCode!=''"> and t.userCode = #{userCode,jdbcType=VARCHAR} </if> <if test="passWord!=null and passWord!=''"> and t.passWord = #{passWord,jdbcType=VARCHAR} </if> </select> 大家应该发现了,<select>标签中的id对应的是正是dao层接口中的方法名,这样根据dao层接口中的方法,就可以找到相应的sql语句,这就是springMVC框架与mybatis框架的整合,也是在applicationContext-common.xml中配置的结果。<select>标签中parameterType属性是表示传进来的参数,resultMap属性是表示sql的返回值。 这样我们就能实现具体的增删改查操作了。 好了,这就是springMVC框架与mybatis框架整合的基本使用,可能说的比较乱,毕竟语文是体育老师教的... 最后我总结一下各个模块的作用,希望能加深印象。 com.aa.bb.controller 控制器层,编写controller类处理请求(UserController.java) com.aa.bb.model javabean模块,存放数据(UserBean.java) com.aa.bb.service 业务逻辑接口层(UserBusinessService.java) com.aa.bb.service.impl 业务逻辑接口具体实现层(UserBusinessServiceImpl.java) com.aa.bb.dao 操作数据库接口层(UserDao.java) com.aa.bb.dao.mapper 数据库具体实现xml(UserDaoMapper.xml)
我们需要将使用spring框架的工程导入,在项目工程栏处(最左侧)右键—>Import—>Existing Projects into Workspace —>Browse选择要导入的工程—>finish就将工程导入进来了。如图:
然后我们在tomcat中配置一下该工程,
在这个叶签中右键,new—>server—>tomcat6.0(我用的是tomcat6.0)—>
你的工程,加载到右边—>finish。这样该工程在tomcat中就配置完成了,如图:
然后我们需要在tomcat中修改数据库连接,因为是别人的项目,所以我需要连上自己的数据库。 当工程在tomcat中配置完成时,会出来一个server文件夹:
,在里面的context.xml文件中添加上连接字符串的代码:<Resource auth="Container" driverClassName="oracle.jdbc.driver.OracleDriver"
maxActive="100"
maxIdle="30"
maxWait="5000"
name="jdbc/数据库名称"
password="登录密码"
type="javax.sql.DataSource"
url="jdbc:oracle:thin:@数据库地址:1521:数据库名称"
username="登陆账户名"/>然后保存就可以了。 下面我们开始搭建框架。首先我们先找到工程里面的/WebRoot/WEB-INF/web.xml文件,在这个文件里面我们可以看到两个需要配置的文件:
找到这两个文件,一般都是在/src/config底下,我们先打开applicationContext-common.xml文件,以下几个配置很重要:<context:component-scan base-package="com.aa.bb.service.*" /><!-- 映射service接口层 --><!-- 加载properties配置文件 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations" value="classpath:config/*.properties" />
</bean><!-- 数据源 -->
<bean id="dataSource" name="dataSource"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/数据库名称" />
</bean><!-- 配置SqlSessionFactoryBean -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations"
value="classpath*:/com/aa/bb/dao/mapper/*Mapper.xml" /> <!-- 映射MyBatis数据库查询层 -->
<property name="typeAliasesPackage" value="com.aa.bb.model" /> <!-- 映射JavaBean -->
<property name="configLocation" value="/WEB-INF/classes/config/mybatis.xml"/>
</bean><!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置事务的传播特性 -->
<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="edit*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="del*">PROPAGATION_REQUIRED</prop>
<prop key="*">readOnly</prop>
</props>
</property>
</bean><!-- 通过扫描的模式,扫描Mapper -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.aa.bb.dao" /> <!-- 通过dao层映射mybatis中的查询语句 --></bean>以上这些配置现在看起来头大不要紧,一会到具体项目中的时候,就知道他们的用处了。 然后我们接着打开dispatcher-servlet.xml文件,在这个文件里面,主要配置上以下代码:<context:component-scan base-package="com.foresea-life.cc.*"(package包路径) />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
<mvc:annotation-driven />
<mvc:resources mapping="/resource/**" location="/resource/" />上面这段代码主要用于后端控制器映射到前段JSP页面的。 然后在mybatis.xml文件中就配置上数据库类型就可以了,如:<property name="databaseType" value="oracle"/> 好了,关于框架的配置现在基本完成了,咱们现在就开始来进行具体业务逻辑是如何使用该框架来实现的讲解。咱们以系统登录为例来讲解一下。 在开始之前,大家先眼熟这些词: 1、@controller 控制器(注入服务)
2、@service 服务(注入dao)
3、@repository dao(实现dao访问)
4、@component (把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>)首先,我们先编写一个简单的前端登录页面:login.jsp。该页面就两个文本录入框,登录账户userCode,登录密码passWord,一个登录按钮,比较简单,我就不列出代码了。
然后我们编写一个javabean,用来存储一些登录需要用到的字段。在src底下新建一个包com.aa.bb.model,在包中新建一个类UserBean,在类中定义两个字段:private String userCode; private String passWord; 并定义它们的get、set方法。大家注意到没有,这里的字段和页面上的字段大小写是严格对应的,这样,我们一会从页面获取用户输入的账户名密码的时候,就不用再做额外传值的操作,直接可以将页面的值映射到这个userbean中,在后台直接用userbean就可以取到值。
然后我们需要编写一个控制器来控制它跳转到这个页面(记住spring框架的实现都是通过控制器来处理各种各样的请求)。我们在src底下新建一个包:com.aa.bb.controller,然后在包中新建一个类IndexController.java: @Controller //这个就是刚才前面的applicationContext-common.xml文件配置起了作用,是一种自动扫描机制 public class IndexController {
@RequestMapping(value="/") //这个就是刚才前面的applicationContext-common.xml文件配置起了作用,是一种自动扫描机制
public String index(HttpServletRequest request,HttpServletResponse response,Model model){
return "login"; //控制页面跳转到login.jsp页面中,这个就是dispatcher-servlet.xml配置起的作用
}}这样,当我们在浏览器上输入http://localhost:8080/cc(最后这个cc需要在tomcat中配置这个地址,配置方法是:在server中双击
,
然后在弹出页面中选
红框中的path修改就好了,改成什么就在http://localhost:8080/这个后面接什么就行)时,会进入控制器IndexController.java的index()方法中,为什么呢?因为这个@RequestMapping(value="/"),一个斜杠就是项目首页的意思,就是你只要输入网址,就会自动映射到一个斜杠标记的方法,所以一个项目只能有一个首页,否则有可能会无法识别。然后在index()方法中跳转到login.jsp中,在页面上录入账号密码,点击登录,调用js方法:saveAction(){ $('#loginForm').form({ url : '/login.do',
onSubmit : function() {
return docheck();
},
success : function(data) {
$('.waitemode').hide();
if (data == "success") {
window.location.href = "/index.do";
}else{
$("#password").val("");
$("#password").focus();
return;
}
}
});
}} 大家看到这段代码,肯定会说/login.do和/index.do这是什么鬼?有经验的开发工程师应该猜到这其实又是映射,没错,这也是控制器中映射。下面我们在控制器包底下新建一个登录的控制器LoginController.java: @Controller public class UserController {
@Autowired
private UserBusinessService userBusinessService;
/**
* 用户登录
*
* @param res
* @param user
* @throws Exception
*/
@RequestMapping(value = "/login.do")
public void login(HttpServletRequest request, HttpServletResponse response,UserBean userbean) {
WebUtil.print(response, userBusinessService.login(request, userbean));
}} 大家这里可以看到/login.do又对应了控制器中login()方法,至于WebUtil.print()这个是个公共方法来的,用来返回数据给前台,大家就不要在意了,用你们自己的公共类方法就行了。而UserBusinessService这就是service层的接口,@Autowired这个东西呢,是一种spring框架的注入式,根据类型自动装配,有很多关于这方面的书籍资料,大家可以在网上和书上查阅,因为如果在这里说的话,要花很大的篇幅。所以我们新建一个com.aa.bb.service包,在包里新建一个接口UserBusinessService,在里面写一个方法public String login(HttpServletRequest request,UserBean userbean); 既然有接口,那么一定就有接口实现。新建一个包com.aa.bb.service.impl,在包中新建一个接口实现类UserBusinessServiceimpl.java,在这个实现类中,大家可以写自己项目中的具体业务逻辑,也就是业务逻辑层,像现在咱们这个登录的一些基本校验,我们就可以写在这个类中: @Component("userBusinessService") //这里的@Component同理,大家可以在网上查到资料
public class UserBusinessServiceImpl implements UserBusinessService { @Autowired private UserDao userdao;
public String login(HttpServletRequest request, UserBean userbean) { //从userbean中取出userCode和passWord判断是否为空,如果不为空,则将账号密码放到数据库 //中判断,看用户名密码是否正确。 List<UserBean> listUser=userdao.queryUser(userbean); //这里的userdao就是数据库接口层,新建com.aa.bb.dao包,新建一个接口UserDao.java,定义一个 //方法public List<UserBean> queryUser(UserBean userbean); } } 然后我们新建一个包com.aa.bb.dao.mapper。在包中新建一个xml文件UserDaoMapper.xml: <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC
"-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.foresealife.cc.dao.UserDao"> <select id="queryUser" parameterType="UserBean" resultMap="userResultMap"> SELECT userCode,passWord FROM hjuser t where 1=1 <if test="userCode!=null and userCode!=''"> and t.userCode = #{userCode,jdbcType=VARCHAR} </if> <if test="passWord!=null and passWord!=''"> and t.passWord = #{passWord,jdbcType=VARCHAR} </if> </select> 大家应该发现了,<select>标签中的id对应的是正是dao层接口中的方法名,这样根据dao层接口中的方法,就可以找到相应的sql语句,这就是springMVC框架与mybatis框架的整合,也是在applicationContext-common.xml中配置的结果。<select>标签中parameterType属性是表示传进来的参数,resultMap属性是表示sql的返回值。 这样我们就能实现具体的增删改查操作了。 好了,这就是springMVC框架与mybatis框架整合的基本使用,可能说的比较乱,毕竟语文是体育老师教的... 最后我总结一下各个模块的作用,希望能加深印象。 com.aa.bb.controller 控制器层,编写controller类处理请求(UserController.java) com.aa.bb.model javabean模块,存放数据(UserBean.java) com.aa.bb.service 业务逻辑接口层(UserBusinessService.java) com.aa.bb.service.impl 业务逻辑接口具体实现层(UserBusinessServiceImpl.java) com.aa.bb.dao 操作数据库接口层(UserDao.java) com.aa.bb.dao.mapper 数据库具体实现xml(UserDaoMapper.xml)
相关文章推荐
- Struts、Spring 、Hibernate 三大框架概述
- java7新特性之Improved exception handling
- Spring注解学习手札(一)构建web应用
- 一口气从CSS讲到Servlet再到JSP、Struts2,清蒸JavaWeb的前前后后。
- 选择排序和冒泡排序(JAVA)
- java基础(二)之数据类型
- Springframework和Hibernate版本对应关系
- Spring Boot 系列 —— Hello World
- java <T> <E> <?>
- Java静态变量,常量,成员变量,局部变量
- 如何解决Eclipse开发android程序的编译错误:com/android/dx/command/dexer/Main : Unsupported major.minor version 52.0?
- Java基础复习系列五
- java7新特性之Enhanced syntax for numeric literals
- 设计模式之------创建型模式(五)-----原型模式
- Ajax前台请求 以及 后台 Java 处理 (包含undefined的问题)
- java连接数据库常见错误总结
- Java Bean简单介绍
- leetcode:Restore IP Addresses 【Java】
- struts2——(8)(①3种情况通配符的使用方法②动态方法调用 )
- 关于java对象复制clone 给一个对象赋值 会随原来的对象变化