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

目录
相关文章
|
8天前
|
IDE Java 应用服务中间件
spring boot 启动流程
Spring Boot 启动流程简介: 在使用 Spring Boot 之前,启动 Java Web 应用需要配置 Web 容器(如 Tomcat),并将应用打包放入容器目录。而使用 Spring Boot,只需运行 main() 方法即可启动 Web 应用。Spring Boot 的核心启动方法是 SpringApplication.run(),它负责初始化和启动应用上下文。 主要步骤包括: 1. **应用启动计时**:使用 StopWatch 记录启动时间。 2. **打印 Banner**:显示 Spring Boot 的 LOGO。 3. **创建上下文实例**:通过反射创建
|
23天前
|
监控 Java 应用服务中间件
SpringBoot是如何简化Spring开发的,以及SpringBoot的特性以及源码分析
Spring Boot 通过简化配置、自动配置和嵌入式服务器等特性,大大简化了 Spring 应用的开发过程。它通过提供一系列 `starter` 依赖和开箱即用的默认配置,使开发者能够更专注于业务逻辑而非繁琐的配置。Spring Boot 的自动配置机制和强大的 Actuator 功能进一步提升了开发效率和应用的可维护性。通过对其源码的分析,可以更深入地理解其内部工作机制,从而更好地利用其特性进行开发。
42 6
|
1月前
|
人工智能 Java API
阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手
本次分享的主题是阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手,由阿里云两位工程师分享。
阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手
|
2月前
|
人工智能 前端开发 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应用的开发流程。
909 0
|
1月前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
2月前
|
XML JSON Java
Spring Boot 开发中常见的错误
本文总结了 Java 开发中常见的几个问题及其改进方法,包括:1. 过度使用 `@Component` 注解;2. `@ResponseBody` 注解的错误用法;3. `@Autowired` 的不当使用;4. `application.properties` 管理不善;5. 异常处理不当。每部分详细解释了错误情况和建议的改进方案,并提供了相应的代码示例。
69 11
|
2月前
|
IDE Java 测试技术
互联网应用主流框架整合之Spring Boot开发
通过本文的介绍,我们详细探讨了Spring Boot开发的核心概念和实践方法,包括项目结构、数据访问层、服务层、控制层、配置管理、单元测试以及部署与运行。Spring Boot通过简化配置和强大的生态系统,使得互联网应用的开发更加高效和可靠。希望本文能够帮助开发者快速掌握Spring Boot,并在实际项目中灵活应用。
80 5
|
2月前
|
前端开发 Java 开发者
这款免费 IDEA 插件让你开发 Spring 程序更简单
Feign-Helper 是一款支持 Spring 框架的 IDEA 免费插件,提供 URL 快速搜索、Spring Web Controller 路径一键复制及 Feign 与 Controller 接口互相导航等功能,极大提升了开发效率。
|
XML 设计模式 Java
SPRING03_为什么要学习源码、基础的接口、SPRING工作流程详解
①. 为什么要学习源码? ②. Spring基础接口 ③. Spring的工作流程详解
143 0
SPRING03_为什么要学习源码、基础的接口、SPRING工作流程详解
|
29天前
|
XML Java 应用服务中间件
Spring Boot 两种部署到服务器的方式
本文介绍了Spring Boot项目的两种部署方式:jar包和war包。Jar包方式使用内置Tomcat,只需配置JDK 1.8及以上环境,通过`nohup java -jar`命令后台运行,并开放服务器端口即可访问。War包则需将项目打包后放入外部Tomcat的webapps目录,修改启动类继承`SpringBootServletInitializer`并调整pom.xml中的打包类型为war,最后启动Tomcat访问应用。两者各有优劣,jar包更简单便捷,而war包适合传统部署场景。需要注意的是,war包部署时,内置Tomcat的端口配置不会生效。
233 17
Spring Boot 两种部署到服务器的方式