MyBatis3_Spring4_SpringMvc整合指南
- 1.1MyBatis3_Spring4_SpringMvc整合指南 MyBatis3_Spring4_SpringMvc整合指南加粗样式
一、 添加架包支持
1、 添加Spring4架包
spring-beans-4.3.25.RELEASE.jar
说明:这个jar文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类。如果应用只需基本的IoC/DI支持,引入spring-core.jar及spring-beans.jar文件就可以了。
spring-context-4.3.25.RELEASE.jar
说明:Spring提供在基础IoC功能上的扩展服务,此外还提供许多企业级服务的支持,如邮件服务、任务调度、JNDI定位、
学习内容:
例如:
1、 搭建 Java 开发环境
2、 掌握 Java 基本语法
3、 掌握条件语句
4、 掌握循环语句
学习产出:
例如:
spring-core-4.3.25.RELEASE.jar
说明:Spring框架基本的核心工具类,Spring其它组件要都要使用到这个包里的类,是其它组件的基本核心,当然你也可以在自己的应用系统中使用这些工具类。
spring-expression-4.3.25.RELEASE.jar
说明:Spring表达式语言( Spring 3.0 创建了一种新的方式用以配置对象的注入(set注入或者构造参数注入),它便是SpEL (Spring Expression Language),SpEL使用#{…}作为定界符,所有在大框号中的字符都将被认为是SpEL。
spring-aop-4.3.25.RELEASE.jar
说明:这个jar文件包含在应用中使用Spring的AOP特性时所需的类。使用基于AOP的Spring特性,如声明型事务管理(Declarative Transaction Management)。
spring-aspects-4.3.25.RELEASE.jar
说明:Spring提供对AspectJ框架的整合(AspectJ:springAOP就是用aspectj来实现的,是依赖关系!AspectJ是动态代理的一种实现!而spring默认使用的就是AspectJ来实现的动态代理,spring自己的AOP就是使用AspectJ来实现的)。
spring-jdbc-4.3.25.RELEASE.jar
说明:Spring对JDBC数据访问进行封装的所有类。
spring-orm-4.3.25.RELEASE.jar
说明:包含Spring对DAO特性集进行了扩展,使其支持 iBATIS、JDO、OJB、TopLink,因为Hibernate已经独立成包了,现在不包含在这个包里了。这个jar文件里大部分的类都要依赖spring-dao.jar里的类,用这个包时你需要同时包含spring-dao.jar包。
spring-tx-4.3.25.RELEASE.jar
说明:Spring提供对事务的支持。
spring-web-4.3.25.RELEASE. .jar
说明:SpringWeb下的工具包。
spring-webmvc-4.3.25.RELEASE .jar
说明:包含Spring MVC框架相关的所有类。包含国际化、标签、Theme、视图展现的FreeMarker、JasperReports、Tiles、Velocity、XSLT相关类。当然,如果你的应用使用了独立的MVC框架,则无需这个JAR文件里的任何类。
2、 添加SpringAOP支持的补充包
com.springsource.net.sf.cglib-2.2.0.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
3、 添加持久层架包
mybatis-3.4.1.jar:mybatis架包
mysql-connector-java-5.1.37-bin.jar:数据库连接驱动架包
c3p0-0.9.1.2.jar:C3P0连接池架包
4、 添加MyBatis-Spring整合架包
mybatis-spring-1.3.0.jar:需要下载MyBatis官方指定匹配Spring版本的架包
5、 添加其他架包
commons-logging-1.2.jar:日志支持架包
log4j.jar:Debug调试输出日志架包
taglibs-standard-impl-1.2.1.jar、taglibs-standard-spec-1.2.1.jar:JSTL标签库架包
二、 规划项目结构
1、 包结构(src源码目录下):
org.ssm.domain:实体层
org.ssm.dao:持久层接口
org.ssm.service:业务层接口
org.ssm.service.impl:业务层实现类
org.ssm. controller:控制层
2、 配置文件目录(conf源码目录下):
org.ssm.dao:持久层SQL映射文件包
applicationContext.xml:Spring核心配置文件
log4j.xml:Debug调试输出配置文件
3、 WEB目录结构:
/WEB-INF/lib:项目架包目录
/WEB-INF/views:项目视图目录
/WEB-INF/spring-mvc-servlet.xml:SpringMVC核心配置文件
/WEB-INF/web.xml:项目配置文件
三、 编写配置文件
1、 Web项目配置文件(/WEB-INF/web.xml)配置:
<!—
配置Spring配置文件的位置
classpath:代表源码目录
–>
contextConfigLocation
classpath:applicationContext.xml
<!-- 配置Spring启动的监听器 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
<!-- 配置SpringMVC前端控制器 -->
<servlet>
<servlet-name>spring-mvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
1
<!-- 配置SpringMVC前端控制器映射 -->
<servlet-mapping>
<servlet-name>spring-mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 配置字符集过滤器 -->
<filter>
<filter-name>CharsetFilter</filter-name>
<filter-class>org.ssm.filter.CharsetFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharsetFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2、 Spring核心配置文件( /src/applicationContext.xml)配置:
<context:component-scan base-package=“org.ssm”>
<context:exclude-filter type=“annotation”
expression=“org.springframework.stereotype.Controller” />
</context:component-scan>
<!--
配置数据源:
com.mchange.v2.c3p0.ComboPooledDataSource:c3p0数据源
destroy-method="close":设置close方法为关闭连接方法
-->
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method=“close”>
<!-- 配置事务管理器 -->
<bean id="dataSourceTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置使用注解实现声明式事务 -->
<tx:annotation-driven
transaction-manager="transactionManager" />
<!-- 配置创建sqlSessionFactory -->
<bean id="sqlSessionFactoryBean"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 配置MyBatis-SQL映射文件所在位置 -->
<property name="mapperLocations"
value=“classpath:org/ssm/dao/*.xml”/>
<!-- 配置扫描MyBatis实现的持久层包扫描 -->
<mybatis-spring:scan base-package="org.ssm.dao"/>
<!-- 配置扫描MyBatis实现的持久层包扫描的另外一种方式 -->
<!-- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> -->
<!-- <property name="basePackage" value="org.ssm.dao"/> -->
<!-- </bean> -->
3、 SpringMVC核心配置文件( /WEB-INF/spring-mvc-servlet.xml)配置:
<context:component-scan
base-package=“org.ssm” use-default-filters=“false”>
<context:include-filter type=“annotation”
expression=“org.springframework.stereotype.Controller” />
</context:component-scan>
<!-- 配置SpringMVC视图解析器 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置路径映射的前缀规则 -->
<property name="prefix" value="/WEB-INF/views/" />
<!-- 配置路径映射的后缀规则 -->
<property name="suffix" value=".jsp"/>
</bean>
<!-- 配置注解、JSR303支持、数据格式化、类型转化器等功能的支持 -->
<mvc:annotation-driven />
<!-- 配置默认处理器,以支持访问静态资源 -->
<mvc:default-servlet-handler />
<!-- 配置不经过Controller处理的映射规则 -->
<mvc:view-controller path="/index" view-name="index" />
4、 Debug调试输出配置文件(/src/log4j.xml)配置:
将log4j.xml文件拷贝到源码目录,无需配置。
四、 编写数据库脚本
DROP TABLE IF EXISTS student;
CREATE TABLE student (
stuId int(11) NOT NULL AUTO_INCREMENT,
stuName varchar(50) NOT NULL,
age int(11) NOT NULL,
gender varchar(2) NOT NULL,
PRIMARY KEY (stuId
)
);
五、 模型层编码
实体类:
public class Student implements Serializable {
private int stuId;
private String stuName;
private int age;
private String gender;
//setter、getter 方法省略
}
数据访问接口:
public interface StudentDao {
public int insert(Student obj);
public int update(Student obj);
public int delete(Integer id);
public Student selectById(Integer id);
public List<Student> selectAll();
}
SQL映射文件:
<insert id="insert" parameterType="org.ssm.domain.Student">
insert into student(stuName,age,gender)
values(#{stuName},#{age},#{gender})
</insert>
<update id="update" parameterType="org.ssm.domain.Student">
update student set stuName=#{stuName},age=#{age},gender=#{gender}
where stuId=#{stuId}
</update>
<delete id="delete" parameterType="integer">
delete from student where stuId=#{id}
</delete>
<select id="selectById" resultType="org.ssm.domain.Student">
select * from student where stuId=#{id}
</select>
<select id="selectAll" resultType="org.ssm.domain.Student">
select * from student
</select>
业务层接口:
public interface StudentService {
public boolean insert(Student obj);
public boolean update(Student obj);
public boolean delete(Integer id);
public Student selectById(Integer id);
public List<Student> selectAll();
}
业务层实现类:
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentDao studentDao;
@Override
public boolean insert(Student obj) {
return this.studentDao.insert(obj)>0?true:false;
}
@Override
public boolean update(Student obj) {
return this.studentDao.update(obj)>0?true:false;
}
@Override
public boolean delete(Integer id) {
return this.studentDao.delete(id)>0?true:false;
}
@Override
public Student selectById(Integer id) {
return this.studentDao.selectById(id);
}
@Override
public List<Student> selectAll() {
return this.studentDao.selectAll();
}
}
字符过滤器:
public class CharsetFilter implements Filter {
private String charset;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
this.charset=filterConfig.getInitParameter("charset");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
request.setCharacterEncoding(this.charset);
response.setCharacterEncoding(this.charset);
response.setContentType("text/html;charset="+this.charset);
filterChain.doFilter(request, response);
}
@Override
public void destroy() {
Filter.super.destroy();
this.charset=null;
}
}
六、 控制器编码
获取原生API基类:
public class BaseController {
@Autowired
protected HttpServletRequest request;
@Autowired
protected HttpServletResponse response;
}
Controller处理器类:
@RequestMapping("/student")
@Controller
public class StudentController extends BaseController {
@Autowired
private StudentService studentService;
@RequestMapping("/index")
public String index(Map<String,Object> map) {
map.put("objs", this.studentService.selectAll());
return "student/index";
}
@RequestMapping(value = "/append",method = RequestMethod.GET)
public String append() {
return "student/append";
}
@RequestMapping(value = "/append",method = RequestMethod.POST)
public String append(Student obj) {
if(this.studentService.insert(obj))
return "redirect:/student/index";
else {
request.setAttribute("msg", "添加学生失败!");
return "error";
}
}
@RequestMapping(value = "/modify",method = RequestMethod.GET)
public String modify(Map<String, Object> map,Integer id) {
map.put("obj", this.studentService.selectById(id));
return "student/modify";
}
@RequestMapping(value = "/modify",method = RequestMethod.POST)
public String modify(Student obj) {
if(this.studentService.update(obj))
return "redirect:/student/index";
else {
request.setAttribute("msg", "修改学生信息失败!");
return "error";
}
}
@RequestMapping("/remove")
public String remove(Integer id) {
if(this.studentService.delete(id))
return "redirect:/student/index";
else {
request.setAttribute("msg", "删除学生信息失败!");
return "error";
}
}
@RequestMapping("/detail")
public String detail(Map<String, Object> map,Integer id) {
map.put("obj", this.studentService.selectById(id));
return "student/detail";
}
}
七、 视图编码
1、/WEB-INF/views/index.jsp:
<head>
<base href="${pageContext.request.contextPath }/">
<meta charset="utf-8">
</head>
<body>
学生管理系统
2、/WEB-INF/views/error.jsp:Error Page
<head>
<base href="${pageContext.request.contextPath }/">
<meta charset="utf-8">
</head>
<body>
<h1>Student List</h1>
<table style="width:800px;border:1px #000 solid">
<tr>
<td>ID</td>
<td>Name</td>
<td>Age</td>
<td>Gender</td>
<td>Operate</td>
</tr>
<c:forEach var="obj" items="${objs }" varStatus="status">
<tr>
<td>${status.index+1 }</td>
<td>
<a href="student/detail?id=${obj.stuId }">
${obj.stuName }
</a>
</td>
<td>${obj.age }</td>
<td>${obj.gender }</td>
<td>
<a href="student/modify?id=${obj.stuId }">Modify</a>
<a href="student/remove?id=${obj.stuId }">Remove</a>
</td>
</tr>
</c:forEach>
</table>
<a href="student/append">Append</a>
</body>
4、/WEB-INF/views/student/append.jsp:
<head>
<base href="${pageContext.request.contextPath }/">
<meta charset="utf-8">
<script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
</head>
<body>
<h1>Student Append</h1>
<form action="student/append" method="post">
name:<input id="stuName" type="text" name="stuName"> <br/>
age:<input id="age" type="text" name="age"> <br/>
gender:<input id="gender" type="text" name="gender"> <br/>
<input id="btn" type="submit" value="submit">
</form>
</body>
5、/WEB-INF/views/student/modify.jsp:
<head>
<base href="${pageContext.request.contextPath }/">
<meta charset="utf-8">
</head>
<body>
<h1>Student Modify</h1>
<form action="student/modify" method="post">
<input type="hidden" name="stuId" value="${obj.stuId }">
name:
<input type="text" name="stuName" value="${obj.stuName }"><br/>
age:<input type="text" name="age" value="${obj.age }"><br/>
gender:
<input type="text" name="gender" value="${obj.gender }"><br/>
<input type="submit" value="submit">
</form>
</body>
6、/WEB-INF/views/student/detail.jsp:
<head>
<base href="${pageContext.request.contextPath }/">
<meta charset="utf-8">
</head>
<body>
<h1>Student Detail</h1>
<ul>
<li>id:${obj.stuId }</li>
<li>name:${obj.stuName }</li>
<li>age:${obj.age }</li>
<li>gender:${obj.gender }</li>
</ul>
<a href="student/index">Return To List</a>
</body>
八、 发布测试,整合结束