前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringMVC学习笔记 (day2)

SpringMVC学习笔记 (day2)

作者头像
Gorit
发布2021-12-08 21:45:27
2720
发布2021-12-08 21:45:27
举报
文章被收录于专栏:Gorit 带你学全栈系列

文章目录

一、响应数据和结果视图

黑马程序员 SpringMVC day2 部分

1.1 返回值分类

1.1.1 返回字符串
代码语言:javascript
复制
import cn.gorit.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@Controller
@RequestMapping("/user")
public class UserController {

    // 返回字符串
    @RequestMapping("/testString")
    public String testString(Model model) {
        System.out.println("testString 执行了");
        User user = new User(); // 实体类 User
        user.setUsername("美美");
        user.setPassword("123321");
        user.setAge(18);
        model.addAttribute("user",user);
        return "success";
    }
}

// 前面经过视图解析器的处理,均会跳转到 success.jsp 的界面
    <h5>一、返回字符串</h5>
姓名:${user.username}</br>
密码:${user.password}</br>
年龄:${user.age}
1.1.2 返回 void
代码语言:javascript
复制
    /**
     * 返回 空,如果没有返回值,
     * 会默认请求 testVoid.jsp 结果是 404
     * 请求转发是一次请求
     * 重定向是两次请求
     */

    @RequestMapping("/testVoid")
    public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("testVoid 执行了");
        // 1. 编写请求转发的程序
        // request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
        
        // 2. 重定向
        // response.sendRedirect("../index.jsp");
        
        // 3. 直接进行相应
        PrintWriter out = response.getWriter();
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("gbk"); // 解决中文乱码
        response.setContentType("text/html;charset=gbk");
        out.print("你好");
        out.flush();
        out.close();
        return;
    }
1.1.3 返回值是 ModelAndView 对象
代码语言:javascript
复制
    // 和返回 字符串是一致的
    @RequestMapping("/testModelAndView")
    public ModelAndView testModelAndView()  {
        System.out.println("testModelAndView 执行了");
        //Spring 提供
        ModelAndView mv = new ModelAndView();
        User user = new User();
        user.setUsername("小风");
        user.setPassword("456");
        user.setAge(18);
        // 把 user 对象存储进 mv 对象中,也会把 user 对象存到 request 对象中
        mv.addObject("user",user);

        // 跳转到哪个页面
        mv.setViewName("success");
        return mv;
    }

1.2 转发和重定向

代码语言:javascript
复制
    /**
     * 使用关键字的形式进行转发或重定向
     * */
    @RequestMapping("/testForwardOrRedirect")
    public String testForwardOrRedirect()  {
        System.out.println("testForwardOrRedirect 执行了");

        // 请求的转发
//        return "forward:/WEB-INF/pages/success.jsp";

        // 重定向(返回根目录)
        return  "redirect:/index.jsp";
    }

1.3 ajax 响应 json 字符串

  1. 在 pom.xml 添加 json 解析依赖
代码语言:javascript
复制
        <dependency>
            <groupId>com.fasterxml.jackson.coregroupId>
            <artifactId>jackson-databindartifactId>
            <version>2.10.0version>
        dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.coregroupId>
            <artifactId>jackson-coreartifactId>
            <version>2.10.0version>
        dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.coregroupId>
            <artifactId>jackson-annotationsartifactId>
            <version>2.10.0version>
        dependency>
  1. 编写前端 ajax 请求
代码语言:javascript
复制
    <button id="btn">发送 ajax</button>

    <script type="text/javascript">
        // 页面加载,绑定单击事件
        $(function () {
            $("#btn").click(function () {
                // alert("Hello");
                $.ajax({
                    url:"user/testAjax",
                    type:"post",
                    contentType:"application/json;charset=UTF-8",
                    data:'{"username":"hehe","password":"122","age":30}', // 传 json 数据
                    dataType:"json",
                    success:function (data) {
                        // data 为服务端响应的 json 数据,进行解析
                        alert(data);
                        alert(data.username);
                        alert(data.password);
                        alert(data.age);
                    }
                })
            })

        })
    </script>
  1. ajax 响应(后端处理)
代码语言:javascript
复制
    // 模拟异步请求相应
    @RequestMapping("/testAjax")
    public @ResponseBody User testAjax(@RequestBody User user)  {
        System.out.println("testAjax 执行了");
        // 接收 客户端发送的 ajax 请求,传的是 json 字符串,后端吧 json 字符串封装到 user对象中
        System.out.println(user);
//       得到 json 串,并相应处理 {"username":"hehe","password":"122","age:30}
        // 做响应,模拟查询数据库
        user.setUsername("hehe");
        user.setAge(40);
        // 做响应
        return user;
    }

二、SpringMVC 实现文件上传

2.1 文件上传

  1. 文件上传的 前提

2.2 传统方式上传 文件

上传依赖的 jar 包

代码语言:javascript
复制
<dependency>
    <groupId>commons-fileuploadgroupId>
    <artifactId>commons-fileuploadartifactId>
    <version>1.3.3version>
dependency>
<dependency>
    <groupId>commons-iogroupId>
    <artifactId>commons-ioartifactId>
    <version>2.5version>
dependency>文件

文件上传前端代码

代码语言:javascript
复制
    <h3>文件上传h3>
    <form action="user/fileupload1" method="post" enctype="multipart/form-data">
        <input type="file" name="upload"/><br>
        <input type="submit" value="上传">
    form>

后端 controller

代码语言:javascript
复制
@Controller
@RequestMapping("/user")
public class UserController {  
    
	@RequestMapping("/fileupload1")
    public String fileUpload(HttpServletRequest request) throws Exception {
        System.out.println("文件上传。。。");

        // 使用 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));
                // 删除临时文件
                item.delete();
            }
        }
        return "success";
    }
   
}

2.3 SpringMVC 提供的文件上传

上传原理

前端页面

代码语言:javascript
复制
    <h3>文件上传 SpringMVCh3>
    <form action="user/fileupload2" method="post" enctype="multipart/form-data">
        <input type="file" name="upload"/><br>
        <input type="submit" value="上传">
    form>

Springmvc.xml

添加一个文件解析器

代码语言:javascript
复制
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10240" />
    bean>

controller 编写

代码语言:javascript
复制
    // SpringMVC 文件上传
    @RequestMapping("/fileupload2")
    public String fileupload2(HttpServletRequest request, MultipartFile upload) throws Exception {
        System.out.println("文件上传。。。");

        // 使用 fileupload 完成文件上传
        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";
    }

2.4 跨服务器文件上传

添加 jar 包 即可,开两个 Tomcat服务器,使用不同的端口进行跨服务器上传文件

三、SpringMVC 异常处理

3.1 异常处理思路

3.2 处理异常

不知道为啥,我这里就总是报 500 错误

  1. 编写自定义异常类 (做提示信息的)
  2. 编写异常处理器
  3. 配置异常处理器 (跳转到显示页面)

前端跳转页面

代码语言:javascript
复制
    <h3>异常处理h3>
    <a href="user/testException">异常处理a>

异常处理 controller 编写

代码语言:javascript
复制
@Controller
@RequestMapping("/user")
public class UserController {
    // 异常处理
    @RequestMapping("/testException")
    public String testException() throws SysException {
        System.out.println("testException。。。");
        try {
            // 模拟异常
            int a = 10/0;
        } catch (Exception e) {
            // 打印异常信息
            e.printStackTrace();
            // 抛出自定义异常信息
            throw new SysException("查询的所有用户出现了错误");
        }
        return "success";
    }
 }

自定义异常器

代码语言:javascript
复制
package cn.gorit.exception;

import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 异常处理器
 * */
public class SysExceptionResolver  implements HandlerExceptionResolver {

    /**
     * 处理异常业务逻辑
     * */
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        // 获取异常对象
        SysException e = null;
        if (ex instanceof  SysException) {
            e = (SysException)ex;
        } else {
            e = new SysException("系统正在维护");
        }
        // 创建 ModelAndView 对象
        ModelAndView mv = new ModelAndView();
        mv.addObject("errorMsg", e.getMessage());
        mv.setViewName("error"); // 跳转的页面,这里要记得在 WEB-INF/pages 下编写一个 error.jsp
        return mv;
    }

}
代码语言:javascript
复制
package cn.gorit.exception;

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

    public String getMessage() {
        return message;
    }

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

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

springmvc.xml 配置

代码语言:javascript
复制
    <bean id="sysExceptionResolver" class="cn.gorit.exception.SysExceptionResolver">bean>

四、SpringMVC 拦截器

4.1 拦截器作用

4.2 编写拦截器

4.3 拦截器编写

  1. 前端界面跳转
代码语言:javascript
复制
    <h3>拦截器h3>
    <a href="test/testIntercepter">拦截器a>
  1. 后端 controller 编写
代码语言:javascript
复制
package cn.gorit.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/test")
public class TestController {
    /**
     * 拦截器
     * */
    @RequestMapping("/testIntercepter")
    public String testIntercepter()  {
        System.out.println("testIntercepter。。。");

        return "success";
    }
}
  1. 拦截器类编写
代码语言:javascript
复制
package cn.gorit.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 自定义拦截器
 * */
public class MyInterceptor implements HandlerInterceptor {

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

    /**
     * 后处理方法,controller 方法执行之后,success.jsp 执行之前
     * */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("拦截器执行了,succes.jsp 加载之前");
    }

    /**
     * success.jsp 执行了,该方法会执行
     * */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("拦截器执行了 success.jsp 之后");
    }
}
  1. 拦截器 springmvc.xml 配置
代码语言:javascript
复制
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.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-3.0.xsd">

    
    <context:component-scan base-package="cn.gorit">context:component-scan>

    
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/">property>
        <property name="suffix" value=".jsp">property>
    bean>

    
    <mvc:resources mapping="/js/**" location="/js/">mvc:resources>
    <mvc:resources mapping="/css/**" location="/csss/">mvc:resources>
    <mvc:resources mapping="/images/**" location="/images/">mvc:resources>

    
    <mvc:interceptors>
        
        <mvc:interceptor>
            
            <mvc:mapping path="/**"/>
            

            
            <bean class="cn.gorit.interceptor.MyInterceptor">bean>
        mvc:interceptor>
    mvc:interceptors>
    
    
    <mvc:annotation-driven/>
beans>

运行效果

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/05/05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、响应数据和结果视图
    • 1.1 返回值分类
      • 1.2 转发和重定向
        • 1.3 ajax 响应 json 字符串
        • 二、SpringMVC 实现文件上传
          • 2.1 文件上传
            • 2.2 传统方式上传 文件
              • 2.3 SpringMVC 提供的文件上传
                • 2.4 跨服务器文件上传
                • 三、SpringMVC 异常处理
                  • 3.1 异常处理思路
                    • 3.2 处理异常
                    • 四、SpringMVC 拦截器
                      • 4.1 拦截器作用
                        • 4.2 编写拦截器
                          • 4.3 拦截器编写
                          相关产品与服务
                          云服务器
                          云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档