• 全网最详细:基于SpringMVC实现CRUD&文件上传下载


    目录

    一、SpringMVC实现CRUD

    二、SpringMVC实现上传文件

    三、SpringMVC实现文件下载


    一、SpringMVC实现CRUD

            这次我们从头到尾,一步一步来实现一次搭建环境+基本配置+后端编码+前端编码的。基于SpringMVC的CRUD

            ①使用开发工具Idea创建Maven项目

    这里我是Idea创建Maven的模块(就是项目,只是Idea中成为模块而已,最外面的文件才叫项目)

    我直接用图示大家一步步来就OK

     这是我们就初步创建完毕Maven项目但是还需要细微调整(必须要确保自己的网络OK!!!)

    到这里我们还需修改一下,因为我们刚创建的模块是没有完整的文件的,我们需要手动添加

     然后我们就可以开始下一步了,这一步是之后所有的开始!

             ②导入Pom依赖

    我都准备好了大家直接copy即可

    pom.xml:(这一步也是需要网络!!!)

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <groupId>org.examplegroupId>
    6. <artifactId>ssm2artifactId>
    7. <version>1.0-SNAPSHOTversion>
    8. <packaging>warpackaging>
    9. <name>ssm2 Maven Webappname>
    10. <url>http://www.example.comurl>
    11. <properties>
    12. <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    13. <maven.compiler.source>1.8maven.compiler.source>
    14. <maven.compiler.target>1.8maven.compiler.target>
    15. <maven.compiler.plugin.version>3.7.0maven.compiler.plugin.version>
    16. <spring.version>5.0.2.RELEASEspring.version>
    17. <mybatis.version>3.4.5mybatis.version>
    18. <mysql.version>5.1.44mysql.version>
    19. <pagehelper.version>5.1.2pagehelper.version>
    20. <mybatis.spring.version>1.3.1mybatis.spring.version>
    21. <commons.dbcp2.version>2.1.1commons.dbcp2.version>
    22. <commons.pool2.version>2.4.3commons.pool2.version>
    23. <log4j2.version>2.9.1log4j2.version>
    24. <junit.version>4.12junit.version>
    25. <servlet.version>4.0.0servlet.version>
    26. <lombok.version>1.18.2lombok.version>
    27. properties>
    28. <dependencies>
    29. <dependency>
    30. <groupId>org.springframeworkgroupId>
    31. <artifactId>spring-contextartifactId>
    32. <version>${spring.version}version>
    33. dependency>
    34. <dependency>
    35. <groupId>org.springframeworkgroupId>
    36. <artifactId>spring-ormartifactId>
    37. <version>${spring.version}version>
    38. dependency>
    39. <dependency>
    40. <groupId>org.springframeworkgroupId>
    41. <artifactId>spring-txartifactId>
    42. <version>${spring.version}version>
    43. dependency>
    44. <dependency>
    45. <groupId>org.springframeworkgroupId>
    46. <artifactId>spring-aspectsartifactId>
    47. <version>${spring.version}version>
    48. dependency>
    49. <dependency>
    50. <groupId>org.springframeworkgroupId>
    51. <artifactId>spring-webartifactId>
    52. <version>${spring.version}version>
    53. dependency>
    54. <dependency>
    55. <groupId>org.springframeworkgroupId>
    56. <artifactId>spring-testartifactId>
    57. <version>${spring.version}version>
    58. dependency>
    59. <dependency>
    60. <groupId>org.mybatisgroupId>
    61. <artifactId>mybatisartifactId>
    62. <version>${mybatis.version}version>
    63. dependency>
    64. <dependency>
    65. <groupId>mysqlgroupId>
    66. <artifactId>mysql-connector-javaartifactId>
    67. <version>${mysql.version}version>
    68. dependency>
    69. <dependency>
    70. <groupId>com.github.pagehelpergroupId>
    71. <artifactId>pagehelperartifactId>
    72. <version>${pagehelper.version}version>
    73. dependency>
    74. <dependency>
    75. <groupId>org.mybatisgroupId>
    76. <artifactId>mybatis-springartifactId>
    77. <version>${mybatis.spring.version}version>
    78. dependency>
    79. <dependency>
    80. <groupId>org.apache.commonsgroupId>
    81. <artifactId>commons-dbcp2artifactId>
    82. <version>${commons.dbcp2.version}version>
    83. dependency>
    84. <dependency>
    85. <groupId>org.apache.commonsgroupId>
    86. <artifactId>commons-pool2artifactId>
    87. <version>${commons.pool2.version}version>
    88. dependency>
    89. <dependency>
    90. <groupId>org.apache.logging.log4jgroupId>
    91. <artifactId>log4j-coreartifactId>
    92. <version>${log4j2.version}version>
    93. dependency>
    94. <dependency>
    95. <groupId>org.apache.logging.log4jgroupId>
    96. <artifactId>log4j-apiartifactId>
    97. <version>${log4j2.version}version>
    98. dependency>
    99. <dependency>
    100. <groupId>org.apache.logging.log4jgroupId>
    101. <artifactId>log4j-webartifactId>
    102. <version>${log4j2.version}version>
    103. dependency>
    104. <dependency>
    105. <groupId>junitgroupId>
    106. <artifactId>junitartifactId>
    107. <version>${junit.version}version>
    108. <scope>testscope>
    109. dependency>
    110. <dependency>
    111. <groupId>javax.servletgroupId>
    112. <artifactId>javax.servlet-apiartifactId>
    113. <version>${servlet.version}version>
    114. <scope>providedscope>
    115. dependency>
    116. <dependency>
    117. <groupId>org.projectlombokgroupId>
    118. <artifactId>lombokartifactId>
    119. <version>${lombok.version}version>
    120. <scope>providedscope>
    121. dependency>
    122. <dependency>
    123. <groupId>org.springframeworkgroupId>
    124. <artifactId>spring-webmvcartifactId>
    125. <version>${spring.version}version>
    126. dependency>
    127. <dependency>
    128. <groupId>javax.servlet.jspgroupId>
    129. <artifactId>javax.servlet.jsp-apiartifactId>
    130. <version>2.3.3version>
    131. dependency>
    132. <dependency>
    133. <groupId>jstlgroupId>
    134. <artifactId>jstlartifactId>
    135. <version>1.2version>
    136. dependency>
    137. <dependency>
    138. <groupId>taglibsgroupId>
    139. <artifactId>standardartifactId>
    140. <version>1.1.2version>
    141. dependency>
    142. <dependency>
    143. <groupId>commons-fileuploadgroupId>
    144. <artifactId>commons-fileuploadartifactId>
    145. <version>1.3.3version>
    146. dependency>
    147. dependencies>
    148. <build>
    149. <finalName>ssm2finalName>
    150. <resources>
    151. <resource>
    152. <directory>src/main/javadirectory>
    153. <includes>
    154. <include>**/*.xmlinclude>
    155. includes>
    156. resource>
    157. <resource>
    158. <directory>src/main/resourcesdirectory>
    159. <includes>
    160. <include>jdbc.propertiesinclude>
    161. <include>*.xmlinclude>
    162. includes>
    163. resource>
    164. resources>
    165. <pluginManagement>
    166. <plugins>
    167. <plugin>
    168. <groupId>org.apache.maven.pluginsgroupId>
    169. <artifactId>maven-compiler-pluginartifactId>
    170. <version>${maven.compiler.plugin.version}version>
    171. <configuration>
    172. <source>${maven.compiler.source}source>
    173. <target>${maven.compiler.target}target>
    174. <encoding>${project.build.sourceEncoding}encoding>
    175. configuration>
    176. plugin>
    177. <plugin>
    178. <groupId>org.mybatis.generatorgroupId>
    179. <artifactId>mybatis-generator-maven-pluginartifactId>
    180. <version>1.3.2version>
    181. <dependencies>
    182. <dependency>
    183. <groupId>mysqlgroupId>
    184. <artifactId>mysql-connector-javaartifactId>
    185. <version>${mysql.version}version>
    186. dependency>
    187. dependencies>
    188. <configuration>
    189. <overwrite>trueoverwrite>
    190. configuration>
    191. plugin>
    192. <plugin>
    193. <artifactId>maven-clean-pluginartifactId>
    194. <version>3.1.0version>
    195. plugin>
    196. <plugin>
    197. <artifactId>maven-resources-pluginartifactId>
    198. <version>3.0.2version>
    199. plugin>
    200. <plugin>
    201. <artifactId>maven-compiler-pluginartifactId>
    202. <version>3.8.0version>
    203. plugin>
    204. <plugin>
    205. <artifactId>maven-surefire-pluginartifactId>
    206. <version>2.22.1version>
    207. plugin>
    208. <plugin>
    209. <artifactId>maven-war-pluginartifactId>
    210. <version>3.2.2version>
    211. plugin>
    212. <plugin>
    213. <artifactId>maven-install-pluginartifactId>
    214. <version>2.5.2version>
    215. plugin>
    216. <plugin>
    217. <artifactId>maven-deploy-pluginartifactId>
    218. <version>2.8.2version>
    219. plugin>
    220. <plugin>
    221. <artifactId>maven-clean-pluginartifactId>
    222. <version>3.1.0version>
    223. plugin>
    224. <plugin>
    225. <artifactId>maven-resources-pluginartifactId>
    226. <version>3.0.2version>
    227. plugin>
    228. <plugin>
    229. <artifactId>maven-compiler-pluginartifactId>
    230. <version>3.8.0version>
    231. plugin>
    232. <plugin>
    233. <artifactId>maven-surefire-pluginartifactId>
    234. <version>2.22.1version>
    235. plugin>
    236. <plugin>
    237. <artifactId>maven-war-pluginartifactId>
    238. <version>3.2.2version>
    239. plugin>
    240. <plugin>
    241. <artifactId>maven-install-pluginartifactId>
    242. <version>2.5.2version>
    243. plugin>
    244. <plugin>
    245. <artifactId>maven-deploy-pluginartifactId>
    246. <version>2.8.2version>
    247. plugin>
    248. plugins>
    249. pluginManagement>
    250. build>
    251. project>

            ③导入配置文件 

    因为我们在正式的项目开发肯定使用框架进行开发工作,也就意味着我们的对应的框架的配置文件也少不了!

    我已经整理如下了,然后我们导入的时候建议一个个检查,因为有些是需要改变中间的文件路径啊等等一下小细节的,这个不改就会对应的报错!

    我们看一下配置文件的载入位置:(和我保持一样即可)

    接下来是直接准备好,大家copy即可,文件有点多大家注意别搞错!!!

     applicationContext.xml:

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
    5. xmlns:aop="http://www.springframework.org/schema/aop"
    6. 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">
    7. <import resource="applicationContext-mybatis.xml">import>
    8. beans>

     applicationContext-mybatis.xml:

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
    5. xmlns:aop="http://www.springframework.org/schema/aop"
    6. 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">
    7. <context:annotation-config/>
    8. <context:component-scan base-package="com.zq.ssm"/>
    9. <context:property-placeholder location="classpath:jdbc.properties"/>
    10. <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
    11. destroy-method="close">
    12. <property name="driverClassName" value="${jdbc.driver}"/>
    13. <property name="url" value="${jdbc.url}"/>
    14. <property name="username" value="${jdbc.username}"/>
    15. <property name="password" value="${jdbc.password}"/>
    16. <property name="initialSize" value="10"/>
    17. <property name="maxTotal" value="100"/>
    18. <property name="maxIdle" value="50"/>
    19. <property name="minIdle" value="10"/>
    20. <property name="maxWaitMillis" value="-1"/>
    21. bean>
    22. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    23. <property name="dataSource" ref="dataSource"/>
    24. <property name="mapperLocations" value="classpath*:com/zq/ssm/**/mapper/*.xml"/>
    25. <property name="typeAliasesPackage" value="com/javaxl/ssm/**/model"/>
    26. <property name="plugins">
    27. <array>
    28. <bean class="com.github.pagehelper.PageInterceptor">
    29. <property name="properties">
    30. <value>
    31. helperDialect=mysql
    32. value>
    33. property>
    34. bean>
    35. array>
    36. property>
    37. bean>
    38. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    39. <property name="basePackage" value="com/zq/ssm/**/mapper"/>
    40. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    41. bean>
    42. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    43. <property name="dataSource" ref="dataSource" />
    44. bean>
    45. <tx:annotation-driven transaction-manager="transactionManager" />
    46. <aop:aspectj-autoproxy/>
    47. beans>

    generatorConfig.xml:

    1. "1.0" encoding="UTF-8" ?>
    2. generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    3. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
    4. <generatorConfiguration>
    5. <properties resource="jdbc.properties"/>
    6. <classPathEntry location="D:\\mvn-repository\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>
    7. <context id="infoGuardian">
    8. <commentGenerator>
    9. <property name="suppressAllComments" value="true"/>
    10. <property name="suppressDate" value="true"/>
    11. commentGenerator>
    12. <jdbcConnection driverClass="${jdbc.driver}"
    13. connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>
    14. <javaTypeResolver>
    15. <property name="forceBigDecimals" value="false"/>
    16. javaTypeResolver>
    17. <javaModelGenerator targetPackage="com.zq.ssm.model"
    18. targetProject="src/main/java">
    19. <property name="enableSubPackages" value="false"/>
    20. <property name="constructorBased" value="true"/>
    21. <property name="trimStrings" value="false"/>
    22. <property name="immutable" value="false"/>
    23. javaModelGenerator>
    24. <sqlMapGenerator targetPackage="com.zq.ssm.mapper"
    25. targetProject="src/main/java">
    26. <property name="enableSubPackages" value="false"/>
    27. sqlMapGenerator>
    28. <javaClientGenerator targetPackage="com.zq.ssm.mapper"
    29. targetProject="src/main/java" type="XMLMAPPER">
    30. <property name="enableSubPackages" value="false"/>
    31. javaClientGenerator>
    32. <table schema="" tableName="t_struts_class" domainObjectName="Clazz"
    33. enableCountByExample="false" enableDeleteByExample="false"
    34. enableSelectByExample="false" enableUpdateByExample="false">
    35. table>
    36. context>
    37. generatorConfiguration>

    jdbc.properties:

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

    log4j2.xml:

    1. "1.0" encoding="UTF-8"?>
    2. <Configuration status="WARN" monitorInterval="30">
    3. <Properties>
    4. <Property name="LOG_HOME">/root/workspace/lucenedemo/logsProperty>
    5. <property name="ERROR_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/errorproperty>
    6. <property name="WARN_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/warnproperty>
    7. <property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%nproperty>
    8. Properties>
    9. <Appenders>
    10. <Console name="Console" target="SYSTEM_OUT">
    11. <ThresholdFilter level="trace" onMatch="ACCEPT"
    12. onMismatch="DENY" />
    13. <PatternLayout pattern="${PATTERN}" />
    14. Console>
    15. <File name="log" fileName="logs/test.log" append="false">
    16. <PatternLayout
    17. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    18. File>
    19. <RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/info.log"
    20. filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
    21. <ThresholdFilter level="info" onMatch="ACCEPT"
    22. onMismatch="DENY" />
    23. <PatternLayout
    24. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    25. <Policies>
    26. <TimeBasedTriggeringPolicy interval="1"
    27. modulate="true" />
    28. Policies>
    29. RollingFile>
    30. <RollingFile name="RollingFileWarn" fileName="${WARN_LOG_FILE_NAME}/warn.log"
    31. filePattern="${WARN_LOG_FILE_NAME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
    32. <ThresholdFilter level="warn" onMatch="ACCEPT"
    33. onMismatch="DENY" />
    34. <PatternLayout
    35. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    36. <Policies>
    37. <TimeBasedTriggeringPolicy />
    38. <SizeBasedTriggeringPolicy size="2 kB" />
    39. Policies>
    40. <DefaultRolloverStrategy max="20" />
    41. RollingFile>
    42. <RollingFile name="RollingFileError" fileName="${ERROR_LOG_FILE_NAME}/error.log"
    43. filePattern="${ERROR_LOG_FILE_NAME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd-HH-mm}-%i.log">
    44. <ThresholdFilter level="error" onMatch="ACCEPT"
    45. onMismatch="DENY" />
    46. <PatternLayout
    47. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    48. <Policies>
    49. <TimeBasedTriggeringPolicy interval="1"
    50. modulate="true" />
    51. Policies>
    52. RollingFile>
    53. Appenders>
    54. <Loggers>
    55. <logger name="org.springframework" level="INFO">logger>
    56. <logger name="org.mybatis" level="INFO">logger>
    57. <logger name="org.springframework" level="ERROR" />
    58. <logger name="org.hibernate" level="ERROR" />
    59. <logger name="org.apache.struts2" level="ERROR" />
    60. <logger name="com.opensymphony.xwork2" level="ERROR" />
    61. <logger name="org.jboss" level="ERROR" />
    62. <root level="all">
    63. <appender-ref ref="Console" />
    64. <appender-ref ref="RollingFileInfo" />
    65. <appender-ref ref="RollingFileWarn" />
    66. <appender-ref ref="RollingFileError" />
    67. root>
    68. Loggers>
    69. Configuration>

    springmvc-servlet.xml:

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
    6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    7. 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">
    8. <aop:aspectj-autoproxy/>
    9. <context:component-scan base-package="com.zq.ssm"/>
    10. <mvc:annotation-driven>mvc:annotation-driven>
    11. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    12. <property name="viewClass"
    13. value="org.springframework.web.servlet.view.JstlView">property>
    14. <property name="prefix" value="/"/>
    15. <property name="suffix" value=".jsp"/>
    16. bean>
    17. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    18. <property name="defaultEncoding" value="UTF-8">property>
    19. <property name="maxUploadSize" value="52428800">property>
    20. <property name="resolveLazily" value="true"/>
    21. bean>
    22. <mvc:resources location="/static/" mapping="/static/**"/>
    23. beans>

    OK这些是我们使用到的框架的所有配置文件,包括日志框架、mybatis、SpringMVC、Spring

            ④修改web.xml

     web.xml:

    1. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    4. version="3.1">
    5. <display-name>Archetype Created Web Applicationdisplay-name>
    6. <context-param>
    7. <param-name>contextConfigLocationparam-name>
    8. <param-value>classpath:applicationContext.xmlparam-value>
    9. context-param>
    10. <listener>
    11. <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
    12. listener>
    13. <servlet>
    14. <servlet-name>SpringMVCservlet-name>
    15. <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
    16. <init-param>
    17. <param-name>contextConfigLocationparam-name>
    18. <param-value>/WEB-INF/springmvc-servlet.xmlparam-value>
    19. init-param>
    20. <load-on-startup>1load-on-startup>
    21. <async-supported>trueasync-supported>
    22. servlet>
    23. <servlet-mapping>
    24. <servlet-name>SpringMVCservlet-name>
    25. <url-pattern>/url-pattern>
    26. servlet-mapping>
    27. <filter>
    28. <filter-name>encodingFilterfilter-name>
    29. <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
    30. <async-supported>trueasync-supported>
    31. <init-param>
    32. <param-name>encodingparam-name>
    33. <param-value>UTF-8param-value>
    34. init-param>
    35. filter>
    36. <filter-mapping>
    37. <filter-name>encodingFilterfilter-name>
    38. <url-pattern>/*url-pattern>
    39. filter-mapping>
    40. web-app>

     完成好上述我们就是搭建好maven项目开发的环境了接下来正式进入编码工作

            ⑤导入分页依赖&必要工具类

    我们做CRUD肯定要分页,那么我们就使用我们的工具类配合实现分页:

    zking.tld:

    1. "1.0" encoding="UTF-8" ?>
    2. <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    5. version="2.0">
    6. <description>zking 1.1 core librarydescription>
    7. <display-name>zking coredisplay-name>
    8. <tlib-version>1.1tlib-version>
    9. <short-name>zkingshort-name>
    10. <uri>http://jsp.veryedu.cnuri>
    11. <tag>
    12. <name>pagename>
    13. <tag-class>com.zq.ssm.tag.PageTagtag-class>
    14. <body-content>JSPbody-content>
    15. <attribute>
    16. <name>pageBeanname>
    17. <required>truerequired>
    18. <rtexprvalue>truertexprvalue>
    19. attribute>
    20. tag>
    21. taglib>

     还有我们们的工具类util以及tage我们将它们分别放入不同的包,以及上次我们处理分页时所用的切面aspect

    util.pageBean:

    1. package com.zq.ssm.util;
    2. import javax.servlet.http.HttpServletRequest;
    3. import java.io.Serializable;
    4. import java.util.Map;
    5. public class PageBean implements Serializable {
    6. private static final long serialVersionUID = 2422581023658455731L;
    7. //页码
    8. private int page=1;
    9. //每页显示记录数
    10. private int rows=10;
    11. //总记录数
    12. private int total=0;
    13. //是否分页
    14. private boolean isPagination=true;
    15. //上一次的请求路径
    16. private String url;
    17. //获取所有的请求参数
    18. private Map map;
    19. public PageBean() {
    20. super();
    21. }
    22. //设置请求参数
    23. public void setRequest(HttpServletRequest req) {
    24. String page=req.getParameter("page");
    25. String rows=req.getParameter("rows");
    26. String pagination=req.getParameter("pagination");
    27. this.setPage(page);
    28. this.setRows(rows);
    29. this.setPagination(pagination);
    30. this.url=req.getContextPath()+req.getServletPath();
    31. this.map=req.getParameterMap();
    32. }
    33. public String getUrl() {
    34. return url;
    35. }
    36. public void setUrl(String url) {
    37. this.url = url;
    38. }
    39. public Map getMap() {
    40. return map;
    41. }
    42. public void setMap(Map map) {
    43. this.map = map;
    44. }
    45. public int getPage() {
    46. return page;
    47. }
    48. public void setPage(int page) {
    49. this.page = page;
    50. }
    51. public void setPage(String page) {
    52. if(null!=page&&!"".equals(page.trim()))
    53. this.page = Integer.parseInt(page);
    54. }
    55. public int getRows() {
    56. return rows;
    57. }
    58. public void setRows(int rows) {
    59. this.rows = rows;
    60. }
    61. public void setRows(String rows) {
    62. if(null!=rows&&!"".equals(rows.trim()))
    63. this.rows = Integer.parseInt(rows);
    64. }
    65. public int getTotal() {
    66. return total;
    67. }
    68. public void setTotal(int total) {
    69. this.total = total;
    70. }
    71. public void setTotal(String total) {
    72. this.total = Integer.parseInt(total);
    73. }
    74. public boolean isPagination() {
    75. return isPagination;
    76. }
    77. public void setPagination(boolean isPagination) {
    78. this.isPagination = isPagination;
    79. }
    80. public void setPagination(String isPagination) {
    81. if(null!=isPagination&&!"".equals(isPagination.trim()))
    82. this.isPagination = Boolean.parseBoolean(isPagination);
    83. }
    84. /**
    85. * 获取分页起始标记位置
    86. * @return
    87. */
    88. public int getStartIndex() {
    89. //(当前页码-1)*显示记录数
    90. return (this.getPage()-1)*this.rows;
    91. }
    92. /**
    93. * 末页
    94. * @return
    95. */
    96. public int getMaxPage() {
    97. int totalpage=this.total/this.rows;
    98. if(this.total%this.rows!=0)
    99. totalpage++;
    100. return totalpage;
    101. }
    102. /**
    103. * 下一页
    104. * @return
    105. */
    106. public int getNextPage() {
    107. int nextPage=this.page+1;
    108. if(this.page>=this.getMaxPage())
    109. nextPage=this.getMaxPage();
    110. return nextPage;
    111. }
    112. /**
    113. * 上一页
    114. * @return
    115. */
    116. public int getPreivousPage() {
    117. int previousPage=this.page-1;
    118. if(previousPage<1)
    119. previousPage=1;
    120. return previousPage;
    121. }
    122. @Override
    123. public String toString() {
    124. return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", isPagination=" + isPagination
    125. + "]";
    126. }
    127. }

    util.StringUtils:

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

    tag.PageTag:

    1. package com.zq.ssm.tag;
    2. import com.zq.ssm.util.PageBean;
    3. import javax.servlet.jsp.JspException;
    4. import javax.servlet.jsp.JspWriter;
    5. import javax.servlet.jsp.tagext.BodyTagSupport;
    6. import java.io.IOException;
    7. import java.util.Map;
    8. import java.util.Map.Entry;
    9. import java.util.Set;
    10. public class PageTag extends BodyTagSupport{
    11. private PageBean pageBean;// 包含了所有分页相关的元素
    12. public PageBean getPageBean() {
    13. return pageBean;
    14. }
    15. public void setPageBean(PageBean pageBean) {
    16. this.pageBean = pageBean;
    17. }
    18. @Override
    19. public int doStartTag() throws JspException {
    20. // 没有标签体,要输出内容
    21. JspWriter out = pageContext.getOut();
    22. try {
    23. out.print(toHTML());
    24. } catch (IOException e) {
    25. e.printStackTrace();
    26. }
    27. return super.doStartTag();
    28. }
    29. private String toHTML() {
    30. StringBuffer sb = new StringBuffer();
    31. // 隐藏的form表单---这个就是上一次请求下次重新发的奥义所在
    32. // 上一次请求的URL
    33. sb.append("
      ");
    34. sb.append(" ");
    35. // 上一次请求的参数
    36. Map paramMap = pageBean.getMap();
    37. if(paramMap != null && paramMap.size() > 0) {
    38. Set> entrySet = paramMap.entrySet();
    39. for (Entry entry : entrySet) {
    40. // 参数名
    41. String key = entry.getKey();
    42. // 参数值
    43. for (String value : entry.getValue()) {
    44. // 上一次请求的参数,再一次组装成了新的Form表单
    45. // 注意:page参数每次都会提交,我们需要避免
    46. if(!"page".equals(key)) {
    47. sb.append(" ");
    48. }
    49. }
    50. }
    51. }
    52. sb.append("");
    53. // 分页条
    54. sb.append("
        ");
    55. sb.append("
    56. );
  • ");
  • sb.append("
  • );
  • ");// less than 小于号
  • // sb.append("
  • 1
  • ");
  • // sb.append("
  • 2
  • ");
  • sb.append("
  • "+pageBean.getPage()+"
  • ");
  • sb.append("
  • >
  • ");
  • sb.append("
  • 尾页
  • ");
  • sb.append("
  • 到第);
  • sb.append(" type='text' id='skipPage' name='' />
  • ");
  • sb.append("
  • );
  • ");
  • sb.append("
  • 共"+pageBean.getTotal()+"条
  • ");
  • sb.append("");
  • // 分页执行的JS代码
  • sb.append("");
  • return sb.toString();
  • }
  • }
  •  aspect.PagerAspect:

    1. package com.zq.ssm.aspect;
    2. import com.github.pagehelper.PageHelper;
    3. import com.github.pagehelper.PageInfo;
    4. import com.zq.ssm.util.PageBean;
    5. import org.aspectj.lang.ProceedingJoinPoint;
    6. import org.aspectj.lang.annotation.Around;
    7. import org.aspectj.lang.annotation.Aspect;
    8. import org.springframework.stereotype.Component;
    9. import java.util.List;
    10. /**
    11. * @author张强
    12. * @site www.zq.com
    13. * @create  2022-08-16 11:45
    14. */
    15. @Component
    16. @Aspect
    17. public class PagerAspect {
    18. @Around("execution(* *..*Biz.*Pager(..))")
    19. public Object invoke(ProceedingJoinPoint args) throws Throwable {
    20. Object[] params = args.getArgs();
    21. PageBean pageBean = null;
    22. for (Object param : params) {
    23. if(param instanceof PageBean){
    24. pageBean = (PageBean)param;
    25. break;
    26. }
    27. }
    28. if(pageBean != null && pageBean.isPagination())
    29. PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
    30. //执行目标方法
    31. Object list = args.proceed(params);
    32. if(null != pageBean && pageBean.isPagination()){
    33. PageInfo pageInfo = new PageInfo((List) list);
    34. pageBean.setTotal(pageInfo.getTotal()+"");
    35. }
    36. return list;
    37. }
    38. }

            ⑥mybatis框架逆向生成实体类以及crud方法

    我们可以使用mybatis的逆向生成功能初步完成实体类以及方法的开发

    关于逆向生成的步骤在之前已经介绍了,这里直接实践:

    我们使用到的数据库为:t_struts_class

     然后在配置文件中我已经写好了,我们直接运行我们创建的maven命令进行逆向生成

    结果:我们想要实现的就是如图的效果:

     这里是因为我是写完在做博客的所以有些下面才会实现对应的包和类!

            ⑦最后的实现查询方法编写

    我们需要分页的话还需要自己写一个分页查询的方法在对应的文件中添加:

    ClazzMapper.xml:

    1. <select id="listPager" parameterType="com.zq.ssm.model.Clazz" resultType="com.zq.ssm.model.Clazz">
    2. select
    3. <include refid="Base_Column_List" />
    4. from t_struts_class
    5. <where>
    6. <if test="cname != null and cname != ''">
    7. cname like CONCAT('%',#{cname},'%')
    8. if>
    9. <if test="cid != null and cid != ''">
    10. cid = #{cid}
    11. if>
    12. where>
    13. select>

    ClazzMapper:

    1. package com.zq.ssm.mapper;
    2. import com.zq.ssm.model.Clazz;
    3. import org.springframework.stereotype.Repository;
    4. import java.util.List;
    5. @Repository
    6. public interface ClazzMapper {
    7. int deleteByPrimaryKey(Integer cid);
    8. int insert(Clazz record);
    9. int insertSelective(Clazz record);
    10. Clazz selectByPrimaryKey(Integer cid);
    11. int updateByPrimaryKeySelective(Clazz record);
    12. int updateByPrimaryKey(Clazz record);
    13. List listPager(Clazz clazz);
    14. }

    ClazzBiz:

    1. package com.zq.ssm.biz;
    2. import com.zq.ssm.model.Clazz;
    3. import com.zq.ssm.util.PageBean;
    4. import org.springframework.stereotype.Repository;
    5. import java.util.List;
    6. @Repository
    7. public interface ClazzBiz {
    8. int deleteByPrimaryKey(Integer cid);
    9. int insert(Clazz record);
    10. int insertSelective(Clazz record);
    11. Clazz selectByPrimaryKey(Integer cid);
    12. int updateByPrimaryKeySelective(Clazz record);
    13. int updateByPrimaryKey(Clazz record);
    14. List listPager(Clazz clazz, PageBean pageBean);
    15. }

    ClazzBizImpl:

    1. package com.zq.ssm.biz.impl;
    2. import com.zq.ssm.biz.ClazzBiz;
    3. import com.zq.ssm.mapper.ClazzMapper;
    4. import com.zq.ssm.model.Clazz;
    5. import com.zq.ssm.util.PageBean;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.stereotype.Service;
    8. import java.util.List;
    9. /**
    10. * @author张强
    11. * @site www.zq.com
    12. * @create  2022-08-17 18:25
    13. */
    14. @Service
    15. public class ClazzBizImpl implements ClazzBiz {
    16. @Autowired
    17. private ClazzMapper clazzMapper;
    18. @Override
    19. public int deleteByPrimaryKey(Integer cid) {
    20. return clazzMapper.deleteByPrimaryKey(cid);
    21. }
    22. @Override
    23. public int insert(Clazz record) {
    24. return clazzMapper.insert(record);
    25. }
    26. @Override
    27. public int insertSelective(Clazz record) {
    28. return clazzMapper.insertSelective(record);
    29. }
    30. @Override
    31. public Clazz selectByPrimaryKey(Integer cid) {
    32. return clazzMapper.selectByPrimaryKey(cid);
    33. }
    34. @Override
    35. public int updateByPrimaryKeySelective(Clazz record) {
    36. return clazzMapper.updateByPrimaryKeySelective(record);
    37. }
    38. @Override
    39. public int updateByPrimaryKey(Clazz record) {
    40. return clazzMapper.updateByPrimaryKey(record);
    41. }
    42. @Override
    43. public List listPager(Clazz clazz, PageBean pageBean) {
    44. return clazzMapper.listPager(clazz);
    45. }
    46. }

    web层ClazzController: 

    1. package com.zq.ssm.controller;
    2. import com.zq.ssm.biz.ClazzBiz;
    3. import com.zq.ssm.model.Clazz;
    4. import com.zq.ssm.model.dto.ClazzDto;
    5. import com.zq.ssm.util.PageBean;
    6. import org.apache.commons.io.FileUtils;
    7. import org.springframework.beans.factory.annotation.Autowired;
    8. import org.springframework.http.HttpHeaders;
    9. import org.springframework.http.HttpStatus;
    10. import org.springframework.http.MediaType;
    11. import org.springframework.http.ResponseEntity;
    12. import org.springframework.stereotype.Controller;
    13. import org.springframework.web.bind.annotation.RequestMapping;
    14. import org.springframework.web.multipart.MultipartFile;
    15. import javax.servlet.http.HttpServletRequest;
    16. import java.io.File;
    17. import java.io.IOException;
    18. import java.util.List;
    19. /**
    20. * @author张强
    21. * @site www.zq.com
    22. * @create  2022-08-17 18:35
    23. */
    24. @Controller
    25. @RequestMapping("/clz")
    26. public class ClazzController {
    27. @Autowired
    28. private ClazzBiz clazzBiz;
    29. @RequestMapping("/list")
    30. public String list(HttpServletRequest req, Clazz clazz){
    31. PageBean pageBean = new PageBean();
    32. pageBean.setRequest(req);
    33. List lst = this.clazzBiz.listPager(clazz, pageBean);
    34. req.setAttribute("lst",lst);
    35. req.setAttribute("pageBean",pageBean);
    36. return "list";
    37. }
    38. @RequestMapping("/add")
    39. public String add(HttpServletRequest req, Clazz clazz){
    40. this.clazzBiz.insertSelective(clazz);
    41. return "redirect:/clz/list";
    42. }
    43. @RequestMapping("/edit")
    44. public String edit(HttpServletRequest req, Clazz clazz){
    45. this.clazzBiz.updateByPrimaryKeySelective(clazz);
    46. return "redirect:/clz/list";
    47. }
    48. @RequestMapping("/del")
    49. public String del(HttpServletRequest req, Clazz clazz){
    50. this.clazzBiz.deleteByPrimaryKey(clazz.getCid());
    51. return "redirect:/clz/list";
    52. }
    53. @RequestMapping("/toEdit")
    54. public String toEdit(HttpServletRequest req, Clazz clazz){
    55. if(clazz.getCid() != null){
    56. List lst = this.clazzBiz.listPager(clazz, null);
    57. req.setAttribute("b",lst.get(0));
    58. }
    59. return "clzEdit";
    60. }
    61. }

            ⑧前台界面 

    list.jsp:

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

    clzEdit.jsp:

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

             ⑨配置Tomcat

    我们完成前后端编码后只需最后一步就是配置Tomcat了


    二、SpringMVC实现上传文件

            ①导入pom依赖

    1. <dependency>
    2. <groupId>commons-fileuploadgroupId>
    3. <artifactId>commons-fileuploadartifactId>
    4. <version>1.3.3version>
    5. dependency>

            ②添加多功能解析器 在SpringMvc配置文件中

    1. <bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    2. <property name="defaultEncoding" value="UTF-8">property>
    3. <property name="maxUploadSize" value="52428800">property>
    4. <property name="resolveLazily" value="true"/>
    5. bean>

            ③前台界面        

    clzUpload.jsp: 

    1. <%--
    2. Created by IntelliJ IDEA.
    3. User: zjjt
    4. Date: 2022/8/17
    5. Time: 23:41
    6. To change this template use File | Settings | File Templates.
    7. --%>
    8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    9. <html>
    10. <head>
    11. <title>玉渊工作室title>
    12. head>
    13. <body>
    14. <form action="${pageContext.request.contextPath }/clz/upload" method="post" enctype="multipart/form-data">
    15. <input type="text" name="cid" value="${param.cid}"><br>
    16. <input type="file" name="picFile">
    17. <input type="submit">
    18. form>
    19. body>
    20. html>

            ④创建一个multipartFile类 进行文件接收  

    这里要注意的是multipartFile的属性名一定要和form表单中的属性名一致

    ClazzDto :

    1. package com.zq.ssm.model.dto;
    2. import com.zq.ssm.model.Clazz;
    3. import lombok.Data;
    4. import org.springframework.web.multipart.MultipartFile;
    5. /**
    6. * @author张强
    7. * @site www.zq.com
    8. * @create  2022-08-17 23:45
    9. */
    10. @Data
    11. public class ClazzDto extends Clazz {
    12. private MultipartFile picFile;
    13. public MultipartFile getPicFile() {
    14. return picFile;
    15. }
    16. public void setPicFile(MultipartFile picFile) {
    17. this.picFile = picFile;
    18. }
    19. }

            ⑤后台编码:

     在我们刚才创建的Controller类中加入文件上传的方法

    1. //文件上传
    2. @RequestMapping("/upload")
    3. public String upload(ClazzDto clazzDto){
    4. try {
    5. String diskPath = "E:/temp/T280/";
    6. String reqPath = "/upload/mvc/";
    7. MultipartFile picFile = clazzDto.getPicFile();
    8. // 完成文件上传
    9. FileUtils.copyInputStreamToFile(picFile.getInputStream(),new File(diskPath+picFile.getOriginalFilename()));
    10. // 保存到数据库中
    11. Clazz clz = new Clazz();
    12. clz.setCid(clazzDto.getCid());
    13. clz.setPic(reqPath + picFile.getOriginalFilename());
    14. this.clazzBiz.updateByPrimaryKeySelective(clz);
    15. } catch (IOException e) {
    16. e.printStackTrace();
    17. }
    18. return "redirect:/clz/list";
    19. }

            ⑥在idea中配置片请求的地址与硬盘中地址的映射关系

    选择配置Tomcat,然后进行配置

    三、SpringMVC实现文件下载

    1、点击下载传递文件的ID,通过文件的ID查询出对应的数据库中的的文件路径

    2、通过文件的请求地址,转换成文件存放的硬盘地址

    3、将硬盘中文件下载下来

    1. @RequestMapping(value="/download")
    2. public ResponseEntity<byte[]> download(Clazz clazz, HttpServletRequest req){
    3. try {
    4. //先根据文件id查询对应图片信息
    5. Clazz clz = this.clazzBiz.selectByPrimaryKey(clazz.getCid());
    6. String diskPath = "E:/temp/T280/";
    7. String reqPath = "/upload/mvc/";
    8. String realPath = clz.getPic().replace(reqPath,diskPath);
    9. String fileName = realPath.substring(realPath.lastIndexOf("/")+1);
    10. //下载关键代码
    11. File file=new File(realPath);
    12. HttpHeaders headers = new HttpHeaders();//http头信息
    13. String downloadFileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1");//设置编码
    14. headers.setContentDispositionFormData("attachment", downloadFileName);
    15. headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    16. //MediaType:互联网媒介类型 contentType:具体请求中的媒体类型信息
    17. return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.OK);
    18. }catch (Exception e){
    19. e.printStackTrace();
    20. }
    21. return null;
    22. }

     

  • 相关阅读:
    How to capture Microsoft logs IE Activex issue
    记录一次数据库CPU被打满的排查过程
    【21天python打卡】第4天 基础语法(2)
    CJSON库的学习
    SpringCloud Fegin CircuitBreaker (原hystrix) 熔断失效原因
    2022年高教社杯全国大学生数学建模竞赛-【比赛规则篇】比赛规则及比赛指导
    STL中list实现
    asp.net水资源检测系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
    开源报表工具Limereport交叉编译及使用
    如何从存档服务器上完全删除PDM用户
  • 原文地址:https://blog.csdn.net/weixin_66110079/article/details/126408185