环境搭建
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的注解驱动,会自动注册HandlerMapping、HandlerAdapter,使用json转换器来支持ajax的json交互-->
<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"/>
<!--下面这种配置静态资源的方式容易出错,尽量使用上面那种-->
<!--<mvc:resources mapping="/resource/js/**" location="/resource/js/**" />-->
<!--<mvc:resources mapping="/resource/css/**" location="/resource/css/**" />-->
<!--<mvc:resources mapping="/resource/image/**" location="/resource/image/**" />-->
</beans>
既然是springmvc,那mvc(表现层,前端+controller)的controller(包扫描)、view(视图解析器)、前端要用的静态资源都要配置,
至于model,表现层、业务层、持久层都要用,放到spring配置文件中去配置。
看到<mvc: />、<tx: />开头的标签,十有八九IDEA要导错约束,将cache换为mvc、tx即可,xsi中对应的部分也要改(已标红)。
如果不改,会报错:“通配符的匹配很全面, 但无法找到元素 'mvc:annotation-driven' 的声明。”、没有这样的bean。
静态资源的路径:
<%--相对路径,注意开头不能加/。这个路径是加在当前页面的url后的,很容易出错,尤其是使用url模板映射时,不推荐 --%>
<img src="resource/image/1.jpg" />
<%--绝对路径,推荐--%>
<img src="${pageContext.request.contextPath}/resource/image/1.jpg" />
静态资源的配置,有时候代码本身没有错误,报404可能是因为:
- 使用的是浏览器缓存,清除缓存或者换个浏览器试试
- IDEA中调试时,先前就已run | debug,修改代码后,未先点击停止,直接点重新部署 | 重启服务器。不要图省事儿,先点停止,再点部署|重启服务器,能避免很多问题。
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" />
<!--配置数据源,此处使用dbcp-->
<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>
<!--配置MyBatis的SqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--注入数据源-->
<property name="dataSource" ref="dataSource" />
<!--指定mybatis配置文件的位置-->
<property name="configLocation" value="classpath:mybatis-config.xml" />
</bean>
<!--配置事务管理器-->
<!--<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">-->
<!-- <!–注入数据源–>-->
<!-- <property name="dataSource" ref="dataSource" />-->
<!--</bean>-->
<!--开启事务注解,指定要使用的事务管理器-->
<!--<tx:annotation-driven transaction-manager="transactionManager" />-->
<!--包扫描-->
<context:component-scan base-package="com.chy.service,com.chy.po" />
<!--mapper扫描配置-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--指定mapper接口所在的包,有多个包时使用逗号或分号隔开-->
<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";
}
}
来源:https://www.cnblogs.com/chy18883701161/p/12259365.html