一步步教你搭建Spring MVC && Spring &&mybatis框架
本文使用的是Spring 4.3.2
项目源码下载地址
0x01 创建工程
下载地址
解压后的截图
新创建一个SpringTest的web project,将libs下的所有jar放到项目的WEB-INF/lib目录下
结果如图
0x02 创建Spring MVC 的配置文件
在src目录下新建 SpringMVCConfig.xml 文件,并复制以下内容到文件中。如果不出问题的话,保存后,这个文件的图标会变成一片小绿叶(Spring的图标)
<?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:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 注解驱动 -->
<mvc:annotation-driven>
</mvc:annotation-driven>
<!-- 自动装配 -->
<context:component-scan base-package="com.zdr.controller" />
<!--视图解析器 -->
<bean id="jspViewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 加载静态资源 -->
<mvc:default-servlet-handler/>
</beans>
注解驱动:是可以自动将将请求的返回数据转换为JSON数据的工具,你可以直接将一些对象,集合返回给浏览器,这个驱动会自动将数据转换为JSON数据返回给浏览器。
自动装配:com.zdr.controller 的包是你自己创建的,Spring会自动扫描这个包下的所有带Controller注解的类。这个包下是所有controller的类,这些类不需要你自己去new就可以使用,是Spring MVC帮你管理的。
视图解析器:根据controller返回的数据,会去匹配相应的视图。Spring MVC会去/WEB-INF/pages/目录下找相应的.jsp文件。其中的pages目录是你自己创建的。
加载静态资源:有些静态资源例如图片,css不需要经过controlle的管理,所以需要做这个配置。
到这一步后,项目的结构如图
0x03 加载Spring MVC 的配置文件。
在web.xml文件中添加下面的代码
<!-- spring mvc 配置 -->
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:SpringMVCConfig.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
其中 classpaths 指向的文件就是你在上一步创建的文件。
创建Controller
在 com.zdr.controller 包下新建一个java类,作为controller,代码如下
package com.zdr.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class TestController {
@RequestMapping(value = "/test")
public String gotoIndex(){
return "/index";
}
}
@Controller:添加这个注解后Spring MVC便会将这个类当作controller处理。
@RequestMapping: 这个注解是用在controller的方法上的。value指定当你访问哪个路径时会执行该方法。比如要执行该方法需要访问的地址是 http://localhost:8080/SpringTest/test
return "/index": 一定要注意!!!这个返回值不要随便写。这个是跟你的视图解析器是对应的,在我的这个项目中,当执行完这句后,Spring MVC 会去 该项目的 /WEB-INF/pages/ 目录下,去寻找 index.jsp 的页面。如果没有的话会出现404的错误。还有,返回值不带.jsp,.html等后缀
0x04 创建视图
在 /WEB-INF/pages/ 目录下创建 index.jsp。一定要注意,跟上一步的返回值一样。
到这一步整个项目的结构如图
访问下 http://localhost:8080/SpringTest/test试试吧。
0x05 返回字符串到浏览器
如果我们不希望跳转页面,希望返回一些字符串到浏览器,需要用到@ResponseBody注解。代码如下
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class TestController {
@RequestMapping(value = "/test")
@ResponseBody
public String gotoIndex(){
return "/index";
}
}
再次访问下试试看,一定要记得,每次修改了Controller都有重启tomcat。
0x06 返回 JSON 数据到浏览器
0x06.1 添加jackson包
下载地址
0x06.2 添加消息转换器
在 SpringMVCConfig.xml 中做如下修改
<!-- 注解驱动 -->
<mvc:annotation-driven>
<mvc:message-converters>
<bean class = "org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
</bean>
<bean class = "org.springframework.http.converter.StringHttpMessageConverter">
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
添加这句后会自动将返回的对象转换成JSON数据。
0x06.3 创建User类
public class User {
private String account;
private String pwd;
public User() {
}
//以及对应的get set方法,一定要有一个无餐的构造方法
}
0x06.4 Controller代码
@RequestMapping(value = "/json")
@ResponseBody
public User getJSON(){
return new User("test","123456");
}
访问 http://localhost:8080/SpringTest/json
结果如图
同样的方法你也可以返回List集合。
Spring MVC 告一段落,下面开始 Spring 。
0x07 Spring 工作流程
Spring 的工作流程是: 浏览器发出请求到Controller -> Controller 调用对应的Service执行 ->
Service 调用对应的dao层获得结果。然后再依次返回给浏览器。
0x08 创建 Spring 配置文件
在src目录下新建SpringConfig.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:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 自动装配 -->
<context:component-scan base-package="com.zdr.service" />
<context:component-scan base-package="com.zdr.dao" />
</beans>
0x09 加载 SpringConfig.xml 文件
在web.xml文件中添加下面的代码
<!-- spring 配置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:SpringConfig.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
一定要将 Spring 配置放在 Spring MVC配置上面
自动装配的那两个包是你自己创建的。
正项目的结构如图
0x0A 创建 dao
import java.util.List;
import com.zdr.entity.User;
public interface UserDao {
public List<User> findAllUsers();
}
//-----------我是分割线-----------
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.zdr.dao.BaseDao;
import com.zdr.dao.baseDao.UserDao;
import com.zdr.entity.User;
@Repository
public class UserDaoImpl extends BaseDao implements UserDao{
//代码太多,不宜粘贴,源码已上传github
}
需要注意的是,每一个dao的实现类都需要添加@Repository注解。
BaseDao 主要实现了数据库的连接。
0x0B 创建 service
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zdr.dao.baseDao.UserDao;
import com.zdr.entity.User;
@Service
public class UserService {
@Autowired
private UserDao userDao;
public List<User> findAllUsers(){
return userDao.findAllUsers();
}
}
同样Service也需要添加@Service注解,@Autowired注解是用来自动生成Dao的,添加这个注解后,你便不需要自己创建userDao了。可以直接使用。
0x0C 修改 Controller代码
//使用Spring 管理
@RequestMapping(value = "/getAllUsers")
@ResponseBody
public List<User> getAllUsers(){
return userService.findAllUsers();
}
记得重启tomcat
运行结果
Spring 到这里就结束了,下面是myBatis
0x0D myBatis
下载地址请自行百度将相应的jar包导入项目
0x0E 创建 myBatis配置文件
在src目录下新建myBatisConfig.xml文件,代码如下
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource = "jdbc.properties">
</properties>
<typeAliases>
<package name = "com.zdr.mapper.entity"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!-- 注册映射文件 -->
<mappers>
<mapper resource="com/zdr/mapper/UserMapper.xml" />
</mappers>
</configuration>
注意映射文件UserMapper.xml是你自己创建的。为了不与Spring混淆,这里采用了第二种配置文件。在src目录下创建jdbc.properties文件,代码如下
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc\:mysql\://localhost\:3306/springTest
jdbc.username=root
jdbc.password=rootzdr
0x0F 创建UserMapper.xml文件
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zdr.dao.baseDao.UserDao">
<select id = "findAllUsers" resultType = "User">
select account,pwd from users
</select>
</mapper>
0x10 写service
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.zdr.dao.baseDao.UserDao;
import com.zdr.entity.User;
import com.zdr.utils.SqlSessionFactoryUtil;
public class MyBatisUserService {
public List<User> findUsersByMybatis(){
SqlSession session= SqlSessionFactoryUtil.openSession();
UserDao userDao = session.getMapper(UserDao.class);
List<User> list= userDao.findAllUsers();
for(User u :list){
System.out.println(u.toString());
}
return list;
}
}
0x11 controller测试
@RequestMapping(value = "/getUsers")
@ResponseBody
public List<User> getUsers(){
MyBatisUserService myService = new MyBatisUserService();
return myService.findUsersByMybatis();
}