Spring MVC框架:第二章:视图解析器和@RequestMapping注解使用在类级别及获取原生Servlet API对象

简介: Spring MVC框架:第二章:视图解析器和@RequestMapping注解使用在类级别及获取原生Servlet API对象

SpringMVC使用细节

第一节 视图解析器

通过HelloWorld程序我们看到了handler方法的返回值表示:

请求处理完成后,请SpringMVC执行一个请求转发。转发的地址就是handler方法的返回值。

假设我们在/WEB-INF/pages目录下有一组JSP页面,那么访问它们的路径都是以“/WEB-INF/pages/”开头,以“.jsp”结尾。基于这样一种情况,SpringMVC做了一种设计:它允许我们把转发路径中前面的固定部分和后面的固定部分以前缀、后缀的形式写到配置文件中,然后我们的handler方法就仅仅指定中间不一样的部分即可。中间部分和前缀、后缀做字符串拼接。这就是SpringMVC提供的视图解析器,我们在SpringMVC的配置文件中加入下面的配置,视图解析器就生效了。

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/pages/"/>
    <property name="suffix" value=".jsp"/>
</bean>

有了视图解析器,handler方法的返回值就简单了:

@RequestMapping("/hello")
public String hello() {
    System.out.println("SpringMVC处理了这个请求!");
    return "result";
}

SpringMVC会使用上面方法的返回值“result”和前缀后缀做字符串拼接,从而得到转发路径。

“/WEB-INF/pages/”+“result”+".jsp"→"/WEB-INF/pages/result.jsp"

然后按照拼接得到的结果转发请求。

第二节 @RequestMapping注解使用在类级别

假设我们在同一个模块有下面几个方法

@RequestMapping("/user/login")
public String login() {
    return "result";
}
@RequestMapping("/user/register")
public String register() {
    return "result";
}
@RequestMapping("/user/logout")
public String logout() {
    return "result";
}

它们在@RequestMapping注解中的映射地址都是以/user开头,能否统一提取出来呢?很简单,在类上再使用一个@RequestMapping注解把/user部分提取出来即可。

@Controller
@RequestMapping("/user")
public class UserHandler {
    @RequestMapping("/login")
    public String login() {
        return "result";
    }
    @RequestMapping("/register")
    public String register() {
        return "result";
    }
    @RequestMapping("/logout")
    public String logout() {
        return "result";
    }
}

访问的效果是一样的。

第三节 获取原生Servlet API对象

1.提出问题

在Servlet的doGet()方法中,我们可以拿到原生、本真的HttpServletRequest和HttpServletResponse这样的对象,那么在SpringMVC的handler方法中能够拿到吗?

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    ……
}

完全可以,直接从handler方法的参数位置传入即可。

2.直接传入handler方法

@RequestMapping("/testOriginalObject")
public String testOriginalObject( HttpServletRequest request,  HttpServletResponse response,  HttpSession session) {
    System.out.println(request);
    System.out.println(response);
    System.out.println(session);
    return "result";
}

结果:

org.apache.catalina.connector.RequestFacade@d57f488
org.apache.catalina.connector.ResponseFacade@3b9b53b
org.apache.catalina.session.StandardSessionFacade@27f11e41

3.ServletContext对象

方法一:通过HttpSession对象获取

session.getServletContext()

方法二:使用@Autowired注解装配

@Autowired

private ServletContext servletContext;

相关文章
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
227 3
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
981 3
|
人工智能 API 开发者
HarmonyOS Next~鸿蒙应用框架开发实战:Ability Kit与Accessibility Kit深度解析
本书深入解析HarmonyOS应用框架开发,聚焦Ability Kit与Accessibility Kit两大核心组件。Ability Kit通过FA/PA双引擎架构实现跨设备协同,支持分布式能力开发;Accessibility Kit提供无障碍服务构建方案,优化用户体验。内容涵盖设计理念、实践案例、调试优化及未来演进方向,助力开发者打造高效、包容的分布式应用,体现HarmonyOS生态价值。
842 27
|
人工智能 自然语言处理 搜索推荐
ViDoRAG:开源多模态文档检索框架,多智能体推理+图文理解精准解析文档
ViDoRAG 是阿里巴巴通义实验室联合中国科学技术大学和上海交通大学推出的视觉文档检索增强生成框架,基于多智能体协作和动态迭代推理,显著提升复杂视觉文档的检索和生成效率。
1027 8
ViDoRAG:开源多模态文档检索框架,多智能体推理+图文理解精准解析文档
|
机器学习/深度学习 人工智能 Java
Java机器学习实战:基于DJL框架的手写数字识别全解析
在人工智能蓬勃发展的今天,Python凭借丰富的生态库(如TensorFlow、PyTorch)成为AI开发的首选语言。但Java作为企业级应用的基石,其在生产环境部署、性能优化和工程化方面的优势不容忽视。DJL(Deep Java Library)的出现完美填补了Java在深度学习领域的空白,它提供了一套统一的API,允许开发者无缝对接主流深度学习框架,将AI模型高效部署到Java生态中。本文将通过手写数字识别的完整流程,深入解析DJL框架的核心机制与应用实践。
875 3
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
安全 测试技术 数据安全/隐私保护
原生鸿蒙应用市场开发者服务的技术解析:从集成到应用发布的完整体验
原生鸿蒙应用市场开发者服务的技术解析:从集成到应用发布的完整体验
|
Web App开发 IDE 测试技术
自动化测试的利器:Selenium 框架深度解析
【10月更文挑战第2天】在软件开发的海洋中,自动化测试犹如一艘救生艇,让质量保证的过程更加高效与精准。本文将深入探索Selenium这一强大的自动化测试框架,从其架构到实际应用,带领读者领略自动化测试的魅力和力量。通过直观的示例和清晰的步骤,我们将一起学习如何利用Selenium来提升软件测试的效率和覆盖率。
|
前端开发 JavaScript C#
移动应用开发中的跨平台框架解析
【9月更文挑战第5天】在移动应用开发领域,跨平台框架因其“一次编写,处处运行”的便利性而受到开发者的青睐。本文将深入探讨几种流行的跨平台框架,包括React Native、Flutter和Xamarin,并比较它们的优势与局限。我们将通过代码示例揭示这些框架如何简化移动应用的开发过程,同时保持高性能和良好的用户体验。无论你是新手还是有经验的开发者,这篇文章都将成为你了解和选择跨平台框架的宝贵资源。
344 19
|
人工智能 缓存 Java
深入解析Spring AI框架:在Java应用中实现智能化交互的关键
【10月更文挑战第12天】Spring AI 是 Spring 框架家族的新成员,旨在满足 Java 应用程序对人工智能集成的需求。它支持自然语言处理、图像识别等多种 AI 技术,并提供与云服务(如 OpenAI、Azure Cognitive Services)及本地模型的无缝集成。通过简单的配置和编码,开发者可轻松实现 AI 功能,同时应对模型切换、数据安全及性能优化等挑战。
1276 4

推荐镜像

更多
  • DNS