Portal Starter 源码深入剖析(一)

Portal Starter 源码深入剖析(一)
学ASP.net光看书看来是不行的,找一些经典的源代码来读读,对提升认识是很有帮助的。
在Microsoft的网站上找到几个范例,选择Portal是因为这个范例最大,可作为一个简单的门户站。
Portal的工作流程:
1、读取网站设置文件PortalCfg.xml至context中缓存起来,这个过程由Global.asax中的Application_BeginRequest()事件来完成的。
2、客户访问Portal站,执行Default.aspx,Default.aspx判断客户端是Mobile还是浏览器,如果是后者,引导客户至DesktopDefault.aspx
3、DesktopDefault.aspx完成网站各个栏目的展示以及各个栏目中相应模块的加载。
分析Global.asax中的Application_BeginRequest()事件:

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
'默认访问主页
Dim tabIndex As Integer = 0
Dim tabId As Integer = 1

' Get TabIndex from querystring
If Not (Request.Params("tabindex") Is Nothing) Then
tabIndex = CInt(Request.Params("tabindex"))
End If

' Get TabID from querystring
If Not (Request.Params("tabid") Is Nothing) Then
tabId = CInt(Request.Params("tabid"))
End If

' Add the PortalSettings object to the context
' PortalSetting在Components\Configuration.vb中定义,其作用是根据传入的tabIndex,tabId加载相应栏目的元素。
' Context用来缓存相应栏目的设置。
Context.Items.Add("PortalSettings", New PortalSettings(tabIndex, tabId))

' Read the configuration info from the XML file or retrieve from Cache
' and add to the context
' Configuration类在Components\Configuration中定义,其作用是操作Portal网站的设置文件PortalCfg.xml文件。
' 同样是将设置文件缓存到Context中,这样网站的任何部分都可以访问到这些设置。
Dim config As Configuration = New Configuration()
Context.Items.Add("SiteSettings", config.GetSiteSettings())

Try
If Not (Request.UserLanguages Is Nothing) Then
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Request.UserLanguages(0))
' Default to English if there are no user languages
Else
Thread.CurrentThread.CurrentCulture = New CultureInfo("en-us")
End If
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture
Catch ex As Exception
Thread.CurrentThread.CurrentCulture = New CultureInfo("en-us")
End Try
End Sub
分析New PortalSettings(tabIndex, tabId),请看下面PortalSettings的构造函数:
Public Class PortalSettings
Public PortalId As Integer
Public PortalName As String
Public AlwaysShowEditButton As Boolean
Public DesktopTabs As New ArrayList()
Public MobileTabs As New ArrayList()
Public ActiveTab As New TabSettings()
......

Public Sub New(ByVal tabIndex As Integer, ByVal tabId As Integer)

' Get the configuration data
Dim config As Configuration = New Configuration()
' 通过Configuration类中的GetSiteSettings()将PortalCfg.xml文件导入到Context中,
' 随后通过返回值赋值给siteSettings,siteSettings被定义为一个增强型的Dataset类。
Dim siteSettings As SiteConfiguration = config.GetSiteSettings()

' Read the Desktop Tab Information, and sort by Tab Order
' 读取Tab信息,也就是Portal网站的栏目信息,放到DesktopTabs中。
Dim tRow As SiteConfiguration.TabRow
For Each tRow In siteSettings.Tab.Select("", "TabOrder")
Dim tabDetails As New TabStripDetails()

With tabDetails
.TabId = tRow.TabId
.TabName = tRow.TabName
.TabOrder = tRow.TabOrder
.AuthorizedRoles = tRow.AccessRoles
End With

Me.DesktopTabs.Add(tabDetails)
Next

' If the PortalSettings.ActiveTab property is set to 0, change it to
' the TabID of the first tab in the DesktopTabs collection
If Me.ActiveTab.TabId = 0 Then
Me.ActiveTab.TabId = CType(Me.DesktopTabs(0), TabStripDetails).TabId
End If

' Read the Mobile Tab Information, and sort by Tab Order
Dim mRow As SiteConfiguration.TabRow
For Each mRow In siteSettings.Tab.Select("ShowMobile='true'", "TabOrder")
Dim tabDetails As New TabStripDetails()

With tabdetails

时间: 2024-10-30 07:09:52

Portal Starter 源码深入剖析(一)的相关文章

tomcat集群实现源码级别剖析

随着互联网快速发展,各种各样供外部访问的系统越来越多且访问量越来越大,以前Web容器可以包揽接收-逻辑处理-响应整个请求生命周期的工作,现在为了构建让更多用户访问更强大的系统,人们通过不断地业务解耦.架构解耦将web容器的逻辑处理抽离交由其他中间件处理,例如缓存中间件.消息队列中间件.数据存储中间件等等.Web容器负责的工作可能越来越少,但是它确实必不可少的部分,它负责接收用户请求并分别调用各个服务最后响应.可以说目前最受欢迎的web容器是用Java写的tomcat小猫,由于生产上的tomcat

请问哪位高手对Liferay Portal 的源码有研究?或者对在Liferay Portal 上进行Portlet开发有研究的,请指点一下学习路线。谢谢

问题描述 请问哪位高手对LiferayPortal的源码有研究?或者对在LiferayPortal上进行Portlet开发有研究的,请指点一下学习路线.谢谢 解决方案 解决方案二:以前想用来着,LIFERAY太大大难,作罢.解决方案三:在源码上开发了3个月,还是有点理不清,那东西有点难!不好说.

jQuery.API源码深入剖析以及应用实现(3) - 选择器篇(上)

还漏了一个框题,jQuery的冲突机制解决方法jQuery.noConflict()以及jQuery.noConflict(extreme),这里先分析一下: jQuery.noConflict():运行这个函数将变量$的控制权让渡给第一个实现它的那个库. jQuery.noConflict(extreme):将$和jQuery的控制权都交还给原来的库. 比如在prototype框架中的$会和jQuery框架中的$产生命名冲突,这里就是为了解决这种问题. 现在先看下noConflict方法的具体

jQuery.API源码深入剖析以及应用实现(4) - 选择器篇(下)

继续介绍选择器的其它原理,包括内容,可见性,属性,子元素,表单,表单对象属性等等原理. jQuery选择器的图示包括: 一.内容 1. [ :contains(text) ] 匹配包含给定文本的元素. 例子 HTML代码 jQuery代码 结果 <div>John Resig</div> <div>George Martin</div> <div>Malcom John Sinclair</div> <div>J. Ohn

深度剖析ConcurrentHashMap源码

概述 你可能会在一些技术类的书籍上看到下面这样一段关于HahsMap和Hashtable的表述: HashMap是非线程安全的,Hashtable是线程安全的. 不知道大家有什么反应,我当时只是记住了,知道面试的时候能回答上来就行了-至于为什么是线程安全的,内部怎么实现的,却不怎么了解. 今天我们将深入剖析一个比Hashtable性能更优的线程安全的Map类,它就是ConcurrentHashMap,本文基于Java 7的源码做剖析. ConcurrentHashMap的目的 多线程环境下,使用

Oracle调用接口(OCI)源码剖析(2):执行SQL语句并获取结果

概述 接着上一篇文章<Oracle调用接口(OCI)源码剖析(1):创建数据库连接>,我们继续对OCI中执行SQL语句并获取结果的源码进行剖析.该操作主要是由两个函数完成的:CDbExecSql和CDbFetch,其中CDbExecSql函数用于执行普通SQL语句,CDbFetch函数用于获取数据库的返回结果. 下面对这两个函数的源码进行分析. OCI中执行SQL语句并获取结果的源码剖析 1.执行普通SQL语句的操作 在OCI中,执行普通SQL语句的操作是由CDbExecSql函数实现的,其代

Oracle调用接口(OCI)源码剖析(3):关闭数据库连接

概述 继创建数据库连接和执行SQL语句并获取结果之后,我们继续对OCI中关闭数据库连接的源码进行剖析.该操作主要是由CDbCloseDb函数完成的. 下面对这个函数的源码进行分析. OCI中执行关闭数据库连接的源码剖析 在OCI中,CDbCloseDb函数的代码如下: void CDbCloseDb(void *hDb) { CDb *pCDb = NULL; if (NULL == hDb) { return; } pCDb = (CDb *)hDb; DoDbFree(pCDb->hdbc)

grunt源码解析:整体运行机制&amp;grunt-cli源码解析

前端的童鞋对grunt应该不陌生,前面也陆陆续续的写了几篇grunt入门的文章.本篇文章会更进一步,对grunt的源码进行分析.文章大体内容内容如下: grunt整体设计概览 grunt-cli源码分析 grunt-cli模块概览 grunt-cli源码分析 写在后面 grunt整体设计概览 grunt主要由三部分组成.其中,grunt-cli是本文的讲解重点 grunt-cli:命令行工具,调用本地安装的grunt来运行任务,全局安装. grunt:本地grunt,一般安装在项目根目录下.主要

75篇关于Tomcat源码和机制的文章

整理下前面写过的75篇关于Tomcat源码和机制的文章 文章列表 如何设计一个Web容器 Web安全认证机制知多少 Tomcat集群实现源码级别剖析 Tomcat集群如何同步会话 从单机到集群会话的管理之集群模式一 从单机到集群会话的管理之集群模式二(更大的集群) Tomcat集群的failover机制 Tomcat集群应用部署的实现机制 Tomcat集群机制剖析及其生产部署选型 Tomcat如何实现WebSocket Tomcat如何实现Comet Tomcat怎么实现异步Servlet To