(Portal 开发读书笔记)Spring PortletMVC 工作流程

简介:

 

 

如上所示,这是Spring Portlet MVC的整个工作流程:

DispatcherPortlet 作为前端控制器,负责接收所有到Portlet的请求

(1) 当Portlet请求发送到DispatcherPortlet时,它利用PortletMVC的HandlerMapping来找到一个合适的Handler(也就是controller)来处理当前请求


  
  
  1. <portlet> 
  2. <portlet-name>helloWorld</portlet-name> 
  3. <portlet-class> 
  4. org.springframework.web.portlet.DispatcherPortlet 
  5. </portlet-class> 
  6. <supports> 
  7. <mime-type>text/html</mime-type> 
  8. <portlet-mode>view</portlet-mode> 
  9. </supports> 
  10. <resource-bundle>content.Language-ext</resource-bundle> 
  11. <portlet-info> 
  12. <title>HelloWorld</title> 
  13. </portlet-info> 
  14. </portlet> 

(2) PortletMVC 提供了一个PortletModeHandlerMapping,它实现了HandlerMapping接口,并且它基于当前Portlet的模式(view/edit/help....)来选择恰当的Handler.这个模式->Handler的映射规则配置在 <portlet-name>-portlet.xml ,它是该portlet的Spring配置文件

比如:


  
  
  1. <beans ... > 
  2. <bean id="helloWorldController" 
  3. class="chapter07.code.listing.HelloWorldController"/> 
  4.  
  5. <bean id="portletModeHandlerMapping" 
  6. class="org.springframework.web.portlet.handler.PortletModeHandlerMapping"> 
  7. <property name="portletModeMap"> 
  8. <map> 
  9. <entry key="view"> 
  10. <ref bean="helloWorldController" /> 
  11. </entry> 
  12. </map> 
  13. </property> 
  14. </bean> 
  15.  
  16. </beans> 

在这个例子中,我们可以看到PortletModeHandlerMapping将view模式匹配到了HelloWorldController 作为Handler,所以这个HellowWorldController有能力处理render类型的请求(对应view模式)

(3) 于是,这个DispatcherPortlet会指派HelloWorldController,而HelloWorldController处理了render类型的请求,然后返回一个ModelAndView对象给DispatcherPortlet.


  
  
  1. public class HelloWorldController implements Controller{ 
  2. public void handleActionRequest(ActionRequest request, 
  3. ActionResponse response)throws Exception { 
  4. //这个是render类型请求的处理函数,请求结果被封装在ModelAndView对象中返回给调用者,也就是返回给DispatcherPortlet
  5. public ModelAndView handleRenderRequest 
  6. (RenderRequest request, RenderResponse response) 
  7. throws Exception { 
  8. Map<String, Object> model = 
  9. new HashMap<String, Object>(); 
  10. model.put("helloWorldMessage""Hello World"); 
  11. return new ModelAndView("helloWorld", model); 

 

(4) 于是DispatcherPortlet找一个合适的视图来渲染页面,这时候,它委托ViewResolver 来解析包含在ModelAndView中的视图名"helloWorld",ViewResolver 根据以下portlet的Spring 配置文件:


  
  
  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <beans ... > 
  3. .. 
  4. <bean id="viewResolver" 
  5. class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
  6. <property name="viewClass" 
  7. value="org.springframework.web.servlet.view.JstlView"/> 
  8. <property name="prefix" value="/WEB-INF/jsp/" /> 
  9. <property name="suffix" value=".jsp" /> 
  10. </bean> 
  11. </beans> 

得知,一个叫 helloWorld的视图名会被映射到/WEB-INF/jsp/helloWorld.jsp的视图,它把最终解析得到的视图页面jsp信息连同模型Model信息返回给DispatcherPortlet

 

(5)最后到了渲染阶段,于是DispatcherPortlet 委托ViewRenderServlet ,让它基于helloWorld.jsp和模型数据进行渲染。ViewRenderServlet最终渲染到浏览器上。


  
  
  1. <web-app ...> 
  2. ... 
  3. <servlet> 
  4. <servlet-name>ViewRendererServlet</servlet-name> 
  5. <servlet-class> 
  6. org.springframework.web.servlet.ViewRendererServlet 
  7. </servlet-class> 
  8. </servlet> 
  9. <servlet-mapping> 
  10. <servlet-name>ViewRendererServlet</servlet-name> 
  11. <url-pattern>/WEB-INF/servlet/view</url-pattern> 
  12. </servlet-mapping> 
  13. ... 
  14. </web-app> 

 





本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/845017,如需转载请自行联系原作者

目录
相关文章
|
1月前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
3166 46
|
1月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
3月前
|
前端开发 Java API
利用 Spring WebFlux 技术打造高效非阻塞 API 的完整开发方案与实践技巧
本文介绍了如何使用Spring WebFlux构建高效、可扩展的非阻塞API,涵盖响应式编程核心概念、技术方案设计及具体实现示例,适用于高并发场景下的API开发。
365 0
|
2月前
|
安全 数据可视化 Java
AiPy开发的 Spring 漏洞检测神器,未授权访问无所遁形
针对Spring站点未授权访问问题,现有工具难以检测如Swagger、Actuator等组件漏洞,且缺乏修复建议。全新AI工具基于Aipy开发,具备图形界面,支持一键扫描常见Spring组件,自动识别未授权访问风险,按漏洞类型标注并提供修复方案,扫描结果可视化展示,支持导出报告,大幅提升渗透测试与漏洞定位效率。
|
3月前
|
缓存 Java API
Spring WebFlux 2025 实操指南详解高性能非阻塞 API 开发全流程核心技巧
本指南基于Spring WebFlux 2025最新技术栈,详解如何构建高性能非阻塞API。涵盖环境搭建、响应式数据访问、注解与函数式两种API开发模式、响应式客户端使用、测试方法及性能优化技巧,助你掌握Spring WebFlux全流程开发核心实践。
700 0
|
3月前
|
存储 NoSQL Java
探索Spring Boot的函数式Web应用开发
通过这种方式,开发者能以声明式和函数式的编程习惯,构建高效、易测试、并发友好的Web应用,同时也能以较小的学习曲线迅速上手,因为这些概念与Spring Framework其他部分保持一致性。在设计和编码过程中,保持代码的简洁性和高内聚性,有助于维持项目的可管理性,也便于其他开发者阅读和理解。
138 0
|
5月前
|
Java API 网络架构
基于 Spring Boot 框架开发 REST API 接口实践指南
本文详解基于Spring Boot 3.x构建REST API的完整开发流程,涵盖环境搭建、领域建模、响应式编程、安全控制、容器化部署及性能优化等关键环节,助力开发者打造高效稳定的后端服务。
812 1
|
4月前
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
889 0
|
5月前
|
人工智能 Java 测试技术
Spring Boot 集成 JUnit 单元测试
本文介绍了在Spring Boot中使用JUnit 5进行单元测试的常用方法与技巧,包括添加依赖、编写测试类、使用@SpringBootTest参数、自动装配测试模块(如JSON、MVC、WebFlux、JDBC等),以及@MockBean和@SpyBean的应用。内容实用,适合Java开发者参考学习。
632 0

热门文章

最新文章