Spring mvc+ibatis 整合:
Mvc 是当前最主流的框架之一。收到广大开发者的热烈追捧。我也是受影响的人之一。因此,决定在新的项目中,使用 spring mvc + mybatis 进行处理框架搭建。相对以前比较欢迎的SSI来说,缺少了struts2 的使用,自从上次struts的bug事件,导致现在我对struts还心有余悸。这次使用spring代替struts也是有这方面的影响。
好了,废话不多说,开始搭建环境。
网上各种翻阅资料,好多。但是大体上都是说,在spring mvc + mybatis 的时候,后台添加一个sql语句,对应的就需要添加一个借口!!!我去,这对爱偷懒的我,怎么能受得了!继续翻阅资料,查看是否有有没有什么好的解决办法。…… 好吧,我承认自己钻研能力不是很好,各种想办法都没有找到解决方案。感觉mybatis 单独为一个sql语句配置xml文件也就罢了,还要配置借口,这个我不能接受。想到前一段时间,使用ibatis,让我想到了使用ibatis替代mybatis,有点倒退的感觉,但是能满足我现在的需要。不管了,找资料,配置SI 框架。
Jar包预览
首先,要导入jar包,我太懒了, spring的依赖包全都放进去了。再加上其他的依赖包,结果就是如下图所示了:
接上图:
好吧,这是我整合成功之后用到的所有jar包,都在这里了,其中有一个叫做aopallinacd-1.0.jar 这个包是必须的,少了它报错,这个包可整死我了!!!
好了,jar包配置完了,就一步一步来,配置框架了。
Web.xml配置文件
1) 配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>GameOperators</display-name>
<!-- 欢迎界面 -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- mvc 拦截配置 -->
<servlet>
<servlet-name>spring-mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param> <!-- 这里是配置mvc的拦截配置文件,自己定义的,如果没有设置,就是默认的,网上有相关资料 -->
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-servlet.xml</param-value>
</init-param> <!-- 触发条件为1,表示在一开始的时候,加载启动 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping> <!-- 表示拦截以 html 结尾的action请求 -->
<servlet-name>spring-mvc</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<!-- 防止乱码方式,这是一下编码格式 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- spring配置,加载数据使用的 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param> <!-- spring的配置文件名字为 applicationContext.xml, 这里制定路径,为 项目中 (默认的) src下面 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext.xml</param-value>
</context-param>
</web-app>
好了,web.xml文件配置完成了,下面要配置 spring-mvc 文件,这个是mvc的配置文件,用于注释使用,文件的位置和名字要跟
<init-param> <!--这里是配置mvc的拦截配置文件,自己定义的,如果没有设置,就是默认的,网上有相关资料 -->
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-servlet.xml</param-value>
</init-param> <!--触发条件为1,表示在一开始的时候,加载启动 -->
对应起来,否则,找不到文件就报错了。
Sping-servlet.xml mvc配置文件
1) spring-servlet.xml mvc的配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 启动注解驱动的Spring MVC功能,注册请求url和注解POJO类方法的映射-->
<mvc:annotation-driven />
<!-- 要映射的包名,表示这里所定义的包名,全都被可以被注释使用。 -->
<context:component-scan base-package="com.zy.ywyd.gameoperators.action" />
<context:component-scan base-package="com.zy.ywyd.gameoperators.service" />
<context:component-scan base-package="com.zy.ywyd.gameoperators.dao" />
<!-- 完成请求和注解POJO的映射 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="" p:suffix=".jsp" /> <!—定义了返回路径,以及返回文件的后缀。-->
</beans>
配置完成之后, spring 的mvc 的配置就差不多完成了,剩下的就是写一个jsp测试界面和action的类了。
测试mvc的代码:
Jsp测试代码
Jsp:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<head>
<%
String path = request.getScheme() + "://" + request.getServerName()
+ ":" + request.getServerPort() + request.getContextPath()
+ "/";
%>
<base href="<%=path%>" />
<title>Spring 3.0 MVC Series: Index - ViralPatel.net</title>
</head>
<body>
<a href="TestAction/helloWorld.html">Say Hello</a>
<form method="POST" action="TestAction/helloWorld.html" id="test">
<input type="text" name="name" id="name" value="321">
<input type="submit">
</form>
</body>
</html>
代码很简单,这里提交主要有两种方式,一个是get 一种是post两种。感觉应该包含了大部分的要求了。
Java代码
Java代码:
package com.zy.ywyd.gameoperators.action;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import com.zy.ywyd.gameoperators.service.TestService;
@Controller
@RequestMapping("TestAction")
public class TestAction {
@Autowired
private TestService testS;
@RequestMapping(value="helloWorld", method=RequestMethod.POST)
public void helloWorld(HttpServletRequest request,HttpServletResponse response,
@RequestParam String name) {
String message = "Hello World, Spring 3.0!";
System.out.println(testS.test());
System.out.println(message);
System.out.println(name);
try {
response.getWriter().write("11111");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// return new ModelAndView("/jsp/hello", "message", message);
}
}
上面的有几个注释要说明一下:
@Controller:
1:spring mvc 中将 controller 认为是 MVC中的C --控制层
2:规范命名 类名 xxxController
3:如果不基于注解: 该类需要继承 CommandController 或者 其他很多 参见 spring帮助
如果基于注解:在类名前 加上 @controller
4:补充:将类名前加上该注解,当spring启动 或者web服务启动 spring会自动扫描所有包(当然,这个可以设置)
作用: 就是告诉服务器 这个类是MVC中的C 这个类可以接收用户请求 处理用户请求
说白了就是定义界面想java类中的请求,类似struts中的action。只在controller中,也就是控制层使用。如果用到其他类里面,也能使用,就是太乱了。
@RequestMapping:
定义名称。负责跳转使用的。TestAction/ helloWorld.html /前面的是类里面的,helloword是方法中的。这样跳转方便。
@Autowired:
定义变量,只要在其他的类中,有用注释定义类的,让spring资源管理器处理的,用这个就能获取到。
@RequestMapping(value="helloWorld",method=RequestMethod.POST)
这个在后面中,定义了请求方法。如果是非定义的请求方法,就找不到地方了。
Return返回, 定义好返回的jsp界面以及文件就好了。Ibatis整合
ApplicationContext-xml配置文件
Ibatis整合:
配置application.xml文件,用来定义数据源。数据库的访问,整体上跟ibatis的方式差不多。
Application.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<tx:annotation-driven transaction-manager="txManager" />
<!-- <import resource="com/zy/ywyd/gameoperators/dao/applicationContext-daoImpl.xml"/> -->
<!-- mySQL 数据库配置 -->
<bean id="mysqldataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="preferredTestQuery" value="select 1"/>
<property name="idleConnectionTestPeriod" value="18000"/>
<property name="testConnectionOnCheckout" value="true "/>
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<!-- 126测试 -->
<property name="jdbcUrl" value="jdbc:mysql://192.168.1.126:3306/databaseName"></property>
<property name="user"><value>user</value></property>
<property name="password"><value>password</value></property>
</bean>
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation"><value>classpath:sql-map-config.xml</value> </property>
<property name="mappingLocations">
<value>classpath:com/zy/ywyd/gameoperators/dao/*-ibatis.xml</value>
</property>
<property name="dataSource"><ref bean="mysqldataSource" /></property>
</bean>
</beans>
Sql-map-config.xml配置文件
sql-map-config.xml 配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<settings useStatementNamespaces="true"/>
<sqlMap resource="ibates.xml"/>
</sqlMapConfig>
Ibatis.xml配置文件
Ibatis.xml文件<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="ibates11">
<select id="list" resultClass="String">
select top 1 PINGNAME from PingDao
</select>
<insert id="insert" parameterClass="map" >
insert into PingDao values (#name#)
</insert>
</sqlMap>
首先需要定义个dao基类,用来配置dao层的数据库连接。代码如下:
package com.zy.ywyd.gameoperators.dao;
//import java.util.Map;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
import com.ibatis.sqlmap.client.SqlMapClient;
@SuppressWarnings("deprecation")
public class Dao extends SqlMapClientDaoSupport {
@Resource(name = "sqlMapClient")
public SqlMapClient sqlMapClient;
@PostConstruct
public void initSqlMapClient() {
super.setSqlMapClient(sqlMapClient);
}
/*
获取查询的对象
public Object selectObject(Map<String,Object> parameter){
return null;
};
获取查询的结果集
public Object selectList(Map<String,Object> parameter){
return null;
}
插入数据
public Object insert(Map<String,Object> parameter){
return null;
}
更新数据
public Object update(Map<String,Object> parameter){
return null;
}
删除数据
public Object delete(Map<String,Object> parameter){
return null;
}*/
}
然后定义分类 TestDao 代码如下:
package com.zy.ywyd.gameoperators.dao;
import org.springframework.stereotype.Component;
@Component
public class TestDao extends Dao {
@SuppressWarnings("deprecation")
public void getMsg(){
System.out.println("123aaaaaaaaaaaaaa");
System.out.println("TestDao-ibatis.test");
String msg = (String) this.getSqlMapClientTemplate().queryForObject("TestDao-ibatis.test");
System.out.println(msg);
}
}
定义对应的xml 文件
TestDao-ibatis.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="TestDao-ibatis">
<select id="test" resultClass="String">
SELECT test FROM test limit 1,1
</select>
</sqlMap>
最后就是中间的service 进行action和dao 的衔接。
package com.zy.ywyd.gameoperators.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zy.ywyd.gameoperators.dao.TestDao;
@Service
public class TestService {
@Autowired
private TestDao testD;
@Autowired
public String test(){
System.out.println("test service");
System.out.println("testD = " +testD);
testD.getMsg();
return "123456";
}
}
以上是我在项目总,自己总结的。有不对的地方,还请指教,希望能给大家带来帮助。 qq 2281879713 同时,希望通过技术跟大家作为好朋友
最后,给大家献上 我的 一个小 demo,写的不好,但是希望能给大家带来帮助。 http://download.csdn.net/detail/cl_ghost/6725963