环境搭建
1、新建SpringMVC项目,添加所需的jar包
- spring-core.jar
- spring-beans.jar
- spring-context.jar
- spring-expression.jar
- spring-aop.jar (使用spring的注解)
- spring-jdbc.jar (spring-tx.jar依赖spring-jdbc,如果要使用spring的事务管理,需添加此包。就算不使用spring的事务管理,mybatis-spring.jar依赖此包,也必须添加此包)
- spring-tx.jar (事务一般是用spring的事务管理,如果要使用spring的事务管理,需要添加此包)
(如果要整合AspectJ)
- spring-aspects.jar
- aopalliance.jar
- aspectjweaver.jar
- mybatis.jar
- log4j.jar
- commons-logging.jar
- mybatis-spring.jar (spring整合mybatis需要的包。springmvc本身就是spring的一部分,本来就要搭配使用,不存在什么整合的说法)
- 数据库驱动
- dbcp的jar包 (也可以使用其它连接池)
- java web2个jar:servlet、jsp各一个 (需要用到request、response、session等对象)
2、项目下新建文件夹config,右键标识为资源根目录(Resources Root),把spring的配置文件applicationContext.xml、springmvc的配置文件dispatcher-servlet.xml放进去。
本来applicationContext.xml、dispatcher-servlet.xml、web.xml都在WEB-INF下的,因为ssm配置文件多,一般都拿出来单独放在一个文件夹里,只在WEB-INF下留一个web.xml。
在spring配置文件中引入mybatis配置文件,然后在web.xml中引入spring配置文件、springmvc配置文件。web服务器默认加载WEB-INF下的web.xml,web.xml不能移到别处。
其实spring、springmvc的配置文件都是spring的配置文件,可以写在一个xml中,但ssm配置多,分开来写,使单个xml不臃肿,即模块化配置。
springmvc配置文件中一般只写springmvc相关的配置,比如springmvc的注解驱动、视图解析、controller层的包扫描、springmvc的拦截器,其它配置都写到spring配置文件中。
如果spring配置文件很大,也可以划分为多个xml,比如spring-tx.xml(事务配置)、spring-db.xml(数据库相关配置).....在web.xml中使用spring-*.xml引入即可。
3、config下新建db.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/my_db?serverTimezone=GMT
jdbc.username=chy
jdbc.password=abcd
jdbc.initialSize=5
jdbc.maxTotal=30
jdbc.maxIdle=10
4、config下新建log4j.properties
# Global logging configuration
log4j.rootLogger=DEBUG, stdout,D
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#如果查看调试信息,改为DEBUG即可
log4j.appender.stdout.Threshold = ERROR
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
# File output...
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
#相对路径,部署到tomcat后,会输出日志到tomcat的logs文件夹下的error.log中
log4j.appender.D.File = ../logs/error.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = ERROR
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
log4j.appender.D.encoding=UTF-8
5、config下新建mybatis-config.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> <typeAliases> <package name="com.chy.po"/> typeAliases> configuration>
数据库配置、mapper指定都移到spring配置文件中去了,mybatis配置文件只需指定po类的别名。
6、新建包、文件夹
dao下面放mapper接口、映射文件。
service下放业务层的接口、实现类,可以建一个子包impl来放实现类。
controller不需要写接口。
如果po类需要序列化,需要implements Serializable。
WEB-INF下新建lib文件夹来存放jar包,新建jsp文件夹来存放jsp文件。
静态资源的放法很多:
- 在web下新建resource(不需要右键标注),resource下新建css、js、image。(最常用)
- web下新建css、js、image
- WEB-INF下新建css、js、image
7、在dispatcher-servlet.xml中配置springmvc
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:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://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.chy.controller" /> <mvc:annotation-driven /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> bean> <mvc:default-servlet-handler default-servlet-name="default"/> beans>
既然是springmvc,那mvc(表现层,前端+controller)的controller(包扫描)、view(视图解析器)、前端要用的静态资源都要配置,
至于model,表现层、业务层、持久层都要用,放到spring配置文件中去配置。
看到
如果不改,会报错:“通配符的匹配很全面, 但无法找到元素 'mvc:annotation-driven' 的声明。”、没有这样的bean。
静态资源路径的2种写法:(不能直接使用IDEA提示的路径)
<%-- 相对路径,可能会出现问题--%> <img src="resource/image/1.jpg" /> <%--绝对路径--%>
静态资源的配置,有时候代码本身没有错误,报404可能是因为:
- 使用的是浏览器缓存,清除缓存或者换个浏览器试试。
- IDEA中调试时,先前就已run | debug,修改代码后,未先点击停止,直接点重新部署 | 重启服务器。不要图省事儿,先点停止,再点部署|重启服务器,能避免很多问题。
- 部署项目时资源拷贝不全,可在out目录查看资源是否拷贝齐全。
7、在applicationContext.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:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <context:property-placeholder location="classpath:db.properties" /> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="initialSize" value="${jdbc.initialSize}" /> <property name="maxTotal" value="${jdbc.maxTotal}" /> <property name="maxIdle" value="${jdbc.maxIdle}" /> bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:mybatis-config.xml" /> bean> <context:component-scan base-package="com.chy.service,com.chy.po" /> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.chy.dao" /> bean> beans>
各层编写示例
po:
@Component public class User implements Serializable { private int id; private String username; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
dao:
public interface UserDao { public User queryUserById(Integer id); }
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.chy.dao.UserDao"> <select id="queryUserById" parameterType="integer" resultType="user"> select * from user_tb where id=#{id} select> mapper>
这2个是mapper接口、映射文件。
service:
public interface UserService { public User queryUserById(Integer id); }
@Service("userService") public class UserServiceImpl implements UserService { private UserDao userDao; @Autowired public void setUserDao(UserDao userDao) { this.userDao = userDao; } @Override public User queryUserById(Integer id) { return userDao.queryUserById(id); } }
controller:
@Controller @RequestMapping("/user") public class UserController { private UserService userService; @Autowired public void setUserService(UserService userService) { this.userService = userService; } @RequestMapping("/{id}") public String queryUserById(@PathVariable Integer id, Model model){ User user = userService.queryUserById(id); model.addAttribute("user", user); return "user_info"; } }