目录
新建一个Maven项目

显示BUILD SUCCESS就代表建立成功了
一步一步导入
- <properties>
- <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
- <maven.compiler.source>1.8maven.compiler.source>
- <maven.compiler.target>1.8maven.compiler.target>
- <maven.compiler.plugin.version>3.7.0maven.compiler.plugin.version>
-
-
-
- <spring.version>5.0.2.RELEASEspring.version>
-
- <mybatis.version>3.4.5mybatis.version>
-
- <mysql.version>5.1.44mysql.version>
-
- <pagehelper.version>5.1.2pagehelper.version>
-
- <mybatis.spring.version>1.3.1mybatis.spring.version>
-
- <commons.dbcp2.version>2.1.1commons.dbcp2.version>
- <commons.pool2.version>2.4.3commons.pool2.version>
-
- <log4j2.version>2.9.1log4j2.version>
-
- <junit.version>4.12junit.version>
- <servlet.version>4.0.0servlet.version>
- <lombok.version>1.18.2lombok.version>
- properties>
- <dependencies>
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-contextartifactId>
- <version>${spring.version}version>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-ormartifactId>
- <version>${spring.version}version>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-txartifactId>
- <version>${spring.version}version>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-aspectsartifactId>
- <version>${spring.version}version>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-webartifactId>
- <version>${spring.version}version>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-testartifactId>
- <version>${spring.version}version>
- dependency>
-
- <dependency>
- <groupId>org.mybatisgroupId>
- <artifactId>mybatisartifactId>
- <version>${mybatis.version}version>
- dependency>
-
- <dependency>
- <groupId>mysqlgroupId>
- <artifactId>mysql-connector-javaartifactId>
- <version>${mysql.version}version>
- dependency>
-
- <dependency>
- <groupId>com.github.pagehelpergroupId>
- <artifactId>pagehelperartifactId>
- <version>${pagehelper.version}version>
- dependency>
-
- <dependency>
- <groupId>org.mybatisgroupId>
- <artifactId>mybatis-springartifactId>
- <version>${mybatis.spring.version}version>
- dependency>
-
- <dependency>
- <groupId>org.apache.commonsgroupId>
- <artifactId>commons-dbcp2artifactId>
- <version>${commons.dbcp2.version}version>
- dependency>
- <dependency>
- <groupId>org.apache.commonsgroupId>
- <artifactId>commons-pool2artifactId>
- <version>${commons.pool2.version}version>
- dependency>
-
-
- <dependency>
- <groupId>org.apache.logging.log4jgroupId>
- <artifactId>log4j-coreartifactId>
- <version>${log4j2.version}version>
- dependency>
- <dependency>
- <groupId>org.apache.logging.log4jgroupId>
- <artifactId>log4j-apiartifactId>
- <version>${log4j2.version}version>
- dependency>
-
- <dependency>
- <groupId>org.apache.logging.log4jgroupId>
- <artifactId>log4j-webartifactId>
- <version>${log4j2.version}version>
- dependency>
-
- <dependency>
- <groupId>junitgroupId>
- <artifactId>junitartifactId>
- <version>${junit.version}version>
- <scope>testscope>
- dependency>
- <dependency>
- <groupId>javax.servletgroupId>
- <artifactId>javax.servlet-apiartifactId>
- <version>${servlet.version}version>
- <scope>providedscope>
- dependency>
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- <version>${lombok.version}version>
- <scope>providedscope>
- dependency>
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-webmvcartifactId>
- <version>${spring.version}version>
- dependency>
-
-
- <dependency>
- <groupId>javax.servlet.jspgroupId>
- <artifactId>javax.servlet.jsp-apiartifactId>
- <version>2.3.3version>
- dependency>
-
- <dependency>
- <groupId>jstlgroupId>
- <artifactId>jstlartifactId>
- <version>1.2version>
- dependency>
-
- <dependency>
- <groupId>taglibsgroupId>
- <artifactId>standardartifactId>
- <version>1.1.2version>
- dependency>
- dependencies>
resources
- <resources>
-
- <resource>
- <directory>src/main/javadirectory>
- <includes>
- <include>**/*.xmlinclude>
- includes>
- resource>
-
- <resource>
- <directory>src/main/resourcesdirectory>
- <includes>
- <include>jdbc.propertiesinclude>
- <include>*.xmlinclude>
- includes>
- resource>
- resources>
plugin
- <plugin>
- <groupId>org.apache.maven.pluginsgroupId>
- <artifactId>maven-compiler-pluginartifactId>
- <version>${maven.compiler.plugin.version}version>
- <configuration>
- <source>${maven.compiler.source}source>
- <target>${maven.compiler.target}target>
- <encoding>${project.build.sourceEncoding}encoding>
- configuration>
- plugin>
- <plugin>
- <groupId>org.mybatis.generatorgroupId>
- <artifactId>mybatis-generator-maven-pluginartifactId>
- <version>1.3.2version>
- <dependencies>
-
- <dependency>
- <groupId>mysqlgroupId>
- <artifactId>mysql-connector-javaartifactId>
- <version>${mysql.version}version>
- dependency>
- dependencies>
- <configuration>
- <overwrite>trueoverwrite>
- configuration>
- plugin>
applicationContext.xml
- "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="applocationContext-mybatis.xml">import>
- beans>
applicationContext-mybatis.xml
- "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">
-
-
- <context:annotation-config/>
-
- <context:component-scan base-package="com.oyang.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"/>
-
-
- <property name="maxWaitMillis" value="-1"/>
- bean>
-
-
-
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
-
- <property name="dataSource" ref="dataSource"/>
-
- <property name="mapperLocations" value="classpath*:com/oyang/ssm/**/mapper/*.xml"/>
-
- <property name="typeAliasesPackage" value="com/oyang/ssm/**/model"/>
-
- <property name="plugins">
- <array>
- <bean class="com.github.pagehelper.PageInterceptor">
- <property name="properties">
- <value>
- helperDialect=mysql
- value>
- property>
- bean>
- array>
- property>
- bean>
-
-
-
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
-
-
- <property name="basePackage" value="com/oyang/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>
generatorConfig.xml
- "1.0" encoding="UTF-8" ?>
- 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"/>
-
-
- <classPathEntry location="D:\\SoftwareInstallPath\\repository\\mvn_repository\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>
-
-
- <context id="infoGuardian">
-
- <commentGenerator>
- <property name="suppressAllComments" value="true"/>
- <property name="suppressDate" value="true"/>
- commentGenerator>
-
-
- <jdbcConnection driverClass="${jdbc.driver}"
- connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>
-
-
- <javaTypeResolver>
-
- <property name="forceBigDecimals" value="false"/>
- javaTypeResolver>
-
-
-
-
- <javaModelGenerator targetPackage="com.oyang.ssm.model"
- targetProject="src/main/java">
-
- <property name="enableSubPackages" value="false"/>
-
- <property name="constructorBased" value="true"/>
-
- <property name="trimStrings" value="false"/>
-
- <property name="immutable" value="false"/>
- javaModelGenerator>
-
-
- <sqlMapGenerator targetPackage="com.oyang.ssm.mapper"
- targetProject="src/main/java">
-
- <property name="enableSubPackages" value="false"/>
- sqlMapGenerator>
-
-
-
-
-
- <javaClientGenerator targetPackage="com.oyang.ssm.mapper"
- targetProject="src/main/java" type="XMLMAPPER">
-
- <property name="enableSubPackages" value="false"/>
- javaClientGenerator>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <table schema="" tableName="t_struts_class" domainObjectName="Clazz"
- enableCountByExample="false" enableDeleteByExample="false"
- enableSelectByExample="false" enableUpdateByExample="false">
- table>
-
- context>
- generatorConfiguration>
jdbc.properties
- jdbc.driver=com.mysql.jdbc.Driver
- jdbc.url=jdbc:mysql://localhost:3306/db_2022_08?useUnicode=true&characterEncoding=UTF-8
- jdbc.username=root
- jdbc.password=123
log4j2.xml
- "1.0" encoding="UTF-8"?>
-
- <Configuration status="WARN" monitorInterval="30">
- <Properties>
-
- <Property name="LOG_HOME">/root/workspace/lucenedemo/logsProperty>
- <property name="ERROR_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/errorproperty>
- <property name="WARN_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/warnproperty>
- <property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%nproperty>
- Properties>
-
- <Appenders>
-
- <Console name="Console" target="SYSTEM_OUT">
-
- <ThresholdFilter level="trace" onMatch="ACCEPT"
- onMismatch="DENY" />
-
-
- <PatternLayout pattern="${PATTERN}" />
- Console>
-
-
-
- <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>
-
- <RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/info.log"
- filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
-
- <ThresholdFilter level="info" onMatch="ACCEPT"
- onMismatch="DENY" />
- <PatternLayout
- pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
- <Policies>
-
-
-
- <TimeBasedTriggeringPolicy interval="1"
- modulate="true" />
-
-
- 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 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>
-
- <TimeBasedTriggeringPolicy interval="1"
- modulate="true" />
-
- Policies>
- RollingFile>
-
- Appenders>
-
-
- <Loggers>
-
- <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>
springmvc-servlet.xml
- "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">
-
-
- <aop:aspectj-autoproxy/>
- <context:component-scan base-package="com.oyang.ssm"/>
-
-
-
-
- <mvc:annotation-driven>mvc:annotation-driven>
-
-
- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
-
- <property name="viewClass"
- value="org.springframework.web.servlet.view.JstlView">property>
- <property name="prefix" value="/"/>
- <property name="suffix" value=".jsp"/>
- bean>
-
-
-
-
-
-
-
- beans>
web.xml
- <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 Applicationdisplay-name>
- <context-param>
- <param-name>contextConfigLocationparam-name>
- <param-value>classpath:applicationContext.xmlparam-value>
- context-param>
-
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
- listener>
-
-
- <servlet>
- <servlet-name>SpringMVCservlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
-
- <init-param>
- <param-name>contextConfigLocationparam-name>
- <param-value>/WEB-INF/springmvc-servlet.xmlparam-value>
- init-param>
- <load-on-startup>1load-on-startup>
-
- <async-supported>trueasync-supported>
- servlet>
- <servlet-mapping>
- <servlet-name>SpringMVCservlet-name>
- <url-pattern>/url-pattern>
- servlet-mapping>
-
-
- <filter>
- <filter-name>encodingFilterfilter-name>
- <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
-
- <async-supported>trueasync-supported>
- <init-param>
- <param-name>encodingparam-name>
- <param-value>UTF-8param-value>
- init-param>
- filter>
- <filter-mapping>
- <filter-name>encodingFilterfilter-name>
- <url-pattern>/*url-pattern>
- filter-mapping>
- web-app>
将t_struts_class表逆向生成出Model、Mapper.xml、Mapper.java


工具类
StringUtils
- package com.oyang.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);
- }
-
- }
分页工具类
PageBean
- package com.oyang.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
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
getParamMap() { - return paramMap;
- }
-
- public void setParamMap(Map
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 + "]";
- }
-
- }
PageTag
- package com.oyang.ssm.tag;
-
- import com.oyang.ssm.util.PageBean;
-
- import javax.servlet.jsp.JspException;
- import javax.servlet.jsp.JspWriter;
- import javax.servlet.jsp.tagext.BodyTagSupport;
- import java.io.IOException;
- import java.util.Map;
- import java.util.Map.Entry;
- import java.util.Set;
-
-
- 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
paramMap = pageBean.getParamMap(); - if(paramMap != null && paramMap.size() > 0) {
- Set
> entrySet = paramMap.entrySet(); - for (Entry
entry : entrySet) { - // 参数名
- String key = entry.getKey();
- // 参数值
- for (String value : entry.getValue()) {
- // 上一次请求的参数,再一次组装成了新的Form表单
- // 注意:page参数每次都会提交,我们需要避免
- if(!"page".equals(key)) {
- sb.append(" ");
- }
- }
- }
- }
- sb.append("");
-
- // 分页条
- sb.append("
"
); - sb.append("
- );
- sb.append(" href='javascript:gotoPage(1)'>首页");
- sb.append("
- );
- sb.append(" href='javascript:gotoPage("+pageBean.previousPage()+")'><");// 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(" href='javascript:skipPage()'>确定");
- sb.append("
- 共"
+pageBean.getTotal()+"条"); - sb.append("");
-
- // 分页执行的JS代码
- sb.append("");
-
- return sb.toString();
- }
- }
ClazzMapper.xml
- "1.0" encoding="UTF-8" ?>
- mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
- <mapper namespace="com.oyang.ssm.mapper.ClazzMapper" >
- <resultMap id="BaseResultMap" type="com.oyang.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="selectByPrimaryKey" resultType="com.oyang.ssm.model.Clazz" parameterType="com.oyang.ssm.model.Clazz" >
- select
- <include refid="Base_Column_List" />
- from t_struts_class
- where cid = #{cid,jdbcType=INTEGER}
- select>
-
- <select id="listPager" resultType="com.oyang.ssm.model.Clazz" parameterType="com.oyang.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 cid!=''">
- and cid = #{cid}
- if>
- where>
- select>
-
- <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
- delete from t_struts_class
- where cid = #{cid,jdbcType=INTEGER}
- delete>
- <insert id="insert" parameterType="com.oyang.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.oyang.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.oyang.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.oyang.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>
ClazzMapper
- package com.oyang.ssm.mapper;
-
- import com.oyang.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);
-
- int updateByPrimaryKeySelective(Clazz record);
-
- int updateByPrimaryKey(Clazz record);
-
- List
listPager(Clazz clazz); - }
Clazz
- package com.oyang.ssm.model;
-
- public class Clazz {
- private Integer cid;
-
- private String cname;
-
- private String cteacher;
-
- private 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;
- }
- }
ClazzBiz
- package com.oyang.ssm.biz;
-
- import com.oyang.ssm.model.Clazz;
- import com.oyang.ssm.util.PageBean;
-
- 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
listPager(Clazz clazz, PageBean pageBean); - }
ClazzBizImpl
- package com.oyang.ssm.impl;
-
- import com.oyang.ssm.biz.ClazzBiz;
- import com.oyang.ssm.mapper.ClazzMapper;
- import com.oyang.ssm.model.Clazz;
- import com.oyang.ssm.util.PageBean;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
-
- import java.util.List;
-
- /**
- * @author oyang
- * @site https://blog.csdn.net
- * @qq 1828190940
- * @create 2022-08-17 20:59
- */
- @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
listPager(Clazz clazz, PageBean pageBean) { - return clazzMapper.listPager(clazz);
- }
- }



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



clzList 主界面
- <%@ 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"%>
- 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">IDth>
- <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>
增加 / 修改界面
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- 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>
界面图

ClazzController
- package com.oyang.ssm.controller;
-
- import com.oyang.ssm.biz.ClazzBiz;
- import com.oyang.ssm.model.Clazz;
- import com.oyang.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 oyang
- * @site https://blog.csdn.net
- * @qq 1828190940
- * @create 2022-08-17 21:17
- */
- @Controller
- @RequestMapping("/clz")
- public class ClazzController {
-
- @Autowired
- private ClazzBiz clazzBiz;
- // list->clzList
- // toList->重定向->"redirect:/clz/list"
- //toEdit->跳转到编辑界面
- //Clazz:以前是通过模型驱动接口封装,现在是直接在方法中接收参数即可
- @RequestMapping("/list")
- public String list(Clazz clazz, HttpServletRequest request){
- PageBean pageBean =new PageBean();
- pageBean.setRequest(request);
- List
lst = this.clazzBiz.listPager(clazz, pageBean); - request.setAttribute("lst",lst);
- request.setAttribute("pageBean",pageBean);
- return "clzList";
- }
- }

ClazzController
- @RequestMapping("/toEdit")
- public String toEdit(Clazz clazz, HttpServletRequest request){
- Integer cid = clazz.getCid();
- //传递了id代表修改,没传代表新增
- if(cid!=null){
- List
lst = this.clazzBiz.listPager(clazz, null); - request.setAttribute("b",lst.get(0));
- }
- return "clzEdit";
- }
-
- @RequestMapping("/add")
- public String add(Clazz clazz){
- this.clazzBiz.insertSelective(clazz);
- return "redirect:/clz/list";
- }


- @RequestMapping("/toEdit")
- public String toEdit(Clazz clazz, HttpServletRequest request){
- Integer cid = clazz.getCid();
- //传递了id代表修改,没传代表新增
- if(cid!=null){
- List
lst = this.clazzBiz.listPager(clazz, null); - request.setAttribute("b",lst.get(0));
- }
- return "clzEdit";
- }
- @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";
- }
- }

二、文件上传SpringMVC上传
Springmvc.xml中添加 多功能解析器 配置
前台的页面 添加 多功能表单设置 multipart/from-data
后台要利用multipartFile类进行 文件接收
注:multipartFile的属性名一定要跟form中的表单属性名一致
在IDEA中完成图片请求地址与硬盘中地址的映射关系
- <dependency>
- <groupId>commons-fileuploadgroupId>
- <artifactId>commons-fileuploadartifactId>
- <version>1.3.3version>
- dependency>
- <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
-
- <property name="defaultEncoding" value="UTF-8">property>
-
- <property name="maxUploadSize" value="52428800">property>
-
- <property name="resolveLazily" value="true"/>
- bean>
vo:view Object
Dto:接收参数 参数不仅仅存在于实体类Model中
- package com.oyang.ssm.model.dto;
-
- import com.oyang.ssm.model.Clazz;
- import org.springframework.web.multipart.MultipartFile;
-
- /**
- * @author oyang
- * @site https://blog.csdn.net
- * @qq 1828190940
- * @create 2022-08-18 11:27
- */
- public class ClazzDto extends Clazz {
- //multipartFile的属性名一定要跟form中的表单属性名一致
- private MultipartFile pocFile;
-
- public MultipartFile getPocFile() {
- return pocFile;
- }
-
- public void setPocFile(MultipartFile pocFile) {
- this.pocFile = pocFile;
- }
- }
注意,这里ClazzDto 继承了Clazz实体类,要将实体类的的属性修饰符改成 protected,同时,multipartFile的属性名一定要跟form中的表单属性名一致!


ClazzController
上诉小编有提到,pom依赖可导可不导。这是为什么呢?小编给个位看下区别吧
不导pom依赖:
- //文件上传
- @RequestMapping("/upload")
- public String upload(ClazzDto clazzDto) {
- try {
- //前台上传的文件
- MultipartFile pocFile = clazzDto.getPocFile();
- InputStream inputStream = pocFile.getInputStream();
- FileOutputStream fout = new FileOutputStream(new File("d/temp"));
- byte[] bbuf=new byte[1024];
- int len=0;
- while (true){
- len=inputStream.read(bbuf,0,len);
- fout.write(bbuf,0,len);
- if(len<0){
- break;
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- return "redirect:/clz/list";
- }
加了pom依赖:
- //文件上传
- @RequestMapping("/upload")
- public String upload(ClazzDto clazzDto) {
- try {
- //前台上传的文件
- MultipartFile pocFile = clazzDto.getPocFile();
- String diskPath="D:/temp/oyang";//图片存放地址
- InputStream inputStream = pocFile.getInputStream();
- FileUtils.copyInputStreamToFile(inputStream,new File(diskPath));
- } catch (Exception e) {
- e.printStackTrace();
- }
- return "redirect:/clz/list";
- }
完整代码:
- //文件上传
- @RequestMapping("/upload")
- public String upload(ClazzDto clazzDto) {
- try {
- //前台上传的文件
- MultipartFile pocFile = clazzDto.getPocFile();
- //实际应该配置到resource.properties中
- String diskPath="D:/temp/oyang";//图片存放地址
- String requesPath="/upload/mvc/";//数据库保存地址,也是访问地址
-
- //拿到上传文件的名字
- String filename = pocFile.getOriginalFilename();
- InputStream inputStream = pocFile.getInputStream();
- FileUtils.copyInputStreamToFile(inputStream,new File(diskPath+filename));
-
- //将图片上传之后,并且将图片地址更新到数据库中
- Clazz clazz=new Clazz();
- clazz.setCid(clazzDto.getCid());
- clazz.setPic(requesPath+filename);
- this.clazzBiz.updateByPrimaryKeySelective(clazz);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return "redirect:/clz/list";
- }
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"%>
- 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>
- <center>
- <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>
- center>
-
- <table class="table table-striped bg-success">
- <thead>
- <tr>
- <th scope="col">IDth>
- <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>
- <a href="${pageContext.request.contextPath }/clzUploa.jsp?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>
clzUpload.jsp
- <%--
- Created by IntelliJ IDEA.
- User: Administrator
- Date: 2022/8/19
- Time: 1:19
- To change this template use File | Settings | File Templates.
- --%>
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>文件上传title>
- head>
- <body>
- <form action="${pageContext.request.contextPath}/clz/upload" method="post" enctype="multipart/form-data">
- <input type="text" value="${param.cid}" name="cid">
- <input type="file" name="pocFile">
- <input type="submit">
- form>
- body>
- html>



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


点击 + 号 External Source

选择我们的映射地址

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

再将我们主界面的图片展示更改一下
- <td>
- <img src="${pageContext.request.contextPath }${b.pic}" style="width: 100px;height: 100px;">
- td>

SpringMVC下载
1.点击下载传递文件的ID,通过文件的ID查询出文件的路径
2.通过文件的请求地址,转换成文件存放的硬盘地址
3.将硬盘中的文件下载下来
<a href="${pageContext.request.contextPath }/clz/download?cid=${b.cid}">下载图片a>
clzUpload.jsp
- //文件上传
- @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 diskPath="D:/temp/oyang/";//图片存放地址
- String requesPath="/upload/mvc/";//数据库保存地址,也是访问地址
-
- // 2.通过文件的请求地址,转换成文件存放的硬盘地址
- String replPath=pic.replace(requesPath,diskPath);
- String fileName=replPath.substring(replPath.lastIndexOf("/")+1);
- // 3.将硬盘中的文件下载下来->固定代码
- //下载关键代码
- File file=new File(replPath);
- 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;
- }



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