• 一秒钟学会SprinvMvc开发


    一、基础增删改查

    1.1 环境搭建

    1.1.1 导入相关的pom依赖

    pom.xml

    注意:如果本地仓库是第一次导入其包,那么我们首先导入properties标签里面的内容,然后导入dependencies的内容,在dependencies标签里面我们有几个依赖有顺序,首先要导入
    org.springframework spring-webmvc ${spring.version}
    然后导入
    javax.servlet.jsp javax.servlet.jsp-api 2.3.3
    在导入
    jstl jstl 1.2
    最后导入
    taglibs standard 1.1.2
    导入dependencies标签内容后我们在导入resources标签的内容,最后导入plugin内容即可

    <?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.example</groupId>
      <artifactId>ssm02</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>war</packaging>
    
      <name>ssm02 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.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.plugin.version>3.7.0</maven.compiler.plugin.version>
    
        <!--添加jar包依赖-->
        <!--1.spring 5.0.2.RELEASE相关-->
        <spring.version>5.0.2.RELEASE</spring.version>
        <!--2.mybatis相关-->
        <mybatis.version>3.4.5</mybatis.version>
        <!--mysql-->
        <mysql.version>5.1.44</mysql.version>
        <!--pagehelper分页jar依赖-->
        <pagehelper.version>5.1.2</pagehelper.version>
        <!--mybatis与spring集成jar依赖-->
        <mybatis.spring.version>1.3.1</mybatis.spring.version>
        <!--3.dbcp2连接池相关 druid-->
        <commons.dbcp2.version>2.1.1</commons.dbcp2.version>
        <commons.pool2.version>2.4.3</commons.pool2.version>
        <!--4.log日志相关-->
        <log4j2.version>2.9.1</log4j2.version>
        <!--5.其他-->
        <junit.version>4.12</junit.version>
        <servlet.version>4.0.0</servlet.version>
        <lombok.version>1.18.2</lombok.version>
      </properties>
    
      <dependencies>
        <!--1.spring相关-->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>${spring.version}</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-orm</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-aspects</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-test</artifactId>
          <version>${spring.version}</version>
        </dependency>
    
        <!--2.mybatis相关-->
        <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>${mybatis.version}</version>
        </dependency>
        <!--mysql-->
        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>${mysql.version}</version>
        </dependency>
        <!--pagehelper分页插件jar包依赖-->
        <dependency>
          <groupId>com.github.pagehelper</groupId>
          <artifactId>pagehelper</artifactId>
          <version>${pagehelper.version}</version>
        </dependency>
        <!--mybatis与spring集成jar包依赖-->
        <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis-spring</artifactId>
          <version>${mybatis.spring.version}</version>
        </dependency>
    
        <!--3.dbcp2连接池相关-->
        <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-dbcp2</artifactId>
          <version>${commons.dbcp2.version}</version>
        </dependency>
        <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-pool2</artifactId>
          <version>${commons.pool2.version}</version>
        </dependency>
    
        <!--4.log日志相关依赖-->
        <!--核心log4j2jar包-->
        <dependency>
          <groupId>org.apache.logging.log4j</groupId>
          <artifactId>log4j-core</artifactId>
          <version>${log4j2.version}</version>
        </dependency>
        <dependency>
          <groupId>org.apache.logging.log4j</groupId>
          <artifactId>log4j-api</artifactId>
          <version>${log4j2.version}</version>
        </dependency>
        <!--web工程需要包含log4j-web,非web工程不需要-->
        <dependency>
          <groupId>org.apache.logging.log4j</groupId>
          <artifactId>log4j-web</artifactId>
          <version>${log4j2.version}</version>
        </dependency>
    
        <!--5.其他-->
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>${junit.version}</version>
          <scope>test</scope>
        </dependency>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>${servlet.version}</version>
          <scope>provided</scope>
        </dependency>
        <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <version>${lombok.version}</version>
          <scope>provided</scope>
        </dependency>
    
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>${spring.version}</version>
        </dependency>
    
        <!-- jsp依赖-->
        <dependency>
          <groupId>javax.servlet.jsp</groupId>
          <artifactId>javax.servlet.jsp-api</artifactId>
          <version>2.3.3</version>
        </dependency>
    
        <dependency>
          <groupId>jstl</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
        </dependency>
    
        <dependency>
          <groupId>taglibs</groupId>
          <artifactId>standard</artifactId>
          <version>1.1.2</version>
        </dependency>
    
      </dependencies>
    
      <build>
        <finalName>ssm02</finalName>
        <resources>
          <!--解决mybatis-generator-maven-plugin运行时没有将XxxMapper.xml文件放入target文件夹的问题-->
          <resource>
            <directory>src/main/java</directory>
            <includes>
              <include>**/*.xml
            
          
          
          
            src/main/resources
            
              jdbc.properties
              *.xml
            
          
        
    
        
          
    
            
              org.apache.maven.plugins
              maven-compiler-plugin
              ${maven.compiler.plugin.version}
              
                ${maven.compiler.source}
                ${maven.compiler.target}
                ${project.build.sourceEncoding}
              
            
            
              org.mybatis.generator
              mybatis-generator-maven-plugin
              1.3.2
              
                
                
                  mysql
                  mysql-connector-java
                  ${mysql.version}
                
              
              
                true
              
            
    
            
              maven-clean-plugin
              3.1.0
            
            
            
              maven-resources-plugin
              3.0.2
            
            
              maven-compiler-plugin
              3.8.0
            
            
              maven-surefire-plugin
              2.22.1
            
            
              maven-war-plugin
              3.2.2
            
            
              maven-install-plugin
              2.5.2
            
            
              maven-deploy-plugin
              2.8.2
            
          
        
      
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263

    1.1.2 导入相关配置文件

    导入的配置文件有
    applicationContext.xml
    applicationContext-mybatis.xml
    generatorConfig.xml
    jdbc.properties
    log4j2.xml
    mybatis.cfg.xml
    springmvc-servlet.xml
    需要用到的分页工具类
    PageTag.java
    PageBean.java
    StringUtils.java
    标签tld文件
    zking.tld
    web.xml相关配置
    web.xml

    2.1 配置文件

    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" xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:aop="http://www.springframework.org/schema/aop"
           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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    
        <import resource="applicationContext-mybatis.xml"></import>
    
    </beans>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    applicationContext-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:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:aop="http://www.springframework.org/schema/aop"
           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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
        <!--1. 注解式开发 -->
        <!-- 注解驱动 -->
        <context:annotation-config/>
        <!-- 用注解方式注入bean,并指定查找范围:com.javaxl.ssm及子子孙孙包-->
        <context:component-scan base-package="com.xlb.ssm"/>
    
        <context:property-placeholder location="classpath:jdbc.properties"/>
    
        <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
              destroy-method="close">
            <property name="driverClassName" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
            <!--初始连接数-->
            <property name="initialSize" value="10"/>
            <!--最大活动连接数-->
            <property name="maxTotal" value="100"/>
            <!--最大空闲连接数-->
            <property name="maxIdle" value="50"/>
            <!--最小空闲连接数-->
            <property name="minIdle" value="10"/>
            <!--设置为-1时,如果没有可用连接,连接池会一直无限期等待,直到获取到连接为止。-->
            <!--如果设置为N(毫秒),则连接池会等待N毫秒,等待不到,则抛出异常-->
            <property name="maxWaitMillis" value="-1"/>
        </bean>
    
        <!--4. spring和MyBatis整合 -->
        <!--1) 创建sqlSessionFactory-->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <!-- 指定数据源 -->
            <property name="dataSource" ref="dataSource"/>
            <!-- 自动扫描XxxMapping.xml文件,**任意路径 -->
            <property name="mapperLocations" value="classpath*:com/xlb/ssm/**/mapper/*.xml"/>
            <!-- 指定别名 -->
            <property name="typeAliasesPackage" value="com/xlb/ssm/**/model"/>
            <!--配置pagehelper插件-->
            <property name="plugins">
                <array>
                    <bean class="com.github.pagehelper.PageInterceptor">
                        <property name="properties">
                            <value>
                                helperDialect=mysql
                            </value>
                        </property>
                    </bean>
                </array>
            </property>
        </bean>
    
        <!--2) 自动扫描com/javaxl/ssm/**/mapper下的所有XxxMapper接口(其实就是DAO接口),并实现这些接口,-->
        <!--   即可直接在程序中使用dao接口,不用再获取sqlsession对象-->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <!--basePackage 属性是映射器接口文件的包路径。-->
            <!--你可以使用分号或逗号 作为分隔符设置多于一个的包路径-->
            <property name="basePackage" value="com/xlb/ssm/**/mapper"/>
            <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        </bean>
    
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource" />
        </bean>
        <tx:annotation-driven transaction-manager="transactionManager" />
        <aop:aspectj-autoproxy/>
    </beans>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72

    generatorConfig.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
            "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
    <generatorConfiguration>
        <!-- 引入配置文件 -->
        <properties resource="jdbc.properties"/>
    
        <!--指定数据库jdbc驱动jar包的位置-->
        <classPathEntry location="E:\\maven\\mavenjar\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>
    
        <!-- 一个数据库一个context -->
        <context id="infoGuardian">
            <!-- 注释 -->
            <commentGenerator>
                <property name="suppressAllComments" value="true"/><!-- 是否取消注释 -->
                <property name="suppressDate" value="true"/> <!-- 是否生成注释代时间戳 -->
            </commentGenerator>
    
            <!-- jdbc连接 -->
            <jdbcConnection driverClass="${jdbc.driver}"
                            connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>
    
            <!-- 类型转换 -->
            <javaTypeResolver>
                <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.-->
                <property name="forceBigDecimals" value="false"/>
            </javaTypeResolver>
    
            <!-- 01 指定javaBean生成的位置 -->
            <!-- targetPackage:指定生成的model生成所在的包名 -->
            <!-- targetProject:指定在该项目下所在的路径  -->
            <javaModelGenerator targetPackage="com.xlb.ssm.model"
                                targetProject="src/main/java">
                <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
                <property name="enableSubPackages" value="false"/>
                <!-- 是否对model添加构造函数 -->
                <property name="constructorBased" value="true"/>
                <!-- 是否针对string类型的字段在set的时候进行trim调用 -->
                <property name="trimStrings" value="false"/>
                <!-- 建立的Model对象是否 不可改变  即生成的Model对象不会有 setter方法,只有构造方法 -->
                <property name="immutable" value="false"/>
            </javaModelGenerator>
    
            <!-- 02 指定sql映射文件生成的位置 -->
            <sqlMapGenerator targetPackage="com.xlb.ssm.mapper"
                             targetProject="src/main/java">
                <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
                <property name="enableSubPackages" value="false"/>
            </sqlMapGenerator>
    
            <!-- 03 生成XxxMapper接口 -->
            <!-- type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象 -->
            <!-- type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象 -->
            <!-- type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口 -->
            <javaClientGenerator targetPackage="com.xlb.ssm.mapper"
                                 targetProject="src/main/java" type="XMLMAPPER">
                <!-- 是否在当前路径下新加一层schema,false路径com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] -->
                <property name="enableSubPackages" value="false"/>
            </javaClientGenerator>
    
            <!-- 配置表信息 -->
            <!-- schema即为数据库名 -->
            <!-- tableName为对应的数据库表 -->
            <!-- domainObjectName是要生成的实体类 -->
            <!-- enable*ByExample是否生成 example类 -->
            <!--<table schema="" tableName="t_book" domainObjectName="Book"-->
            <!--enableCountByExample="false" enableDeleteByExample="false"-->
            <!--enableSelectByExample="false" enableUpdateByExample="false">-->
            <!--&lt;!&ndash; 忽略列,不生成bean 字段 &ndash;&gt;-->
            <!--&lt;!&ndash; <ignoreColumn column="FRED" /> &ndash;&gt;-->
            <!--&lt;!&ndash; 指定列的java数据类型 &ndash;&gt;-->
            <!--&lt;!&ndash; <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> &ndash;&gt;-->
            <!--</table>-->
    
            <table schema="" tableName="t_struts_class" domainObjectName="Clazz"
                   enableCountByExample="false" enableDeleteByExample="false"
                   enableSelectByExample="false" enableUpdateByExample="false">
            </table>
    
    
    
    
    
        </context>
    </generatorConfiguration>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86

    jdbc.properties

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/y101?useUnicode=true&characterEncoding=UTF-8
    jdbc.username=root
    jdbc.password=123
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    log4j2.xml

    <?xml version="1.0" encoding="UTF-8"?>
    
    <!-- status : 指定log4j本身的打印日志的级别.ALL< Trace < DEBUG < INFO < WARN < ERROR 
    	< FATAL < OFF。 monitorInterval : 用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s. -->
    <Configuration status="WARN" monitorInterval="30">
    	<Properties>
    		<!-- 配置日志文件输出目录 ${sys:user.home} -->
    		<Property name="LOG_HOME">/root/workspace/lucenedemo/logs</Property>
    		<property name="ERROR_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/error</property>
    		<property name="WARN_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/warn</property>
    		<property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%n</property>
    	</Properties>
    
    	<Appenders>
    		<!--这个输出控制台的配置 -->
    		<Console name="Console" target="SYSTEM_OUT">
    			<!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
    			<ThresholdFilter level="trace" onMatch="ACCEPT"
    				onMismatch="DENY" />
    			<!-- 输出日志的格式 -->
    			<!-- %d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间 %p : 日志输出格式 %c : logger的名称 
    				%m : 日志内容,即 logger.info("message") %n : 换行符 %C : Java类名 %L : 日志输出所在行数 %M 
    				: 日志输出所在方法名 hostName : 本地机器名 hostAddress : 本地ip地址 -->
    			<PatternLayout pattern="${PATTERN}" />
    		</Console>
    
    		<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用 -->
    		<!--append为TRUE表示消息增加到指定文件中,false表示消息覆盖指定的文件内容,默认值是true -->
    		<File name="log" fileName="logs/test.log" append="false">
    			<PatternLayout
    				pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    		</File>
    		<!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size, 则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
    		<RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/info.log"
    			filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
    			<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
    			<ThresholdFilter level="info" onMatch="ACCEPT"
    				onMismatch="DENY" />
    			<PatternLayout
    				pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    			<Policies>
    				<!-- 基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。 modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am. -->
    				<!-- 关键点在于 filePattern后的日期格式,以及TimeBasedTriggeringPolicy的interval, 日期格式精确到哪一位,interval也精确到哪一个单位 -->
    				<!-- log4j2的按天分日志文件 : info-%d{yyyy-MM-dd}-%i.log -->
    				<TimeBasedTriggeringPolicy interval="1"
    					modulate="true" />
    				<!-- SizeBasedTriggeringPolicy:Policies子节点, 基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小. -->
    				<!-- <SizeBasedTriggeringPolicy size="2 kB" /> -->
    			</Policies>
    		</RollingFile>
    
    		<RollingFile name="RollingFileWarn" fileName="${WARN_LOG_FILE_NAME}/warn.log"
    			filePattern="${WARN_LOG_FILE_NAME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
    			<ThresholdFilter level="warn" onMatch="ACCEPT"
    				onMismatch="DENY" />
    			<PatternLayout
    				pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    			<Policies>
    				<TimeBasedTriggeringPolicy />
    				<SizeBasedTriggeringPolicy size="2 kB" />
    			</Policies>
    			<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
    			<DefaultRolloverStrategy max="20" />
    		</RollingFile>
    
    		<RollingFile name="RollingFileError" fileName="${ERROR_LOG_FILE_NAME}/error.log"
    			filePattern="${ERROR_LOG_FILE_NAME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd-HH-mm}-%i.log">
    			<ThresholdFilter level="error" onMatch="ACCEPT"
    				onMismatch="DENY" />
    			<PatternLayout
    				pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    			<Policies>
    				<!-- log4j2的按分钟 分日志文件 : warn-%d{yyyy-MM-dd-HH-mm}-%i.log -->
    				<TimeBasedTriggeringPolicy interval="1"
    					modulate="true" />
    				<!-- <SizeBasedTriggeringPolicy size="10 MB" /> -->
    			</Policies>
    		</RollingFile>
    
    	</Appenders>
    
    	<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
    	<Loggers>
    		<!--过滤掉spring和mybatis的一些无用的DEBUG信息 -->
    		<logger name="org.springframework" level="INFO"></logger>
    		<logger name="org.mybatis" level="INFO"></logger>
    
    		<!-- 第三方日志系统 -->
    		<logger name="org.springframework" level="ERROR" />
    		<logger name="org.hibernate" level="ERROR" />
    		<logger name="org.apache.struts2" level="ERROR" />
    		<logger name="com.opensymphony.xwork2" level="ERROR" />
    		<logger name="org.jboss" level="ERROR" />
    
    
    		<!-- 配置日志的根节点 -->
    		<root level="all">
    			<appender-ref ref="Console" />
    			<appender-ref ref="RollingFileInfo" />
    			<appender-ref ref="RollingFileWarn" />
    			<appender-ref ref="RollingFileError" />
    		</root>
    
    	</Loggers>
    
    </Configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106

    springmvc-servlet.xml这个配置文件要在WEB-INF目录下

    springmvc-servlet.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:aop="http://www.springframework.org/schema/aop"
           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-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
        <!-- 通过context:component-scan元素扫描指定包下的控制器-->
        <!--1) 扫描com.javaxl.zf及子子孙孙包下的控制器(扫描范围过大,耗时)-->
        <aop:aspectj-autoproxy/>
        <context:component-scan base-package="com.xlb.ssm"/>
    
        <!--2) 此标签默认注册DefaultAnnotationHandlerMappingAnnotationMethodHandlerAdapter -->
        <!--两个bean,这两个bean是spring MVC为@Controllers分发请求所必须的。并提供了数据绑定支持,-->
        <!--@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson-->
        <mvc:annotation-driven></mvc:annotation-driven>
    
        <!--3) ViewResolver -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!-- viewClass需要在pom中引入两个包:standard.jar and jstl.jar -->
            <property name="viewClass"
                      value="org.springframework.web.servlet.view.JstlView"></property>
            <property name="prefix" value="/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    
        <!--4) 单独处理图片、样式、js等资源 -->
        <!--<mvc:resources location="/css/" mapping="/css/**"/>-->
        <!--<mvc:resources location="/images/" mapping="/images/**"/>-->
        <!--<mvc:resources location="/js/" mapping="/js/**"/>-->
    
    
    </beans>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    2.1.1 Web.xml配置

    Web.xlm

    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
             version="3.1">
      <display-name>Archetype Created Web Application</display-name>
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
      </context-param>
      <!-- 读取Spring上下文的监听器 -->
      <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
    
      <!-- Spring MVC servlet -->
      <servlet>
        <servlet-name>SpringMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--此参数可以不配置,默认值为:/WEB-INF/springmvc-servlet.xml-->
        <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>/WEB-INF/springmvc-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
        <!--web.xml 3.0的新特性,是否支持异步-->
        <async-supported>true</async-supported>
      </servlet>
      <servlet-mapping>
        <servlet-name>SpringMVC</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>
    
      <!-- 中文乱码处理 -->
      <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <!--web.xml 3.0的新特性,是否支持异步-->
        <async-supported>true</async-supported>
        <init-param>
          <param-name>encoding</param-name>
          <param-value>UTF-8</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*
      
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    2.1.2 分页工具类

    PageTag

    package com.xlb.ssm.tag;
    
    import com.xlb.ssm.util.PageBean;
    
    import java.io.IOException;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.Set;
    
    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.JspWriter;
    import javax.servlet.jsp.tagext.BodyTagSupport;
    
    
    public class PageTag extends BodyTagSupport{
    	private PageBean pageBean;// 包含了所有分页相关的元素
    	
    	public PageBean getPageBean() {
    		return pageBean;
    	}
    
    	public void setPageBean(PageBean pageBean) {
    		this.pageBean = pageBean;
    	}
    
    	@Override
    	public int doStartTag() throws JspException {
    //		没有标签体,要输出内容
    		JspWriter out = pageContext.getOut();
    		try {
    			out.print(toHTML());
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		return super.doStartTag();
    	}
    
    	private String toHTML() {
    		StringBuffer sb = new StringBuffer();
    //		隐藏的form表单---这个就是上一次请求下次重新发的奥义所在
    //		上一次请求的URL
    		sb.append("
    "); sb.append(" "); // 上一次请求的参数 Map<String, String[]> paramMap = pageBean.getParamMap(); if(paramMap != null && paramMap.size() > 0) { Set<Entry<String, String[]>> entrySet = paramMap.entrySet(); for (Entry<String, String[]> entry : entrySet) { // 参数名 String key = entry.getKey(); // 参数值 for (String value : entry.getValue()) { // 上一次请求的参数,再一次组装成了新的Form表单 // 注意:page参数每次都会提交,我们需要避免 if(!"page".equals(key)) { sb.append(" "); } } } } sb.append(""
    ); // 分页条 sb.append(""); // 分页执行的JS代码 sb.append(""); return sb.toString(); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100

    PageBean

    package com.xlb.ssm.util;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    
    /**
     * 分页工具类
     *
     */
    public class PageBean {
    
    	private int page = 1;// 页码
    
    	private int rows = 10;// 页大小
    
    	private int total = 0;// 总记录数
    
    	private boolean pagination = true;// 是否分页
    	
    	private String url; //保存上一次请求的URL
    	
    	private Map<String,String[]> paramMap = new HashMap<>();// 保存上一次请求的参数
    	
    	/**
    	 * 初始化pagebean的,保存上一次请求的重要参数
    	 * @param req
    	 */
    	public void setRequest(HttpServletRequest req) {
    //		1.1	需要保存上一次请求的URL
    		this.setUrl(req.getRequestURL().toString());
    //		1.2	需要保存上一次请求的参数	bname、price
    		this.setParamMap(req.getParameterMap());
    //		1.3	需要保存上一次请求的分页设置	pagination
    		this.setPagination(req.getParameter("pagination"));
    //		1.4	需要保存上一次请求的展示条目数
    		this.setRows(req.getParameter("rows"));
    //		1.5  初始化请求的页码	page
    		this.setPage(req.getParameter("page"));
    	}
    	
    	public void setPage(String page) {
    		if(StringUtils.isNotBlank(page))
    			this.setPage(Integer.valueOf(page));
    	}
    
    	public void setRows(String rows) {
    		if(StringUtils.isNotBlank(rows))
    			this.setRows(Integer.valueOf(rows));
    	}
    
    	public void setPagination(String pagination) {
    //		只有在前台jsp填写了pagination=false,才代表不分页
    		if(StringUtils.isNotBlank(pagination))
    			this.setPagination(!"false".equals(pagination));
    	}
    
    
    	public String getUrl() {
    		return url;
    	}
    
    	public void setUrl(String url) {
    		this.url = url;
    	}
    
    	public Map<String, String[]> getParamMap() {
    		return paramMap;
    	}
    
    	public void setParamMap(Map<String, String[]> paramMap) {
    		this.paramMap = paramMap;
    	}
    
    
    
    	public PageBean() {
    		super();
    	}
    
    	public int getPage() {
    		return page;
    	}
    
    	public void setPage(int page) {
    		this.page = page;
    	}
    
    	public int getRows() {
    		return rows;
    	}
    
    	public void setRows(int rows) {
    		this.rows = rows;
    	}
    
    	public int getTotal() {
    		return total;
    	}
    
    	public void setTotal(int total) {
    		this.total = total;
    	}
    
    	public void setTotal(String total) {
    		this.total = Integer.parseInt(total);
    	}
    
    	public boolean isPagination() {
    		return pagination;
    	}
    
    	public void setPagination(boolean pagination) {
    		this.pagination = pagination;
    	}
    
    	/**
    	 * 获得起始记录的下标
    	 * 
    	 * @return
    	 */
    	public int getStartIndex() {
    		return (this.page - 1) * this.rows;
    	}
    	
    	/**
    	 * 最大页
    	 * @return
    	 */
    	public int maxPage() {
    //		total % rows == 0 ? total / rows : total / rows +1
    		return this.total % this.rows == 0 ? this.total / this.rows : this.total / this.rows + 1;
    	}
    	
    	/**
    	 * 下一页
    	 * @return
    	 */
    	public int nextPage() {
    //		如果当前页小于最大页,那就下一页为当前页+1;如果不小于,说明当前页就是最大页,那就无需+1
    		return this.page < this.maxPage() ? this.page + 1 : this.page;
    	}
    	
    	/**
    	 * 上一页
    	 * @return
    	 */
    	public int previousPage() {
    		return this.page > 1 ? this.page - 1 : this.page;
    	}
    
    	@Override
    	public String toString() {
    		return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]";
    	}
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159

    StringUtils

    package com.xlb.ssm.util;
    
    public class StringUtils {
    	// 私有的构造方法,保护此类不能在外部实例化
    	private StringUtils() {
    	}
    
    	/**
    	 * 如果字符串等于null或去空格后等于"",则返回true,否则返回false
    	 * 
    	 * @param s
    	 * @return
    	 */
    	public static boolean isBlank(String s) {
    		boolean b = false;
    		if (null == s || s.trim().equals("")) {
    			b = true;
    		}
    		return b;
    	}
    	
    	/**
    	 * 如果字符串不等于null或去空格后不等于"",则返回true,否则返回false
    	 * 
    	 * @param s
    	 * @return
    	 */
    	public static boolean isNotBlank(String s) {
    		return !isBlank(s);
    	}
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    2.1.3 tld文件

    zking.tld

    <?xml version="1.0" encoding="UTF-8" ?>
    
    <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
        version="2.0">
        
      <description>zking 1.1 core library</description>
      <display-name>zking core</display-name>
      <tlib-version>1.1</tlib-version>
      <short-name>zking</short-name>
      <uri>http://jsp.veryedu.cn</uri>
      
      
      <tag>
        <name>page</name>
        <tag-class>com.xlb.ssm.tag.PageTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
            <name>pageBean</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
      </tag>
      
    </taglib>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    到这我们的配置环境就完成了

    3.1 逆向生成

    逆向生成我们要用到的表t_struts_class,这里要注意,我们取别名是首字母要大写,且不能是关键字比如Class等

    <table schema="" tableName="t_struts_class" domainObjectName="Clazz"
                   enableCountByExample="false" enableDeleteByExample="false"
                   enableSelectByExample="false" enableUpdateByExample="false">
            </table>
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述那么就会有我们逆向生成的表和配置文件
    ClazzMapper

    这里我新增了一个分页的方法listPager

    package com.xlb.ssm.mapper;
    
    import com.xlb.ssm.model.Clazz;
    import org.springframework.stereotype.Repository;
    
    import java.util.List;
    
    @Repository
    public interface ClazzMapper {
        int deleteByPrimaryKey(Integer cid);
    
        int insert(Clazz record);
    
        int insertSelective(Clazz record);
    
        Clazz selectByPrimaryKey(Integer cid);
    
        List<Clazz> listPager(Clazz clazz);
    
        int updateByPrimaryKeySelective(Clazz record);
    
        int updateByPrimaryKey(Clazz record);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    对应的配置文件ClazzMapper.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="com.xlb.ssm.mapper.ClazzMapper" >
      <resultMap id="BaseResultMap" type="com.xlb.ssm.model.Clazz" >
        <constructor >
          <idArg column="cid" jdbcType="INTEGER" javaType="java.lang.Integer" />
          <arg column="cname" jdbcType="VARCHAR" javaType="java.lang.String" />
          <arg column="cteacher" jdbcType="VARCHAR" javaType="java.lang.String" />
          <arg column="pic" jdbcType="VARCHAR" javaType="java.lang.String" />
        </constructor>
      </resultMap>
      <sql id="Base_Column_List" >
        cid, cname, cteacher, pic
      </sql>
    
    
      <select id="listPager" resultType="com.xlb.ssm.model.Clazz" parameterType="com.xlb.ssm.model.Clazz" >
        select
        <include refid="Base_Column_List" />
        from t_struts_class
        <where>
            <if test="cname != null and cname !='' ">
                and cname like CONCAT('%',#{cname},'%')
            </if>
    
            <if test="cid != null and cname !='' ">
                and cid = #{cid}
            </if>
        </where>
      </select>
    
    
      <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
        select 
        <include refid="Base_Column_List" />
        from t_struts_class
        where cid = #{cid,jdbcType=INTEGER}
      </select>
      <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
        delete from t_struts_class
        where cid = #{cid,jdbcType=INTEGER}
      </delete>
      <insert id="insert" parameterType="com.xlb.ssm.model.Clazz" >
        insert into t_struts_class (cid, cname, cteacher, 
          pic)
        values (#{cid,jdbcType=INTEGER}, #{cname,jdbcType=VARCHAR}, #{cteacher,jdbcType=VARCHAR}, 
          #{pic,jdbcType=VARCHAR})
      </insert>
      <insert id="insertSelective" parameterType="com.xlb.ssm.model.Clazz" >
        insert into t_struts_class
        <trim prefix="(" suffix=")" suffixOverrides="," >
          <if test="cid != null" >
            cid,
          </if>
          <if test="cname != null" >
            cname,
          </if>
          <if test="cteacher != null" >
            cteacher,
          </if>
          <if test="pic != null" >
            pic,
          </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides="," >
          <if test="cid != null" >
            #{cid,jdbcType=INTEGER},
          </if>
          <if test="cname != null" >
            #{cname,jdbcType=VARCHAR},
          </if>
          <if test="cteacher != null" >
            #{cteacher,jdbcType=VARCHAR},
          </if>
          <if test="pic != null" >
            #{pic,jdbcType=VARCHAR},
          </if>
        </trim>
      </insert>
      <update id="updateByPrimaryKeySelective" parameterType="com.xlb.ssm.model.Clazz" >
        update t_struts_class
        <set >
          <if test="cname != null" >
            cname = #{cname,jdbcType=VARCHAR},
          </if>
          <if test="cteacher != null" >
            cteacher = #{cteacher,jdbcType=VARCHAR},
          </if>
          <if test="pic != null" >
            pic = #{pic,jdbcType=VARCHAR},
          </if>
        </set>
        where cid = #{cid,jdbcType=INTEGER}
      </update>
      <update id="updateByPrimaryKey" parameterType="com.xlb.ssm.model.Clazz" >
        update t_struts_class
        set cname = #{cname,jdbcType=VARCHAR},
          cteacher = #{cteacher,jdbcType=VARCHAR},
          pic = #{pic,jdbcType=VARCHAR}
        where cid = #{cid,jdbcType=INTEGER}
      </update>
    </mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102

    Biz层ClazzBiz

    package com.xlb.ssm.biz;
    
    import com.xlb.ssm.model.Clazz;
    import com.xlb.ssm.util.PageBean;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import java.util.List;
    
    public interface ClazzBiz {
        int deleteByPrimaryKey(Integer cid);
    
        int insert(Clazz record);
    
        int insertSelective(Clazz record);
    
        Clazz selectByPrimaryKey(Integer cid);
    
        int updateByPrimaryKeySelective(Clazz record);
    
        int updateByPrimaryKey(Clazz record);
    
        List<Clazz> listPager(Clazz clazz, PageBean pageBean);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    实现层ClazzBizImpl

    package com.xlb.ssm.biz.impl;
    
    import com.xlb.ssm.biz.ClazzBiz;
    import com.xlb.ssm.mapper.ClazzMapper;
    import com.xlb.ssm.model.Clazz;
    import com.xlb.ssm.util.PageBean;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    /**
     * @author 波哥
     * @QQ 2212371722
     * @company 波哥集团
     * @create  2022-08-17 20:42
     */
    
    @Service
    public class ClazzBizImpl implements ClazzBiz {
    
        @Autowired
        private ClazzMapper clazzMapper;
    
        @Override
        public int deleteByPrimaryKey(Integer cid) {
            return clazzMapper.deleteByPrimaryKey(cid);
        }
    
        @Override
        public int insert(Clazz record) {
            return clazzMapper.insert(record);
        }
    
        @Override
        public int insertSelective(Clazz record) {
            return clazzMapper.insertSelective(record);
        }
    
        @Override
        public Clazz selectByPrimaryKey(Integer cid) {
            return clazzMapper.selectByPrimaryKey(cid);
        }
    
        @Override
        public int updateByPrimaryKeySelective(Clazz record) {
            return clazzMapper.updateByPrimaryKeySelective(record);
        }
    
        @Override
        public int updateByPrimaryKey(Clazz record) {
            return clazzMapper.updateByPrimaryKey(record);
        }
    
        @Override
        public List<Clazz> listPager(Clazz clazz, PageBean pageBean) {
            return clazzMapper.listPager(clazz);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    4.1 代码开发

    4.1.1 web层

    ClazzController

    package com.xlb.ssm.controller;
    
    import com.xlb.ssm.biz.ClazzBiz;
    import com.xlb.ssm.model.Clazz;
    import com.xlb.ssm.util.PageBean;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import javax.servlet.http.HttpServletRequest;
    import java.util.List;
    
    /**
     * @author 波哥
     * @QQ 2212371722
     * @company 波哥集团
     * @create  2022-08-17 20:54
     */
    
    @Controller
    @RequestMapping("/clz")
    public class ClazzController {
    
        @Autowired
        private ClazzBiz clazzBiz;
    
        @RequestMapping("/list")
        public String list(Clazz clazz, HttpServletRequest request){
            PageBean pageBean = new PageBean();
            pageBean.setRequest(request);
            List<Clazz> clazzes = this.clazzBiz.listPager(clazz, pageBean);
            request.setAttribute("lst",clazzes);
            request.setAttribute("pageBean",pageBean);
            return "clzList";
        }
    
        @RequestMapping("/toEdit")
        public String toEdit(Clazz clazz, HttpServletRequest request){
            Integer cid = clazz.getCid();
            //传递的id代表是修改还是新增
            if(cid != null){
                List<Clazz> clazzes = this.clazzBiz.listPager(clazz, null);
                request.setAttribute("b",clazzes.get(0));
            }
            return "clzEdit";
        }
    
        @RequestMapping("/add")
        public String add(Clazz clazz){
            this.clazzBiz.insertSelective(clazz);
            return "redirect:/clz/list";
        }
    
        @RequestMapping("/edit")
        public String edit(Clazz clazz){
            this.clazzBiz.updateByPrimaryKeySelective(clazz);
            return "redirect:/clz/list";
        }
    
        @RequestMapping("/del")
        public String del(Clazz clazz){
            this.clazzBiz.deleteByPrimaryKey(clazz.getCid());
            return "redirect:/clz/list";
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67

    4.1.2 页面层

    clzList.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
             pageEncoding="UTF-8"%>
    <%@ taglib uri="http://jsp.veryedu.cn" prefix="z"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <link
                href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css"
                rel="stylesheet">
        <script
                src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js"></script>
        <title>博客列表</title>
        <style type="text/css">
            .page-item input {
                padding: 0;
                width: 40px;
                height: 100%;
                text-align: center;
                margin: 0 6px;
            }
    
            .page-item input, .page-item b {
                line-height: 38px;
                float: left;
                font-weight: 400;
            }
    
            .page-item.go-input {
                margin: 0 10px;
            }
        </style>
    </head>
    <body>
    <form class="form-inline"
          action="${pageContext.request.contextPath }/clz/list" method="post">
        <div class="form-group mb-2">
            <input type="text" class="form-control-plaintext" name="cname"
                   placeholder="请输入班级名称">
        </div>
        <button type="submit" class="btn btn-primary mb-2">查询</button>
        <a class="btn btn-primary mb-2" href="${pageContext.request.contextPath }/clz/toEdit">新增</a>
    </form>
    
    <table class="table table-striped bg-success">
        <thead>
        <tr>
            <th scope="col">ID</th>
            <th scope="col">班级名称</th>
            <th scope="col">指导老师</th>
            <th scope="col">班级相册</th>
            <th scope="col">操作</th>
        </tr>
        </thead>
        <tbody>
        <c:forEach  var="b" items="${lst }">
            <tr>
                <td>${b.cid }</td>
                <td>${b.cname }</td>
                <td>${b.cteacher }</td>
                <td>${b.pic }</td>
                <td>
                    <a href="${pageContext.request.contextPath }/clz/toEdit?cid=${b.cid}">修改</a>
                    <a href="${pageContext.request.contextPath }/clz/del?cid=${b.cid}">删除</a>
                </td>
            </tr>
        </c:forEach>
        </tbody>
    </table>
    <!-- 这一行代码就相当于前面分页需求前端的几十行了 -->
    <z:page pageBean="${pageBean }"></z:page>
    
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75

    clzEdit.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
             pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>博客的编辑界面</title>
    </head>
    <body>
    <form action="${pageContext.request.contextPath }/clz/${empty b ? 'add' : 'edit'}" method="post">
        cid:<input type="text" name="cid" value="${b.cid }"><br>
        cname:<input type="text" name="cname" value="${b.cname }"><br>
        cteacher:<input type="text" name="cteacher" value="${b.cteacher }"><br>
        <input type="submit">
    </form>
    </body>
    </html>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    5.1 测试

    5.1.1 分页查询

    在这里插入图片描述

    5.1.2 增加

    在这里插入图片描述
    在这里插入图片描述

    5.1.3 修改

    在这里插入图片描述
    在这里插入图片描述

    5.1.4 删除

    删除id为12的学生
    在这里插入图片描述

    二、文件上传

    步骤

    1. Springmvc.xml中添加 多功能解析器 配置
    2. 前台页面 添加 多功能表单设置 mutipart/form-data
    3. 后台要利用multipartFile类进行 文件接收
      multipartFile的属性名一定要跟from表单属性名一致
    4. 在IDER中完成图片请求地址与硬盘的映射关系

    2.1 第一步(可有可无):导入pom.xml依赖

    <dependency>
          <groupId>commons-fileupload</groupId>
          <artifactId>commons-fileupload</artifactId>
          <version>1.3.3</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.2 第二步:Springmvc.xml中添加 多功能解析器 配置

     <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <!-- 必须和用户JSP 的pageEncoding属性一致,以便正确解析表单的内容 -->
            <property name="defaultEncoding" value="UTF-8"></property>
            <!-- 文件最大大小(字节) 1024*1024*50=50M-->
            <property name="maxUploadSize" value="52428800"></property>
            <!--resolveLazily属性启用是为了推迟文件解析,以便捕获文件大小异常-->
            <property name="resolveLazily" value="true"/>
        </bean>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.3 第三步:写前端界面clzupload.jsp

    <%--
      Created by IntelliJ IDEA.
      User: Administrator
      Date: 2022/8/18
      Time: 17:40
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <%--enctype="multipart/form-data"多功能表单--%>
    <form action="${pageContext.request.contextPath}/clz/upload" method="post" enctype="multipart/form-data">
        <%--为了方便所有把id展示--%>
        <input type="text" value="${param.cid}" name="cid">
        <input type="file" name="picFile">
        <input type="submit">
    </form>
    </body>
    </html>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    2.4 第四步:编写Dto

    Dto:接受参数,参数不仅仅存在与实体类Model中
    protected会被子类继承

    首先我们要修改实体类要其属性那够被子类继承

    package com.xlb.ssm.model;
    
    public class Clazz {
        //protected会被子类继承
        protected Integer cid;
    
        protected String cname;
    
        protected String cteacher;
    
        protected String pic;
    
        public Clazz(Integer cid, String cname, String cteacher, String pic) {
            this.cid = cid;
            this.cname = cname;
            this.cteacher = cteacher;
            this.pic = pic;
        }
    
        public Clazz() {
            super();
        }
    
        public Integer getCid() {
            return cid;
        }
    
        public void setCid(Integer cid) {
            this.cid = cid;
        }
    
        public String getCname() {
            return cname;
        }
    
        public void setCname(String cname) {
            this.cname = cname;
        }
    
        public String getCteacher() {
            return cteacher;
        }
    
        public void setCteacher(String cteacher) {
            this.cteacher = cteacher;
        }
    
        public String getPic() {
            return pic;
        }
    
        public void setPic(String pic) {
            this.pic = pic;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    然后编写ClazzDto

    package com.xlb.ssm.model.dto;
    
    import com.xlb.ssm.model.Clazz;
    import org.springframework.web.multipart.MultipartFile;
    
    /**
     * @author 波哥
     * @QQ 2212371722
     * @company 波哥集团
     * @create  2022-08-18 17:47
     */
    public class ClazzDto extends Clazz {
        private MultipartFile picFile;
    
        public MultipartFile getPicFile() {
            return picFile;
        }
    
        public void setPicFile(MultipartFile picFile) {
            this.picFile = picFile;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    2.5 第五部:编写web层

    这里有两种方法
    第一种没有导入
    commons-fileupload commons-fileupload 1.3.3

    /*文件上传*/
        @RequestMapping("/upload")
        public String upload(ClazzDto clazzDto){
            try {
                //前台上传到后台的文件
                MultipartFile picFile = clazzDto.getPicFile();
                //实际应该配置到resource.properties中
                //图片存放地址
                String disPatch = "E:/222/";
                //数据库保存地址 也是 访问地址
                String requestPath = "/upload/mvc/";
    
                InputStream inputStream = picFile.getInputStream();
    
                //拿到上传文件的名字
                String Filename = picFile.getOriginalFilename();
    
                //FileUtils.copyInputStreamToFile(picFile.getInputStream(),new File(disPatch+Filename));
    
                //将图片上传之后 , 并且将图片地址更新到数据库中
                FileOutputStream fileOutputStream = new FileOutputStream(new File("d/temp/1.png"));
                byte[] buff = new byte[1024];
                int len = 0;
                while (true){
                    len = inputStream.read(buff,0,len);
                    fileOutputStream.write(buff,0,len);
                    if(len<0){
                        break;
                    }
                }
                Clazz clazz = new Clazz();
                clazz.setCid(clazzDto.getCid());
                clazz.setPic(requestPath+Filename);
    
                this.clazzBiz.updateByPrimaryKeySelective(clazz);
    
            }catch (Exception e){
                e.printStackTrace();
            }
            return "redirect:/clz/list";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    导入pom依赖

     @RequestMapping("/upload")
        public String upload(ClazzDto clazzDto){
            try {
                //前台上传到后台的文件
                MultipartFile picFile = clazzDto.getPicFile();
                //实际应该配置到resource.properties中
                //图片存放地址
                String disPatch = "E:/222";
                //数据库保存地址 也是 访问地址
                String requestPath = "/upload/mvc/";
    
                //拿到上传文件的名字
                String Filename = picFile.getOriginalFilename();
    
                FileUtils.copyInputStreamToFile(picFile.getInputStream(),new File(disPatch+Filename));
    
                //将图片上传之后 , 并且将图片地址更新到数据库中
                Clazz clazz = new Clazz();
                clazz.setCid(clazzDto.getCid());
                clazz.setPic(requestPath+Filename);
    
                this.clazzBiz.updateByPrimaryKeySelective(clazz);
            }catch (Exception e){
                e.printStackTrace();
            }
            return "redirect:/clz/list";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    2.6 ider与本地硬盘图片映射

    在这里插入图片描述在这里插入图片描述

    选择自己图片映射地址

    在这里插入图片描述
    所以我们把网络请求地址改为我们项目请求地址
    在这里插入图片描述

    点击Ok即可

    2.7 主界面编写

    <%@ page language="java" contentType="text/html; charset=UTF-8"
             pageEncoding="UTF-8"%>
    <%@ taglib uri="http://jsp.veryedu.cn" prefix="z"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <link
                href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css"
                rel="stylesheet">
        <script
                src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js"></script>
        <title>博客列表</title>
        <style type="text/css">
            .page-item input {
                padding: 0;
                width: 40px;
                height: 100%;
                text-align: center;
                margin: 0 6px;
            }
    
            .page-item input, .page-item b {
                line-height: 38px;
                float: left;
                font-weight: 400;
            }
    
            .page-item.go-input {
                margin: 0 10px;
            }
        </style>
    </head>
    <body>
    <form class="form-inline"
          action="${pageContext.request.contextPath }/clz/list" method="post">
        <div class="form-group mb-2">
            <input type="text" class="form-control-plaintext" name="cname"
                   placeholder="请输入班级名称">
        </div>
        <button type="submit" class="btn btn-primary mb-2">查询</button>
        <a class="btn btn-primary mb-2" href="${pageContext.request.contextPath }/clz/toEdit">新增</a>
    </form>
    
    <table class="table table-striped bg-success">
        <thead>
        <tr>
            <th scope="col">ID</th>
            <th scope="col">班级名称</th>
            <th scope="col">指导老师</th>
            <th scope="col">班级相册</th>
            <th scope="col">操作</th>
        </tr>
        </thead>
        <tbody>
        <c:forEach  var="b" items="${lst }">
            <tr>
                <td>${b.cid }</td>
                <td>${b.cname }</td>
                <td>${b.cteacher }</td>
                <td>
                    <img src="${pageContext.request.contextPath }${b.pic }" style="height: 100px;width: 100px">
                </td>
                <td>
                    <a href="${pageContext.request.contextPath }/clz/toEdit?cid=${b.cid}">修改</a>
                    <a href="${pageContext.request.contextPath }/clz/del?cid=${b.cid}">删除</a>
                    <a href="${pageContext.request.contextPath }/clz/upload?cid=${b.cid}">上传图片</a>
                </td>
            </tr>
        </c:forEach>
        </tbody>
    </table>
    <!-- 这一行代码就相当于前面分页需求前端的几十行了 -->
    <z:page pageBean="${pageBean }"></z:page>
    
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78

    2.8 测试

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    三、文件下载

    1.点击下载传递文件的id,通过文件的ID查询出文件的路径
    2.通过文件的请求地址,转换成文件的硬盘地址
    3.将硬盘中的文件下载下来

    在主界面添加操作

    <a href="${pageContext.request.contextPath }/download?cid=${b.cid}">下载图片</a>
    
    • 1

    编写web层,写download

      /*文件下载*/
        @RequestMapping("/download")
        public ResponseEntity download(ClazzDto clazzDto){
            try {
                //1.点击下载传递文件的id,通过文件的ID查询出文件的路径
                Clazz clazz = this.clazzBiz.selectByPrimaryKey(clazzDto.getCid());
                String pic = clazz.getPic();
                //实际应该配置到resource.properties中
                //图片存放地址
                String disPatch = "E:/222/";
                //数据库保存地址 也是 访问地址
                String requestPath = "/upload/mvc/";
    
                //2.通过文件的请求地址,转换成文件的硬盘地址
                String realPath = pic.replace(requestPath,disPatch);
                //可能图片地址是中文,所以分割后缀
                String fileName = realPath.substring(realPath.lastIndexOf("/")+1);
    
    
                File file=new File(realPath);
                HttpHeaders headers = new HttpHeaders();//http头信息
                String downloadFileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1");//设置编码
                headers.setContentDispositionFormData("attachment", downloadFileName);
                headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
                //MediaType:互联网媒介类型  contentType:具体请求中的媒体类型信息
                return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.OK);
    
            }catch (Exception e){
                e.printStackTrace();
            }
            return null;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    测试
    在这里插入图片描述在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    《Get your hands dirty on clean architecture》读书笔记
    SpringBoot整合Swagger详解
    二建Day08 混凝土 和易性,强度,外加剂
    [附源码]计算机毕业设计茂名特产销售商城网站Springboot程序
    数仓精品理论-做大数据还有没有前途?
    JVM哪些区域可能出现内存溢出,哪些地方需要GC?
    【Java数据结构】初步认识ArrayList与顺序表
    如何在JAVA中构建区块链?
    南卡和益博思哪个电容笔比较好?国产电容笔全方位对比
    【Java基础】泛型+反射+枚举+Lambda表达式 知识点总结
  • 原文地址:https://blog.csdn.net/qq_63531917/article/details/126408812