高级参数绑定

package com.zze.springmvc.web.controller;

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

import java.util.Arrays;

@Controller
public class TestController {
    /**
     * 数组参数绑定
     */
    @RequestMapping("test")
    public void test(Integer[] ids) {
        System.out.println(Arrays.toString(ids));
        /*
        [1, 2]
         */
    }
}

例:数组参数绑定

package com.zze.springmvc.pojo;

import java.util.List;

public class QueryVo {

    private List<User> users;

    public List<User> getUsers() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }
}

package com.zze.springmvc.web.controller;

import com.zze.springmvc.pojo.QueryVo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.Arrays;

@Controller
public class TestController {
    /**
     * 集合参数绑定
     */
    @RequestMapping("test")
    public void test(QueryVo queryVo) {
        System.out.println(Arrays.toString(queryVo.getUsers().toArray()));
        /*
        [User{id=1, name='zhangsan'}, User{id=2, name='lisi'}]
         */
    }
}

例:集合参数绑定

参数转换器

如果要进行日期类型参数绑定,SpringMVC 默认是不支持的,需要我们手动定义一个转换器来告知 SpringMVC 如何转换,如下:

package com.zze.springmvc.web.converter;

import org.springframework.core.convert.converter.Converter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * String : 源类型
 * Date : 目标类型
 */
public class DateConverter implements Converter<String,Date> {
    public Date convert(String source) {
        Date date = null;
        try {
            date = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(source);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
}

com.zze.springmvc.web.converter.DateConverter : 自定义的日期转换器

<!--自定义转换器工厂-->
<bean id="myConverters" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="converters">
        <!--注册自己定义的日期转换器-->
        <bean class="com.zze.springmvc.web.converter.DateConverter"/>
    </property>
</bean>
<!--使用上自定义的转换器工厂-->
<mvc:annotation-driven conversion-service="myConverters"/>

config/spring/springmvc.xml : 注册自定义转换器

相关注解

@RequestMapping

package com.zze.springmvc.web.controller;

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

@Controller
public class TestController {
    /**
     * 请求 /test1 和 /test2 都会指向 test 方法
     */
    @RequestMapping(value = {"test1", "test2"})
    public void test() {

    }
}

例:多路由

package com.zze.springmvc.web.controller;

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

@Controller
@RequestMapping("test")
public class TestController {
    /**
     * 因为类上使用了 RequestMapping 注解,此时 test 方法的访问路径就为:
     *      /test/test1 和 /test/test2
     */
    @RequestMapping(value = {"test1", "test2"})
    public void test() {

    }
}

例:配置在类上

package com.zze.springmvc.web.controller;

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

@Controller
public class TestController {
    /**
     * 限定请求方法只能为 GET 和 POST
     */
    @RequestMapping(value = "test",method = {RequestMethod.POST,RequestMethod.GET})
    public void test() {

    }
}

例:限定请求方式

@RequestParam

package com.zze.springmvc.web.controller;

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

@Controller
public class TestController {
    /**
     * @RequestParam
     *  name 指定所修饰参数对应请求参数名
     *  required 指定所修饰参数是否必须
     *  defaultValue 指定所修饰参数的默认值
     */
    @RequestMapping(value = "test")
    public void test(@RequestParam(name = "pid",required = false,defaultValue = "1") Integer id) {

    }
}

例:自定义请求参数映射

请求方法的返回值

在 SpringMVC 中,请求方法的返回值除了 ModelAndView,还可以有如下几种方式:

package com.zze.springmvc.web.controller;

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

@Controller
public class TestController {
    /**
     * 转发到 jsp
     */
    @RequestMapping(value = "test")
    public String test() {
        // 因为配置了视图解析器,这里的 userlist 实际指向 /WEB-INF/jsp/userlist.jsp
        return "userlist";
    }
}

返回 String,转发到 JSP

package com.zze.springmvc.web.controller;

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

@Controller
public class TestController {
    /**
     * 转发到 Action
     */
    @RequestMapping(value = "test")
    public String test() {
        return "forward:/user/list";
    }
}

返回 String,转发到 Action

package com.zze.springmvc.web.controller;

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

@Controller
public class TestController {
    /**
     * 重定向到 Action
     */
    @RequestMapping(value = "test")
    public String test() {
        return "redirect:/user/list";
    }
}

返回 String,重定向到 Action

package com.zze.springmvc.web.controller;

import org.springframework.stereotype.Controller;
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;

@Controller
public class TestController {
    /**
     * 访问原生 request 和 response API
     */
    @RequestMapping(value = "test")
    public void test(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/plain;charset=utf-8");
//        request.getRequestDispatcher("/user/list").forward(request,response); 转发
//        response.sendRedirect("/user/list"); // 重定向
        response.getWriter().write("你好世界");
    }
}

无返回值,访问原生 Servlet API

请求乱码问题解决

<filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

WEB-INF/web.xml : 解决 POST 请求乱码

<Connector port="8080"  protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />  

tomcat - server.xml : 解决 GET 请求乱码

全局异常处理

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>消息页</title>
</head>
<body>
${msg}
</body>
</html>

WEB-INF/jsp/msg.jsp : 1、创建一个消息通知页

package com.zze.springmvc.web.util;

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

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

public class MyExceptionResolver implements HandlerExceptionResolver {
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("msg");
        modelAndView.addObject("msg", "服务器异常!");
        return modelAndView;
    }
}

com.zze.springmvc.web.util.MyExceptionResolver : 2、编写自定义的异常处理器

<!--注册全局异常处理器-->
    <bean class="com.zze.springmvc.web.util.MyExceptionResolver"/>

config/spring/springmvc.xml : 3、直接注册到 Spring 容器中就可以生效

文件上传

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.2.2</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

pom.xml : 1、添加文件上传依赖

<!--
配置多媒体处理器
注意:这里的 id 必须使用 multipartResolver
-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!--限制单次文件上传大小不超过 8m-->
    <property name="maxUploadSize" value="8388608"/>
</bean>

config/spring/springmvc.xml : 2、配置多媒体处理器

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>图片上传</title>
</head>
<body>
<form action="/fileupload" method="post" enctype="multipart/form-data">
    <input type="file" name="picFile">
    <input type="submit" value="上传">
</form>
</body>
</html>

WEB-INF/jsp/fileupload.jsp : 3、编写文件上传页面

package com.zze.springmvc.web.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

@Controller
public class TestController {

    @RequestMapping(value = "fileupload", method = RequestMethod.GET)
    public String upload() {
        return "fileupload";
    }

    @RequestMapping(value = "fileupload", method = RequestMethod.POST)
    public String upload(Model model, MultipartFile picFile) throws IOException {
        File file = new File("D:/upload/" + picFile.getOriginalFilename());
        picFile.transferTo(file);
        model.addAttribute("msg", "上传成功");
        return "fileupload";
    }
}

com.zze.springmvc.web.controller.TestController : 4、编写文件上传服务端代码

// 新建目录 D:/upload
// 浏览器访问 localhost:8080/fileupload

5、测试:

JSON交互

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.4.0</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.4.2</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.4.2</version>

pom.xml : 加入 json 支持依赖

package com.zze.springmvc.web.controller;

import com.zze.springmvc.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.text.ParseException;
import java.text.SimpleDateFormat;

@Controller
public class TestController {
    /**
     * 返回 JSON 格式数据
     * 返回值设为要序列化的类型,并在方法上添加上 @ResponseBody 注解
     */
    @RequestMapping("getUser")
    @ResponseBody
    public User getUser() throws ParseException {
        User user = new User();
        user.setId(1);
        user.setName("张三");
        user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("1998-1-1"));
        user.setGender("男");
        user.setAddress("河北");
        return user;
    }
}

返回 JSON 格式数据

package com.zze.springmvc.web.controller;

import com.zze.springmvc.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class TestController {

    /**
     * 1、使用 @RequestBody 修饰入参
     * 2、请求方式为 POST,content-type 为 application/json
     * 3、json 中字段名与 pojo 属性一致
     */
    @RequestMapping("addUser")
    @ResponseBody
    public User addUser(@RequestBody User user){
        System.out.println(user);
        user.setGender("女");
        return user;
    }
}

接收 JSON 格式数据

要使用该方式进行 JSON 交互,必须配置注解驱动。

<!--配置注解驱动,相当于同时使用最新处理器映射器和处理器适配器,同时对 JSON 数据响应提供支持-->
<mvc:annotation-driven/>

Restful风格

package com.zze.springmvc.web.controller;

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

@Controller
public class TestController {

    @RequestMapping("user/{id}")
    @ResponseBody
    public void getUser(@PathVariable Integer id){
        System.out.println(id);
        /*
        请求 localhost:8080/user/1
        控制台输出: 1
         */
    }
}

com.zze.springmvc.web.controller.TestController

拦截器

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

package com.zze.springmvc.web.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 MyInterceptor1 implements HandlerInterceptor {
    /**
     * 处理器执行前执行
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor.preHandle");
        return true; // true:放行 false:拦截
    }

    /**
     * 处理器执行后, modelAndView 返回前执行
     */
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor.postHandle");
    }

    /**
     * 处理器执行后执行
     */
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor.afterCompletion");
    }
}

com.zze.springmvc.web.interceptor.MyInterceptor1 : 1、定义拦截器 1

package com.zze.springmvc.web.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 MyInterceptor2 implements HandlerInterceptor {
    /**
     * 处理器执行前执行
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor.preHandle");
        return true; // true:放行 false:拦截
    }

    /**
     * 处理器执行后, modelAndView 返回前执行
     */
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor.postHandle");
    }

    /**
     * 处理器执行后执行
     */
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor.afterCompletion");
    }
}

com.zze.springmvc.web.interceptor.MyInterceptor2 : 2、定义拦截器 2

<!--注册拦截器-->
<mvc:interceptors>
    <mvc:interceptor>
        <!--拦截所有请求,包括二级以上目录-->
        <mvc:mapping path="/**"/>
        <!--指定路径不拦截-->
        <mvc:exclude-mapping path="/login"/>
        <bean class="com.zze.springmvc.web.interceptor.MyInterceptor1"/>
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.zze.springmvc.web.interceptor.MyInterceptor2"/>
    </mvc:interceptor>
</mvc:interceptors>

config/spring/springmvc.xml : 3、注册拦截器

package com.zze.springmvc.web.controller;

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

@Controller
public class TestController {

    @RequestMapping("test")
    public void test() {
        System.out.println("from TestController.test");
    }
}

com.zze.springmvc.web.controller.TestController : 4、编写测试 Controller

5、测试,请求 localhost:8080/test ,控制台输出如下:

java框架之SpringMVC(2)-补充及拦截器的更多相关文章

  1. SpringMVC中的Interceptor拦截器及与Filter区别

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...

  2. SpringMVC中session使用&&拦截器&&乱码处理&&异常处理

    ### 1. 使用Session 通常,会在Session中存放: 1. 客户端(用户)的身份标识,通常是用户的id:2. 使用频率非常高的数据,例如显示在页面中的用户名.头像等:3. 其它的不便于使 ...

  3. 【SpringMVC】 4.3 拦截器

    SpringMVC学习记录 注意:以下内容是学习 北京动力节点 的SpringMVC视频后所记录的笔记.源码以及个人的理解等,记录下来仅供学习 第4章 SpringMVC 核心技术 4.3 拦截器   ...

  4. SpringMVC中使用Interceptor拦截器

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...

  5. SpringMVC 中的Interceptor 拦截器

    1.配置拦截器 在springMVC.xml配置文件增加: <mvc:interceptors>  <!-- 日志拦截器 -->  <mvc:interceptor> ...

  6. springMVC之mvc:interceptors拦截器的用法

    1.配置拦截器 在springMVC.xml配置文件增加: <mvc:interceptors> <!-- 日志拦截器 --> <mvc:interceptor> ...

  7. springmvc实现简单的拦截器

    SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的.在SpringMVC 中定义一个Interceptor 非常简单,主要有两种方式,第一种方 ...

  8. SpringMVC学习记录(七)--拦截器的使用

    SpringMVC的请求如以下这样的图所看到的: 能够看出全部的请求都要通过Dispatherservlet来接收,然后通过Handlermapping来决定使用哪个控制器,再依据ViewResolv ...

  9. SpringMVC之七:SpringMVC中使用Interceptor拦截器

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...

随机推荐

  1. wps直接打开CVS文件会把长串数字订单号最后4位变为0

    WPS打开CVS文件,发现里面的长串数字订单号后4位全变成0了,而且是以科学计数法来显示了 上网查了下,不能直接打开,得先在WPS(OFFICE中也一样)中新建一个空白表格,然后用菜单里的数据导入功能 ...

  2. Atitit s2018 s3 doc list alldvc.docx .docx s2018 s3f doc compc s2018 s3f doc homepc sum doc dvcCompc dtS312 s2018 s3f doc compc\Atitit PathUtil 工具新特性新版本 v8 s312.docx s2018 s3f doc compc\Atitit 操作日

    Atitit s2018 s3 doc list alldvc.docx .docx s2018 s3f doc compc s2018 s3f doc homepc sum doc dvcCompc ...

  3. Linux常用的基础组件

    Linux服务器(新机器) yum install gcc gcc-c++ glibc-devel make ncurses-devel openssl-devel autoconf git yum  ...

  4. hdoj:2050

    #include <iostream> using namespace std; int main() { int T; while (cin >> T) { ; i < ...

  5. Android 引用外部字体

    在Android中,加载外部字体是非常容易的! 步骤如下: 1. 创建新的Android工程: 2. 在工程下的assets文件夹下新建名字为fonts的文件夹(名字可以任意选取),把所有的外部字体文 ...

  6. Linux 文件属性及权限_007

    Linux一切皆文件: Llinux系统的文件或目录的属性主要包括:索引节点.文件类型.文件权限.链接数.所属的用户和用户组.最近修改时间等. Llinux文件属性及权限图形说明: Linux文件属性 ...

  7. 9. Oracle DataGuard的介绍

    一. Oracle DataGuard简介 Oracle DataGuard:简称DG.是由一个Primary Database(主库)和一个或者多个Standby Database(备库)组成.对O ...

  8. c++ 模板相关

    https://blog.csdn.net/lezardfu/article/details/60466161 https://www.cnblogs.com/ymy124/p/3632634.htm ...

  9. 【html5】 解决 video标签 不自动全屏

    <video controls="controls" poster='' src='' preload="auto" x5-playsinline=&qu ...

  10. Golang知识图谱

    原:https://www.processon.com/view/link/5a9ba4c8e4b0a9d22eb3bdf0?from=timeline 百度脑图重制:http://naotu.bai ...