Spring MVC 视图解析器

在Spring MVC中,配置视图解析器可以帮助将Controller返回的字符串转换为实际的页面地址。以下是配置视图解析器的步骤:

  1. 选择视图解析器 :根据使用的模板技术,选择合适的视图解析器。常见的视图解析器有InternalResourceViewResolverThymeleafViewResolver等。
  2. 配置前缀和后缀:在视图解析器的配置中,通常需要设置前缀(prefix)和后缀(suffix)。前缀指的是存放页面文件的目录,后缀则是页面文件的扩展名。例如,如果设置前缀为"/WEB-INF/views/",后缀为".jsp",那么当Controller返回逻辑视图名"home"时,视图解析器会将其解析为"/WEB-INF/views/home.jsp"。
  3. 配置视图解析器 :可以在XML配置文件中使用<bean>标签来定义视图解析器,或者通过Java Config的方式进行配置。
  4. 理解工作原理:当DispatcherServlet接收到一个HTTP请求时,它会调用HandlerMapping来查找处理该请求的Controller。Controller处理完请求后,会返回一个逻辑视图名。然后DispatcherServlet会使用配置的视图解析器将逻辑视图名解析成实际的页面地址,并将该地址的内容返回给客户端。
XML 复制代码
#yml配置
spring:
  mvc:
#  视图解析器
    view:
      prefix: /imf/
      suffix: .html
#  静态资源访问前缀(区分动态资源和静态资源)
    static-path-pattern: /imf/**
#  静态资源的加载路径
  resources:
    static-locations: classpath:/templates/

将Controller返回的字符串填写到地址栏中,通常涉及到前端页面的跳转和后端Controller的返回值处理。以下是一些可能的方法:

  1. 使用重定向:在Controller中,可以通过返回"redirect:目标URL"的方式来实现页面的重定向。这样,浏览器会自动将"目标URL"加载到地址栏中。
  2. 视图解析器:如果Controller返回的是一个字符串,这个字符串可以被视作逻辑视图名。通过配置视图解析器(ViewResolver),可以将逻辑视图名解析成实际的页面地址,并显示在地址栏中。
  3. 直接返回地址:在某些情况下,Controller可以直接返回一个代表URL的字符串,前端页面可以通过JavaScript等技术将这个URL设置到地址栏中。
  4. 前端页面操作 :在前端页面中,可以使用JavaScript的window.location.href或者history.pushState()等方法来改变地址栏中的URL。
  5. 表单提交 :如果是通过表单提交的方式,可以在表单的action属性中填写Controller返回的字符串作为处理的URL,提交后浏览器会自动更新地址栏。
  6. Ajax请求:在使用Ajax进行页面局部刷新时,虽然可以获取到Controller返回的数据,但不会改变地址栏中的URL。如果需要改变地址栏,可以在Ajax请求成功后,使用JavaScript进行操作。

当使用Springboot配置视图解析器时,

一定不能使用@RestController注解,需要替换成@Controller

@RestController 是一个组合注解 ,@Controller和@ResponseBody的结合。当使用@RestController 注解的类时,其中的方法默认返回的数据会直接以JSON或XMl格式写入HTTP响应体,而不是作为视图解析。这意味着@RestController 适用于构建Restful风格的API,主要用于前后端分离的机构中。

@Controller 这是一个传统的控制器注解,用于处理客户端发起的请求。当使用@Controller注解的类时,其中的方法通常返回视图名称(如JSP界面),由视图解析器处理。这适用于传统的MVC架构,其中控制器负责返回视图,而不是直接数据。

小结:@RestController 适合用于构建返回数据(如Json或XMl) 的Restful API,而@Controller 更适合于需要渲染视图(如Html界面)的传统MVC应用。

相关推荐
苹果醋328 分钟前
Vue3响应式数据: 深入分析Ref与Reactive
java·运维·spring boot·mysql·nginx
缘友一世1 小时前
JAVA代理模式和适配器模式
java·代理模式·适配器模式
轻浮j1 小时前
Sentinel底层原理以及使用算法
java·算法·sentinel
it噩梦1 小时前
springboot 工程使用proguard混淆
java·spring boot·后端
潜意识起点1 小时前
Java数组:静态初始化与动态初始化详解
java·开发语言·python
竹影卿心1 小时前
Java连接HANA数据库
java·数据库·windows
Abelard_1 小时前
LeetCode--347.前k个高频元素(使用优先队列解决)
java·算法·leetcode
海海不掉头发1 小时前
软件工程-【软件项目管理】--期末复习题汇总
java·学习·产品运营·软件工程·团队开发·需求分析·期末复习
缘友一世1 小时前
java实现网络IO高并发编程java AIO
java·网络·python
m0_748246351 小时前
Spring Web MVC:功能端点(Functional Endpoints)
前端·spring·mvc