20190717使用idea搭建ssm项目的基本流程

2 篇文章 0 订阅
1 篇文章 0 订阅

使用idea搭建ssm项目的基本流程

一,mybatis的配置

1.创建maven项目,选择apache-archetype-web-app
在这里插入图片描述
2.配置项目所需要用到的第三方jar包依赖和tomcat的运行插件:代码如下

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

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.gxa</groupId>
  <artifactId>ssm0717-lianchua</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>ssm0717-lianchua Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <!--规定版本-->
    <!--spring版本-->
    <spring.version>4.3.16.RELEASE</spring.version>
    <!--mybatis版本-->
    <mybatis.version>3.4.6</mybatis.version>
  </properties>

  <dependencies>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <!--spring核心包-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-expression</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <!--spring-web-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!--spring-mvc-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!--test-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!--jdbc-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!--tx-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!--mybatis-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>${mybatis.version}</version>
    </dependency>

    <!--mybatis 整合 spring-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.3.1</version>
    </dependency>
    <!--数据库驱动-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.46</version>
    </dependency>
    <!--引入阿里连接池-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.10</version>
    </dependency>
    <!-- 日志 -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.2</version></dependency>
    <!-- jstl -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>
    <!-- servlet -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
    <!-- jsp -->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId><version>2.2</version>
      <scope>provided</scope>
    </dependency>
    <!--mybatis分页插件-->
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>5.1.10</version>
    </dependency>

  </dependencies>

  <build>
    <finalName>189-ssm</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>



        <!--利用maven tomcat插件来运行-->
        <plugin>
          <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat7-maven-plugin</artifactId>
          <configuration>
            <port>8082</port>
            <path>/</path>
          </configuration>
        </plugin>

        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>


3.创建项目的资源resources文件夹和java文件夹并进行相关设置(文件夹名字虽然可以任意命名,但是建议使用标准的,增加易读性)
各个公司可能有自己的规范,但是基本上都需要这几个文件夹
4.创建ssm框架基本的文件夹结构
在这里插入图片描述
5.mybatis配置(在resources目录创建mybatis-config.xml文件)
如果没有这个选项,就设置一个mybatis配置文件的模板,设置方法:IDEA新建mybatis-config.xml配置文件
在这里插入图片描述
配置文件代码如下:(取名为sqlMapConfig.xml)
需要配置如下4个参数:
数据库驱动:com.mysql.jdbc.Driver
数据库url:jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8
数据库用户名:root
**数据库密码:**123123
可以通过读取配置文件的方式得到该数据,也可以直接配置在相关项目的value的双引号里面;

<?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>
    <properties resource=""></properties>
    <typeAliases>

        <package name=""/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${database.driver}"/>
                <property name="url" value="${database.url}"/>
                <property name="username" value="${database.username}"/>
                <property name="password" value="${database.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource=""></mapper>
    </mappers>

</configuration>

如果数据库的相关属性需要走配置方式,那么需要在上面的配置文件的 标签内的双引号内加上配置文件的路径(配置文件放在resources目录下,路径为相对路径)
在这里插入图片描述
数据库配置文件如下:(不走配置可以直接配置在mybatis的配置文件中)

database.driver=com.mysql.jdbc.Driver
database.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf8
database.username=root
database.password=123123

固定设置:是否显示sql语句,和返回空行的设置,不使用别名
settings标签配置在configuration双标签里面

 <settings>
    <!-- 当返回行的所有列都是空时,mybatis默认返回null -->
        <setting name="returnInstanceForEmptyRow" value="true"/>
    <!--  显示sql语句  -->
        <setting name="logImol" value="STDOUT_LOGGING"/>
    </settings>

删除别名(显示包名会更加直观,不建议省略):
以下是需要删除的标签,不然configuration会报错。

 <typeAliases>
            <package name="com.alibaba"/>
 </typeAliases>

6.从数据库映射pojo文件,数据库结构如下:
点击百度云下载转储sql文件
在这里插入图片描述
映射的方式如下:右键user表,根据图示映射文件到pojo目录:
在这里插入图片描述
a.某些操作系统映射文件后可能pojo文件的包路径需要修改,需要注意一下!
b.给该pojo所有属性添加toString方法
c.给pojo添加无参构造器

    @Override
      public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", userPhone=" + userPhone +
                ", userPwd='" + userPwd + '\'' +
                ", userAddTime=" + userAddTime +
                ", roleId=" + roleId +
                '}';
      }

7.在dao下创建pojo对应的mapper接口(interface

package com.gxa.dao;

import com.gxa.pojo.User;

import java.util.List;

public interface UserMapper {

    /**
     * 查询所有用户
     * @return
     */
    List<User> findAll();
}

a.根据需要写方法,根据不同的情况,需要有不同的返回类型;

8.在resources的mapper目录创建与interface对应的mapper配置文件

<?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.gxa.dao.UserMapper">
      <!--查询所有-->
      <select id="findAll" resultType="com.gxa.pojo.User">
        select * from user order by id desc
      </select>
    </mapper>

a.namespace的属性对应dao接口的在java目录下包路径;
b.select标签里面的id对应interface里面的方法名
c.select标签里面的resultType对应查询数据库后需要返回的pojo对象类型
d.select标签里面是sql语句

9.在mybatis的配置文件引入这个mapper文件

 <mappers>
            <mapper resource="mapper/UserMapper.xml"></mapper>
     </mappers>

10.创建测试类MyTest

import com.gxa.dao.UserMapper;
import com.gxa.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MyTest {


    @Test
    public void test01() throws IOException {
        //读取配置文件
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        //得到factory
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
        //得到session
        SqlSession session = factory.openSession();
        //得到代理对象
        UserMapper mapper = session.getMapper(UserMapper.class);
        //正常的业务操作
        List<User> list = mapper.findAll();
        //提交事物
        session.commit();
        for (User user : list) {
            System.out.println(user);
        }
    }
}

运行测试方法,结果如下:

log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Opening JDBC Connection
Wed Jul 17 21:40:36 CST 2019 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Created connection 1364767791.
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@5158b42f]
==>  Preparing: select * from user order by id desc 
==> Parameters: 
<==    Columns: id, userName, userPhone, userPwd, userAddTime, roleId
<==        Row: 13, admin, 18708118865, 74613432f3cd11797550f0c8ea993d61, 2018-11-20 22:36:48.0, 1
<==        Row: 12, bbb, 18708118869, 74613432f3cd11797550f0c8ea993d61, 2018-11-19 23:25:12.0, 2
<==        Row: 5, 小李, 18708118867, 74613432f3cd11797550f0c8ea993d61, 2018-11-17 22:20:18.0, 2
<==        Row: 4, admin789, 15808907890, 74613432f3cd11797550f0c8ea993d61, 2018-11-13 13:42:11.0, 1
<==      Total: 4
User{id=13, userName='admin', userPhone=18708118865, userPwd='74613432f3cd11797550f0c8ea993d61', userAddTime=2018-11-20 22:36:48.0, roleId=1}
User{id=12, userName='bbb', userPhone=18708118869, userPwd='74613432f3cd11797550f0c8ea993d61', userAddTime=2018-11-19 23:25:12.0, roleId=2}
User{id=5, userName='小李', userPhone=18708118867, userPwd='74613432f3cd11797550f0c8ea993d61', userAddTime=2018-11-17 22:20:18.0, roleId=2}
User{id=4, userName='admin789', userPhone=15808907890, userPwd='74613432f3cd11797550f0c8ea993d61', userAddTime=2018-11-13 13:42:11.0, roleId=1}

Process finished with exit code 0

已经成功查询出数据,说明mybatis配置一切正常!接下来开始配置spring

二,spring

1.在resources创建spring-dao-config.xml文件

<?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 http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!--扫描包-->
    <context:component-scan base-package="com.gxa.dao"/>

    <!--配置数据源-->
    <bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://139.155.110.172:3306/test?useUnicode=true&amp;characterEncoding=utf8"/>
        <property name="username" value="root"/>
        <property name="password" value="123123"/>
    </bean>

    <!--配置sqlSessionFactory-->
    <bean name="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--数据源-->
        <property name="dataSource" ref="dataSource"/>
        <!--mybatis配置文件位置-->
        <property name="configLocation" value="classpath:sqlMapConfig.xml"/>
        <!--mapper位置-->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
        <!--配置插件-->
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <!--使用下面的方式配置参数,一行配置一个 -->
                        <value>
                            helperDialect=mysql
                        </value>
                    </property>
                </bean>
            </array>
        </property>
    </bean>

    <!--扫描mapper接口-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.gxa.dao"/>
    </bean>


    <!--事务管理器-->
    <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--开启事务注解-->
    <tx:annotation-driven/>
</beans>

2.创建spring-service-config.xml文件

<?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"
       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">

    <!--扫描包-->
    <context:component-scan base-package="com.gxa.service"/>
    
</beans>

3.创建UserService接口和impl目录下的UserServiceImpl实现类

package com.gxa.service;

import com.gxa.pojo.User;
import java.util.List;

public interface UserService {

    List<User> list();
}

package com.gxa.service.impl;

import com.gxa.dao.UserMapper;
import com.gxa.pojo.User;
import com.gxa.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional(noRollbackFor = Exception.class)
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public List<User> list() {
        return userMapper.findAll();
    }
}

4.在test的java目录写一个SpringTest测试类(测试上面两个配置文件是否能正常使用)

import com.gxa.dao.UserMapper;
import com.gxa.pojo.User;
import com.gxa.service.UserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.List;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({
        "classpath:spring-dao-config.xml",
        "classpath:spring-service-config.xml"
})
public class SpringTest {

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private UserService userService;

    @Test
    public void test01(){
        List<User> all = userMapper.findAll();
        for (User user : all) {
            System.out.println(user);
        }
    }

    @Test
    public void test02(){
        List<User> list = userService.list();
        for (User user : list) {
            System.out.println(user);
        }
    }

}

运行上面两个测试方法,都正常查询出数据,说明配置正确;

在这里插入图片描述

三,SpringMVC的配置

1.在resources目录新建spring-mvc-config.xml配置文件

<?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 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.gxa.web"/>
    <!--使用推荐的映射器和适配器-->
    <mvc:annotation-driven/>

    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/pages/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

2.配置web.xml文件

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>

  <!--容器启动加载配置文件-->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-*-config.xml</param-value>
  </context-param>

  <!--配置核心控制器-->
  <servlet>
    <servlet-name>springMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc-config.xml</param-value>
    </init-param>
  <!--随容器启动加载-->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springMVC</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

3.创建controller类UserController和WEB-INF/pages/hello.jsp

package com.gxa.web.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class UserController {

    @RequestMapping("/hello")
    public String hello(){
        return "hello";
    }
}
<%--
  Created by IntelliJ IDEA.
  User: lianchua
  Date: 2019-07-20
  Time: 15:16
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Hello</title>
</headH
<body>
<h1>Hello SSM</h1>
</body>
</html>

4.启动tomcat进行web访问测试
在这里插入图片描述
一切正常!

5.我们可以为这个方法加一个分类,让/hello成为/user下面的一个方法
在这里插入图片描述
6.再继续添加一个查询所有用户的方法(user的controller类完整代码如下)

package com.gxa.web.controller;

import com.gxa.pojo.User;
import com.gxa.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;

@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("/hello")
    public String hello(){
        return "hello";
    }
    @RequestMapping("/list")
    public String list(Model model){
        List<User> list = userService.list();
        model.addAttribute("list",list);
        return "list";
    }
}

7.使用bootstrap模板创建一个/WEB-INF/pages/list.jsp
这里使用了bootstrap模板和引用了el表达式读取后端返回的addAttribute数据

<%--
  Created by IntelliJ IDEA.
  User: lianchua
  Date: 2019-07-20
  Time: 15:37
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <title>用户列表</title>

    <!-- Bootstrap -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">

    <!-- HTML5 shim 和 Respond.js 是为了让 IE8 支持 HTML5 元素和媒体查询(media queries)功能 -->
    <!-- 警告:通过 file:// 协议(就是直接将 html 页面拖拽到浏览器中)访问页面时 Respond.js 不起作用 -->
    <!--[if lt IE 9]>
    <script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
    <![endif]-->
</head>
<body>
<div class="container">
    <table class="table table-hover">
        <caption>用户列表</caption>
        <thead>
        <tr>
            <th>id</th>
            <th>姓名</th>
            <th>电话</th>
            <th>密码</th>
            <th>加入时间</th>
            <th>角色id</th>
        </tr>
        </thead>
        <tbody>
        <c:forEach items="${list}" var="user">
            <tr>
                <td>${user.id}</td>
                <td>${user.userName}</td>
                <td>${user.userPhone}</td>
                <td>${user.userPwd}</td>
                <td>${user.userAddTime}</td>
                <td>${user.roleId}</td>

            </tr>
        </c:forEach>

        </tbody>
    </table>
</div>>

<!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
<script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
<!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>
</body>
</html>

8.测试
在这里插入图片描述
到这一步,基本的ssm框架已经搭建好了,如果想要加入分页的功能,请接着往下看;

四,分页插件(PageHelper)

1.由于依赖之前已经一次性导入,相关的分页插件也在spring-dao-config里面配置
所有,我们只需要在service的实现里面在返回结果以前,调用下面的方法即可实现分页;
修改UserService的实现

@Service
@Transactional(noRollbackFor = Exception.class)
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public List<User> list() {
        PageHelper.startPage(1,3);
        return userMapper.findAll();
    }
}

startPage的两个参数分别是第几页和页容量

2.测试
在这里插入图片描述
可以看到只查询到第一页的三条数据:说明分页的功能已经实现了;
在这里插入图片描述
3.修改user的service接口,重载查询方法

我们应该把页数和容量通过前端传回去:

  package com.gxa.service;
    
    import com.gxa.pojo.User;
    
    import java.util.List;
    
    public interface UserService {
    
        List<User> list();
    
        List<User> list(Integer pageNum,Integer pageSize);
    }

4.修改具体实现类(取消固定的页码数和页容量)

package com.gxa.service.impl;

import com.github.pagehelper.PageHelper;
import com.gxa.dao.UserMapper;
import com.gxa.pojo.User;
import com.gxa.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;

@Service
@Transactional(noRollbackFor = Exception.class)
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    @Override
    public List<User> list() {
        return userMapper.findAll();
    }
    @Override
    public List<User> list(Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum,pageSize);
        return userMapper.findAll();
    }
}

5.修改UserController类,把前端页码和页容量传到后端

不仅需要传参到后端,还需要给一个默认的参数,访问该页面没有选择页码时,默认使用默认的参数,代码如下:

package com.gxa.web.controller;

import com.gxa.pojo.User;
import com.gxa.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;


@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("/hello")
    public String hello(){
        return "hello";
    }

    @RequestMapping("/list")
    public String list(Model model,
                       @RequestParam(defaultValue = "1") Integer page,
                       @RequestParam(defaultValue = "5") Integer pageSize){
        List<User> list = userService.list(page,pageSize);
        model.addAttribute("list",list);
        return "list";
    }
}

3.接着我们需要修改前端页面,把页数传到后端以达到控制翻页的目的,加入一些分页的前端代码(暂不用修改)

现在后端可以返回查询到的数据到前端,但是后端没有返回分页的相关信息到前端,以至于前端无法直到数据到底有几页,前端的页码数不可能是固定去手写,应该是查询到数据总条数,然后经过计算得到总共的页码数,以及其他的分页的相关数据,把这个数据和我们查询到的数据一起返回到前端才行。所以我们想到了把查询到的数据和分页相关数据打包成一个新的对象,然后把这个对象通过model.addAttribute传回前端,前端把这个对象解析成正常的查询数据和分页数据,再去遍历他们,让我们需要的值显示到网页上;

在这里插入图片描述
4.修改service接口和类(重载方法)

package com.gxa.service;

import com.github.pagehelper.PageInfo;
import com.gxa.pojo.User;

import java.util.List;

public interface UserService {

    List<User> list();

    List<User> list(Integer pageNum,Integer pageSize);

    PageInfo<User> listPage(Integer pageNum, Integer pageSize);
}

实现代码如下:

package com.gxa.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.gxa.dao.UserMapper;
import com.gxa.pojo.User;
import com.gxa.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional(noRollbackFor = Exception.class)
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public List<User> list() {
        return userMapper.findAll();
    }

    @Override
    public List<User> list(Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum,pageSize);
        return userMapper.findAll();
    }

    @Override
    public PageInfo<User> listPage(Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum,pageSize);
        List<User> all = userMapper.findAll();
        //封装
        PageInfo<User> userPageInfo = new PageInfo<User>(all);
        return userPageInfo;
    }
}

5.修改controller类

package com.gxa.web.controller;

import com.github.pagehelper.PageInfo;
import com.gxa.pojo.User;
import com.gxa.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("/hello")
    public String hello(){
        return "hello";
    }

    @RequestMapping("/list")
    public String list(Model model,
                       @RequestParam(defaultValue = "1") Integer page,
                       @RequestParam(defaultValue = "5") Integer pageSize){
        PageInfo<User> userPageInfo = userService.listPage(page, pageSize);
        model.addAttribute("pageInfo",userPageInfo);
        return "list";
    }
}

在这里插入图片描述
6.修改list.jsp

修改遍历的对象为pageInfo里面的list

      <c:forEach items="${pageInfo.list}" var="user">
            <tr>
                <td>${user.id}</td>
                <td>${user.userName}</td>
                <td>${user.userPhone}</td>
                <td>${user.userPwd}</td>
                <td>${user.userAddTime}</td>
                <td>${user.roleId}</td>
            </tr>
        </c:forEach>

遍历页数:

 <ul class="pagination">
        <li><a href="#">&laquo;</a></li>
        <c:forEach items="${pageInfo.navigatepageNums}" var="p">
            <li><a href="#">${p}</a></li>
        </c:forEach>
        <li><a href="#">&raquo;</a></li>
    </ul>

7.测试(由于我这里暂时只有一页数据,所以只显示了一页,我需要多加入一点儿数据)
在这里插入图片描述
添加好数据
在这里插入图片描述
成功显示3页
在这里插入图片描述
需要给页码加上链接:

需要给当前页码高亮显示:

判断是否有下一页,上一页,代码如下:
在这里插入图片描述
list.jsp全部代码如下:

<%--
  Created by IntelliJ IDEA.
  User: lianchua
  Date: 2019-07-20
  Time: 15:37
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <title>用户列表</title>

    <!-- Bootstrap -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">

    <!-- HTML5 shim 和 Respond.js 是为了让 IE8 支持 HTML5 元素和媒体查询(media queries)功能 -->
    <!-- 警告:通过 file:// 协议(就是直接将 html 页面拖拽到浏览器中)访问页面时 Respond.js 不起作用 -->
    <!--[if lt IE 9]>
    <script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
    <![endif]-->
</head>
<body>
<div class="container">
    <table class="table table-hover">
        <caption>用户列表</caption>
        <thead>
        <tr>
            <th>id</th>
            <th>姓名</th>
            <th>电话</th>
            <th>密码</th>
            <th>加入时间</th>
            <th>角色id</th>
        </tr>
        </thead>
        <tbody>
        <c:forEach items="${pageInfo.list}" var="user">
            <tr>
                <td>${user.id}</td>
                <td>${user.userName}</td>
                <td>${user.userPhone}</td>
                <td>${user.userPwd}</td>
                <td>${user.userAddTime}</td>
                <td>${user.roleId}</td>
            </tr>
        </c:forEach>

        </tbody>
    </table>
    <ul class="pagination">
        <c:if test="${pageInfo.hasPreviousPage}">
            <li><a href="${pageContext.request.contextPath}/user/list?page=${pageInfo.prePage}">&laquo;</a></li>
        </c:if>
        <c:forEach items="${pageInfo.navigatepageNums}" var="p">
            <li class="${pageInfo.pageNum==p ? "active" : ""}"><a  href="${pageContext.request.contextPath}/user/list?page=${p}">${p}</a></li>
        </c:forEach>
        <c:if test="${pageInfo.hasNextPage}">
            <li><a href="${pageContext.request.contextPath}/user/list?page=${pageInfo.nextPage}">&raquo;</a></li>
        </c:if>
    </ul>
</div>>

<!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
<script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
<!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>
</body>
</html>

再次测试页面,已经达到我们想要的效果:
在这里插入图片描述
到此,ssm框架已经搭建好,并且带上了分页的功能,如果各位在学习的朋友遇到博客里不明白的问题,可以留言,大家可以互相交流一下!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值