SSM框架搭建以及简单增删改查以及分页功能的实现,前端bootstrap+css+jq

一、项目结构截图:

![!\[在这里插入图片描述\](https://img-blo](https://img-blog.csdnimg.cn/20190309205353843.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODQ4NDc0MA==,size_16,color_FFFFFF,t_70)

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190309205537363.png)

二、配置文件介绍

POM文件配置:

<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/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>com.ssm</groupId>

<artifactId>blog</artifactId>

<packaging>war</packaging>

<version>0.0.1-SNAPSHOT</version>

<name>blog Maven Webapp</name>

<url>http://maven.apache.org</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.2.5.RELEASE</spring.version>

<!-- mybatis版本号 -->

<mybatis.version>3.2.8</mybatis.version>

<!-- mysql驱动版本号 -->

<mysql-driver.version>5.1.29</mysql-driver.version>

<!-- log4j日志包版本号 -->

<slf4j.version>1.7.18</slf4j.version>

<log4j.version>1.2.17</log4j.version>

<!--spring-security版本号-->

<spring-security.version>4.1.3.RELEASE</spring-security.version>

<!--spring-data-redis版本号-->

<spring.data.redis.version>1.7.1.RELEASE</spring.data.redis.version>

</properties>

<dependencies>

<!-- 添加jstl依赖 -->

<dependency>

<groupId>jstl</groupId>

<artifactId>jstl</artifactId>

<version>1.2</version>

</dependency>

<dependency>

<groupId>javax</groupId>

<artifactId>javaee-api</artifactId>

<version>7.0</version>

</dependency>

<!-- 添加spring核心依赖 -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-core</artifactId>

<version>${spring.version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-web</artifactId>

<version>${spring.version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-oxm</artifactId>

<version>${spring.version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-tx</artifactId>

<version>${spring.version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-jdbc</artifactId>

<version>${spring.version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-webmvc</artifactId>

<version>${spring.version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>${spring.version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context-support</artifactId>

<version>${spring.version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-aop</artifactId>

<version>${spring.version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-test</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.2.2</version>

</dependency>

<!-- 添加mysql驱动依赖 -->

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>${mysql-driver.version}</version>

</dependency>

<!-- 添加数据库连接池依赖 -->

<dependency>

<groupId>commons-dbcp</groupId>

<artifactId>commons-dbcp</artifactId>

<version>1.2.2</version>

</dependency>

<!-- 添加日志相关jar包 -->

<dependency>

<groupId>log4j</groupId>

<artifactId>log4j</artifactId>

<version>${log4j.version}</version>

</dependency>

<dependency>

<groupId>org.slf4j</groupId>

<artifactId>slf4j-api</artifactId>

<version>${slf4j.version}</version>

</dependency>

<dependency>

<groupId>org.slf4j</groupId>

<artifactId>slf4j-log4j12</artifactId>

<version>${slf4j.version}</version>

</dependency>

<!-- log end -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-jms</artifactId>

<version>${spring.version}</version>

</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.xbean/xbean-spring -->

<dependency>

<groupId>org.apache.xbean</groupId>

<artifactId>xbean-spring</artifactId>

<version>4.0</version>

</dependency>

<!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->

<dependency>

<groupId>commons-beanutils</groupId>

<artifactId>commons-beanutils</artifactId>

<version>1.9.3</version>

</dependency>

<dependency>

<groupId>commons-io</groupId>

<artifactId>commons-io</artifactId>

<version>1.4</version>

</dependency>

<dependency>

<groupId>commons-fileupload</groupId>

<artifactId>commons-fileupload</artifactId>

<version>1.3.1</version>

</dependency>

<!-- 引入Mybatis分页插件 -->

<!-- 引入5.0版本在测试的时候会报错 4.2版本也会报错

4.2版本总是出现String无法转换为某个对象的错误

-->

<dependency>

<groupId>com.github.pagehelper</groupId>

<artifactId>pagehelper</artifactId>

<version>5.1.1</version>

</dependency>

<!-- 通用mapper -->

<dependency>

<groupId>tk.mybatis</groupId>

<artifactId>mapper</artifactId>

<version>3.1.2</version>

</dependency>

<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-core</artifactId>

<version>2.1.0</version>

</dependency>

<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-databind</artifactId>

<version>2.1.0</version>

</dependency>

<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-annotations</artifactId>

<version>2.1.0</version>

</dependency>

</dependencies>

<build>

<finalName>blog</finalName>

</build>

</project>

(1)、jdbc.properties:

概念:

jdbc.properties文件主要是配置了数据库连接信息(JDBC 加载驱动类、数据库地址URL、数据库账号密码、初始连接数、最大连接数等),主要是为了方便后面spring和mybatis整合时引入数据源,为了连接数据库而配置。

配置:

#数据库驱动

driverClasss=com.mysql.jdbc.Driver

#数据库地址

jdbcUrl=jdbc:mysql://localhost:3306/dream_db?useUnicode=true

&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull

#数据库账号

username=root

#数据库密码

password=137972zc

#定义初始连接数

initialSize=0

#定义最大连接数

maxActive=20

#定义最大空闲

maxIdle=20

#定义最小空闲

minIdle=1

#定义最长等待时间

maxWait=60000

(2)、log4j.properties文件配置

概念:

log4j.properties主要是为了设置日志信息,主要将程序运行中的日志信息输出到控制台和保存到文件.可以通过设置日志文件的输出级别来控制输出那些信息。

ERROR > WARN > INFO > DEBUG

设置级别为 ERROR 只会打印出 ERROR 日志;

设置级别为 WARN 会打印出 ERROR 和 WRAN 日志;

设置级别为 INFO 会打印出 ERROR、WARN 和 INFO 日志;

设置级别为 DEBUG会打印出 ERROR、WARN 、 INFO和 DEBUG日志;

配置:

#指定输出级别为DEBUG,输出到Console,和File变量指定的地方

log4j.rootLogger=DEBUG,Console,File

log4j.logger.org.springframework=ERROR,Console

#设置Console变量,日志输出到控制台

log4j.appender.Console=org.apache.log4j.ConsoleAppender

#指定SYSTEM_OUT 或 SYSTEM_ERR,默认是SYSTEM_OUT

log4j.appender.Console.Target=System.out

#设置为自定义布局

log4j.appender.Console.layout=org.apache.log4j.PatternLayout

#日志输出格式设置,翻译为

[DEBUG][线程名][2019-02-01 12:01:54][类名]-输出信息-\n

log4j.appender.Console.layout.ConversionPattern=[%p][%t][%d{yyyy-MM-dd HH\:mm\:ss}][%C] - %m%n

#日志输出到文件,当文件到达设定大小时产生一个新的文件

log4j.appender.File=org.apache.log4j.RollingFileAppender

#日志存放位置

log4j.appender.File.File=G:/javaWorkspace/blog/log4j/run.log

#单个日志文件大小设置

log4j.appender.File.MaxFileSize=10MB

#输出日志,如果换成DEBUG表示输出DEBUG以上级别日志

log4j.appender.File.Threshold=ALL

log4j.appender.File.layout=org.apache.log4j.PatternLayout

#[ALL][线程名][2019-03-01 12:01:42]-输出信息-\n

log4j.appender.File.layout.ConversionPattern=[%p][%t][%d{yyyy-MM-dd HH\:mm\:ss}][%C] - %m%n

(3)、mybatis-config.xml 文件配置

概念:

mybatis-config.xml 是mybatis的核心配置文件,主要是配置分页插件、设置实体别名、设置控制台打印sql语句等。

配置:

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

<settings>

<!-- 开启驼峰匹配,配置后查询出的数据库字段自动转为对应的驼峰命名实体字段 -->

<setting name="mapUnderscoreToCamelCase" value="true"/>

<!-- 打印sql语句 -->

<setting name="logImpl" value="LOG4J" />

</settings>

<!-- 别名 -->

<typeAliases>

<!--扫描包,默认别名为:javabean 的首字母小写的非限定类名来作为它的别名-->

<package name="com.base.entity" />

</typeAliases>

<!-- mybatis分页插件 -->

<plugins>

<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>

</plugins>

</configuration>

(4)、spring-mybatis.xml文件配置

概念:

spring-mybatis.xml这个文件主要是用来整合spring和mybatis框架的,主要是做了以下设置:

1、自动扫描包,扫描范围内的java文件,只要带有spring注解,就把这些类交给spring容器管理,以下是几个常见的spring注解:

@controller 控制器(注入服务) 用于标注控制层,相当于struts中的action层

@service 服务(注入dao) 用于标注服务层,主要用来进行业务的逻辑处理

@repository(实现dao访问) 用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件.

@component (把普通pojo实例化到spring容器中,相当于配置文件中的 <bean class=" "/>) 当组件不好归类的时候,我们可以使用这个注解进行标注。

2、引入配置文件(jdbc.properties),引入后,当前xml就可以使用jdbc.properties里面设置的参数和属性,用于声明数据源

3、声明数据源

4、声明事务管理器,将数据源注入事务管理器

5、声明通知,将事务管理器注入通知,设置通知属性(事务管理模式,方法是否只读等等)

6、aop切入事务(声明切点,切面,切入通知)

7、声明sqlSessionFactory(sql会话工厂),注入mybatis核心配置文件、数据源,自动扫描mapping.xml文件路径。(声明sqlSessionFactory,设置dataSource,configLocation,mapperLocations三个属性)

dataSource:数据库

configLocation:配置路径

mapperLocations:映射路径

8、声明MapperScannerConfigurer(mapping扫描配置器),扫描DAO接口,注入sqlSessionFactory(sql会话工厂),从而完成DAO接口和mapping.xml文件的映射。(设置basePackage和sqlSessionFactoryBeanName)

basePackage:要扫描的DAO接口所在的包

sqlSessionFactoryBeanName:前面声明sqlSessionFactory的id(把sql会话注入到这些自动扫描到的DAO接口里面去)

配置:

<?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-3.1.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.1.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx.xsd">

<!-- 自动扫描,自动扫描这些包下的java文件,如果带有spring注解

(@Service,@Component,@Repository,@Controller等),

就把这些类注册为bean,由spring管理 -->

<context:component-scan base-package="com.base"/>

<!--加载多个properties文件,加载后,当前xml就可以使用加载文件的属性-->

<bean class="org.springframework.beans.factory.config.PropertiesFactoryBean">

<property name="locations">

<list>

<value>classpath:system/jdbc.properties</value>

</list>

</property>

<property name="fileEncoding" value="UTF-8"/>

</bean>

<bean class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">

<property name="properties" ref="configProperties"/>

</bean>

<!-- 配置数据源 -->

<bean class="org.apache.commons.dbcp.BasicDataSource"

destroy-method="close">

<property name="driverClassName" value="${driverClasss}"/>

<property name="url" value="${jdbcUrl}"/>

<property name="username" value="${username}"/>

<property name="password" value="${password}"/>

<!-- 初始化连接大小 -->

<property name="initialSize" value="${initialSize}"></property>

<!-- 连接池最大数量 -->

<property name="maxActive" value="${maxActive}"></property>

<!-- 连接池最大空闲 -->

<property name="maxIdle" value="${maxIdle}"></property>

<!-- 连接池最小空闲 -->

<property name="minIdle" value="${minIdle}"></property>

<!-- 获取连接最大等待时间 -->

<property name="maxWait" value="${maxWait}"></property>

</bean>

<!-- mybatis和spring完美整合,不需要mybatis的配置映射文件,

声明sqlSessionFactory,注入数据源和mybatis核心配置文件,

配置扫描路径configLocation(扫描xml -->

<bean class="org.mybatis.spring.SqlSessionFactoryBean">

<property name="dataSource" ref="dataSource"/>

<!-- 配置Mybati的核心配置文件 -->

<property name="configLocation" value="classpath:mybatis/mybatis-config.xml" />

<!-- 自动扫描mapping.xml文件-->

<property name="mapperLocations" value="classpath:**/dao/mapping/*.xml"></property>

</bean>

<!-- DAO接口所在包名,Spring会自动查找其下的类,扫描dao接口 -->

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

<property name="basePackage" value="com.base.dao"/>

<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>

</bean>

<!-- 事务管理-->

<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref="dataSource"/>

</bean>

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

</beans>

(5)、spring-mvc.xml文件配置

概念:

spring-mvc.xml文件是springMVC的核心配置文件,主要是配置了一下几点:

1、<mvc:default-servlet-handler />:启动自动检测机制,判断是否是静态资源,如果是静态资源就交给Servlet容器处理,否则就交给DispatcherServlet继续处理

2、开启自动扫描,将@Controller标注的类,交给spring容器管理

3、设置自动将对象转换成Json格式数据(JSON自动转换器)

4、启用注解驱动

5、视图模式配置(跳转路径的前后缀)

6、文件上传配置

配置:

<?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:p="http://www.springframework.org/schema/p"

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-4.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-4.0.xsd

http://www.springframework.org/schema/mvc

http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">

<!-- 检查,如果是静态资源,就交给就将该请求转由Web应用服务器默认的Servlet处理,

如果不是静态资源的请求,才由DispatcherServlet继续处理。 -->

<mvc:default-servlet-handler />

<!-- 自动扫描, 扫描包下的java文件,

如果带有@Component,@Repository,@Service,@Controller,

就会将这个对象作为Bean注册进Spring容器。 -->

<context:component-scan base-package="com.base.controller"/>

<!--自动将对象转换成Json格式数据,避免IE执行AJAX时,返回JSON出现下载文件 -->

<bean

class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">

<property name="supportedMediaTypes">

<list>

<value>text/html;charset=UTF-8</value>

</list>

</property>

</bean>

<!-- 启用注解驱动 -->

<mvc:annotation-driven />

<!-- 定义跳转的文件的前后缀 ,视图模式配置 -->

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/page" />

<property name="suffix" value=".jsp"/>

</bean>

<!-- 文件上传配置 -->

<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

<!-- 默认编码 -->

<property name="defaultEncoding" value="UTF-8"/>

<!-- 上传文件大小限制为31M,31*1024*1024 -->

<property name="maxUploadSize" value="32505856"/>

<!-- 内存中的最大值 -->

<property name="maxInMemorySize" value="4096"/>

</bean>

<!-- 对静态资源文件的访问-->

<mvc:resources mapping="/images/**" location="/images/" cache-period="31556926"/>

<mvc:resources mapping="/js/**" location="/js/" cache-period="31556926"/>

<mvc:resources mapping="/css/**" location="/css/" cache-period="31556926"/>

</beans>

(6)、web.xml 配置

概念:

web.xml 是web程序启动时,tomcat要加载的文件,主要是设置以下初始化配置:

1、Web 应用的名字、描述(display-name 和 description 标签);

2、应用范围的初始化参数,定义要装配的文件(context-param 标签);

3、过滤器配置(filter 标签);

4、监听器配置(listener 标签);

5、servlet 配置(servlet 标签,如前端控制器和验证码);

6、欢迎页面(welcome-file-list 标签,如 index.jsp 页面);

7、session失效时间(session-config 标签);

8、错误页面配置(error-page 标签,如 404、500错误页面等)。

配置:

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

<web-app xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

version="3.0">

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

<display-name>blog-web</display-name>

<!-- 配置应用级参数contextConfigLocation,

定义了要装入的 Spring 配置文件。 -->

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>

classpath:spring/spring-mybatis.xml

</param-value>

</context-param>

<context-param>

<param-name>log4jConfigLocation</param-name>

<param-value>classpath:system/log4j.properties</param-value>

</context-param>

<context-param>

<param-name>log4jRefreshInterval</param-name >

<param-value> 600000 </param-value >

</context-param>

<!--log4j配置监听-->

<listener>

<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>

</listener>

<!-- 编码过滤器 解决POST乱码问题-->

<filter>

<filter-name>encodingFilter</filter-name>

<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

</filter>

<!-- 设置过滤器encodingFilter扫描范围,/*-->

<filter-mapping>

<filter-name>encodingFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

<!-- spring监听器 -->

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

<!-- 防止spring内存溢出监听器,比如quartz -->

<listener>

<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>

</listener>

<!-- spring mvc servlet-->

<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:springMvc/spring-mvc.xml</param-value>

</init-param>

<load-on-startup>1</load-on-startup>

<async-supported>true</async-supported>

</servlet>

<!-- servlet-mapping -->

<servlet-mapping>

<servlet-name>SpringMVC</servlet-name>

<!-- 此处也可以配置成 *.do 形式 -->

<url-pattern>/</url-pattern>

</servlet-mapping>

<!-- 指明对于如下资源文件不采用spring的过滤器,

对客户端请求的静态资源如图片、JS文件等的请求交由默认的servlet进行处理 -->

<servlet-mapping>

<servlet-name>default</servlet-name>

<url-pattern>*.xml</url-pattern>

</servlet-mapping>

<servlet-mapping>

<servlet-name>default</servlet-name>

<url-pattern>*.css</url-pattern>

</servlet-mapping>

<welcome-file-list>

<welcome-file>page/index.jsp</welcome-file>

<welcome-file>page/index.html</welcome-file>

</welcome-file-list>

<!-- session配置 -->

<session-config>

<session-timeout>15</session-timeout>

</session-config>

</web-app>

(7)、对于整合SSM框架我的总结:

主要步骤:

<1>:配置jdbc.properties文件,为了连接数据库

<2>:配置log4j文件,为了记录和输出日志信息。

<3>:配置mybatis.xml文件,为了指定mybatis的基本设置(别名\方言\分页插件等等)

<4> : 配置spring-mybatis文件,为了整合spring和mybatis,让spring管理mybatis。其中分为这样几步:

(1):<context:component-scan base-package="com.base"/>

设置自动扫描,扫描包下的java文件,如果带有spring注解,就交给spring来管理(@Service,@Component,@Repository,@Controller等)

(2):加载多个properties文件,加载后,当前xml就可以使用加载文件的属性

(3):配置数据源

(4):声明"sqlSessionFactory"(sql会话),注入数据源和mybatis核心配置文件(mybatis.xml文件),配置扫描路径configLocation(也就是mapper映射文件的路径)

(5):扫描dao接口,指定basePackage,Spring会自动查找其下的类,扫描dao接口,再将sqlSessionFactory注入进去。完成dao接口和mapper映射文件的映射。

(6):事务管理,声明事务管理器,将数据源注入到事务管理器,再设置通知(事务管理模式,方法是否只读等等),然后再设置aop,用aop的方式来管理事务(切点和切面(管理的范围就是切面),再通过动态代理的方法,把切点和通知联系起来,从而完成aop管理事务.

<5> : 配置spring-MVC文件,为了设置Controller 层的包扫描、视图模式配置(跳转路径的前后缀)、文件上传配置、静态资源处理等

(1): <context:component-scan base-package="com.base.controller"/>

自动扫描, 扫描包下的java文件,

如果带有@Component,@Repository,@Service,@Controller, 就会将这个对象作为Bean注册进Spring容器。

(2):mappingJacksonHttpMessageConverter

设置json转换器

(3):启动注解驱动 <mvc:annotation-driven />

(4):定义跳转的文件的前后缀 ,视图模式配置

(5):文件上传配置

(6):设置对静态资源文件的访问

<6> : 配置web.xml文件,用来初始化配置信息(项目启动时,要加载那些东西)

(1):配置应用级参数contextConfigLocation,定义要装入的配置文件。

(2):配置编码过滤器 解决POST乱码问题

(3):配置spring监听器

(4):配置spring mvc servlet,也就是DispatcherServlet(前端控制器)

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

三、开始增删改查功能

(1)、DAO层:

UserMapper.xml:

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

<!--namespace就是与此文件对应的Dao接口的全路径-->

<mapper namespace="com.base.dao.IUserDao" >

<!--根据id查询user实体-->

<select parameterType="java.lang.Integer" resultType="userEntity">

SELECT

ID as id, NAME as name, AGE as age

FROM

USER

WHERE

ID = #{userId}

</select>

<!--插入user实体数据到数据库-->

<insert parameterType="userEntity">

INSERT INTO USER(

NAME,

AGE

)

VALUES (

#{name},

#{age}

);

</insert>

<!--根据id删除user信息-->

<delete parameterType="java.lang.Integer">

DELETE

FROM

USER

WHERE

ID IN (#{ids})

</delete>

<!--根据id更新user信息-->

<update parameterType="userEntity">

UPDATE

USER

SET

NAME=#{name},

AGE=#{age}

WHERE

ID=#{id}

</update>

<!--查询所有user数据集合-->

<select parameterType="java.util.HashMap" resultType="java.util.HashMap">

SELECT

ID AS id,

NAME AS name,

AGE AS age

FROM

USER

WHERE

1=1

<if test="id !=null">

AND ID=#{id}

</if>

</select>

</mapper>

IUserDao:

/**

* Copyright © 2019 eSunny Info. Tech Ltd. All rights reserved.

*

* 功能描述:

* @Package: com.base.dao

* @author: zhangCheng

* @date: 2019年3月3日 下午1:00:19

*/

package com.base.dao;

import java.util.HashMap;

import java.util.List;

import org.springframework.stereotype.Repository;

import com.base.entity.UserEntity;

/**

* Copyright: Copyright (c) 2019 LanRu-Caifu

*

* @ClassName: IUserDao.java

* @Description: 用户模块dao接口

*

* @version: v1.0.0

* @author: zhangCheng

* @date: 2019年3月3日 下午1:00:19

*

* Modification History:

* Date Author Version Description

*---------------------------------------------------------*

* 2019年3月3日 zhangCheng v1.0.0 修改原因

*/

@Repository("userDao")

public interface IUserDao {

/**

* @Function: IUserDao.java

* @Description: 根据id查询用户实体

*

* @param:userId: userID

* @return:

* @throws:异常描述

*

* @version: v1.0.0

* @author: zhangCheng

* @date: 2019年3月3日 下午1:03:01

*

* Modification History:

* Date Author Version Description

*---------------------------------------------------------*

* 2019年3月3日 zhangCheng v1.0.0 修改原因

*/

public UserEntity selectByPrimaryKey(Integer userId);

/**

*

* @Function: IUserDao.java

* @Description: 添加user信息

*

* @param:userEntity 实体

* @return:返回结果描述

* @throws:异常描述

*

* @version: v1.0.0

* @author: Administrator

* @date: 2019年3月8日 下午8:15:59

*

* Modification History:

* Date Author Version Description

*---------------------------------------------------------*

* 2019年3月8日 Administrator v1.0.0 修改原因

*/

public void saveUser(UserEntity userEntity);

/**

* @Function: IUserDao.java

* @Description: 更新user信息

*

* @param:userEntity user实体

* @return:返回结果描述

* @throws:异常描述

*

* @version: v1.0.0

* @author: zhangCheng

* @date: 2019年3月8日 下午8:45:23

*

* Modification History:

* Date Author Version Description

*---------------------------------------------------------*

* 2019年3月8日 zhangCheng v1.0.0 修改原因

*/

public void updateUserEntity(UserEntity userEntity);

/**

*

* @Function: IUserDao.java

* @Description: 根据ids删除user信息

*

* @param:描述1描述

* @return:返回结果描述

* @throws:异常描述

*

* @version: v1.0.0

* @author: zhangCheng

* @date: 2019年3月8日 下午8:46:07

*

* Modification History:

* Date Author Version Description

*---------------------------------------------------------*

* 2019年3月8日 zhangCheng v1.0.0 修改原因

*/

public void deleteUser(Integer ids);

/**

*

* @Function: IUserDao.java

* @Description: 该函数的功能描述

*

* @param:描述1描述

* @return:返回结果描述

* @throws:异常描述

*

* @version: v1.0.0

* @author: zhangCheng

* @date: 2019年3月9日 上午10:55:24

*

* Modification History:

* Date Author Version Description

*---------------------------------------------------------*

* 2019年3月9日 zhangCheng v1.0.0 修改原因

*/

public List<Object> getUserList(HashMap<String, Object> map);

}

(2)、Service层

IUserService:

package com.base.service;

import java.util.HashMap;

import java.util.List;

import javax.xml.rpc.ServiceException;

import com.base.entity.UserEntity;

/**

*

* Copyright: Copyright (c) 2019 LanRu-Caifu

*

* @ClassName: IUserService.java

* @Description: 用户模块Service接口

*

* @version: v1.0.0

* @author: zhangCheng

* @date: 2019年3月3日 上午10:33:13

*

* Modification History:

* Date Author Version Description

*---------------------------------------------------------*

* 2019年3月3日 zhangCheng v1.0.0 修改原因

*/

public interface IUserService {

/**

*

* @Function: IUserService.java

* @Description: 根据id查询user信息

*

* @param:根据id查询用户

* @return:用户实体

* @throws:异常描述

*

* @version: v1.0.0

* @author: zhangCheng

* @throws ServiceException

* @date: 2019年3月3日 上午10:34:16

*

* Modification History:

* Date Author Version Description

*---------------------------------------------------------*

* 2019年3月3日 zhangCheng v1.0.0 修改原因

*/

public UserEntity selectByPrimaryKey(int userId) throws ServiceException;

/**

* @Function: IUserService.java

* @Description: 添加user信息

*

* @param:userEntity

* @return: void

* @throws:ServiceException

*

* @version: v1.0.0

* @author: zhangCheng

* @date: 2019年3月8日 下午8:25:30

*

* Modification History:

* Date Author Version Description

*---------------------------------------------------------*

* 2019年3月8日 Administrator v1.0.0 修改原因

*/

public void saveUser(UserEntity userEntity) throws ServiceException;

/**

*

* @Function: IUserService.java

* @Description: 根据删除user信息

*

* @param:描述1描述

* @return:返回结果描述

* @throws:异常描述

*

* @version: v1.0.0

* @author: zhangCheng

* @date: 2019年3月8日 下午8:28:12

*

* Modification History:

* Date Author Version Description

*---------------------------------------------------------*

* 2019年3月8日 zhangCheng v1.0.0 修改原因

*/

public void deleteUser(Integer id) throws ServiceException;

/**

* @Function: IUserService.java

* @Description: 更新user

*

* @param:userEntity 用户实体

* @return:返回结果描述

* @throws:异常描述

*

* @version: v1.0.0

* @author: zhangCheng

* @date: 2019年3月8日 下午8:31:55

*

* Modification History:

* Date Author Version Description

*---------------------------------------------------------*

* 2019年3月8日 zhangCheng v1.0.0 修改原因

*/

public void updateUser(UserEntity userEntity) throws ServiceException;

/**

*

* @Function: IUserService.java

* @Description: 查询list信息

*

* @param:描述1描述

* @return:返回结果描述

* @throws:异常描述

*

* @version: v1.0.0

* @author: zhangCheng

* @date: 2019年3月9日 上午10:52:26

*

* Modification History:

* Date Author Version Description

*---------------------------------------------------------*

* 2019年3月9日 zhangCheng v1.0.0 修改原因

*/

public List<Object> getUserList(HashMap<String, Object> map)throws ServiceException;

}

UserServiceImpl:

/**

* Copyright © 2019 eSunny Info. Tech Ltd. All rights reserved.

*

* 功能描述:用户模块Service接口实现

* @Package: com.base.service.impl

* @author: zhangCheng

* @date: 2019年3月3日 上午10:38:42

*/

package com.base.service.impl;

import java.util.HashMap;

import java.util.List;

import javax.annotation.Resource;

import javax.xml.rpc.ServiceException;

import org.springframework.stereotype.Service;

import com.base.dao.IUserDao;

import com.base.entity.UserEntity;

import com.base.service.IUserService;

/**

* Copyright: Copyright (c) 2019 LanRu-Caifu

*

* @ClassName: UserServiceImpl.java

* @Description: 用户模块Service接口实现类

*

* @version: v1.0.0

* @author: zhangCheng

* @date: 2019年3月3日 上午10:38:42

*

* Modification History:

* Date Author Version Description

*---------------------------------------------------------*

* 2019年3月3日 zhangCheng v1.0.0 修改原因

*/

@Service("userService")

public class UserServiceImpl implements IUserService {

@Resource(name = "userDao")

private IUserDao userDao;

/**

* @see com.base.service.IUserService#getUserById(int)

* @Function: UserServiceImpl.java

* @Description: 根据id查询user信息

*

* @param: userId

* @return:返回结果描述

* @throws:异常描述

*

* @version: v1.0.0

* @author: zhangCheng

* @throws ServiceException

* @date: 2019年3月3日 上午10:40:04

*

* Modification History:

* Date Author Version Description

*---------------------------------------------------------*

* 2019年3月3日 zhangCheng v1.0.0 修改原因

*/

@Override

public UserEntity selectByPrimaryKey(int userId) throws ServiceException {

UserEntity userEntity = null;

try {

userEntity=userDao.selectByPrimaryKey(userId);

} catch (Exception e) {

e.printStackTrace();

throw new ServiceException("错误信息:"+e.getMessage());

}

return userEntity;

}

/**

* @see com.base.service.IUserService#saveUser(com.base.entity.UserEntity)

* @Function: UserServiceImpl.java

* @Description: 添加user信息

*

* @param: userId

* @return:返回结果描述

* @throws:异常描述

*

* @version: v1.0.0

* @author: zhangCheng

* @throws ServiceException

* @date: 2019年3月8日 下午8:32:45

*

* Modification History:

* Date Author Version Description

*---------------------------------------------------------*

* 2019年3月8日 zhangCheng v1.0.0 修改原因

*/

@Override

public void saveUser(UserEntity userEntity) throws ServiceException {

try {

userDao.saveUser(userEntity);

} catch (Exception e) {

e.printStackTrace();

throw new ServiceException("错误信息:"+e.getMessage());

}

}

/**

* @see com.base.service.IUserService#deleteUser(java.lang.Integer)

* @Function: UserServiceImpl.java

* @Description: 根据id删除user信息

*

* @param:userId

* @return:返回结果描述

* @throws:异常描述

*

* @version: v1.0.0

* @author: zhangCheng

* @throws ServiceException

* @date: 2019年3月8日 下午8:32:45

*

* Modification History:

* Date Author Version Description

*---------------------------------------------------------*

* 2019年3月8日 zhangCheng v1.0.0 修改原因

*/

@Override

public void deleteUser(Integer ids) throws ServiceException {

try {

userDao.deleteUser(ids);

} catch (Exception e) {

e.printStackTrace();

throw new ServiceException("错误信息:"+e.getMessage());

}

}

/**

* @see com.base.service.IUserService#updateUser(com.base.entity.UserEntity)

* @Function: UserServiceImpl.java

* @Description: 更新user

*

* @param: userId

* @return:返回结果描述

* @throws:异常描述

*

* @version: v1.0.0

* @author: zhangCheng

* @throws ServiceException

* @date: 2019年3月8日 下午8:32:45

*

* Modification History:

* Date Author Version Description

*---------------------------------------------------------*

* 2019年3月8日 zhangCheng v1.0.0 修改原因

*/

@Override

public void updateUser(UserEntity userEntity) throws ServiceException {

try {

userDao.updateUserEntity(userEntity);

} catch (Exception e) {

e.printStackTrace();

throw new ServiceException("错误信息:"+e.getMessage());

}

}

/**

* @see com.base.service.IUserService#getUserList(java.util.HashMap)

* @Function: UserServiceImpl.java

* @Description: 查询list信息

*

* @param:描述1描述

* @return:返回结果描述

* @throws:异常描述

*

* @version: v1.0.0

* @author: zhangCheng

* @date: 2019年3月9日 上午10:53:13

*

* Modification History:

* Date Author Version Description

*---------------------------------------------------------*

* 2019年3月9日 zhangCheng v1.0.0 修改原因

*/

@Override

public List<Object> getUserList(HashMap<String, Object> map) throws ServiceException {

List<Object> list=null;

try {

list=userDao.getUserList(map);

} catch (Exception e) {

e.printStackTrace();

throw new ServiceException("错误信息:"+e.getMessage());

}

return list;

}

}

(3)、UserController层

UserController:

/**

* Copyright © 2019 eSunny Info. Tech Ltd. All rights reserved.

*

* 功能描述:

* @Package: com.base.controller

* @author: zhangCheng

* @date: 2019年3月3日 下午1:18:14

*/

package com.base.controller;

import java.util.HashMap;

import javax.xml.rpc.ServiceException;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

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

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.servlet.ModelAndView;

import com.base.entity.UserEntity;

import com.base.service.IUserService;

import com.github.pagehelper.PageHelper;

import com.github.pagehelper.PageInfo;

/**

* Copyright: Copyright (c) 2019 LanRu-Caifu

*

* @ClassName: UserController.java

* @Description: 用户模块Controller层

*

* @version: v1.0.0

* @author: zhangCheng

* @date: 2019年3月3日 下午1:18:14

*

* Modification History:

* Date Author Version Description

*---------------------------------------------------------*

* 2019年3月3日 zhangCheng v1.0.0 修改原因

*/

@Controller

@RequestMapping(value = "/user")

public class UserController {

//注入userService

@Autowired

IUserService userService;

/**

*

* @Function: UserController.java

* @Description: 根据id查询user信息

*

* @param: id:用户id

* @return:返回结果描述

* @throws:异常描述

*

* @version: v1.0.0

* @author: zhangCheng

* @date: 2019年3月8日 下午8:56:17

*

* Modification History:

* Date Author Version Description

*---------------------------------------------------------*

* 2019年3月8日 zhangCheng v1.0.0 修改原因

*/

@RequestMapping(value="selectByPrimaryKey")

public ModelAndView selectByPrimaryKey(Integer id) throws ServiceException {

//声明ModelAndView对象

ModelAndView mv=new ModelAndView();

try {

//加入属性"user",设置值为查询出来的user实体

mv.addObject("user",userService.selectByPrimaryKey(id));

//为了跳转到editUser.jsp页面

mv.setViewName("/user/editUser");

} catch (Exception e) {

e.printStackTrace();

throw new ServiceException("错误信息:"+e.getMessage());

}

return mv;

}

/**

*

* @Function: UserController.java

* @Description: 添加用户信息

*

* @param:userEntity 用户信息

* @return:返回结果描述

* @throws:异常描述

*

* @version: v1.0.0

* @author: zhangCheng

* @throws ServiceException

* @date: 2019年3月8日 下午9:14:32

*

* Modification History:

* Date Author Version Description

*---------------------------------------------------------*

* 2019年3月8日 zhangCheng v1.0.0 修改原因

*/

@RequestMapping("saveUser")

public String saveUser(UserEntity userEntity) throws ServiceException {

try {

if(userEntity!=null);

userService.saveUser(userEntity);

} catch (Exception e) {

e.printStackTrace();

throw new ServiceException("错误信息:"+e.getMessage());

}

//重定向到getUserList方法

return "redirect:/user/getUserList";

};

/**

*

* @Function: UserController.java

* @Description: 跳转到用户添加页面

*

* @param:描述1描述

* @return:返回结果描述

* @throws:异常描述

*

* @version: v1.0.0

* @author: zhangCheng

* @date: 2019年3月9日 上午10:34:16

*

* Modification History:

* Date Author Version Description

*---------------------------------------------------------*

* 2019年3月9日 zhangCheng v1.0.0 修改原因

*/

@RequestMapping("toAdduser")

public String toAdduser() {

//转发到addUser.jsp页面

return "/user/addUser";

}

/**

*

* @Function: UserController.java

* @Description: 删除user信息

*

* @param: ids: id字符串

* @return:返回结果描述

* @throws:异常描述

*

* @version: v1.0.0

* @author: zhangCheng

* @date: 2019年3月8日 下午9:24:33

*

* Modification History:

* Date Author Version Description

*---------------------------------------------------------*

* 2019年3月8日 zhangCheng v1.0.0 修改原因

*/

@RequestMapping("/deleteUser")

public String deleteUser(Integer ids) throws ServiceException {

try {

userService.deleteUser(ids);

} catch (Exception e) {

e.printStackTrace();

throw new ServiceException("错误信息:"+e.getMessage());

}

//重定向到getUserList方法

return "redirect:/user/getUserList";

};

/**

*

* @Function: UserController.java

* @Description: 更新user实体

*

* @param:描述1描述

* @return:返回结果描述

* @throws:异常描述

*

* @version: v1.0.0

* @author: zhangCheng

* @date: 2019年3月10日 下午12:32:26

*

* Modification History:

* Date Author Version Description

*---------------------------------------------------------*

* 2019年3月10日 zhangCheng v1.0.0 修改原因

*/

@RequestMapping("updateUser")

public String updateUser(UserEntity userEntity) throws ServiceException {

try {

userService.updateUser(userEntity);

} catch (Exception e) {

e.printStackTrace();

throw new ServiceException("错误信息:"+e.getMessage());

}

//重定向到getUserList方法

return "redirect:/user/getUserList";

};

/**

*

* @Function: UserController.java

* @Description: 跳转到首页

*

* @param:描述1描述

* @return:返回结果描述

* @throws:异常描述

*

* @version: v1.0.0

* @author: zhangCheng

* @throws ServiceException

* @date: 2019年3月9日 上午10:01:21

*

* Modification History:

* Date Author Version Description

*---------------------------------------------------------*

* 2019年3月9日 zhangCheng v1.0.0 修改原因

*/

@RequestMapping("getUserList")

public ModelAndView getUserList(@RequestParam(value="pn",defaultValue="1")Integer pn,ModelAndView mav) throws ServiceException{

PageHelper.startPage(pn, 5);

mav.setViewName("/user/userInfo");

HashMap<String, Object> paramMap=new HashMap<String, Object>();

//将用户信息放入PageInfo对象里

PageInfo page = new PageInfo(userService.getUserList(paramMap),5);

mav.addObject("pageInfo",page);

return mav;

};

/*public String getUserList(HttpServletRequest request) throws ServiceException{

HashMap<String, Object> paramMap=new HashMap<String, Object>();

request.setAttribute("userList", userService.getUserList(paramMap));

return "/user/userInfo";

}*/

}

(4)、页面:

先在网上下载,把静态资源放入项目里面: bootstrap和layui文件,在各种的官网上可以下载。

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190310130419195.png)

index.jsp: (首页,启动项目进入的页面)

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190310130037259.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODQ4NDc0MA==,size_16,color_FFFFFF,t_70)

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%

pageContext.setAttribute("path", request.getContextPath());

%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>首页</title>

<style type="text/css">

a {

text-decoration: none;

color: #fff;

font-size: 14px;

}

h3 {

width: 180px;

height: 38px;

margin: 100px auto;

text-align: center;

line-height: 38px;

background: #5BC0DE;

border-radius: 4px;

}

</style>

</head>

<body>

<h3>

<a href="${path}/user/getUserList">进入用户管理页</a>

</h3>

</body>

</html>

in.jsp:公共页面(定义一些公共变量或者方法,引入公共js\css)

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<c:set var="path" scope="session" value="${pageContext.request.contextPath}"/>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>in.jsp</title>

<link href="${path}/static/bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet">

<script type="text/javascript" src="${path}/static/bootstrap-3.3.7-dist/js/jquery-1.10.1.min.js"></script>

<script type="text/javascript" src="${path}/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>

<script type="text/javascript" src="${path}/static/layui/layui.all.js"></script>

<script type="text/javascript">

//弹出框

function alert(text) {

layer.open({

type: 1,

skin: \'layui-layer-rim\', //加上边框

area: [\'300px\', \'220px\'], //宽高

shadeClose: true,

shade: 0.8,

content: text

});

};

</script>

</head>

<body>

</body>

</html>

userInfo.jsp: (数据列表页面)

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190311204348136.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODQ4NDc0MA==,size_16,color_FFFFFF,t_70)

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<jsp:include page="../in.jsp" flush="true"/>

<!DOCTYPE HTML>

<html>

<head>

<title>用户列表</title>

</head>

<body>

<div class="container">

<!-- 标题 -->

<div class="row">

<div class="col-md-12">

<h1>用户管理</h1>

</div>

</div>

<!-- 按钮 -->

<div class="row">

<div class="col-md-4 col-md-offset-8">

<a class="btn btn-primary" href="${path}/user/toAdduser">新增</a>

</div>

</div>

<!-- 表格 -->

<div class="row">

<div class="col-md-12">

<table class="table table-hover">

<tr>

<th>id</th>

<th>用户名</th>

<th>年龄</th>

<th>操作</th>

</tr>

<c:forEach items="${pageInfo.list}" var="user">

<tr>

<td>${user.id}</td>

<td>${user.name }</td>

<td>${user.age }</td>

<td>

<a type="button" href="${path}/user/selectByPrimaryKey? class="btn btn-info btn-sm">

<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>

编辑</a>

<a type="button" href="${path}/user/deleteUser?ids=${user.id}" class="btn btn-danger btn-sm">

<span class="glyphicon glyphicon-trash" aria-hidden="true" ></span>

删除</a>

</td>

</tr>

</c:forEach>

</table>

</div>

</div>

<hr />

<!-- 分页导航栏 -->

<!-- 分页信息 -->

<div class="row">

<!-- 分页文字信息,其中分页信息都封装在pageInfo中 -->

<div class="col-md-6">

当前第:${pageInfo.pageNum}页,总共:${pageInfo.pages}页,总共:${pageInfo.total}条记录

</div>

<!-- 分页条 -->

<div class="col-md-6">

<nav aria-label="Page navigation">

<ul class="pagination">

<li><a href="${path}/user/getUserList?pn=1">首页</a></li>

<!-- 如果还有上一页,则显示 -->

<c:if test="${pageInfo.hasPreviousPage }">

<li>

<a href="${path}/user/getUserList?pn=${pageInfo.pageNum-1}" aria-label="Previous">

<span aria-hidden="true">«</span>

</a>

</li>

</c:if>

<!-- 循环所有页码 -->

<c:forEach items="${pageInfo.navigatepageNums }" var="page_Num">

<!-- 如果等于当前页 -->

<c:if test="${page_Num == pageInfo.pageNum }">

<li class="active"><a href="#">${ page_Num}</a></li>

</c:if>

<c:if test="${page_Num != pageInfo.pageNum }">

<li><a href="${path}/user/getUserList?pn=${ page_Num}">${ page_Num}</a></li>

</c:if>

</c:forEach>

<c:if test="${pageInfo.hasNextPage }">

<li>

<a href="${path}/user/getUserList?pn=${pageInfo.pageNum+1}" aria-label="Next">

<span aria-hidden="true">»</span>

</a>

</li>

</c:if>

</ul>

</nav>

</div>

</div>

</div>

</body>

</html>

editUser.jsp: (数据编辑页面)

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190310130106379.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODQ4NDc0MA==,size_16,color_FFFFFF,t_70)

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<jsp:include page="../in.jsp" flush="true"/>

<!DOCTYPE html>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<html>

<head>

<title>编辑用户</title>

<script type="text/javascript">

function updateUser() {

var form = document.forms[0];

form.action = "${path}/user/updateUser";

form.method = "post";

form.submit();

}

</script>

</head>

<body>

<div class="container">

<!-- 标题 -->

<div class="row">

<div class="col-md-12">

<h1>编辑用户</h1>

</div>

</div>

<!-- 表单 -->

<form class="form-horizontal" action="" name="userForm">

<input type="hidden" type="text" name="id" value="${user.id }">

<div class="form-group">

<label for="inputEmail3" class="col-md-2 control-label">姓名:</label>

<div class="col-md-4">

<input class="form-control" type="text" name="name" value="${user.name }">

</div>

</div>

<div class="form-group">

<label for="inputEmail3" class="col-md-2 control-label">年龄:</label>

<div class="col-md-4">

<input class="form-control" type="text" name="age" value="${user.age }">

</div>

</div>

<div class="form-group">

<label class="col-md-2 control-label"></label>

<div class="col-md-4">

<button type="submit" class="btn btn-primary" onclick="updateUser()" >编辑</button>

</div>

</div>

</form>

</div>

</body>

</html>

addUser.jsp: (数据添加页面)

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190310130131496.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODQ4NDc0MA==,size_16,color_FFFFFF,t_70)

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<jsp:include page="../in.jsp" flush="true"/>

<!DOCTYPE HTML>

<html>

<head>

<title>添加用户</title>

<script type="text/javascript">

function addUser() {

var form = document.forms[0];

form.action = "${path}/user/saveUser";

form.method = "post";

form.submit();

};

</script>

</head>

<body>

<div class="container">

<!-- 标题 -->

<div class="row">

<div class="col-md-12">

<h1>添加用户</h1>

</div>

</div>

<!-- 表单 -->

<div class="row">

<div class="col-md-12">

<form class="form-horizontal" action="" name="userForm">

<div class="form-group">

<label for="inputEmail3" class="col-md-2 control-label">姓名:</label>

<div class="col-md-4">

<input class="form-control" type="text" name="name" >

</div>

</div>

<div class="form-group">

<label class="col-md-2 control-label">年龄:</label>

<div class="col-md-4">

<input class="form-control" type="text" name="age" >

</div>

</div>

<div class="form-group">

<label class="col-md-2 control-label"></label>

<div class="col-md-4">

<button type="submit" class="btn btn-primary" onclick="addUser()" >添加</button>

</div>

</div>

</form>

</div>

</div>

</div>

</body>

</html>

以上就是ssm实现增删查改的全部过程。