SpringMVC学习笔记 (day2)

一、响应数据和结果视图

黑马程序员 SpringMVC day2 部分

1.1 返回值分类

1.1.1 返回字符串
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
    /**
     * 返回 空,如果没有返回值,
     * 会默认请求 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 对象
    // 和返回 字符串是一致的
    @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 转发和重定向

    /**
     * 使用关键字的形式进行转发或重定向
     * */
    @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 解析依赖
<!--        json 解析-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.10.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.10.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.10.0</version>
        </dependency>
  1. 编写前端 ajax 请求
    <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 响应(后端处理)
    // 模拟异步请求相应
    @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 包

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.5</version>
</dependency>文件

文件上传前端代码

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

后端 controller

@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 提供的文件上传

上传原理

在这里插入图片描述

前端页面

    <h3>文件上传 SpringMVC</h3>
    <form action="user/fileupload2" method="post" enctype="multipart/form-data">
        <input type="file" name="upload"/><br>
        <input type="submit" value="上传">
    </form>

Springmvc.xml

添加一个文件解析器

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

controller 编写

    // 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. 配置异常处理器 (跳转到显示页面)

前端跳转页面

    <!-- 异常处理报错~ -->
    <h3>异常处理</h3>
    <a href="user/testException">异常处理</a>

异常处理 controller 编写

@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";
    }
 }

自定义异常器

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;
    }

}

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 配置

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

四、SpringMVC 拦截器

4.1 拦截器作用

在这里插入图片描述

4.2 编写拦截器

在这里插入图片描述

4.3 拦截器编写

  1. 前端界面跳转
    <h3>拦截器</h3>
    <a href="test/testIntercepter">拦截器</a>
  1. 后端 controller 编写
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. 拦截器类编写
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 配置
<?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: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">

    <!-- 使用注解开发时,要告知 spring在创建容器时要扫描的包-->
    <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="/**"/>
            <!-- 不要拦截的方法 -->
<!--            <mvc:exclude-mapping path=""/>-->
            <!-- 配置拦截器对象 -->
            <bean class="cn.gorit.interceptor.MyInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>
    
    <!-- 开启 SpringMVC 注解的支持, 自定义类型转换器 -->
    <mvc:annotation-driven/>
</beans>

运行效果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值