zoukankan      html  css  js  c++  java
  • SSM框架+thymeleaf实现基本的增删改查

    前言

    本文使用了SSM框架、thymeleaf和jquery实现了基本的增删改查。

    名词解释

    SSM框架:springMVC、spring、mybatis

    thymeleaf:一个与Velocity、FreeMarker类似的模板引擎

    jquery:一个快速、简洁的JavaScript框架

    程序结构

    本程序框架是用maven建出来的,具体如图:

    程序源码

    pom.xml

    <?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>org.hanzx</groupId>
      <artifactId>webssm</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>war</packaging>
    
      <name>webssm 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.9</maven.compiler.source>
        <maven.compiler.target>1.9</maven.compiler.target>
        <spring.version>4.2.5.RELEASE</spring.version>
        <mybatis.version>3.2.1</mybatis.version>
        <slf4j.version>1.6.6</slf4j.version>
        <log4j.version>1.2.12</log4j.version>
        <mysql.version>5.1.35</mysql.version>
      </properties>
    
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
          <scope>test</scope>
        </dependency>
        <!-- 添加Spring依赖 -->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-core</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-aspects</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-web</artifactId>
          <version>${spring.version}</version>
        </dependency>
        <!--spring单元测试依赖 -->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-test</artifactId>
          <version>${spring.version}</version>
          <scope>test</scope>
        </dependency>
    
        <!-- spring webmvc相关jar -->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>${spring.version}</version>
        </dependency>
    
        <!-- mysql驱动包 -->
        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>${mysql.version}</version>
        </dependency>
    
        <!-- alibaba data source 相关jar包-->
        <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>druid</artifactId>
          <version>0.2.23</version>
        </dependency>
    
        <!-- alibaba fastjson 格式化对 -->
        <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>fastjson</artifactId>
          <version>1.1.41</version>
        </dependency>
    
        <!-- logback start -->
        <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>ch.qos.logback</groupId>
          <artifactId>logback-classic</artifactId>
          <version>1.1.2</version>
        </dependency>
        <dependency>
          <groupId>ch.qos.logback</groupId>
          <artifactId>logback-core</artifactId>
          <version>1.1.2</version>
        </dependency>
        <dependency>
          <groupId>org.logback-extensions</groupId>
          <artifactId>logback-ext-spring</artifactId>
          <version>0.1.1</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.0</version>
        </dependency>
        <!-- 添加servlet3.0核心包 -->
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.0.1</version>
        </dependency>
        <dependency>
          <groupId>javax.servlet.jsp</groupId>
          <artifactId>javax.servlet.jsp-api</artifactId>
          <version>2.3.2-b01</version>
        </dependency>
        <!-- jstl -->
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
        </dependency>
        <!--thymeleaf-->
        <dependency>
          <groupId>org.thymeleaf</groupId>
          <artifactId>thymeleaf-spring5</artifactId>
          <version>3.0.9.RELEASE</version>
        </dependency>
      </dependencies>
    
      <build>
        <finalName>webssm</finalName>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
          <plugins>
            <plugin>
              <artifactId>maven-clean-plugin</artifactId>
              <version>3.0.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.7.0</version>
            </plugin>
            <plugin>
              <artifactId>maven-surefire-plugin</artifactId>
              <version>2.20.1</version>
            </plugin>
            <plugin>
              <artifactId>maven-war-plugin</artifactId>
              <version>3.2.0</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>

    spring配置文件

    applicationContext.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">
    
        <!-- 1.配置jdbc文件 -->
        <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="locations" value="classpath:jdbc.properties"/>
        </bean>
    
        <!-- 2.扫描的包路径,这里不扫描被@Controller注解的类 --><!--使用<context:component-scan/> 可以不再配置<context:annotation-config/> -->
        <context:component-scan base-package="org.hanzx">
            <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
    
        <import resource="classpath:spring-mybatis.xml" />
        <!--<import resource="classpath:spring-mvc.xml" />-->
    </beans>

    springMVC配置文件

    spring-mvc.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" xmlns:p="http://www.springframework.org/schema/p"
           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">
    
        <!-- 扫描controller(controller层注入) -->
        <context:component-scan base-package="org.hanzx.controller" use-default-filters="false">
            <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
    
        <mvc:annotation-driven />
    
        <!-- 内容协商管理器  -->
        <!--1、首先检查路径扩展名(如my.pdf);2、其次检查Parameter(如my?format=pdf);3、检查Accept Header-->
        <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
            <!-- 扩展名至mimeType的映射,即 /user.json => application/json -->
            <property name="favorPathExtension" value="true"/>
            <!-- 用于开启 /userinfo/123?format=json 的支持 -->
            <property name="favorParameter" value="true"/>
            <property name="parameterName" value="format"/>
            <!-- 是否忽略Accept Header -->
            <property name="ignoreAcceptHeader" value="false"/>
    
            <property name="mediaTypes"> <!--扩展名到MIME的映射;favorPathExtension, favorParameter是true时起作用  -->
                <value>
                    json=application/json
                    xml=application/xml
                    html=text/html
                </value>
            </property>
            <!-- 默认的content type -->
            <property name="defaultContentType" value="text/html"/>
        </bean>
    
    
        <!-- 当在web.xml 中   DispatcherServlet使用 <url-pattern>/</url-pattern> 映射时,能映射静态资源 -->
        <mvc:default-servlet-handler />
        <!-- 静态资源映射 -->
        <mvc:resources mapping="/static/**" location="/WEB-INF/static/"/>
    
    
        <!-- 对模型视图添加前后缀 -->
        <!--<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"-->
              <!--p:prefix="/WEB-INF/pages/" p:suffix=".jsp"/>-->
    
        <bean id="templateResolver"
              class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
            <property name="prefix" value="/WEB-INF/templates/"/>
            <property name="suffix" value=".html"/>
            <property name="characterEncoding" value="UTF-8"/>
            <property name="order" value="1"/>
            <property name="templateMode" value="HTML5"/>
            <property name="cacheable" value="false"/>
        </bean>
    
        <bean id="templateEngine"
              class="org.thymeleaf.spring5.SpringTemplateEngine">
            <property name="templateResolver" ref="templateResolver"/>
        </bean>
    
        <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
            <property name="templateEngine" ref="templateEngine"/>
            <property name="characterEncoding" value="UTF-8"/>
        </bean>
    
    
    </beans>

    mybatis配置文件

    spring-mybatis.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: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/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    
        <!-- 3.配置数据源 ,使用的alibba的数据库-->
        <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
            <!-- 基本属性 url、user、password -->
            <property name="driverClassName" value="${jdbc_driverClassName}"/>
            <property name="url" value="${jdbc_url}"/>
            <property name="username" value="${jdbc_username}"/>
            <property name="password" value="${jdbc_password}"/>
    
            <!-- 配置初始化大小、最小、最大 -->
            <property name="initialSize" value="10"/>
            <property name="minIdle" value="10"/>
            <property name="maxActive" value="50"/>
    
            <!-- 配置获取连接等待超时的时间 -->
            <property name="maxWait" value="60000"/>
            <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
            <property name="timeBetweenEvictionRunsMillis" value="60000" />
    
            <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
            <property name="minEvictableIdleTimeMillis" value="300000" />
    
            <property name="validationQuery" value="SELECT 'x'" />
            <property name="testWhileIdle" value="true" />
            <property name="testOnBorrow" value="false" />
            <property name="testOnReturn" value="false" />
    
            <!-- 打开PSCache,并且指定每个连接上PSCache的大小  如果用Oracle,则把poolPreparedStatements配置为true,mysql可以配置为false。-->
            <property name="poolPreparedStatements" value="false" />
            <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
    
            <!-- 配置监控统计拦截的filters -->
            <property name="filters" value="wall,stat" />
        </bean>
    
    
    
        <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource" />
            <!-- 自动扫描mapping.xml文件 -->
            <property name="mapperLocations" value="classpath:mapper/*.xml" />
        </bean>
    
    
        <!-- DAO接口所在包名,Spring会自动查找其下的类 ,自动扫描了所有的XxxxMapper.xml对应的mapper接口文件,只要Mapper接口类和Mapper映射文件对应起来就可以了-->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="org.hanzx.dao" />
            <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        </bean>
    
        <!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
        <!-- 配置事务管理器 -->
        <bean id="transactionManager"
              class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource" />
        </bean>
    
        <!--======= 事务配置 End =================== -->
        <!-- 配置基于注解的声明式事务 -->
        <!-- enables scanning for @Transactional annotations -->
        <tx:annotation-driven transaction-manager="transactionManager" />
    
    </beans>

    jdbc数据库连接配置文件

    jdbc.properties

    jdbc_driverClassName=com.mysql.jdbc.Driver
    jdbc_url=jdbc:mysql://localhost:3306/web_test?useUnicode=true&characterEncoding=utf8
    jdbc_username=root
    jdbc_password=root

    log配置文件

    logback.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <!-- 尽量别用绝对路径,如果带参数不同容器路径解释可能不同,以下配置参数在pom.xml里 -->
        <property name="log.root.level" value="${log.root.level}" /> <!-- 日志级别 -->
        <property name="log.other.level" value="${log.other.level}" /> <!-- 其他日志级别 -->
        <property name="log.base" value="${log.base}" /> <!-- 日志路径,这里是相对路径,web项目eclipse下会输出到eclipse的安装目录下,如果部署到linux上的tomcat下,会输出到tomcat/bin目录 下 -->
        <property name="log.moduleName" value="${log.moduleName}" />  <!-- 模块名称, 影响日志配置名,日志文件名 -->
        <property name="log.max.size" value="100MB" /> <!-- 日志文件大小,超过这个大小将被压缩 -->
    
        <!--控制台输出 -->
        <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <Pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method():%L -%msg%n</Pattern>
            </encoder>
        </appender>
    
        <!-- 用来保存输出所有级别的日志 -->
        <appender name="file.all" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <File>${log.base}/${log.moduleName}.log</File><!-- 设置日志不超过${log.max.size}时的保存路径,注意如果
                是web项目会保存到Tomcat的bin目录 下 -->
            <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <FileNamePattern>${log.base}/archive/${log.moduleName}_all_%d{yyyy-MM-dd}.%i.log.zip
                </FileNamePattern>
                <!-- 文件输出日志 (文件大小策略进行文件输出,超过指定大小对文件备份) -->
                <timeBasedFileNamingAndTriggeringPolicy
                        class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>${log.max.size}</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
            </rollingPolicy>
            <!-- 日志输出的文件的格式 -->
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method():%L -%msg%n</pattern>
            </layout>
        </appender>
    
        <!-- 这也是用来保存输出所有级别的日志 -->
        <appender name="file.all.other" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <File>${log.base}/${log.moduleName}_other.log</File>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <FileNamePattern>${log.base}/archive/${log.moduleName}_other_%d{yyyy-MM-dd}.%i.log.zip
                </FileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy
                        class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>${log.max.size}</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
            </rollingPolicy>
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{56}.%method():%L -%msg%n</pattern>
            </layout>
        </appender>
    
        <!-- 只用保存输出error级别的日志 -->
        <appender name="file.error"
                  class="ch.qos.logback.core.rolling.RollingFileAppender">
            <File>${log.base}/${log.moduleName}_err.log</File>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <FileNamePattern>${log.base}/archive/${log.moduleName}_err_%d{yyyy-MM-dd}.%i.log.zip
                </FileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy
                        class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>${log.max.size}</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
            </rollingPolicy>
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{56}.%method():%L - %msg%n</pattern>
            </layout>
            <!-- 下面为配置只输出error级别的日志 -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>ERROR</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
    
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender name="file.async" class="ch.qos.logback.classic.AsyncAppender">
            <discardingThreshold>0</discardingThreshold>
            <queueSize>256</queueSize>
            <includeCallerData>true</includeCallerData>
            <appender-ref ref="file.all" />
        </appender>
    
        <appender name="file.async.other" class="ch.qos.logback.classic.AsyncAppender">
            <discardingThreshold>0</discardingThreshold>
            <queueSize>256</queueSize>
            <includeCallerData>true</includeCallerData>
            <appender-ref ref="file.all.other" />
        </appender>
    
        <!-- 为某个包下的所有类的指定Appender 这里也可以指定类名称例如:com.aa.bb.ClassName -->
        <logger name="com.lin" additivity="false">
            <level value="${log.root.level}" />
            <appender-ref ref="stdout" />
            <appender-ref ref="file.async" /><!-- 即com.lin包下级别为 ${log.root.level}的才会使用file.async来打印 -->
            <appender-ref ref="file.error" />
        </logger>
    
        <!-- root将级别为${log.root.level}及大于${log.root.level}的日志信息交给已经配置好的名为“Console”的appender处理,“Console”appender将信息打印到Console,其它同理 -->
        <root level="${log.root.level}">
            <appender-ref ref="stdout" /> <!--  标识这个appender将会添加到这个logger -->
            <appender-ref ref="file.async.other" />
            <appender-ref ref="file.error" />
        </root>
    </configuration>

    UserController

    package org.hanzx.controller;
    
    import org.hanzx.model.User;
    import org.hanzx.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.ModelMap;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @Controller
    @RequestMapping("/user")
    public class UserController {
    
        private final UserService userService;
        private String prefix = "user/";
    
        @Autowired
        public UserController(UserService userService) {
            this.userService = userService;
        }
    
        @RequestMapping(value="/getAllUser")
        public String getAllUser(ModelMap modelMap){
            modelMap.put("userList", userService.getAllUser());
            return prefix + "user_list";
        }
    
        @RequestMapping(value="/getUserDetailForm")
        public String getUserDetailForm(ModelMap modelMap, Integer id){
            if (id != null){
                modelMap.put("user", userService.getUserById(id));
            }
            return prefix + "user_detail";
        }
    
        @RequestMapping(value="/addUser")
        public String addUser(User user){
            userService.addUser(user);
            return "redirect:getAllUser";
        }
    
        @RequestMapping(value="/updateUser")
        public String updateUser(User user){
            userService.updateUser(user);
            return "redirect:getAllUser";
        }
    
        @RequestMapping(value="/deleteUser")
        @ResponseBody
        public String deleteUser(@RequestParam(value = "ids[]") Integer[] ids){
            userService.deleteUser(ids);
            return "true";
        }
    
    
    }

    userService

    package org.hanzx.service;
    
    
    import org.hanzx.model.User;
    
    import java.util.List;
    
    public interface UserService {
    
        List<User> getAllUser();
    
        void addUser(User user);
    
        User getUserById(Integer id);
    
        void updateUser(User user);
    
        void deleteUser(Integer[] ids);
    }

    userServiceImpl

    package org.hanzx.service.impl;
    
    import org.hanzx.dao.UserDao;
    import org.hanzx.entity.User;
    import org.hanzx.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.ArrayList;
    import java.util.List;
    
    @Service
    public class UserServiceImpl implements UserService{
    
        private final UserDao userDao;
    
        @Autowired
        public UserServiceImpl(UserDao userDao) {
            this.userDao = userDao;
        }
    
        @Override
        public List<org.hanzx.model.User> getAllUser() {
            List<User> userList = userDao.getAllUser();
            List<org.hanzx.model.User> userModelList = new ArrayList<>();
            for (User user : userList){
                org.hanzx.model.User userModel = new org.hanzx.model.User();
                userModel.setName(user.getName());
                userModel.setId(user.getId());
                userModel.setAge(user.getAge());
                userModelList.add(userModel);
            }
            return userModelList;
        }
    
        @Override
        public void addUser(org.hanzx.model.User user) {
            User userEntity = new User();
            userEntity.setName(user.getName());
            userEntity.setAge(user.getAge());
            userEntity.setPassword(user.getPassword());
            userDao.addUser(userEntity);
        }
    
        @Override
        public org.hanzx.model.User getUserById(Integer id) {
            User userEntity = userDao.getUserById(id);
            org.hanzx.model.User user = new org.hanzx.model.User();
            user.setAge(userEntity.getAge());
            user.setId(userEntity.getId());
            user.setName(userEntity.getName());
            user.setPassword(userEntity.getPassword());
            return user;
        }
    
        @Override
        public void updateUser(org.hanzx.model.User user) {
            User userEntity = userDao.getUserById(user.getId());
            userEntity.setPassword(user.getPassword());
            userEntity.setAge(user.getAge());
            userEntity.setName(user.getName());
            userDao.updateUser(userEntity);
        }
    
        @Override
        public void deleteUser(Integer[] ids) {
            for (Integer id : ids){
                userDao.deleteUserById(id);
            }
        }
    }

    userDao

    package org.hanzx.dao;
    
    
    import org.hanzx.entity.User;
    import org.springframework.stereotype.Repository;
    
    import java.util.List;
    
    @Repository
    public interface UserDao {
    
        List<User> getAllUser();
    
        void addUser(User user);
    
        User getUserById(Integer id);
    
        void updateUser(User user);
    
        void deleteUserById(Integer id);
    }

    entity User

    package org.hanzx.entity;
    
    
    
    public class User {
    
        private Integer id;
    
        private String name;
    
        private Integer age;
    
        private String password;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    }

    model User

    package org.hanzx.model;
    
    
    
    public class User {
    
        private Integer id;
    
        private String name;
    
        private Integer age;
    
        private String password;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    }

    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" >
    
    <mapper namespace="org.hanzx.dao.UserDao">
        <resultMap id="BaseResultMap" type="org.hanzx.entity.User" >
            <id column="id" property="id" jdbcType="INTEGER" />
            <result column="name" property="name" jdbcType="VARCHAR" />
            <result column="password" property="password" jdbcType="VARCHAR" />
            <result column="age" property="age" jdbcType="INTEGER" />
        </resultMap>
        <select id="getAllUser" resultMap="BaseResultMap" >
          SELECT * FROM user;
        </select>
    
        <insert id="addUser">
            INSERT USER VALUES (null, #{name}, #{age}, #{password});
        </insert>
    
        <select id="getUserById" resultMap="BaseResultMap">
            SELECT * FROM user WHERE user.id = #{id};
        </select>
    
        <update id="updateUser">
            UPDATE user SET name = #{name}, age = #{age}, password = #{password} WHERE id = #{id};
        </update>
    
        <delete id="deleteUserById">
            DELETE FROM user where id = #{id};
        </delete>
    
    </mapper>

    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>
    
      <!-- 读取spring配置文件 -->
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
      </context-param>
    
      <context-param>
        <param-name>logbackConfigLocation</param-name>
        <param-value>classpath:logback.xml</param-value>
      </context-param>
    
      <!-- 设计路径变量值
      <context-param>
          <param-name>webAppRootKey</param-name>
          <param-value>springmvc.root</param-value>
      </context-param>
      -->
    
      <!-- Spring字符集过滤器 -->
      <filter>
        <filter-name>SpringEncodingFilter</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>
        <init-param>
          <param-name>forceEncoding</param-name>
          <param-value>true</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>SpringEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
      <!-- 添加日志监听器 -->
      <listener>
        <listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class>
      </listener>
    
      <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
    
      <!-- springMVC核心配置 -->
      <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
          <param-name>contextConfigLocation</param-name>
          <!--spingMVC的配置路径 -->
          <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
      </servlet>
      <!-- 拦截设置 -->
      <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>
    
    
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
    
    </web-app>

    user_list.html

    <!DOCTYPE html>
    <html lang="cn" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>userList</title>
        <script type="text/javascript" src="http://code.jquery.com/jquery-latest.js" ></script>
        <script type="text/javascript">
            $(function () {
                //全选
                $("#selectAll").click(function () {
                    if (this.checked) {
                        $("input[name=deleteId]").prop("checked", true);
                    } else {
                        $("input[name=deleteId]").prop("checked", false);
                    }
                });
    
                $("input[name=deleteId]").click(function () {
                    var allChecked = true;
                    $("input[name=deleteId]").each(function(){
                        if(!$(this).prop("checked")){
                            allChecked = false;
                        }
                    });
                    if(allChecked){
                        $("#selectAll").prop("checked",true);
                    } else {
                        $("#selectAll").prop("checked",false);
                    }
                });
    
                //删除用户
                $("#delete").click(function () {
                    var ids = [];
                    $("input[name=deleteId]:checked").each(function(index){
                        ids[index] = $(this).val();
                    });
                    if (ids.length === 0){
                        alert("没有选中的选项");
                        return false;
                    }
                    $.ajax({
                        url : "deleteUser",
                        data: {"ids": ids},
                        cache : false,
                        async : false,
                        type : "GET",
                        success:function(data){
                            if (data === "true"){
                                window.location.reload();
                            }
                        }
                    });
                });
    
            });
    
        </script>
    </head>
    <body>
        <a th:href="getUserDetailForm">添加</a>
        <a th:id="delete" href="#" >删除</a>
        <table>
            <tr>
                <th><input th:type="checkbox" th:id="selectAll" title="点击全选/取消"/></th>
                <th>用户名</th>
                <th>年龄</th>
                <th>操作</th>
            </tr>
            <tr th:each="user : ${userList}">
                <td><input th:type="checkbox" th:value="${user.id}" th:name="deleteId"/></td>
                <td th:text="${user.name}">abc</td>
                <td th:text="${user.age}">15</td>
                <td><a th:href="'getUserDetailForm?id=' + ${user.id}">修改</a></td>
            </tr>
        </table>
    </body>
    </html>

    user_detail.html

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div th:if="${user} eq null">
            <form th:action="addUser" th:method="post">
        </div>
        <div th:if="${user} ne null">
            <form th:action="updateUser" th:method="post">
        </div>
            <table>
                <tr>
                    <th>用户名</th>
                    <td><input th:type="text" th:name="name" th:value="${user == null? '' : user.name}" th:title="请输入用户名"/></td>
                </tr>
                <tr>
                    <th>密码</th>
                    <td><input th:type="password" th:name="password" th:title="请输入密码"/></td>
                </tr>
                <tr>
                    <th>年龄</th>
                    <td><input th:type="number" th:name="age" th:value="${user == null? '' : user.age}" th:title="请输入年龄"/></td>
                </tr>
                <tr><td th:colspan="2" ><input th:type="submit" th:value="提交" /></td></tr>
            </table>
            <input th:type="hidden" th:name="id" th:value="${user == null? null : user.id}" />
        </form>
    </body>
    </html>

    效果图

    参考资料

    https://www.cnblogs.com/aflyun/p/6421441.html

    https://www.jianshu.com/p/b997449183e3

  • 相关阅读:
    Java集合类框架的基本接口有哪些?
    JSR303校验 —— hibernate-validator实现
    JSON和对象或集合间的转换
    Servlet 单例、多线程
    session.invalidate()
    request获取各种路径
    动态加载类并实例化对象 —— newInstance
    js 事件冒泡和事件捕获
    js事件绑定
    css 选择器和优先级
  • 原文地址:https://www.cnblogs.com/hanzx/p/10016468.html
Copyright © 2011-2022 走看看