SpringMVC(二)

2023-05-16

SpringMVC(二)

响应数据和结果视图
  • 返回值分类:

    • 字符串
    • void
    • ModelAndView 对象:是 spring 提供的一个对象,可以用来调整具体的 JSP 视图
    @RequestMapping("testModelAndView")
    public ModelAndView testModelAndView(){
        //创建 ModelAndView 对象
        ModelAndView mv = new ModelAndView();
        System.out.println("testModelAndView执行了……");
        // 模拟从数据库中查询出User对象
        User user = new User();
        user.setUsername("jljl");
        user.setPassword("456");
        user.setAge(22);
        //把 user 对象存储到 mv 对象中,也会把 user 对象存入到 request 对象
        mv.addObject("user",user);
    
        //跳转到哪个页面,ModelAndView会找到视图解析器,找到其对应的目录下的页面
        mv.setViewName("success");
        return mv;
    }
    
  • SpringMVC 框架提供的 转发重定向

    /**
         * 使用关键字的方式进行转发或者重定向
         * @return
         */
    @RequestMapping("testForwardOrRedict")
    public String testForwardOrRedict(){
        System.out.println("testForwardOrRedict执行了……");
        //请求的转发
        //return "forward:/WEB-INF/pages/success.jsp";
        //重定向
        return "redirect:/index.jsp";
    }
    
  • ResponseBody 响应 json 数据

    • 过滤静态资源:由于web.xml中配置前端控制器时设置了拦截所有资源,导致jsp页面无法加载到JQuery文件,所以要进行这样的设置。
    <!--前端控制器,哪些静态资源不拦截-->
    <mvc:resources location="/js/" mapping="/js/**"/>
    <!--新的设置方式,可以设置不拦截所有静态资源-->
    <!--<mvc:default-servlet-handler/>-->
    
    • 发送 ajax 请求
    <script src="${pageContext.request.contextPath}/js/jquery-3.1.1.min.js"></script>
    <script>
        //页面加载,绑定单击事件
        $(function () {
            $("#btn").click(function () {
                //发送ajax请求
                $.ajax({
                    url:"${pageContext.request.contextPath}/user/testAjax",
                    contentType:"application/json;charset=utf-8",
                    data:'{"username":"jinlu","password":"123","age":22}',
                    dataType:"json",
                    type:"post",
                    success:function (data) {
                        //data:服务器响应的 json 数据,进行解析
                    }
                });
            });
        });
    </script>
    
    <button id="btn">发送 ajax 请求</button>
    
    /**
         * 模拟异步请求响应
         */
    @RequestMapping("testAjax")
    public void testAjax(@RequestBody String body){
        System.out.println("testAjax执行了……");
        System.out.println(body);
    }
    
    • 响应 json 数据格式

      • json 字符串和 JavaBean 对象互相转换过程中,需要使用 jackson 的 jar 包
      <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>2.9.0</version>
      </dependency>
      <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-core</artifactId>
          <version>2.9.0</version>
      </dependency>
      <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-annotations</artifactId>
          <version>2.9.0</version>
      </dependency>
      
      • response.jsp
      <script>
          //页面加载,绑定单击事件
          $(function () {
              $("#btn").click(function () {
                  //alert("hello btn");
                  //发送ajax请求
                  $.ajax({
                      url:"${pageContext.request.contextPath}/user/testAjax",
                      contentType:"application/json;charset=utf-8",
                      data:'{"username":"jinlu","password":"123","age":22}',
                      dataType:"json",
                      type:"post",
                      success:function (data) {
                          //data:服务器响应的 json 数据,进行解析
                          alert(data);
                          alert(data.username);
                          alert(data.password);
                          alert(data.age);
                      }
                  });
              });
          });
      </script>
      
      • UserController.java
      @RequestMapping("testAjax")
      public @ResponseBody User testAjax(@RequestBody User user){
          System.out.println("testAjax执行了……");
          //客户端发送ajax请求,传的是json字符串,后端把json字符串封装到user对象
          System.out.println(user);
          //做响应,模拟查询数据库
          user.setUsername("LULU");
          user.setAge(40);
          //做响应
          return user;
      }
      
springMVC实现文件上传
  • 传统文件上传
<!--传统方法文件上传的jar包-->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>
<form action="user/fileUpload1" method="post" enctype="multipart/form-data">
    选择文件:<input type="file" name="upload" /><br/>
    <input type="submit" value="上传"/>
</form>
@RequestMapping("/fileUpload1")
public String fileUpload1(HttpServletRequest request) throws Exception {
    System.out.println("fileUpload1执行了……");

    //使用fileupload组件完成文件上传
    //上传的位置
    String path = request.getSession().getServletContext().getRealPath("/uploads");
    //判断,该路径是否存在
    File file = new File(path);
    if (!file.exists()){
        //创建该文件夹
        file.mkdirs();
    }
    //解析request对象,获取上传文件项
    DiskFileItemFactory factory = new DiskFileItemFactory();        //磁盘文件
    ServletFileUpload upload = new ServletFileUpload(factory);
    //解析request
    List<FileItem> items = upload.parseRequest(request);
    //遍历
    for (FileItem item: items) {
        //进行判断,当前item对象是否是上传文件项
        if (item.isFormField()){
            //说明是普通表单项
        }else{
            //说明是上传文件项
            //获取上传文件的名称
            String filename = item.getName();
            //把文件名称设置唯一值,uuid
            String uuid = UUID.randomUUID().toString().replace("-", "");
            filename = uuid + "_" + filename;
            //完成上传文件
            item.write(new File(path,filename));
            //删除临时文件(>10kb会删掉,<10kb内存会保存临时文件,所以要删除掉)
            item.delete();
        }
    }
    return "success";
}
  • SpringMVC 文件上传

原理

<!--配置文件解析器,id 必须为"multipartResolver"-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!--文件最大大小-->
    <property name="maxUploadSize" value="10485760"/>
</bean>
/**
     * SpringMVC 文件上传
     * @param request
     * @return
     * @throws Exception
     */
@RequestMapping("/fileUpload2")
public String fileUpload2(HttpServletRequest request, MultipartFile upload) throws IOException {
    System.out.println("fileUpload2执行了……");
    //上传的位置
    String path = request.getSession().getServletContext().getRealPath("/uploads/");
    //判断路径是否存在
    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";
}
  • springMVC 跨服务器方式文件上传

    • 分服务器的目的
      • 应用服务器:负责部署到我们的应用。
      • 数据库服务器:运行我们的数据库。
      • 缓存和消息服务器:负责处理大并发访问的缓存和消息。
      • 文件服务器:负责存储用户上传文件的服务器。

    依赖注入:

    <!--SpringMVC跨服务器方式上传文件依赖的包-->
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-core</artifactId>
        <version>1.18.1</version>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-client</artifactId>
        <version>1.18.1</version>
    </dependency>
    

    后台控制:

    /**
         * 跨服务器文件上传
         * @param upload
         * @return
         * @throws IOException
         */
    @RequestMapping("/fileUpload3")
    public String fileUpload3(MultipartFile upload) throws IOException {
        System.out.println("fileUpload3执行了……");
    
        //定义上传文件服务器路径
        String path = "http://localhost:9990/uploads/";
    
        //说明上传文件项
        //获取上传文件的名称
        String filename = upload.getOriginalFilename();
        //设置唯一值,uuid
        String uuid = UUID.randomUUID().toString().replace("-","");
        filename = uuid + "_" + filename;
        //完成文件上传,跨服务器文件上传
        //1.创建客户端对象
        Client client = Client.create();
        //2.和图片服务器进行连接
        WebResource webResource = client.resource(path + filename);
        //3.上传文件
        webResource.put(upload.getBytes());
    
        return "success";
    }
    

    上传失败,出现错误HTTP Status 500 - Request processing failed; nested exception is com.sun.jersey.api.client.UniformInterfaceException: PUT http://localhost:9090/uploads/69f070620aa54e2f97a2c62299e02d14_1715-9.jpg returned a response status of 403 Forbidden

    原因是跨服务器上传文件,但是文件不能写入,需要在 tomcat 目录下conf文件夹下的 web.xml 的<servlet> 配置中加入:

    <init-param>
        <param-name>readonly</param-name>
        <param-value>false</param-value>
    </init-param>
    
    
springMVC中的异常处理

SpringMVC异常处理

  • 自定义异常类
/**
 * 自定义异常类
 */
public class SysException extends Exception  {
    //存储提示信息
    private String message;

    @Override
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public SysException(String message) {
        this.message = message;
    }
}

  • 异常处理器:必须实现 HandlerExceptionResolver
/**
 * 异常处理器
 */
public class SysExceptionResolver implements HandlerExceptionResolver {
    /**
     * 处理异常业务逻辑
     * @param httpServletRequest
     * @param httpServletResponse
     * @param o
     * @param e
     * @return
     */
    @Nullable
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, @Nullable Object o, Exception e) {
        //获取异常对象
        SysException sysException = null;
        if (e instanceof SysException){
            sysException = (SysException) e;
        }else {
            sysException = new SysException("系统正在维护……");
        }
        //创建ModelAndView 对象
        ModelAndView mv = new ModelAndView();
        mv.addObject("errorMsg",sysException.getMessage());
        mv.setViewName("error");
        return mv;
    }
}

  • 配置异常处理器
<!--配置异常处理器-->
<bean id="sysExceptionResolver" class="com.ssm.exception.SysExceptionResolver"/>

  • 测试:
@RequestMapping("/testException")
public String testException() throws SysException {
    System.out.println("testException执行了...");

    try {
        //模拟异常
        int i = 10/0;
    } catch (Exception e) {
        //打印异常信息
        e.printStackTrace();
        //抛出自定义异常信息
        throw new SysException("查询所有用户信息出错……");
    }
    return "success";
}

springMVC中的拦截器
  • 拦截器类似于Servlet 中的过滤器 Filter,用于对处理器进行预处理和后处理。

  • 拦截器 & 过滤器

    • 过滤器是servlet 规范中的一部分,任何 Javaweb 工程都可以使用。
    • 拦截器是springMVC自己的,只有使用了springMVC框架的工程才能使用。
    • 过滤器在url-pattern 中配置了/*之后,可以对所有要访问的资源拦截。
    • 拦截器只会拦截访问的控制器方法,如果访问的是jsp、html、css、image或者 js 是不会进行拦截的。
  • 流程:

    • 编写拦截器类,实现 HandlerInterceptor 接口
    public class MyInterceptor implements HandlerInterceptor {
        /**
         * 预处理,controller方法执行前
         * return true 放行,执行下一拦截器,如果没有,执行controller中的方法
         * return false 不放行
         * @param request
         * @param response
         * @param handler
         * @return
         * @throws Exception
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("MyInterceptor执行了...");
            return true;
        }
        
        /**
         * 后处理方法
         * @param request
         * @param response
         * @param handler
         * @param modelAndView
         * @throws Exception
         */
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
            System.out.println("MyInterceptor执行了...后");
    //        request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
        }
    
        /**
         * success.jsp执行之后才会执行
         * @param request
         * @param response
         * @param handler
         * @param ex
         * @throws Exception
         */
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
            System.out.println("MyInterceptor执行了...最后");
        }
    }
    
    
    • 配置拦截器
    <mvc:interceptors>
        <mvc:interceptor>
            <!--要拦截的具体方法-->
            <mvc:mapping path="/user/*"/>
            <!--不要拦截的方法-->
            <!--<mvc:exclude-mapping path=""/>-->
            <!--配置拦截器对象-->
            <bean class="com.ssm.interceptor.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
    
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringMVC(二) 的相关文章

随机推荐

  • 【清华大学】2021元宇宙研究报告

    关于元宇宙的详细介绍 xff1b 来源 xff1a 软件定义世界 xff08 SDX xff09
  • MAC OS M1 安装MySQL

    xff08 1 xff09 进入mysql官网下载mysql http www mysql com downloads xff08 2 xff09 选择对应下载版本 xff08 3 xff09 选择直接下载 xff08 4 xff09 下载
  • PX4开源飞控位置控制解析

    位置控制的总体思路为串级PID控制算法 xff0c 内环为对速度的PID控制 xff0c 外环为对位置的比例控制 xff0c 被控对象为四旋翼无人机 xff0c 被控量为四旋翼无人机输出的推力矢量和 xff0c 将测量到的位置与速度进行反馈
  • ONOS意图框架

    1 意图基本概念 Intent是用于描述应用需求的不可变模型对象 xff0c ONOS核心根据其改变网络行为 在最低级别上 xff0c 可以用以下方式描述意图 即意图的组成 xff1a 1 Network Resource xff1a 一组
  • prometheus-4种metric类型说明

    前提了解 prometheus中存储的数据都是时序型 xff0c 其数据模型都是如下 xff1a metric name label 61 value value timestamp 下文中说的数据类型只是客户端的封装 prometheus
  • ROS2 中常用坐标系

    ROS2 中常用坐标系 frame id xff1a 用来告诉你 xff0c 发布的数据是来自哪一个坐标系的 在使用ROS进行定位导航等操作时 xff0c 我们经常会遇到各种坐标系 每种坐标系都有明确的含义 理论上坐标系的名称可以是随意的
  • 国密SM2算法

    目录 1 前言 2 基础参数 3 密钥对生成 4 签名算法 4 1 预处理1 4 2 预处理2 4 3 生成签名 4 4 签名验证 4 5 签名验证原理 5 参考资料 1 前言 比原链的智能合约支持国密算法的函数 SM2是国密标准的椭圆曲线
  • STM32——ARM与STM32之间的联系

    ARM与STM32之间的联系 stm32是基于ARM内核的一种控制器 xff0c 是包含与被包含的关系 ARM xff08 STM32 xff09
  • VTK坐标转换

    VTK坐标转换
  • 软件工程师校招面试救急包

    LeetCode牛人总结 xff08 手撕代码前看看 xff0c 抱佛脚 xff09 https github com labuladong fucking algorithm blob master README md 剑指offer x
  • unix环境高级编程——UNIX体系架构

    本期主题 xff1a unix环境高级编程 UNIX体系架构 文件IO 0 初始UNIX1 系统调用2 库函数2 1 C语言的运行库 3 shell 0 初始UNIX 这里略过unix的历史不讲 xff0c 网上有比较详细的资料 我们可以将
  • CVPR2019:无监督深度追踪

    本文提出了一种无监督的视觉跟踪方法 与使用大量带注释数据进行监督学习的现有方法不同 xff0c 本文的CNN模型是在无监督的大规模无标签视频上进行训练的 动机是 xff0c 强大的跟踪器在向前和向后预测中均应有效 xff08 即 xff0c
  • 各种智能优化算法比较与实现(matlab版)

    各种智能优化算法比较与实现 xff08 matlab版 xff09 一 方法介绍 1免疫算法 xff08 Immune Algorithm xff0c IA xff09 1 1算法基本思想 免疫算法是受生物免疫系统的启发而推出的一种新型的智
  • 我与人工智能的故事

    本文作者 xff1a 诸葛越 前 言 人工智能的三次浪潮 2018年年初 xff0c 招聘季正如火如荼地进行 xff0c 而 数据科学家 和 算法工程师 绝对算得上热门职业 人工智能 机器学习 深度学习 建模 卷积神经网络 等关键词 xff
  • ovn-architecture

    参考 文章目录 1 Name2 Description2 1 Information Flow in OVN OVN中的信息流向 2 2 Chassis Setup2 3 Logical Networks2 4 Life Cycle of
  • IDEA创建maven项目添加jar包依赖出错

    Problem1 xff1a 由于网络原因无法下载jar包 解决方法 xff1a 在maven的settings xml文件的 lt mirrors gt 标签中配置阿里镜像 lt mirror gt lt id gt nexus aliy
  • 判断一个字符串是否为回文字符串

    题目 输入一个字符串 xff0c 判断该字符串中除去空格之后的字符串是否为回文字符串 要求 xff1a 不可使用 Java 已实现的方法替换空格 xff0c 不可消耗额外的空间 代码实现 此处为判断方法的实现 public static b
  • Spring中的 JdbcTemplate和声明式事务控制

    Spring中的 JdbcTemplate和声明式事务控制 JdbcTemplate概述 JdbcTemplate的作用 xff1a 他就是用于和数据库交互的 xff0c 实现CRUD操作 如何创建该对象 在dao的实现类中定义并用set方
  • SpringMVC(一)

    SpringMVC xff08 一 xff09 SpringMVC的基本概念 三层架构 表现层业务层持久层 MVC模型 Model xff08 模型 xff09 xff1a 通常就是指我们的数据模型 xff0c 一般情况下用于封装数据 Vi
  • SpringMVC(二)

    SpringMVC xff08 二 xff09 响应数据和结果视图 返回值分类 xff1a 字符串voidModelAndView 对象 xff1a 是 spring 提供的一个对象 xff0c 可以用来调整具体的 JSP 视图 span