• SpringMVC-CRUD与文件上传、文件下载


    目录

    一、CRUD(增删改查)

    1、导入相关pom依赖

    1.1Pom.xml

    1.2.相关配置文件

    1.3.web.xml相关配置

    1.4.逆向生成

    2.代码开发

    TomCat配置

    界面代码

     查询-主界面页面绑值

     增加

     修改

     删除

     二、文件上传

    思路:

    配置文件上传

    pom依赖(非必须)

    Springmvc.xml配置  文件上传多功能解析器

    后台代码 

    ClazzDto  

    前台

    在IDEA中完成图片请求地址与硬盘中地址的映射关系

    三、文件下载

     思路:

    前端代码

    后端代码 

    运行


    一、CRUD(增删改查)

    新建一个Maven项目

    显示BUILD SUCCESS就代表建立成功了 

    1、导入相关pom依赖

    1.1Pom.xml

    一步一步导入

    1. <properties>
    2. <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    3. <maven.compiler.source>1.8maven.compiler.source>
    4. <maven.compiler.target>1.8maven.compiler.target>
    5. <maven.compiler.plugin.version>3.7.0maven.compiler.plugin.version>
    6. <spring.version>5.0.2.RELEASEspring.version>
    7. <mybatis.version>3.4.5mybatis.version>
    8. <mysql.version>5.1.44mysql.version>
    9. <pagehelper.version>5.1.2pagehelper.version>
    10. <mybatis.spring.version>1.3.1mybatis.spring.version>
    11. <commons.dbcp2.version>2.1.1commons.dbcp2.version>
    12. <commons.pool2.version>2.4.3commons.pool2.version>
    13. <log4j2.version>2.9.1log4j2.version>
    14. <junit.version>4.12junit.version>
    15. <servlet.version>4.0.0servlet.version>
    16. <lombok.version>1.18.2lombok.version>
    17. properties>
    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframeworkgroupId>
    4. <artifactId>spring-contextartifactId>
    5. <version>${spring.version}version>
    6. dependency>
    7. <dependency>
    8. <groupId>org.springframeworkgroupId>
    9. <artifactId>spring-ormartifactId>
    10. <version>${spring.version}version>
    11. dependency>
    12. <dependency>
    13. <groupId>org.springframeworkgroupId>
    14. <artifactId>spring-txartifactId>
    15. <version>${spring.version}version>
    16. dependency>
    17. <dependency>
    18. <groupId>org.springframeworkgroupId>
    19. <artifactId>spring-aspectsartifactId>
    20. <version>${spring.version}version>
    21. dependency>
    22. <dependency>
    23. <groupId>org.springframeworkgroupId>
    24. <artifactId>spring-webartifactId>
    25. <version>${spring.version}version>
    26. dependency>
    27. <dependency>
    28. <groupId>org.springframeworkgroupId>
    29. <artifactId>spring-testartifactId>
    30. <version>${spring.version}version>
    31. dependency>
    1. <dependency>
    2. <groupId>org.mybatisgroupId>
    3. <artifactId>mybatisartifactId>
    4. <version>${mybatis.version}version>
    5. dependency>
    6. <dependency>
    7. <groupId>mysqlgroupId>
    8. <artifactId>mysql-connector-javaartifactId>
    9. <version>${mysql.version}version>
    10. dependency>
    11. <dependency>
    12. <groupId>com.github.pagehelpergroupId>
    13. <artifactId>pagehelperartifactId>
    14. <version>${pagehelper.version}version>
    15. dependency>
    16. <dependency>
    17. <groupId>org.mybatisgroupId>
    18. <artifactId>mybatis-springartifactId>
    19. <version>${mybatis.spring.version}version>
    20. dependency>
    1. <dependency>
    2. <groupId>org.apache.commonsgroupId>
    3. <artifactId>commons-dbcp2artifactId>
    4. <version>${commons.dbcp2.version}version>
    5. dependency>
    6. <dependency>
    7. <groupId>org.apache.commonsgroupId>
    8. <artifactId>commons-pool2artifactId>
    9. <version>${commons.pool2.version}version>
    10. dependency>
    1. <dependency>
    2. <groupId>org.apache.logging.log4jgroupId>
    3. <artifactId>log4j-coreartifactId>
    4. <version>${log4j2.version}version>
    5. dependency>
    6. <dependency>
    7. <groupId>org.apache.logging.log4jgroupId>
    8. <artifactId>log4j-apiartifactId>
    9. <version>${log4j2.version}version>
    10. dependency>
    11. <dependency>
    12. <groupId>org.apache.logging.log4jgroupId>
    13. <artifactId>log4j-webartifactId>
    14. <version>${log4j2.version}version>
    15. dependency>
    1. <dependency>
    2. <groupId>junitgroupId>
    3. <artifactId>junitartifactId>
    4. <version>${junit.version}version>
    5. <scope>testscope>
    6. dependency>
    7. <dependency>
    8. <groupId>javax.servletgroupId>
    9. <artifactId>javax.servlet-apiartifactId>
    10. <version>${servlet.version}version>
    11. <scope>providedscope>
    12. dependency>
    13. <dependency>
    14. <groupId>org.projectlombokgroupId>
    15. <artifactId>lombokartifactId>
    16. <version>${lombok.version}version>
    17. <scope>providedscope>
    18. dependency>
    1. <dependency>
    2. <groupId>org.springframeworkgroupId>
    3. <artifactId>spring-webmvcartifactId>
    4. <version>${spring.version}version>
    5. dependency>
    6. <dependency>
    7. <groupId>javax.servlet.jspgroupId>
    8. <artifactId>javax.servlet.jsp-apiartifactId>
    9. <version>2.3.3version>
    10. dependency>
    11. <dependency>
    12. <groupId>jstlgroupId>
    13. <artifactId>jstlartifactId>
    14. <version>1.2version>
    15. dependency>
    16. <dependency>
    17. <groupId>taglibsgroupId>
    18. <artifactId>standardartifactId>
    19. <version>1.1.2version>
    20. dependency>
    21. dependencies>

    resources 

    1. <resources>
    2. <resource>
    3. <directory>src/main/javadirectory>
    4. <includes>
    5. <include>**/*.xmlinclude>
    6. includes>
    7. resource>
    8. <resource>
    9. <directory>src/main/resourcesdirectory>
    10. <includes>
    11. <include>jdbc.propertiesinclude>
    12. <include>*.xmlinclude>
    13. includes>
    14. resource>
    15. resources>

    plugin 

    1. <plugin>
    2. <groupId>org.apache.maven.pluginsgroupId>
    3. <artifactId>maven-compiler-pluginartifactId>
    4. <version>${maven.compiler.plugin.version}version>
    5. <configuration>
    6. <source>${maven.compiler.source}source>
    7. <target>${maven.compiler.target}target>
    8. <encoding>${project.build.sourceEncoding}encoding>
    9. configuration>
    10. plugin>
    11. <plugin>
    12. <groupId>org.mybatis.generatorgroupId>
    13. <artifactId>mybatis-generator-maven-pluginartifactId>
    14. <version>1.3.2version>
    15. <dependencies>
    16. <dependency>
    17. <groupId>mysqlgroupId>
    18. <artifactId>mysql-connector-javaartifactId>
    19. <version>${mysql.version}version>
    20. dependency>
    21. dependencies>
    22. <configuration>
    23. <overwrite>trueoverwrite>
    24. configuration>
    25. plugin>

    1.2.相关配置文件

    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="applocationContext-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.oyang.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/oyang/ssm/**/mapper/*.xml"/>
    25. <property name="typeAliasesPackage" value="com/oyang/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/oyang/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:\\SoftwareInstallPath\\repository\\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.oyang.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.oyang.ssm.mapper"
    25. targetProject="src/main/java">
    26. <property name="enableSubPackages" value="false"/>
    27. sqlMapGenerator>
    28. <javaClientGenerator targetPackage="com.oyang.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/db_2022_08?useUnicode=true&characterEncoding=UTF-8
    3. jdbc.username=root
    4. jdbc.password=123

    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.oyang.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. beans>

    1.3.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>

    1.4.逆向生成

    将t_struts_class表逆向生成出Model、Mapper.xml、Mapper.java

     

    工具类

    StringUtils 

    1. package com.oyang.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. }

    分页工具类

    PageBean 

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

    PageTag  

    1. package com.oyang.ssm.tag;
    2. import com.oyang.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.getParamMap();
    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();
  • }
  • }
  • 2.代码开发

    ClazzMapper.xml

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

    ClazzMapper  

    1. package com.oyang.ssm.mapper;
    2. import com.oyang.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. }

    Clazz  

    1. package com.oyang.ssm.model;
    2. public class Clazz {
    3. private Integer cid;
    4. private String cname;
    5. private String cteacher;
    6. private String pic;
    7. public Clazz(Integer cid, String cname, String cteacher, String pic) {
    8. this.cid = cid;
    9. this.cname = cname;
    10. this.cteacher = cteacher;
    11. this.pic = pic;
    12. }
    13. public Clazz() {
    14. super();
    15. }
    16. public Integer getCid() {
    17. return cid;
    18. }
    19. public void setCid(Integer cid) {
    20. this.cid = cid;
    21. }
    22. public String getCname() {
    23. return cname;
    24. }
    25. public void setCname(String cname) {
    26. this.cname = cname;
    27. }
    28. public String getCteacher() {
    29. return cteacher;
    30. }
    31. public void setCteacher(String cteacher) {
    32. this.cteacher = cteacher;
    33. }
    34. public String getPic() {
    35. return pic;
    36. }
    37. public void setPic(String pic) {
    38. this.pic = pic;
    39. }
    40. }

     ClazzBiz 

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

    ClazzBizImpl 

    1. package com.oyang.ssm.impl;
    2. import com.oyang.ssm.biz.ClazzBiz;
    3. import com.oyang.ssm.mapper.ClazzMapper;
    4. import com.oyang.ssm.model.Clazz;
    5. import com.oyang.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 oyang
    11. * @site https://blog.csdn.net
    12. * @qq 1828190940
    13. * @create  2022-08-17 20:59
    14. */
    15. @Service
    16. public class ClazzBizImpl implements ClazzBiz {
    17. @Autowired
    18. private ClazzMapper clazzMapper;
    19. @Override
    20. public int deleteByPrimaryKey(Integer cid) {
    21. return clazzMapper.deleteByPrimaryKey(cid);
    22. }
    23. @Override
    24. public int insert(Clazz record) {
    25. return clazzMapper.insert(record);
    26. }
    27. @Override
    28. public int insertSelective(Clazz record) {
    29. return clazzMapper.insertSelective(record);
    30. }
    31. @Override
    32. public Clazz selectByPrimaryKey(Integer cid) {
    33. return clazzMapper.selectByPrimaryKey(cid);
    34. }
    35. @Override
    36. public int updateByPrimaryKeySelective(Clazz record) {
    37. return clazzMapper.updateByPrimaryKeySelective(record);
    38. }
    39. @Override
    40. public int updateByPrimaryKey(Clazz record) {
    41. return clazzMapper.updateByPrimaryKey(record);
    42. }
    43. @Override
    44. public List listPager(Clazz clazz, PageBean pageBean) {
    45. return clazzMapper.listPager(clazz);
    46. }
    47. }

    TomCat配置

     选择工程名,后缀 为: war exploded  效果更好

    界面代码

    clzList 主界面

    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>${b.pic }td>
    60. <td>
    61. <a href="${pageContext.request.contextPath }/clz/toEdit?cid=${b.cid}">修改a>
    62. <a href="${pageContext.request.contextPath }/clz/del?cid=${b.cid}">删除a>
    63. td>
    64. tr>
    65. c:forEach>
    66. tbody>
    67. table>
    68. <z:page pageBean="${pageBean }">z:page>
    69. body>
    70. html>

    增加 / 修改界面

    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. cid:<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>

    界面图 

     查询-主界面页面绑值

    ClazzController

    1. package com.oyang.ssm.controller;
    2. import com.oyang.ssm.biz.ClazzBiz;
    3. import com.oyang.ssm.model.Clazz;
    4. import com.oyang.ssm.util.PageBean;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.stereotype.Controller;
    7. import org.springframework.web.bind.annotation.RequestMapping;
    8. import javax.servlet.http.HttpServletRequest;
    9. import java.util.List;
    10. /**
    11. * @author oyang
    12. * @site https://blog.csdn.net
    13. * @qq 1828190940
    14. * @create  2022-08-17 21:17
    15. */
    16. @Controller
    17. @RequestMapping("/clz")
    18. public class ClazzController {
    19. @Autowired
    20. private ClazzBiz clazzBiz;
    21. // list->clzList
    22. // toList->重定向->"redirect:/clz/list"
    23. //toEdit->跳转到编辑界面
    24. //Clazz:以前是通过模型驱动接口封装,现在是直接在方法中接收参数即可
    25. @RequestMapping("/list")
    26. public String list(Clazz clazz, HttpServletRequest request){
    27. PageBean pageBean =new PageBean();
    28. pageBean.setRequest(request);
    29. List lst = this.clazzBiz.listPager(clazz, pageBean);
    30. request.setAttribute("lst",lst);
    31. request.setAttribute("pageBean",pageBean);
    32. return "clzList";
    33. }
    34. }

     增加

    ClazzController

    1. @RequestMapping("/toEdit")
    2. public String toEdit(Clazz clazz, HttpServletRequest request){
    3. Integer cid = clazz.getCid();
    4. //传递了id代表修改,没传代表新增
    5. if(cid!=null){
    6. List lst = this.clazzBiz.listPager(clazz, null);
    7. request.setAttribute("b",lst.get(0));
    8. }
    9. return "clzEdit";
    10. }
    11. @RequestMapping("/add")
    12. public String add(Clazz clazz){
    13. this.clazzBiz.insertSelective(clazz);
    14. return "redirect:/clz/list";
    15. }

     修改

    1. @RequestMapping("/toEdit")
    2. public String toEdit(Clazz clazz, HttpServletRequest request){
    3. Integer cid = clazz.getCid();
    4. //传递了id代表修改,没传代表新增
    5. if(cid!=null){
    6. List lst = this.clazzBiz.listPager(clazz, null);
    7. request.setAttribute("b",lst.get(0));
    8. }
    9. return "clzEdit";
    10. }
    11. @RequestMapping("/edit")
    12. public String edit(Clazz clazz){
    13. this.clazzBiz.updateByPrimaryKeySelective(clazz);
    14. return "redirect:/clz/list";
    15. }

     删除

    1. @RequestMapping("/del")
    2. public String del(Clazz clazz){
    3. this.clazzBiz.deleteByPrimaryKey(clazz.getCid());
    4. return "redirect:/clz/list";
    5. }
    6. }

     二、文件上传

    思路:

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

    配置文件上传

    pom依赖(非必须)

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

    Springmvc.xml配置  文件上传多功能解析器

    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>

    后台代码 

    vo:view Object
    Dto:接收参数 参数不仅仅存在于实体类Model中 

    ClazzDto  

    1. package com.oyang.ssm.model.dto;
    2. import com.oyang.ssm.model.Clazz;
    3. import org.springframework.web.multipart.MultipartFile;
    4. /**
    5. * @author oyang
    6. * @site https://blog.csdn.net
    7. * @qq 1828190940
    8. * @create  2022-08-18 11:27
    9. */
    10. public class ClazzDto extends Clazz {
    11. //multipartFile的属性名一定要跟form中的表单属性名一致
    12. private MultipartFile pocFile;
    13. public MultipartFile getPocFile() {
    14. return pocFile;
    15. }
    16. public void setPocFile(MultipartFile pocFile) {
    17. this.pocFile = pocFile;
    18. }
    19. }

    注意,这里ClazzDto  继承了Clazz实体类,要将实体类的的属性修饰符改成 protected,同时,multipartFile的属性名一定要跟form中的表单属性名一致!

    ClazzController

    上诉小编有提到,pom依赖可导可不导。这是为什么呢?小编给个位看下区别吧

     不导pom依赖:

    1. //文件上传
    2. @RequestMapping("/upload")
    3. public String upload(ClazzDto clazzDto) {
    4. try {
    5. //前台上传的文件
    6. MultipartFile pocFile = clazzDto.getPocFile();
    7. InputStream inputStream = pocFile.getInputStream();
    8. FileOutputStream fout = new FileOutputStream(new File("d/temp"));
    9. byte[] bbuf=new byte[1024];
    10. int len=0;
    11. while (true){
    12. len=inputStream.read(bbuf,0,len);
    13. fout.write(bbuf,0,len);
    14. if(len<0){
    15. break;
    16. }
    17. }
    18. } catch (Exception e) {
    19. e.printStackTrace();
    20. }
    21. return "redirect:/clz/list";
    22. }

    加了pom依赖:

    1. //文件上传
    2. @RequestMapping("/upload")
    3. public String upload(ClazzDto clazzDto) {
    4. try {
    5. //前台上传的文件
    6. MultipartFile pocFile = clazzDto.getPocFile();
    7. String diskPath="D:/temp/oyang";//图片存放地址
    8. InputStream inputStream = pocFile.getInputStream();
    9. FileUtils.copyInputStreamToFile(inputStream,new File(diskPath));
    10. } catch (Exception e) {
    11. e.printStackTrace();
    12. }
    13. return "redirect:/clz/list";
    14. }

    完整代码:

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

    前台

    clzList.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. <center>
    35. <form class="form-inline"
    36. action="${pageContext.request.contextPath }/clz/list" method="post">
    37. <div class="form-group mb-2">
    38. <input type="text" class="form-control-plaintext" name="cname"
    39. placeholder="请输入班级名称">
    40. div>
    41. <button type="submit" class="btn btn-primary mb-2">查询button>
    42. <a class="btn btn-primary mb-2" href="${pageContext.request.contextPath }/clz/toEdit">新增a>
    43. form>
    44. center>
    45. <table class="table table-striped bg-success">
    46. <thead>
    47. <tr>
    48. <th scope="col">IDth>
    49. <th scope="col">班级名称th>
    50. <th scope="col">指导老师th>
    51. <th scope="col">班级相册th>
    52. <th scope="col">操作th>
    53. tr>
    54. thead>
    55. <tbody>
    56. <c:forEach var="b" items="${lst }">
    57. <tr>
    58. <td>${b.cid }td>
    59. <td>${b.cname }td>
    60. <td>${b.cteacher }td>
    61. <td>${b.pic }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 }/clzUploa.jsp?cid=${b.cid}">上传图片a>
    66. <a href="${pageContext.request.contextPath }/clz/del?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>

     clzUpload.jsp

    1. <%--
    2. Created by IntelliJ IDEA.
    3. User: Administrator
    4. Date: 2022/8/19
    5. Time: 1:19
    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" value="${param.cid}" name="cid">
    16. <input type="file" name="pocFile">
    17. <input type="submit">
    18. form>
    19. body>
    20. html>

    这可以看见,出来的是地址,而不是图片,我们需要在IDEA中完成图片请求地址与硬盘中地址的映射关系

    在IDEA中完成图片请求地址与硬盘中地址的映射关系

    首先将服务停止

     点击 + 号 External Source

     选择我们的映射地址

     注意区分

     将网络请求地址更改为之前写好的访问地址

     再将我们主界面的图片展示更改一下

    1. <td>
    2. <img src="${pageContext.request.contextPath }${b.pic}" style="width: 100px;height: 100px;">
    3. td>

    三、文件下载

     思路:

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

    前端代码

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

    后端代码 

     clzUpload.jsp 

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

    运行

     

     这就是下载的图片啦


    OK,本章的分享就到此结束啦,如果对个位看官有帮助的话可以留下免费的赞哦(收藏或关注也行),如果文章中有什么问题或不足以及需要改正的地方可以私信博主,博主会做出改正的。个位看官,小陽在此跟大家说拜拜啦   

  • 相关阅读:
    飞腾 kylin-server v10 arm64 aarch64 anaconda3 conda 非法指令 Illegal instruction 笔记
    TCL 基于 StarRocks 构建统一的数据分析平台
    JavaScript设计模式之装饰器模式
    外包干了2个月,技术退步明显。。。。。
    VUE的键盘事件
    蓝桥杯 题库 简单 每日十题 day5
    20道前端高频面试题(附答案)
    Kafka:分布式流处理平台的深度解析
    Acwing第76场周赛
    基于深度学习的KBQA方法(pipline)的一些思考(一)
  • 原文地址:https://blog.csdn.net/weixin_65211978/article/details/126412755