(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,如需转载请自行联系原作者

目录
相关文章
|
16天前
|
人工智能 前端开发 Java
Spring AI Alibaba + 通义千问,开发AI应用如此简单!!!
本文介绍了如何使用Spring AI Alibaba开发一个简单的AI对话应用。通过引入`spring-ai-alibaba-starter`依赖和配置API密钥,结合Spring Boot项目,只需几行代码即可实现与AI模型的交互。具体步骤包括创建Spring Boot项目、编写Controller处理对话请求以及前端页面展示对话内容。此外,文章还介绍了如何通过添加对话记忆功能,使AI能够理解上下文并进行连贯对话。最后,总结了Spring AI为Java开发者带来的便利,简化了AI应用的开发流程。
241 0
|
2天前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
23天前
|
XML JSON Java
Spring Boot 开发中常见的错误
本文总结了 Java 开发中常见的几个问题及其改进方法,包括:1. 过度使用 `@Component` 注解;2. `@ResponseBody` 注解的错误用法;3. `@Autowired` 的不当使用;4. `application.properties` 管理不善;5. 异常处理不当。每部分详细解释了错误情况和建议的改进方案,并提供了相应的代码示例。
50 11
|
23天前
|
IDE Java 测试技术
互联网应用主流框架整合之Spring Boot开发
通过本文的介绍,我们详细探讨了Spring Boot开发的核心概念和实践方法,包括项目结构、数据访问层、服务层、控制层、配置管理、单元测试以及部署与运行。Spring Boot通过简化配置和强大的生态系统,使得互联网应用的开发更加高效和可靠。希望本文能够帮助开发者快速掌握Spring Boot,并在实际项目中灵活应用。
44 5
|
21天前
|
前端开发 Java 开发者
这款免费 IDEA 插件让你开发 Spring 程序更简单
Feign-Helper 是一款支持 Spring 框架的 IDEA 免费插件,提供 URL 快速搜索、Spring Web Controller 路径一键复制及 Feign 与 Controller 接口互相导航等功能,极大提升了开发效率。
|
2月前
|
前端开发 JavaScript Java
如何使用 Spring Boot 和 Angular 开发全栈应用程序:全面指南
如何使用 Spring Boot 和 Angular 开发全栈应用程序:全面指南
51 1
|
28天前
|
XML Java 数据格式
Spring Boot 开发中的常见失误
本文深入分析了Spring Boot开发中常见的失误,包括不当使用@Component、@ResponseBody、@Autowired注解,以及不良的异常处理和日志记录实践,提供了有效的规避策略,帮助开发者提升代码质量和系统性能。
|
2天前
|
Java 测试技术 应用服务中间件
Spring Boot 如何测试打包部署
本文介绍了 Spring Boot 项目的开发、调试、打包及投产上线的全流程。主要内容包括: 1. **单元测试**:通过添加 `spring-boot-starter-test` 包,使用 `@RunWith(SpringRunner.class)` 和 `@SpringBootTest` 注解进行测试类开发。 2. **集成测试**:支持热部署,通过添加 `spring-boot-devtools` 实现代码修改后自动重启。 3. **投产上线**:提供两种部署方案,一是打包成 jar 包直接运行,二是打包成 war 包部署到 Tomcat 服务器。
24 10
|
16天前
|
Java 数据库连接 Maven
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
自动装配是现在面试中常考的一道面试题。本文基于最新的 SpringBoot 3.3.3 版本的源码来分析自动装配的原理,并在文未说明了SpringBoot2和SpringBoot3的自动装配源码中区别,以及面试回答的拿分核心话术。
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)