SSM整合

 

环境搭建

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。

 

 

静态资源路径的2种写法:(不能直接使用IDEA提示的路径)

  <%-- 相对路径,可能会出现问题--%>
  <img src="resource/image/1.jpg" />
  
  <%--绝对路径--%>
  <img src="${pageContext.request.contextPath}/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" />

    <!--配置数据源,此处使用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">-->
    <!--    &lt;!&ndash;注入数据源&ndash;&gt;-->
    <!--    <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";
    }
}

 

posted @ 2020-02-04 22:00  chy_18883701161  阅读(343)  评论(0编辑  收藏  举报