博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringMVC框架(二)
阅读量:3915 次
发布时间:2019-05-23

本文共 13262 字,大约阅读时间需要 44 分钟。

目录


响应数据和结果视图

返回值分类

1. 返回字符串

(1)Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址。

@RequestMapping(value="/hello")public String sayHello() {    System.out.println("Hello SpringMVC!!");    // 跳转到XX页面    return "success";}

(2)具体的应用场景

@Controller@RequestMapping("/user")public class UserController {    /**    * 请求参数的绑定    */    @RequestMapping(value="/initUpdate")    public String initUpdate(Model model) {        // 模拟从数据库中查询的数据        User user = new User();        user.setUsername("张三");        user.setPassword("123");        user.setMoney(100d);        user.setBirthday(new Date());        model.addAttribute("user", user);        return "update";    }}

修改用户

${ requestScope }
姓名:
密码:
金额:

2. 返回值是void

1. 如果控制器的方法返回值编写成void,执行程序报404的异常,默认查找JSP页面没有找到,默认会跳转到@RequestMapping(value="/initUpdate") initUpdate的页面。

2. 可以使用请求转发或者重定向跳转到指定的页面

@RequestMapping(value="/initAdd")public void initAdd(HttpServletRequest request,HttpServletResponse response) throwsException {    System.out.println("请求转发或者重定向");    // 请求转发    // request.getRequestDispatcher("/WEB-INF/pages/add.jsp").forward(request,response);    // 重定向    // response.sendRedirect(request.getContextPath()+"/add2.jsp");    response.setCharacterEncoding("UTF-8");    response.setContentType("text/html;charset=UTF-8");    // 直接响应数据    response.getWriter().print("你好");    return;}

3. 返回值是ModelAndView对象

1. ModelAndView对象是Spring提供的一个对象,可以用来调整具体的JSP视图

2. 具体的代码如下

/*** 返回ModelAndView对象* 可以传入视图的名称(即跳转的页面),还可以传入对象。* @return* @throws Exception*/@RequestMapping(value="/findAll")public ModelAndView findAll() throws Exception {    ModelAndView mv = new ModelAndView();    // 跳转到list.jsp的页面    mv.setViewName("list");    // 模拟从数据库中查询所有的用户信息    List
users = new ArrayList<>(); User user1 = new User(); user1.setUsername("张三"); user1.setPassword("123"); User user2 = new User(); user2.setUsername("赵四"); user2.setPassword("456"); users.add(user1); users.add(user2); // 添加对象 mv.addObject("users", users); return mv;}
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>            
Insert title here

查询所有的数据

${ user.username }

 

SpringMVC框架提供的转发和重定向

1. forward请求转发

1. controller方法返回String类型,想进行请求转发也可以编写成

/*** 使用forward关键字进行请求转发* "forward:转发的JSP路径",不走视图解析器了,所以需要编写完整的路径* @return* @throws Exception*/@RequestMapping("/delete")public String delete() throws Exception {    System.out.println("delete方法执行了...");    // return "forward:/WEB-INF/pages/success.jsp";    return "forward:/user/findAll";}

2. redirect重定向

1. controller方法返回String类型,想进行重定向也可以编写成

/*** 重定向* @return* @throws Exception*/@RequestMapping("/count")public String count() throws Exception {    System.out.println("count方法执行了...");    return "redirect:/add.jsp";    // return "redirect:/user/findAll";}

 

ResponseBody响应json数据

DispatcherServlet会拦截到所有的资源,导致一个问题就是静态资源(img、css、js)也会被拦截到,从而不能被使用。解决问题就是需要配置静态资源不进行拦截,在springmvc.xml配置文件添加如下配置:

1. mvc:resources标签配置不过滤

1. location元素表示webapp目录下的包下的所有文件

2. mapping元素表示以/static开头的所有请求路径,如/static/a 或者/static/a/b

1.使用@RequestBody获取请求体数据

// 页面加载// 页面加载$(function(){    // 绑定点击事件    $("#btn").click(function(){        $.ajax({            url:"user/testJson",            contentType:"application/json;charset=UTF-8",            data:'{"addressName":"aa","addressNum":100}',            dataType:"json",            type:"post",            success:function(data){                alert(data);                alert(data.addressName);            }        });    });});
@RequestMapping("/testJson")public void testJson(@RequestBody String body) {    System.out.println(body);}

2.使用@ResponseBody注解把JavaBean对象转换成json字符串,直接响应

// 页面加载$(function(){    // 绑定点击事件    $("#btn").click(function(){        $.ajax({            url:"user/testJson",            contentType:"application/json;charset=UTF-8",            data:'{"addressName":"哈哈","addressNum":100}',            dataType:"json",            type:"post",            success:function(data){                alert(data);                alert(data.addressName);            }        });    });});
@RequestMapping("/testJson")public @ResponseBody Address testJson(@RequestBody Address address) {    System.out.println(address);    address.setAddressName("上海");    return address;}

json字符串和JavaBean对象互相转换的过程中,需要使用jackson的jar包

com.fasterxml.jackson.core
jackson-databind
2.9.0
com.fasterxml.jackson.core
jackson-core
2.9.0
com.fasterxml.jackson.core
jackson-annotations
2.9.0

 

SpringMVC实现文件上传

文件上传

1. 导入文件上传的jar包

commons-fileupload
commons-fileupload
1.3.1
commons-io
commons-io
2.4

2. 编写文件上传的JSP页面

文件上传

选择文件:

3. 编写文件上传的Controller控制器

@Controller@RequestMapping("/user")public class UserController {    /**     * 文件上传     * @return     */    @RequestMapping("/fileupload1")    public String fileuoload1(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
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"; }}

 

SpringMVC传统方式文件上传

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

2. 代码如下

/**     * SpringMVC文件上传     * @return     */    @RequestMapping("/fileupload2")    public String fileuoload2(HttpServletRequest request, MultipartFile upload) throws Exception {        System.out.println("springmvc文件上传...");        // 使用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";    }

3. 配置文件解析器对象

 

SpringMVC跨服务器方式文件上传

1. 搭建图片服务器

2. 实现SpringMVC跨服务器方式文件上传

(1)导入开发需要的jar包

com.sun.jersey
jersey-core
1.18.1
com.sun.jersey
jersey-client
1.18.1

(2) 编写文件上传的JSP页面

跨服务器的文件上传

选择文件:

(3)  编写控制器

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

 

SpringMVC的异常处理

异常处理思路

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

 

SpringMVC的异常处理

1. 自定义异常类

/** * 自定义异常类 */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;    }}

2. 自定义异常处理器

/** * 异常处理器 */public class SysExceptionResolver implements HandlerExceptionResolver{    /**     * 处理异常业务逻辑     */    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");        return mv;    }}

3. 配置异常处理器

 

SpringMVC框架中的拦截器

拦截器概述

1. SpringMVC框架中的拦截器用于对处理器进行预处理和后处理的技术。、

2. 可以定义拦截器链,连接器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链中的拦截器会按着定义的顺序执行。

3. 拦截器和过滤器的功能比较类似,有区别

1)过滤器是Servlet规范的一部分,任何框架都可以使用过滤器技术。

2)拦截器是SpringMVC框架独有的。

3)过滤器配置了/*,可以拦截任何资源。

4) 拦截器只会对控制器中的方法进行拦截。

4. 拦截器也是AOP思想的一种实现方式

5. 想要自定义拦截器,需要实现HandlerInterceptor接口。

 

自定义拦截器步骤

1. 创建类,实现HandlerInterceptor接口,重写需要的方法

/** * 自定义拦截器 */public class MyInterceptor1 implements HandlerInterceptor{    /**     * 预处理,controller方法执行前     * return true 放行,执行下一个拦截器,如果没有,执行controller中的方法     * return false不放行     * @param request     * @param response     * @param handler     * @return     * @throws Exception     */    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        System.out.println("MyInterceptor1执行了...前1111");        // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);        return true;    }    /**     * 后处理方法,controller方法执行后,success.jsp执行之前     * @param request     * @param response     * @param handler     * @param modelAndView     * @throws Exception     */    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {        System.out.println("MyInterceptor1执行了...后1111");        // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);    }    /**     * success.jsp页面执行后,该方法会执行     * @param request     * @param response     * @param handler     * @param ex     * @throws Exception     */    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {        System.out.println("MyInterceptor1执行了...最后1111");    }}

2. 在springmvc.xml中配置拦截器类

 

HandlerInterceptor接口中的方法

1. preHandle方法是controller方法执行前拦截的方法

1. 可以使用request或者response跳转到指定的页面

2. return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。

3. return false不放行,不会执行controller中的方法。

2. postHandle是controller方法执行后执行的方法,在JSP视图执行前。

1. 可以使用request或者response跳转到指定的页面

2. 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。

3. postHandle方法是在JSP执行后执行

1. request或者response不能再跳转页面了

 

配置多个拦截器

1. 再编写一个拦截器的类

/** * 自定义拦截器 */public class MyInterceptor2 implements HandlerInterceptor{    /**     * 预处理,controller方法执行前     * return true 放行,执行下一个拦截器,如果没有,执行controller中的方法     * return false不放行     * @param request     * @param response     * @param handler     * @return     * @throws Exception     */    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        System.out.println("MyInterceptor1执行了...前2222");        // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);        return true;    }    /**     * 后处理方法,controller方法执行后,success.jsp执行之前     * @param request     * @param response     * @param handler     * @param modelAndView     * @throws Exception     */    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {        System.out.println("MyInterceptor1执行了...后2222");        // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);    }    /**     * success.jsp页面执行后,该方法会执行     * @param request     * @param response     * @param handler     * @param ex     * @throws Exception     */    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {        System.out.println("MyInterceptor1执行了...最后2222");    }}

2. 配置2个拦截器

 

转载地址:http://ufirn.baihongyu.com/

你可能感兴趣的文章
【招聘(西安)】深圳市中兴云服务有限公司.NET工程师
查看>>
注意.NET Core进行请求转发问题
查看>>
别“躺”着了,赶紧把「复盘」做起来
查看>>
真正拖垮你的,是沉没成本
查看>>
Docker:恢复对开源项目的无限制访问
查看>>
Blazor 准备好为企业服务了吗?
查看>>
.NET5全面拥抱Azure云,微软市值重回巅峰,那些年吹过的牛,都实现了!
查看>>
C# 中的 ref 已经被放开,或许你已经不认识了
查看>>
C#刷剑指Offer | 【常考题】最小的k个数
查看>>
【专题】多角度深入解析开放原子开源基金会
查看>>
在 Azure App Service 上启用 Application Request Routing
查看>>
使用 Xunit.DependencyInjection 改造测试项目
查看>>
谈谈.NET Core IServiceProvider
查看>>
一个.NET Core下的开源插件框架Pluginfactory
查看>>
基于阿里云日志服务快速打造简版业务监控看板
查看>>
集赞有礼!进击吧! Blazor !第六期 企业内部应用建设实战
查看>>
大象起舞——微软研发如何保持创新力和敏捷性
查看>>
Newbe.ObjectVisitor 0.2.10 发布,更花里胡哨
查看>>
寻找性能更优秀的动态 Getter 和 Setter 方案
查看>>
跟我一起学.NetCore之EF Core 实战入门,一看就会
查看>>