J2EE-021 SSM Spring-MVC入门(下)(文件上传,异常处理,拦截器,FreeMark)

文件上传

文件上传三步骤

1.页面要素

1.Post提交方式
2.file文件上传域
3.enctype属性:必须设置为multipart/form-data

<h2>单文件上传</h2>
<form action="/upload/fileUpload" method="post" enctype="multipart/form-data">
    名称:<input type="text" name="name"><br>
    文件:<input type="file" name="uploadFiles"><br/>
    <input type="submit" value="点击上传">
</form>

2.导入jar包

commons fileupload
commns io

<!--引入文件上传必须依赖-->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.6</version>
    </dependency>

2.配置文件

 <!-- 配置文件上传解析器
    id="multipartResolver" 文件上传解析器id的值必须等于multipartResolver,如果配置不对进会报错
 -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 最大允许上传大小5MB -->
        <property name="maxUploadSize" value="5242880" />
        <property name="maxInMemorySize" value="4096" />
        <property name="defaultEncoding" value="UTF-8" />
    </bean>

后台代码

应当先判断是否有文件夹,没有则新建文件夹再transferTo
这里要拿到文件的后缀,不然上传的文件没有文件类型。

@RequestMapping(value = "/fileUpload",method = RequestMethod.POST)
    @ResponseBody
   public Map<String,String> singleupload(String username, MultipartFile[] uploadFiles) throws IOException {
        Map<String,String> map=new HashMap<>();
        System.out.println(uploadFiles);
        if (uploadFiles.length == 0) {
            System.out.println("12312");
        }

        for (MultipartFile uploadFile : uploadFiles) {
            /*获取原始文件名*/
            System.out.println(uploadFile);
            String originalFilename = uploadFile.getOriginalFilename();
             String originalFilename = uploadFile.getOriginalFilename();
            String[] split = originalFilename.split(".");
            System.out.println(username);
            File file = new File(BASE_PATH);
            if (!file.exists()) {
                file.mkdirs();//创建文件目录
            }
            /*保存到服务器上这里是本地*/
            uploadFile.transferTo(new File(BASE_PATH + username+split [1]));
        }
        map.put("code","200");
        map.put("msg","success");
        return map;
    }
}

前台代码

<h2>单文件上传</h2>
<form action="/upload/fileUpload" method="post" enctype="multipart/form-data">
    名称:<input type="text" name="name"><br>
    文件:<input type="file" name="uploadFiles"><br/>
    <input type="submit" value="点击上传">
</form>

测试

在这里插入图片描述

Spring-MVC统一异常处理

1.针对某个类@Exception

标注在方法上,告诉这个异常处理方法

@ExceptionHandler
    public ModelAndView handlerException(Exception e){
        ModelAndView mv = new ModelAndView();
        mv.setViewName("/error/500");
        mv.addObject("exception","错误信息:"+e.getMessage());
        return mv;
    }

编写页面
在这里插入图片描述

测试
在这里插入图片描述

2,全局针对全局的Excption处理类

继承handlerExceptionResovler类,重写resolverException方法

@Component
public class GoalExcption implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        ModelAndView mv = new ModelAndView();
        if (e instanceof RuntimeException){
            mv.setViewName("/error/500");
        }else if (e instanceof Exception){
            mv.setViewName("错误页面地址");
        }
        mv.addObject("exception","错误信息:"+e.getMessage());
        return mv;
    }
}

中间用instanceof判断属于哪一个继承判断错误,设置错误信息

3.@AdviceGoalExcption+@ExceptionHandler(继承Exception的类对象)+@ResponseStatus(报错码)

@AdviceGoalExcption告诉spirng这个类需要进行管理
@ExceptionHandler(继承Exception的类对象) 设置什么类型的报错进入
@ResponseStatus(报错码) 设置报错码进入

@ControllerAdvice
public class AdviceGoalExcption {
    //内部错误
    @ExceptionHandler(RuntimeException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public ModelAndView inClassExcption(Exception e){
        ModelAndView mv = new ModelAndView("/error/500");
        mv.addObject("exception","错误信息:"+e.getMessage());
        return mv;
    }
}

4.在web.xml中设置报错页

   <error-page>
        <error-code>404</error-code>
        <location>/WEB-INF/views/error/500.jsp</location>
    </error-page>

拦截器

继承HandlerInterceptor方法

继承HandlerInterceptor重写3个方法

  1. preHandle 方法最先执行
  2. postHandle 中间执行
  3. afterCompletion 最后执行
public class MyHandlerInterceptor implements HandlerInterceptor {
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView){
        System.out.println("postHandle");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
        System.out.println("afterCompletion");
    }
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle");
        return true;
    }
}

Bean加载配置文件加载拦截器类

<!--配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="org.example.aop.MyHandlerInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

mvc:mapping path="/**" 设置拦截的路径,这里是所有的都拦截
bean class =“类路径” 加载类

测试 it’s OK!

在这里插入图片描述
拦截器可以做登录的只要返回false就可以不继续往下继续下去。验证没有登录或者登录页面就返回false。登录了就返回true继续下去

FreeMark多视图控制器

配置pom.xml文件

引入支持包spring-context-support

 <!--使用FreeMarker必须引入这个包-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.freemarker</groupId>
      <artifactId>freemarker</artifactId>
      <version>${freemarker.version}</version>
    </dependency>
     <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>${servlet.version}</version>
      <!--只提供访问项目打包不包含该依赖-->
      <scope>provided</scope>
    </dependency>

配置Web.xml DispatcherServlet分发器

<!--配置FreeMark的Servlet分发器-->
    <servlet>
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:Bean文件加载配置文件路径spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>0</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

配置Bean文件加载配置文件.XML

<!-- 定义BeanNameViewResolver 可以用来提供自定义view输出,如pdf等,但是一般用类似千牛
  的DNS静态服务来代替
        此处与freemarker无关,仅仅是介绍freemarker在多视图解析器下order的顺序
  -->
    <!--/配置视图解析器【Freemarker】///-->
    <bean id="freeMarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <!-- ftl模版文件路径  -->
        <property name="templateLoaderPath" value="/WEB-INF/views/"></property>
        <!-- 页面编码 -->
        <property name="defaultEncoding" value="utf-8" />
        <property name="freemarkerSettings">
            <props>
                <!-- 模版缓存刷新时间,不写单位默认为秒 -->
                <prop key="template_update_delay">0</prop>
                <!-- 时区 和 时间格式化 -->
                <prop key="locale">zh_CN</prop>
                <prop key="datetime_format">yyyy-MM-dd</prop>
                <prop key="date_format">yyyy-MM-dd</prop>
                <!-- 数字使用.来分隔 -->
                <prop key="number_format">#.##</prop>
            </props>
        </property>
    </bean>
    <!-- 注册freemarker视图解析器 -->
    <bean id="freeMarkerViewResolver"
          class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
        <!-- 视图解析顺序,排在其他视图解析器之后 数字越大优先级越低 -->
        <property name="order" value="2" />
        <!-- 开启模版缓存 -->
        <property name="cache" value="true" />
        <!-- 上面已经配了,这里就不用配啦 -->
        <property name="prefix" value="" />
        <!-- 配置文件后缀 -->
        <property name="suffix" value=".ftl" />
        <property name="contentType" value="text/html;charset=UTF-8" />
        <!-- 是否允许session属性覆盖模型数据,默认false -->
        <property name="allowSessionOverride" value="false" />
        <!-- 是否允许request属性覆盖模型数据,默认false -->
        <property name="allowRequestOverride" value="false" />
        <!-- 开启spring提供的宏帮助(macro) -->
        <property name="exposeSpringMacroHelpers" value="true" />
        <!-- 添加request attributes属性到ModelAndView中 -->
        <property name="exposeRequestAttributes" value="true" />
        <!-- 添加session attributes属性到ModelAndView中 -->
        <property name="exposeSessionAttributes" value="true" />
    </bean>
    <context:component-scan base-package="org.example"></context:component-scan>
    <!-- 开启spring注解支持 -->
    <mvc:annotation-driven/>

后端代码

@Component
@RequestMapping(value = "/user")
public class UserController {
    public UserController(){
        System.out.println("user");
    }
        @RequestMapping(value = "/infofreemark")
        public String testFreemarker(HttpServletRequest request, ModelMap modelMap)
                throws Exception {
            User user = new User("may", "21");
            List<String> list = new ArrayList<String>();
            list.add("Jack1");
            list.add("Jack2");
            list.add("Jack3");
            modelMap.addAttribute("list", list);
            modelMap.addAttribute("user", user);
            request.setAttribute("haha","哈哈");
            return "userinfo";
        }

        @RequestMapping(value = "/infothymeleaf")
        public String testthymeleaf(HttpServletRequest request, ModelMap modelMap)
                throws Exception {
            User user = new User("may", "21");
            List<String> list = new ArrayList<String>();
            list.add("Jack1");
            list.add("Jack2");
            list.add("Jack3");
            modelMap.addAttribute("list", list);
            modelMap.addAttribute("user", user);
            request.setAttribute("haha","哈哈");
            return "userinfo-thymeleaf";
        }
}

前端代码

<!DOCTYPE HTML>
<html>
    <head>
        <meta content="text/html" charset="UTF-8" />
        <title>Freemarker模板</title>
    </head>
    <body>
        List:<br/>
        <#list list as item >
            <p style="color: red">${item}</p>
        </#list>

        User:<br/>
        ${user.id}-${user.name}--->${user.age}<br/>

        request:<br/>
        ${haha}
    </body>
</html>

测试 it’s OK

在这里插入图片描述

Thymeleaf多视图控制器

配置POM.XML

 <thymeleaf-spring.verson>3.0.5.M3</thymeleaf-spring.verson>
    <thymeleaf.version>3.0.11.RELEASE</thymeleaf.version>
 <dependency>
      <groupId>org.thymeleaf</groupId>
      <artifactId>thymeleaf-spring5</artifactId>
      <version>${thymeleaf-spring.verson}</version>
    </dependency>
    <dependency>
      <groupId>org.thymeleaf</groupId>
      <artifactId>thymeleaf</artifactId>
      <version>${thymeleaf.version}</version>
    </dependency>
  </dependencies>

配置WEB.XML DispatcherServlet分发器

<!--配置FreeMark的Servlet分发器-->
    <servlet>
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <!--<param-value>classpath:spring-mvc.xml</param-value>-->
            <!--<param-value>classpath:spring-mvc-freemark.xml</param-value>-->
            <param-value>classpath:spring-mvc-Thymeleaf.xml</param-value>
        </init-param>
        <load-on-startup>0</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

配置thymeleaf.XML文件

<context:component-scan base-package="org.example.mvc.controller"/>
    <!-- 开启spring注解支持 -->
    <mvc:annotation-driven/>

    <!--thymeleaf模板解析器-->
    <bean id="SpringResourceTemplateResolver"
          class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
        <property name="prefix" value="/WEB-INF/views/"></property>
        <property name="suffix" value=".html"></property>
        <property name="templateMode" value="HTML5"></property>
        <property name="cacheable" value="false"></property>
        <property name="characterEncoding" value="UTF-8"></property>
    </bean>
    <bean id="SpringTemplateEngine"
          class="org.thymeleaf.spring5.SpringTemplateEngine">
        <property name="templateResolver" ref="SpringResourceTemplateResolver">
        </property>
    </bean>
    <bean class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
        <property name="templateEngine" ref="SpringTemplateEngine"></property>
        <property name="characterEncoding" value="UTF-8"></property>
    </bean>

前端代码

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Thymeleaf模板引擎-1</title>
</head>
<body>
    <div th:each="item:${list}">
        <p style="color: red" th:text="${item}" />
    </div>
    <hr>
    User:<br/>
    id:<span th:text="${user.id}" /><br/>
    name:<span th:text="${user.name}" /><br/>
    age:<span th:text="${user.age}" /><br/>
    <hr>
    haha:<label th:text="${haha}" />
    <hr>
    <!--http://localhost:8080/list?uid=10101-->
    <a href="index.html" th:href="@{http://localhost:8080/list(uid=${user.id})}">测试</a>
</body>
</html>

测试 It’s OK

在这里插入图片描述

代码

百度云地址:https://pan.baidu.com/s/1Yp7wl_wG1s2y4GKKYtCe3w
password: k614

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值