Spring 全家桶之 Spring Web MVC(三)- View & ViewResolve

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: Spring 全家桶之 Spring Web MVC(三)- View & ViewResolve

一、视图解析

新建maven项目spring-mvc-view,项目创建过程与配置方式及其maven依赖,创建过程参考QA 由浅入深 Spring Framework 5.0(十)- Spring MVC Restful,这里不在赘述。

转发forward

在spring-mvc-view项目中controller包下新增一个ForwardControlle。

@Controller
public class ForwardController {
    @RequestMapping("/forward_jsp")
    public String forward2JSP(){
        // 相对路径,视图解析器会进行拼串
        // return "../../hello";
        System.out.println("hello");
        return "forward:/hello.jsp";
    }
}
复制代码

在web目录下新建一个jsp页面hello.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Hello</title>
</head>
<body>
    <h2>通过转发或者重定向到达此页面</h2>
</body>
</html>
复制代码

重新启动Tomcat,浏览器输入http://localhost:8080/forward_jsp

8e2b145011404cba92c22d3c01ffa2cc_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

使用forward关键字可以完成转发操作

转发到其他请求,增加forward2URI方法

@RequestMapping("/forward_uri")
public String forward2URI(){
    return "forward:/forward_jsp";
}
复制代码

重新启动Tomcat,浏览器输入http://localhost:8080/forward_uri

60fc060b820a40afb84deaa915c04a8a_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

使用forward关键字可以转发到一个页面或者请求,使用时一定加上/,如果不加就是相对路径,使用了关键字forward:之后,视图解析器不会对页面进行拼串

重定向redirect

controller包下新建一个RedirectController,并新增两个方法分别是redirect2JSP、redirect2URI

@Controller
public class RedirectController {
    // 重定向到其他jsp页面
    @RequestMapping("/redirect_jsp")
    public String redirect2JSP(){
        return "redirect:/hello.jsp";
    }
    // 重定向到其他请求
    @RequestMapping("/redirect_uri")
    public String redirect2URI(){
        return "redirect:/redirect_jsp";
    }
}
复制代码

重启Tomcat,浏览器中先后输入http://localhost:8080/redirect_jsphttp://localhost:8080/redirect_uri, 最后都会重定向到hello.jsp页面

60fc060b820a40afb84deaa915c04a8a_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

redirect的用法与forward用法一致

Spring MVC 视图解析的原理

在浏览器中输入URL地址后会先进入DispatchServlet类中的doDispatch方法,通过调用doDispatch方法完成响应,doDispatch执行过程中的关键步骤如下:

1)根据当前请求地址获取一个handler来处理,如果没有找到就报404

// Determine handler for the current request.
mappedHandler = getHandler(processedRequest);
if (mappedHandler == null) {
   noHandlerFound(processedRequest, response);
   return;
}
复制代码

2)根据handler获取handlerAdapter适配器

// Determine handler adapter for the current request.
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
复制代码

3)执行目标方法,返回ModelAndView

// Actually invoke the handler.
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
复制代码

6beedc3484db4ab289c35bb850ab293e_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

4)根据方法最终执行完成后封装的ModelAndView渲染页面

processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
复制代码

而processDispatchResult方法中又会调用同一类下的render方法,当mv不为空时,调用render方法渲染页面

2b4e40e7b670483c86385e7545314db1_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

render方法中再调用视图解析器的resolveViewName方法来解析ViewName获取View,这里通过for循环获取视图解析器数组中的所有视图解析器来解析ViewName

if (viewName != null) {
   // We need to resolve the view name.
   view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
复制代码

52c649ab547545d794ddec1593ca4baa_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

进入resolveViewName,在通过调用createView方法创建View

b1e4e1b964f146e6a6bee0b4474cbd2d_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

而在createView方法中会通过判断前缀中是否包含forward:、redirect: 来创建不同的View

image.png

视图解析器得到View对象的流程就是,所有配置的视图解析器都来尝试根据视图名(返回值)得到View(视图)对象;如果能得到就返回,得不到就换下一个视图解析器。

视图对象才能真正的转发(将模型数据全部放在请求域中)或者重定向到页面,才能真正的渲染视图;

视图解析器

  • Spring MVC为解析逻辑视图提供了多种方式,可以在Spring MVC配置文件上下文中配置一种或者多种解析策略,并规定他们之间的先后顺序,每种映射策略对应一个具体的视图解析器实现类
  • 将逻辑视图解析为一个具体的视图对象
  • 所有的视图解析器都必须实现ViewResolver接口

视图

  • 视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给用户
  • 为了实现视图模型和具体实现技术的解耦,Spring 定义了一个高度抽象的View接口
  • 视图由视图解析器负责实例化,视图是无状态的,不会设计线程安全问题

视图和视图解析器

  • 请求处理方法(handler方法)执行完成之后,最终会返回一个ModelAndView对象,对于返回String、View、ModelMap等类型的处理方法,Spring MVC会在内部把他们装配成ModelAndView对象,包含了逻辑名和模型对象的视图
  • Spring MVC借助视图解析器(View Resolver)得到最终的视图对象(View),最终的视图可以是JSP,也可以是其他形式的视图
  • 对于最终要采用哪一种视图对模型数据渲染,处理器不关心,处理器关心的是生产模型数据,从而实现MVC的充分解耦

常用的视图实现类(View的实现类)

  • InternalResourceView:URL资源视图,将JSP或者其他资源封装成一个视图,是InternalResourceView提供的默认视图实现类
  • JstlView:URL资源视图,如果JSP中使用了JSTL国际化标签的功能,则需要使用JstlView来实现
  • MappingJacksonJsonView:将模型数据通过Jackson开源框架ObjectMapper及Json方式输出
  • 其他如文档视图实现类AbstractExcelView、AbstractPdfView以及一些报表视图JasperReportsCsvView、JasperReportsHtmlView等等

JstlView实现国际化

将dispatchServlet-servlet.xml中的视图解析器配置增加一个viewClass属性,指定视图解析器获取JstlView,代替默认的InternaleResourceView

<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/pages/"></property>
    <property name="suffix" value=".jsp"></property>
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
</bean>
复制代码

新建一个LoginController,增加login方法,该方法返回login.jsp页面

@Controller
public class LoginController {
    @RequestMapping("/login")
    public String login(){
        return "login";
    }
}
复制代码

login.jsp页面

<h2>Login</h2>
<form action="">
    用户名 :<input type="text" name="username">
    <br>
    密码:<input type="password" name="password">
    <br>
    <input type="submit" value='登录'>
</form>
复制代码

重启Tomcat,浏览器输入http://localhost:8080/login,  login.jsp页面可以正常返回和显示

接着在resources目录下增加国际化配置

message_en.properties

username=USERNAME
password=PASSWORD
loginBtn=LOGIN
复制代码

message_zh.properties

username=\u7528\u6237\u540D
password=\u5BC6\u7801
loginBtn=\u767B\u9646
复制代码

在disptachServlet-servlet.xml配置文件中增加管理国际化的配置

<!--国际化资源文件配置,id不可以更改一定要命名为messageSource-->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename" value="i18n"></property>
</bean>
复制代码

pom.xml中增加jstl依赖

<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>
复制代码

页面顶部导入标签

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
复制代码

修改登录表单

<form action="">
    <fmt:message key="username" /> :<input type="text" name="username">
    <br>
    <fmt:message key="password" />:<input type="password" name="password">
    <br>
    <input type="submit" value="<fmt:message key="loginBtn" />">
</form>
复制代码

重启tomcat,浏览器输入地址http://localhost:8080/login

image.png

切换页面语言后刷新页面

image.png

XML中配置请求映射

<mvc:view-controller path="/login" view-name="login" />
<!--开启mvc注解驱动模式-->
<mvc:annotation-driven></mvc:annotation-driven>
复制代码

参数

  • path:指定请求路径
  • view-name:指定映射的页面

重启Tomcat,将原Controller中的login方法注释,浏览器输入 http://localhost:8080/login

image.png

页面可以正常显示


相关文章
|
1月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
48 4
|
1月前
|
JSON 前端开发 Java
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。
|
1月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
57 2
|
2月前
|
缓存 前端开发 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版)
|
1月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
126 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
2月前
|
XML 缓存 前端开发
springMVC02,restful风格,请求转发和重定向
文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。
springMVC02,restful风格,请求转发和重定向
|
2月前
|
前端开发 安全 Java
技术进阶:使用Spring MVC构建适应未来的响应式Web应用
【9月更文挑战第2天】随着移动设备的普及,响应式设计至关重要。Spring MVC作为强大的Java Web框架,助力开发者创建适应多屏的应用。本文推荐使用Thymeleaf整合视图,通过简洁的HTML代码提高前端灵活性;采用`@ResponseBody`与`Callable`实现异步处理,优化应用响应速度;运用`@ControllerAdvice`统一异常管理,保持代码整洁;借助Jackson简化JSON处理;利用Spring Security增强安全性;并强调测试的重要性。遵循这些实践,将大幅提升开发效率和应用质量。
65 7
|
2月前
|
前端开发 测试技术 开发者
MVC模式在现代Web开发中有哪些优势和局限性?
MVC模式在现代Web开发中有哪些优势和局限性?
|
3月前
|
开发者 前端开发 Java
架构模式的诗与远方:如何在MVC的田野上,用Struts 2编织Web开发的新篇章
【8月更文挑战第31天】架构模式是软件开发的核心概念,MVC(Model-View-Controller)通过清晰的分层和职责分离,成为广泛采用的模式。随着业务需求的复杂化,Struts 2框架应运而生,继承MVC优点并引入更多功能。本文探讨从MVC到Struts 2的演进,强调架构模式的重要性。MVC将应用程序分为模型、视图和控制器三部分,提高模块化和可维护性。
48 0
|
3月前
|
Java Spring Maven
Struts 2遇见Spring:这个组合如何颠覆你的Web开发?
【8月更文挑战第31天】在现代Web开发中,Struts 2与Spring的结合使用能显著增强应用的模块化和可维护性。本文将介绍如何整合这两个框架,并提供代码示例。首先,在`pom.xml`中添加Struts 2和Spring的依赖,然后在`struts.xml`中配置Struts 2以识别Spring插件。接着,在Spring配置文件中定义bean,并在Struts 2的Action类中使用`@Autowired`注解进行自动注入。
50 0
下一篇
无影云桌面