2021年10月20日

                                                     ![](Pictures\logo.jpg)

Author:Exchanges

Version:9.0.2

1.SpringMVC方式文件上传

SpringMVC框架提供了MultipartFile对象,该对象表示上传的文件,要求变量名称必须和表单file标签的 name属性名称相同。

1.1在pom.xml文件中导入依赖

<dependency>
   <groupId>commons-fileupload</groupId>
   <artifactId>commons-fileupload</artifactId>
   <version>1.3.1</version>
</dependency>

1.2在springmvc.xml中配置文件解析器,id 名称必须为:multipartResolver

<!--配置文件解析器对象-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
   <property name="maxUploadSize" value="50000000" />
</bean>

1.3创建jsp页面

<form action="user/fileupload" method="post" enctype="multipart/form-data">
      选择文件:<input type="file" name="upload" /><br/>
       <input type="submit" value="上传" />
</form>

1.4测试

@RequestMapping("/fileupload")
public String fileupload(MultipartFile upload) throws Exception {
   System.out.println("springmvc文件上传...");

   // 使用fileupload组件完成文件上传
   // 上传的位置
   String path = "G:/upload";
   // 判断,该路径是否存在
   File file = new File(path);
   if(!file.exists()){
       // 创建该文件夹
       file.mkdirs();
  }

   // 说明上传文件项
   // 获取上传文件的名称
   String filename = upload.getOriginalFilename();
   // 把文件的名称设置唯一值,uuid
   String uuid = UUID.randomUUID().toString().replace("-", "");
   filename = uuid+"_"+filename;
   // 完成文件上传
   upload.transferTo(new File(path,filename));

   return "success";
}

2.SpringMVC的异常处理

Controller调用service,service调用dao,异常都是向上抛出的,最终有DispatcherServlet找异常处理器进行异常的处理。

2.1创建自定义异常类

public class MyException extends Exception {

   public MyException(String message) {
       super(message);
  }
}

2.2创建异常处理器类

public class MyExceptionResolver implements HandlerExceptionResolver {

   @Override
   public ModelAndView resolveException(HttpServletRequest request,
          HttpServletResponse response, Object object, Exception exception) {

       ModelAndView mv = new ModelAndView();

       // 判断异常类型
       if (exception instanceof MyException) {
           // 如果是自定义异常,读取异常信息
           mv.addObject("msg", exception.getMessage());
      } else {
           // 如果是运行时异常,则取错误堆栈,从堆栈中获取异常信息
           mv.addObject("msg", "未知异常");
      }
       // 返回错误页面,给用户友好页面显示错误信息
       mv.setViewName("/error.jsp");

       return mv;
  }
}

2.3在springmvc.xml中配置

<!--配置异常处理器-->
<bean id="myExceptionResolver" class="com.qf.exception.MyExceptionResolver"/>

2.4测试

//测试异常方法
@RequestMapping(value="/testException")
public void testException() throws MyException{

    //System.out.println(1/0);
    throw new MyException("自定义异常");
}

3.SpringMVC框架中的拦截器

拦截器的概述 SpringMVC框架中的拦截器用于对处理器进行预处理和后处理的技术。 可以定义拦截器链,连接器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链中的拦截器会按着定义的顺序执行。

拦截器和过滤器的功能比较类似,有以下区别:

过滤器是Servlet规范的一部分,任何框架都可以使用过滤器技术。 拦截器是SpringMVC框架独有的。

过滤器配置了/*,可以拦截任何资源。 拦截器只会对控制器中的方法进行拦截。

拦截器也是AOP思想的一种实现方式 想要自定义拦截器,需要实现HandlerInterceptor接口。

3.1创建自定义拦截器

public class MyInterceptor implements HandlerInterceptor {

   /**
    * 预处理,controller方法执行前
    * return true 放行,执行下一个拦截器,如果没有,执行controller中的方法
    * return false 不放行
    */
   @Override
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
       System.out.println("preHandle");
       return true;
  }


   //后处理方法,controller方法执行后,success.jsp执行之前
   public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
       System.out.println("postHandle");
  }

   //success.jsp页面执行后,该方法会执行
   public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
       System.out.println("afterCompletion");
  }
}

3.2在springmvc.xml中配置拦截器

<!--配置拦截器-->
<mvc:interceptors>
   <!--配置拦截器-->
   <mvc:interceptor>
       <!--要拦截的具体的方法-->
       <mvc:mapping path="/user/*"/>
       <!--不要拦截的方法
           <mvc:exclude-mapping path=""/>
           -->
       <!--配置拦截器对象-->
       <bean class="com.qf.interceptor.MyInterceptor" />
   </mvc:interceptor>
</mvc:interceptors>

3.3测试

@RequestMapping("/testInterceptor")
public String testInterceptor(){
   System.out.println("testInterceptor执行了...");
   return "success";
}




SSM整合

1.创建web工程

2.导入依赖

<properties>
   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   <maven.compiler.source>1.7</maven.compiler.source>
   <maven.compiler.target>1.7</maven.compiler.target>
   <!-- 配置全局spring版本 -->
   <spring.version>5.2.6.RELEASE</spring.version>
</properties>

 <dependencies>

   <!-- spring -->
   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-webmvc</artifactId>
     <!-- 配置版本-->
     <version>${spring.version}</version>
   </dependency>
   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-jdbc</artifactId>
     <version>5.2.6.RELEASE</version>
   </dependency>
   <dependency>
     <groupId>org.aspectj</groupId>
     <artifactId>aspectjweaver</artifactId>
     <version>1.9.4</version>
   </dependency>

   <!-- mybatis -->
   <dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>8.0.20</version>
   </dependency>
   <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>druid</artifactId>
     <version>1.1.19</version>
   </dependency>
   <dependency>
     <groupId>org.mybatis</groupId>
     <artifactId>mybatis</artifactId>
     <version>3.5.4</version>
   </dependency>
   <dependency>
     <groupId>org.mybatis</groupId>
     <artifactId>mybatis-spring</artifactId>
     <version>2.0.4</version>
   </dependency>

   <!-- springmvc -->
   <dependency>
     <groupId>com.fasterxml.jackson.core</groupId>
     <artifactId>jackson-databind</artifactId>
     <version>2.11.0</version>
   </dependency>

   <dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>servlet-api</artifactId>
     <version>2.5</version>
     <scope>provided</scope>
   </dependency>

 </dependencies>

3.使用逆向工程生成pojo,mapper以及mapper.xml文件

( 注意:生成的代码拷贝至工程的指定位置,并在Mapper上加@Repository注解 )

4. 编写 Service

package com.qf.service;

import com.qf.pojo.TbMusic;

import java.util.List;

public interface MusicService {

   List<TbMusic> findAll();

}

5.编写ServiceImpl

package com.qf.service.impl;

import com.qf.dao.TbMusicMapper;
import com.qf.pojo.TbMusic;
import com.qf.service.MusicService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class MusicServiceImpl implements MusicService {

   @Autowired
   private TbMusicMapper tbMusicMapper;

   @Override
   public List<TbMusic> findAll() {
       return tbMusicMapper.selectByExample(null);
  }

}

6. 编写Controller

package com.qf.controller;

import com.qf.pojo.TbMusic;
import com.qf.service.MusicService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("music")
public class MusicController {

   @Autowired
   private MusicService musicService;

   @RequestMapping("findAll")
   public List<TbMusic> findAll(){
       return musicService.findAll();
  }
}

7.编写 jdbc.properties

jdbc.username = root
jdbc.password= root
jdbc.url = jdbc:mysql:///wyy_music?serverTimezone=Asia/Shanghai
jdbc.driverClassName = com.mysql.cj.jdbc.Driver

8.编写 mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
       PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
       "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

</configuration>

9.编写 applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:aop="http://www.springframework.org/schema/aop"
      xmlns:tx="http://www.springframework.org/schema/tx"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
     
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx.xsd">
   
   <!-- 扫描指定包下的注解 -->
   <context:component-scan base-package="com.qf">
       <!-- 不扫描指定的注解 -->
       <!-- <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />-->
   </context:component-scan>

   <!-- 引入外包properties文件 -->
   <context:property-placeholder location="classpath:jdbc.properties"/>

   <!-- 配置数据源 -->
   <bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
       <property name="username" value="${jdbc.username}"></property>
       <property name="password" value="${jdbc.password}"></property>
       <property name="url" value="${jdbc.url}"></property>
       <property name="driverClassName" value="${jdbc.driverClassName}"></property>
   </bean>

   <!-- 配置sqlSessionFactoryBean -->
   <bean name="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
       <!-- 配置数据源 -->
       <property name="dataSource" ref="dataSource"></property>
       <!-- 引入mybatis-config.xml -->
       <property name="configLocation" value="classpath:mybatis-config.xml"></property>
   </bean>

   <!-- 扫描mapper.xml配置文件 -->
   <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
       <property name="basePackage" value="com.qf.dao"></property>
   </bean>

   <!-- 配置事务平台管理器 -->
   <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
       <property name="dataSource" ref="dataSource"></property>
   </bean>

   <!-- 配置事务通知-->
   <tx:advice id="txAdvice" transaction-manager="transactionManager">
       <tx:attributes>
           <tx:method name="find*" isolation="DEFAULT" propagation="REQUIRED" read-only="true"/>
       </tx:attributes>
   </tx:advice>

   <!-- 配置事务-->
   <aop:config>
       <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.qf.service.impl.*ServiceImpl.*(..))"></aop:advisor>
   </aop:config>

</beans>

10. 编写 springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:mvc="http://www.springframework.org/schema/mvc"
      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

   <!-- 扫描指定包下的注解 -->
   <context:component-scan base-package="com.qf.controller"/>
   <!-- 设置静态资源可以访问 -->
   <mvc:default-servlet-handler/>
   <!-- 注解配置 -->
   <mvc:annotation-driven/>
   <!-- 配置视图解析器 -->
   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
       <!-- 前缀和后缀 -->
       <!-- <property name="prefix" value=""></property>-->
       <!-- <property name="suffix" value=""></property>-->
   </bean>
</beans>

11.编写web.xml

<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Archetype Created Web Application</display-name>

    <!-- 配置applicationContext.xml-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <!-- 通过监听的方式去加载applicationContext.xml-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- 前端过滤器 -->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>

        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

12.测试

添加分页操作

1.导入依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.11</version>
</dependency>

2.配置分页插件(两种方式)

2.1 第一种:在 applicationContext.xml 中添加配置
<!-- 配置sqlSessionFactoryBean -->
    <bean name="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 配置数据源 -->
        <property name="dataSource" ref="dataSource"></property>
        <!-- 引入mybatis-config.xml -->
        <property name="configLocation" value="classpath:mybatis-config.xml"></property>

        <property name="plugins">
            <set>
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <props>
                            <!-- 数据库方言,可选择:oracle,mysql,mariadb 等-->
                            <prop key="helperDialect">mysql</prop>
                            <!--reasonable:分页合理化参数,默认值:false。
                            当该参数设置为true时,pageNum<=0时会查询第一页,
                            pageNum>pages(超过总数时),会查询最后一页-->
                            <prop key="reasonable">true</prop>
                            <!--supportMethodsArguments:
                            是否支持通过 Mapper 接口参数来传递分页参数,默认值:false-->
                            <prop key="supportMethodsArguments">true</prop>
                        </props>
                    </property>
                </bean>
            </set>
        </property>

    </bean>
2.2 第二种:在 mybatis-config.xml 中添加配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <property name="helperDialect" value="mysql"/>
            <property name="reasonable" value="true"/>
            <property name="supportMtehodsArguments" value="true"/>
        </plugin>
    </plugins>

</configuration>

3.在 controller 中添加方法

@RequestMapping("findPage")
    public PageInfo findPage(
        @RequestParam(value="pageNum",required = false,defaultValue = "1") Integer pageNum,
        @RequestParam(value="pageSize",required = false,defaultValue = "2") Integer pageSize){

        PageHelper.startPage(pageNum,pageSize);
        List<TbMusic> list = musicService.findAll();

        PageInfo pageInfo = new PageInfo(list);

        return pageInfo;
    }


posted @ 2021-10-20 19:06  张三疯321  阅读(41)  评论(0)    收藏  举报