高级参数绑定

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. Atitit php java python nodejs错误日志功能的比较

    Atitit php  java  python  nodejs错误日志功能的比较 1.1. Php方案 自带 1 1.2. Java解决方案 SLF4J 1 1.3. Python解决方案 自带lo ...

  2. 关于web项目创建后WEB-INF下面没有出现web.xml的解决方法

    提供两种解决方案: 第一种:创建完项目后,需要手动创建出web.xml 第一步:选取创建的项目名称右击 第二步:eclipse的同学找到 java EE Tools 中的 下图画圈部分.  MyEcl ...

  3. MUI框架的缩写输入

    html      上面--代表最小触发字符      下面--代表非必要完整触发字符 组件 触发字符 mDoctype(mui-dom结构) mdo ctype mBody(主体) mbo dy m ...

  4. Excel公式笔记

    跨表,查找相同的数据,的其他列的值 =index(sheet2!$c$:$c$,match(sheet1!$b$,sheet2!$d$:$d$,)) 备注: =index(读哪里的数据(大范围), m ...

  5. Windows server 2008普通用户不能远程登录问题

    1.查登录权限 如果文件服务器没有为用户授权,那么用户自然就不能远程登录服务器系统了,为此笔者决定先仔细检查一下文件服务器系统是否为自己使用的登录账号,授予了远程登录权限.在进行这种检查时,笔者先是在 ...

  6. RTT(往返时间)和RPC

    RTT(Round-Trip Time)往返时间在计算机网络中它是一个重要的性能指标.表示从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认,不包含数据传输时间)总共经 ...

  7. Direct3D 11 Tutorial 6:Lighting_Direct3D 11 教程6:灯光

    概述 在之前的教程中,世界看起来很无聊,因为所有对象都以相同的方式点亮. 本教程将介绍简单照明的概念及其应用方法. 使用的技术将是朗伯照明. 本教程的结果将修改前面的示例以包含光源. 该光源将附在轨道 ...

  8. Qt OpenGL 鼠标拾取实现

    在之前的文章中讲到了OpenGL鼠标拾取操作的例子,工作中需要在Qt中实现,下面的程序演示了QT中opengl的拾取例子. 本例子在Qt5.12和Qt Creator4.8.0上测试,使用的是QOpe ...

  9. ansible运维工具(一)

    运维工具介绍 OS Provisioning: PXE, Cobbler(repository, distritution,profile) PXE: dhcp, tftp, (http, ftp) ...

  10. 使用AS-REP Roasting和kerberoasting攻击kerberos

    准备工作 ''' PowerView是PowerSploit框架的一个子集,里面继承了很多和渗透相关的powershell脚本下载地址:https://github.com/PowerShellMaf ...