前言
我是一名练习时长半年多的Java练习生,喜欢CV大法。嗯。跑题了。。。。
在终、终、终于学完Spring、SpringMvc和MyBatis后,今天我也整合一下他们。算是对自己学习成果的检测。
废话不多说,直接开始。
1、IDEA创建maven的web工程
接着NEXT,其他没啥说的,直接看我创建好的项目结构
项目创建好后右下角会弹出这个,直接允许
默认目录结构没有java和resources目录,这个时候在src目录下新建这两个文件,新建后文件默认是灰色的,这时点击右边的maven按钮,然后刷新,文件目录就会自动指定Java代码目录及资源文件路径。
看一下项目整合好的文件目录
这样项目结构就没有问题了,先按照我的结果把包创建一下。
下面开始配置文件编写
Tomcat启动后会先加载wen.xml文件就是WEB-INF下面的
那我就首先配置它,虽然这样它加载的spring.xml文件和spring-mvc.xml还没有创建会报红,但是我觉得这样思路清楚。。。。各个配置作用就写在注释里面吧!
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.15.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.15.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.15.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.1.15.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.15.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.1.15.RELEASE</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.15</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.15.RELEASE</version>
</dependency>
</dependencies>
web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<!--加载spring的配置文件 tomcat启动后就会加载它-->
<!--为什么要提前加载?Spring的核心功能是IOC和AOP,IOC即控制反转,我们将对象的
创建权交给Spring容器来控制,在不使用Spring前比如我们在业务层(service)调用数
据访问层(Dao),我们会写这么一句
private XxxDao xxxDao = new XxxDaoImpl();
使用Spring后我们就不要这么麻烦了,直接private XxxDao XxxDao;一个@Autowired
注解写在这句话上面即可。扯远了。。。。
提前加载配置文件,将spring创建权限交给spring容器,当我们需要使用的时候,直接向
spring要就可以了。
-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
<!--Spring的监听器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--前端控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!--spring-mvc配置文件-->
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!--拦截所有请求,不拦截*.jsp-->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--字符过滤器,处理前端传值乱码-->
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<!--拦截所有请求-->
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
spring主配置文件spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://mybatis.org/schema/mybatis-spring
http://mybatis.org/schema/mybatis-spring.xsd">
<!--包扫描-->
<context:component-scan base-package="com.zhy">
<!--不扫描Controller-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--加载jdbc配置文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--配置数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--mybatis整合-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--指定mybatis全局配置文件位置-->
<property name="configLocation" value="classpath:mybatis-conf.xml"/>
<!--指定mapper位置-->
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
<!--扫描所有的dao接口的实现,加入到ioc容器中-->
<!--方式一-->
<!--<mybatis:scan base-package="com.zhy.dao"/>-->
<!--方式二-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--扫描所有的dao接口的实现,加入到ioc容器中-->
<property name="basePackage" value="com.zhy.dao"/>
</bean>
<!--事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--开启事务-->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!--aop-->
<aop:aspectj-autoproxy/>
</beans>
jdbc.properties文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.user=root
jdbc.password=123456
我连接的是本地mysql的test库,你需要指定自己的数据库,及用户名密码
spring-mvc.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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.zhy" use-default-filters="false">
<!--只扫描Controller-->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/pages/"/>
<!--后缀-->
<property name="suffix" value=".html"/>
</bean>
<!--注解支持-->
<mvc:annotation-driven/>
<!--将springmvc不能处理的请求交给tomcat-->
<!--能支持springmvc更高级的一些功能,JS303校验,快捷的ajax...映射动态请求-->
<mvc:default-servlet-handler/>
</beans>
mybatis-conf.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--这里可以配置一些插件什么的,关于mybatis与spring整合都配置在spring.xml中了-->
</configuration>
到现在配置文件终于配置完了,这个时候你就可以配置一下tomcat或者使用maven插件运行一下了,就可以看到一个大大的HelloWorld
下面写一个简单的登录业务
首先做一个简单的登录页面,这个随便搞吧。将系统默认生成的index.jsp改成index.html,不改应该也行,然后写个form表单如下
name属性要和User实体类的属性相同
实质是和setter方法的setUsername这个set后面的Username首字母小写要一样,不然后台接收不到参数。
<form action="/user/login" method="post">
<input type="text" name="username" id="username"><br>
<input type="password" name="password" id="password"><br>
<input type="submit" value="登录">
</form>
实体类User.java
public class User {
private Integer id;
private String username;
private String password;
//getter和setter方法就不贴了
}
控制层UserController.java
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired//将UserService 注入,这个就是替代以前的new操作
private UserService userService;
@RequestMapping("/login")/*通过前端form表单的action属性/user/login找到该*/
public String getUserByUserName(User login_user){
User user = userService.getUserByUserName(login_user.getUsername());
if (user==null){//用户名不存在
return "error";//通过视图解析器,会找到/WEB-INF/pages/error.xml文件
}else if(!user.getPassword().equals(login_user.getPassword())){//密码不正确
return "error";
}else {//可以登录
return "success";//通过视图解析器,会找到/WEB-INF/pages/success.xml文件
}
}
}
UserService.java和UserServiceImpl.java
public interface UserService {
User getUserByUserName(String username);
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public User getUserByUserName(String username) {
return userDao.getUserByUserName(username);
}
}
最后是数据访问层了
UserDao就是一个接口,sql都在resources,目录下的mapper文件中
在spring.xml文件中对mybatis整合时指定了dao层接口位置及对应的mapper文件位置
public interface UserDao {
User getUserByUserName(String username);
}
UserMapper.xm文件
<?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.zhy.dao.UserDao">
<!-- User getUserByUserName(String username);-->
<select id="getUserByUserName" resultType="com.zhy.bean.User">
select * from user where username = #{username}
</select>
</mapper>
数据库创建一个user表里面三个字段,和User实体类字段相同
到此就整合完毕了,应该没有什么忘记了吧!
哦,还有那个pages文件夹,里面就两个html文件啥也没写,如果你有特殊需求,就自己动手吧。