SSM整合,快速新建javaWeb项目


整合前需要了解:

spring和springmvc包扫描的注意事项

Spring applicationContext.xml (父容器),SpringMVC springmvc-servlet.xml (子容器)

此时项目中有两个工厂

  • DispatcherServlet 启动的springMVC工厂==负责生产C及springMVC自己的系统组件(Servlet)

  • ContextLoaderListener 启动的spring工厂==负责生产其他所有组件(Listener)

  • springMVC的工厂会被设置为spring工厂的子工厂,可以随意获取spring工厂中的组件

  • 整合过程,就是累加:代码+依赖+配置。然后将service注入给controller即可

两个工厂不能有彼此侵入,即,生产的组件不能有重合。

  • mvc.xml中只扫描controller包, 其他不管, 其他包交给spring框架
    
    <context:component-scan base-package="com.xx" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    context:component-scan>
  • applicationContext.xml中不扫描controller包, 这个包交给springMvc框架, spring框架扫描非controller的其他包
    
    <context:component-scan base-package="com.xx" use-default-filters="true">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    context:component-scan>

 

正式开始整合

一、准备测试用的数据库

CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  `gender` tinyint(255) DEFAULT NULL,
  `regist_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of t_user
-- ----------------------------
INSERT INTO `t_user` VALUES ('1', '青龙', '123', '1', '2021-03-07 09:08:39');
INSERT INTO `t_user` VALUES ('2', '白虎', '123', '0', '2021-03-01 09:08:56');
INSERT INTO `t_user` VALUES ('3', '朱雀', '123', '0', '2021-03-01 09:09:10');
INSERT INTO `t_user` VALUES ('4', '玄武', '123', '1', '2021-03-07 09:09:24');

二、创建项目, 项目名为ssmDemo, 选择骨架为 maven-archetype-webapp, 创建后pom文件内容如下:


    UTF-8
    1.8
    1.8



    
    
        org.springframework
        spring-webmvc
        5.1.6.RELEASE
    

    
        
        javax.servlet
        jstl
        1.2
    
    
        
        javax.servlet
        javax.servlet-api
        3.1.0
        provided
    
    
        
        javax.servlet
        jsp-api
        2.0
        provided
    

    
    
        com.alibaba
        fastjson
        1.2.54
    

    
    
        org.springframework
        spring-context
        5.1.6.RELEASE
    
    
        org.springframework
        spring-aspects
        5.1.6.RELEASE
    
    
        org.springframework
        spring-test
        5.1.6.RELEASE
    
    
        org.springframework
        spring-jdbc
        5.1.6.RELEASE
    

    
    
        org.mybatis
        mybatis-spring
        1.3.1
    

    
    
        org.mybatis
        mybatis
        3.4.5
    

    
    
        mysql
        mysql-connector-java
        5.1.25
        runtime
    

    
    
        com.alibaba
        druid
        1.1.12
    

    
    
        junit
        junit
        4.12
    

    
    
        com.github.pagehelper
        pagehelper
        5.1.10
    

三、检查或创建项目结构

  • main目录下新建java目录放java源代码

    • java目录下创建包com.xx.controller 放控制层代码

    • java目录下创建包com.xx.dao 放持久层代码

    • java目录下创建包com.xx.service放业务层代码

    • java目录下创建包com.xx.pojo放实体类代码

    • java目录下创建包com.xx.utils 放工具类代码

    • java目录下创建包com.xx.config放初始化类代码

    • java目录下创建包com.xx.interceptor放拦截器代码

  • main目录下创建resources目录放配置文件

    • resources目录下创建com/xx/dao用于放置mybatis中对应的dao映射文件

  • webapp/WEB-INF/目录下创建 jsp目录放页面

  • webapp目录下创建js目录, img目录, css目录用于放置, js脚本, 图片, css样式

web.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

  
  <servlet>
      <servlet-name>mvc_shineservlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
      <init-param>
        <param-name>contextConfigLocationparam-name>
        <param-value>classpath:mvc.xmlparam-value>
      init-param>
      
      <load-on-startup>1load-on-startup>
  servlet>
  <servlet-mapping>
      <servlet-name>mvc_shineservlet-name>
      <url-pattern>/url-pattern>
  servlet-mapping>

  
  <filter>
      <filter-name>encodingfilter-name>
      <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
      <init-param>
        <param-name>encodingparam-name>
        <param-value>utf-8param-value>
      init-param>
  filter>
  <filter-mapping>
      <filter-name>encodingfilter-name>
      <url-pattern>/*url-pattern>
  filter-mapping>

  
  <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
  listener>
  <context-param>
      <param-name>contextConfigLocationparam-name>
      <param-value>classpath:applicationContext.xmlparam-value>
  context-param>
web-app>
applicationContext.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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/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://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">


    
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        
        <property name="driverClassName" value="${jdbc.driverClass}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>

        
        <property name="initialSize" value="${jdbc.init}"/>
        <property name="minIdle" value="${jdbc.minIdle}"/>
        <property name="maxActive" value="${jdbc.maxActive}"/>

        
        <property name="maxWait" value="60000"/>

        
        <property name="timeBetweenEvictionRunsMillis" value="60000"/>

        
        <property name="minEvictableIdleTimeMillis" value="300000"/>
    bean>

    
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        
        <property name="dataSource" ref="dataSource">property>
        
        <property name="mapperLocations">
            <list>
                <value>classpath:com/xx/dao/*.xmlvalue>
            list>
        property>
        
        <property name="typeAliasesPackage" value="com.xx.pojo">property>

        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <props>
                            
                            <prop key="reasonable">trueprop>
                        props>
                    property>
                bean>
            array>
        property>
    bean>

    
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        
        <property name="basePackage" value="com.xx.dao">property>
        
        
    bean>

    
    <context:component-scan base-package="com.xx" use-default-filters="true">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    context:component-scan>

    
    <bean id="tx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource">property>
    bean>

    
    <tx:annotation-driven transaction-manager="tx"/>
beans>

mvc.xml配置

<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.xx" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller">context:include-filter>
    context:component-scan>

    
    <mvc:annotation-driven>
        
        <mvc:message-converters>
            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                
                <property name="supportedMediaTypes">
                    <list>
                        <value>application/jsonvalue>
                    list>
                property>
            bean>
        mvc:message-converters>
    mvc:annotation-driven>

    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        
        <property name="prefix" value="/WEB-INF/jsp/">property>
        
        <property name="suffix" value=".jsp">property>
    bean>

    
    <mvc:default-servlet-handler/>
beans>

jdbc.properties配置

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mydb2?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=123456
jdbc.init=1
jdbc.minIdle=1
jdbc.maxActive=3

---测试用的页面---

/WEB-INF/jsp/ 目录下页面user.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html lang="en">
<head>
    <title>Hello, world!title>
head>
<body>

    <table width="500px" align="center" border="1px">
        <thead>
            <tr>
                <th>idth>
                <th>usernameth>
                <th>passwordth>
                <th>genderth>
                <th>registTimeth>
            tr>
        thead>
        <tbody>
            <c:forEach items="${requestScope.users}" var="user">
                <tr>
                    <td>${user.id}td>
                    <td>${user.username}td>
                    <td>${user.password}td>
                    <td>${user.gender}td>
                    <td>
                        <fmt:formatDate value="${user.registTime}" pattern="yyyy-MM-dd"/>
                    td>
                tr>
            c:forEach>
        tbody>
    table>
body>
html>

/WEB-INF/jsp/ 目录下页面userPro.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
doctype html>
<html lang="en">
<head>
    <title>Hello, world!title>
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.4.1/dist/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
    
    <script src="https://cdn.jsdelivr.net/npm/jquery@3.4.1/dist/jquery.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous">script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous">script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.4.1/dist/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1ixxktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous">script>

head>
<body>

    <table class="table table-bordered table-striped table-dark">
        <thead>
            <tr>
                <th>idth>
                <th>usernameth>
                <th>passwordth>
                <th>genderth>
                <th>registTimeth>
            tr>
        thead>
        <tbody>
            <c:forEach items="${requestScope.data.list}" var="user">
                <tr>
                    <td>${user.id}td>
                    <td>${user.username}td>
                    <td>${user.password}td>
                    <td>${user.gender}td>
                    <td>
                        <fmt:formatDate value="${user.registTime}" pattern="yyyy-MM-dd"/>
                    td>
                tr>
            c:forEach>
        tbody>
    table>
    <nav aria-label="...">
        <ul class="pagination justify-content-center" >
            <c:if test="${requestScope.data.hasPreviousPage}">
                <li class="page-item">
                    <a class="page-link" href="${pageContext.request.contextPath}/users?pageNum=${requestScope.data.prePage}" tabindex="-1" aria-disabled="true">Previousa>
                li>
            c:if>
            <c:if test="${!requestScope.data.hasPreviousPage}">
                <li class="page-item disabled">
                    <a class="page-link" href="${pageContext.request.contextPath}/users?pageNum=${requestScope.data.prePage}" tabindex="-1" aria-disabled="true">Previousa>
                li>
            c:if>

            <%--<li class="page-item"><a class="page-link" href="#">1a>li>
            <li class="page-item active" aria-current="page">
                <a class="page-link" href="#">2 <span class="sr-only">(current)span>a>
            li>
            <li class="page-item"><a class="page-link" href="#">3a>li>--%>

            <c:forEach begin="1" end="${requestScope.data.pages}" var="pageNum">
                <c:if test="${pageNum==requestScope.data.pageNum}">
                    <li class="page-item active"><a class="page-link" href="${pageContext.request.contextPath}/users?pageNum=${pageNum}">${pageNum}a>li>
                c:if>
                <c:if test="${pageNum!=requestScope.data.pageNum}">
                    <li class="page-item"><a class="page-link" href="${pageContext.request.contextPath}/users?pageNum=${pageNum}">${pageNum}a>li>
                c:if>
            c:forEach>


                <c:if test="${requestScope.data.hasNextPage}">
                    <li class="page-item">
                        <a class="page-link" href="${pageContext.request.contextPath}/users?pageNum=${requestScope.data.nextPage}">Nexta>
                    li>
                c:if>
                <c:if test="${!requestScope.data.hasNextPage}">
                    <li class="page-item disabled">
                        <a class="page-link" href="${pageContext.request.contextPath}/users?pageNum=${requestScope.data.nextPage}">Nexta>
                    li>
                c:if>

        ul>
    nav>
body>
html>

准备实体类pojo

package com.xx.pojo;

import java.util.Date;

public class User {
    private Integer id;
    private String username;
    private String password;
    private Boolean gender;
    private Date registTime;

    public User(){}
    public User(Integer id, String username, String password, Boolean gender, Date registTime) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.gender = gender;
        this.registTime = registTime;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", gender=" + gender +
                ", registTime=" + registTime +
                '}';
    }

    //  ....... get 和 set 方法......
  
}
package com.xx.pojo;

public class Page {
    private Integer pageNum;
    private Integer pageSize=3;

    public Page(){}

    public Page(Integer pageNum, Integer pageSize) {
        this.pageNum = pageNum;
        this.pageSize = pageSize;
    }

    @Override
    public String toString() {
        return "Page{" +
                "pageNum=" + pageNum +
                ", pageSize=" + pageSize +
                '}';
    }

    //  ....... get 和 set 方法......

}

dao接口

package com.xx.dao;

import com.xx.pojo.User;

import java.util.List;

public interface UserDao {
    
    List queryUsers();
}

dao映射文件

dao映射文件放在resources/com/xx/dao目录下必须叫做 UserDao.xml

<?xml version="1.0" encoding="UTF-8" ?>




    

service接口

public interface UserService {
    PageInfo queryUsers(Page page);
}

service实现类

@Service // userServiceImpl
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDAO;

    @Override
    @Transactional(propagation = Propagation.SUPPORTS)
    public PageInfo queryUsers(Page page) {
        PageHelper.startPage(page.getPageNum(),page.getPageSize());
        List users = userDAO.queryUsers();
        return new PageInfo(users);
    }
}

controller类

@Controller
public class UserController {

    @Autowired
    @Qualifier("userServiceImpl")
    private UserService userService;

    @GetMapping("/users")
    public String queryUsers(Model model, Page page){
        System.out.println("queryUsers");
        PageInfo pageInfo = userService.queryUsers(page);
        model.addAttribute("data",pageInfo);
        return "userPro";
    }

    @RequestMapping("/users/{id}")
    public String queryOne(@PathVariable Integer id){
        System.out.println("query user id:"+id);
        return "index";
    }

    @PostMapping(value = "/users")
    public String updateUser(User user){
        System.out.println("update User:"+user);
        return "index";
    }
}

测试整合结果

启动tomcat, 访问地址如下:

http://localhost:8081/users?pageNum=1

 

相关