SpringMVC框架基础知识(04)

简介: SpringMVC框架基础知识(04)

1. 重定向


在SpringMVC框架中,如果处理请求的方法的返回值类型是String,且方法之前没有添加@ResponseBody注解时,使用redirect:目标路径作为返回结果,即可以实现重定向,例如:


return "redirect:hello.do";


2. 转发与重定向


转发:是服务器内部的行为,是由服务器端的控制器将请求转发到视图组件的过程,由于整个过程是发生在服务器内部的,所以,对于客户端来说,是不知道这个过程的,在客户端的浏览器的地址栏中的URL也就一直是最初发出请求的URL,在整个过程中,客户端也只发出了1次请求,如果刷新页面,会再次提交请求,从代码方面来看,转发时,控制器需要给出的只是“视图名称”即可,然后,根据服务器内部的相关配置确定具体的视图组件,之所以是这样,还是因为“转发是服务器内部的行为”,结合服务器端的配置一起使用也是非常正常的!由于转发是服务器内部端内部的行为,所以,服务器端的控制器可以转发任何数据到视图组件!


重定向:在整个过程中,客户端发出第1次请求时,服务器的响应方式是重定向,其具体表现是服务器端会向客户端发出302HTTP响应码,表示“重定向”,同时,还会向客户端响应目标路径,当客户端收到响应码是302时,就会自动的发出第2次请求,并根据服务器端响应的目标路径发出请求。由于客户端是明确第2次请求的目标的,所以,在客户端的浏览器的地址栏中会显示第2次请求的URL。从代码方面来,重定向时,必须给出明确的目标路径,客户端将根据这个路径发出第2次请求!由于前后共有2次请求,同时基于HTTP协议是无状态协议,在没有结合其它技术时,服务器端处理第1次请求时得到的数据并不可以用于处理第2次请求。



3. 使用Session


在SpringMVC中,在处理请求的方法的参数列表中添加HttpSession session对象,就可以使用Session了!


一般情况下,保存在Session中的数据会消失的情景有:


服务器端的Tomcat重启后,Session中的数据会消失;

当客户端的最后一次请求已经超时,Session中的数据会消失,超时时间可以由服务器端进行设置;

当客户端软件被关闭后,将无法访问到此前的Session数据,同时,在超时后,此前的Session数据也会消失!

一般情况下,会保存到Session中的数据大致是这些类型的:


用户身份的唯一标识,例如:用户的id、用户名等;

高频率使用的数据,例如:用户名、头像这种高频率显示的数据,或者用户权限等;

不便于使用其它技术实现存储或传递的数据。

4. Interceptor拦截器


在SpringMVC中,可以创建Interceptor(拦截器)组件,使得若干种不同的请求都会先经过拦截器组件,并且,拦截器组件可以对请求进行阻止,或放行。


注意:拦截器的目的并不一定是要“阻止”,也许,只是希望若干种不同的请求都执行相同的代码片断,然后,拦截器100%放行,也是可以的!


当需要拦截器,可以自定义类(对所在的包没有要求),实现HandlerInterceptor拦截器接口,例如:


public class LoginInterceptor implements HandlerInterceptor {
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
    throws Exception {
  System.out.println("LoginInterceptor.preHandle()"); // syst
  return true;
  }
  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
    ModelAndView modelAndView) throws Exception {
  System.out.println("LoginInterceptor.postHandle()");
  }
  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
    throws Exception {
  System.out.println("LoginInterceptor.afterCompletion()");
  }
}

所有的拦截器必须被注册之后才会发挥作用!关于拦截器的注册,必须重写SpringMVC的配置类中的addInterceptors()方法,通过方法的参数对象来注册拦截器,例如:


@ComponentScan("cn.tedu.spring")
@Configuration
@EnableWebMvc
public class SpringMvcConfigurer implements WebMvcConfigurer {
  /**
  * 添加拦截器链
  */
  public void addInterceptors(InterceptorRegistry registry) {
  // 注意:配置拦截器作用的相关路径时,路径值必须使用 / 作为第1个字符
  LoginInterceptor interceptor = new LoginInterceptor();
  registry.addInterceptor(interceptor).addPathPatterns("/hello.do");
  }
}

通过测试运行,可以发现,在拦截器中的preHandle()方法是运行在控制器之前的,并且,当该方法返回false时,表示“阻止运行”,会导致控制器中的方法不会被执行,当该方法返回true时,表示“放行”,接下来,控制器中的方法就会执行,所以,在拦截器的3个方法中,只有preHandle()是具备真正意义上的“拦截”效果的!


如果需要设计规则“只有登录了才允许后续的访问”,就可以在preHandle()中对登录信息进行验证,如果已登录,则放行,如果未登录,则拦截,且重定向到登录页!例如:

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    System.out.println("LoginInterceptor.preHandle()"); // syst
    HttpSession session = request.getSession();
    if (session.getAttribute("loginUsername") == null) {
        String contextPath = request.getContextPath(); // springmvc02
        response.sendRedirect(contextPath + "/login.do");
        return false;
    }
    return true;
}


关于拦截器的配置,首先,在同一个项目中,可以存在若干个拦截器组件,形成“拦截器链”,如果某个请求会经历多个拦截器组件,必须每个拦截器都放行,才能向后继续执行,如果其中任何一个拦截器执行效果是“阻止”,则尝试访问的控制器将不会被执行!注册拦截器时,注册的先后顺序决定各拦截器的执行顺序!


在配置拦截路径时,可调用的方法addPathPatterns()被重载了2次:


public InterceptorRegistration addPathPatterns(String... patterns) {
    return addPathPatterns(Arrays.asList(patterns));
}
public InterceptorRegistration addPathPatterns(List<String> patterns) {
    this.includePatterns.addAll(patterns);
    return this;
}


所以,在配置拦截路径时,可以使用List<String>或可变参数String...来表示若干个被拦截的路径。


在配置请求路径时,还可以使用星号(*)作为通配符,例如,尝试拦截的路径有:


/blog/publish.do
/blog/edit.do
/blog/delete.do
/blog/list.do

只需要配置为以下路径即可:


/blog/*


需要注意的是:在配置拦截路径时,使用1个星号(*)的通配符只能匹配1个层级的资源,无法匹配多层级资源!例如配置为/blog/*时,就不可以匹配到/blog/2020/list.do,如果需要匹配若干个层级(1层或多层)的资源,就需要使用2个星号(**),例如配置为:


/blog/**


目录
相关文章
|
2月前
|
JSON 前端开发 Java
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。
|
2月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
58 2
|
3月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
2月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
138 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
3月前
|
XML 缓存 前端开发
springMVC02,restful风格,请求转发和重定向
文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。
springMVC02,restful风格,请求转发和重定向
|
4月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
4月前
|
XML JSON 数据库
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
这篇文章详细介绍了RESTful的概念、实现方式,以及如何在SpringMVC中使用HiddenHttpMethodFilter来处理PUT和DELETE请求,并通过具体代码案例分析了RESTful的使用。
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
|
4月前
|
前端开发 应用服务中间件 数据库
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
这篇文章通过一个具体的项目案例,详细讲解了如何使用SpringMVC、Thymeleaf、Bootstrap以及RESTful风格接口来实现员工信息的增删改查功能。文章提供了项目结构、配置文件、控制器、数据访问对象、实体类和前端页面的完整源码,并展示了实现效果的截图。项目的目的是锻炼使用RESTful风格的接口开发,虽然数据是假数据并未连接数据库,但提供了一个很好的实践机会。文章最后强调了这一章节主要是为了练习RESTful,其他方面暂不考虑。
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
|
4月前
|
JSON 前端开发 Java
Spring MVC返回JSON数据
综上所述,Spring MVC提供了灵活、强大的方式来支持返回JSON数据,从直接使用 `@ResponseBody`及 `@RestController`注解,到通过配置消息转换器和异常处理器,开发人员可以根据具体需求选择合适的实现方式。
170 4
|
5月前
|
前端开发 Java 应用服务中间件
我以为我对Spring MVC很了解,直到我遇到了...
所有人都知道Spring MVC是是开发的,却鲜有人知道Spring MVC的理论基础来自于1978 年提出MVC模式的一个老头子,他就是Trygve Mikkjel Heyerdahl Reenskaug,挪威计算机科学家,名誉教授。Trygve Reenskaug的MVC架构思想早期用于图形用户界面(GUI) 的软件设计,他对MVC是这样解释的。MVC 被认为是解决用户控制大型复杂数据集问题的通用解决方案。最困难的部分是为不同的架构组件想出好的名字。模型-视图-编辑器是第一个。
131 1
我以为我对Spring MVC很了解,直到我遇到了...