1、首先根据Sakai开发说明.pdf上面说的所有逻辑都必须都必须打包在sakai容器中,而打包到sakai容器中则是靠pack包来实现的,所以最开始先看一下components.xml文件,所在位置是chat/chat-impl/pack/src/webapp/WEB-INF/components.xml,也是spring框架需要的。

    <bean id="org.sakaiproject.chat2.model.ChatHibernateBean"class="org.sakaiproject.springframework.orm.hibernate.impl.AdditionalHibernateMappingsImpl"><property name="mappingResources"><list><value>org/sakaiproject/chat2/model/impl/ChatImpl.hbm.xml</value></list></property></bean>

1.1、hibernate数据库映射,ChatImpl.hbm.xml主要包含内容:

<hibernate-mapping package="org.sakaiproject.chat2.model"default-lazy="true"><class name="ChatChannel" table="CHAT2_CHANNEL" lazy="true"><id name="id" length="99" column="CHANNEL_ID"><generator class="org.sakaiproject.id.hbm.IdGenerator"/></id><property name="title" type="string" length="64" /><property name="description" type="string" length="255" />
<span style="white-space:pre">     </span>...<property name="migratedChannelId" type="string" length="99" /></class><class name="ChatMessage" table="CHAT2_MESSAGE" lazy="true"><id name="id" length="99" column="MESSAGE_ID"><generator class="org.sakaiproject.id.hbm.IdGenerator"/></id><property name="body" column="BODY" type="text" not-null="true" />...</class><query name="findChannelsInContext">from ChatChannel c WHERE c.context=? order by c.title

主要包含两个bean(POJO)和一些sql查询语句的定义,其中ChatChannel和ChatMessage是数据库映射关系bean类,这两个java文件可以在chat/chat-api/src/.../model中找到,至于这些查询语句???

1.2、Spring中TransactionproxyFactoryBean生成事务代理

    <bean id="org.sakaiproject.chat2.model.ChatManager"class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"><property name="transactionManager"><ref bean="org.sakaiproject.springframework.orm.hibernate.GlobalTransactionManager" /></property><property name="target"><ref bean="org.sakaiproject.chat2.model.impl.ChatManagerImpl" /></property><property name="transactionAttributes"><props><prop key="*">PROPAGATION_REQUIRED</prop></props></property></bean><bean id="org.sakaiproject.chat2.model.impl.ChatManagerImpl"class="org.sakaiproject.chat2.model.impl.ChatManagerImpl"singleton="true" init-method="init" destroy-method="destroy"><property name="sessionFactory"><refbean="org.sakaiproject.springframework.orm.hibernate.GlobalSessionFactory" /></property><property name="entityManager"><ref bean="org.sakaiproject.entity.api.EntityManager" /></property><property name="defaultChannelSettings"><ref bean="defaultChatChannelSettings" /></property></bean>

可以看出生成事务代理需要两个bean,一个是代理类TransactionproxyFactoryBean,另外一个是被代理类ChatManagerImpl,该被代理类可以在chat/chat-impl/impl/src/.../impl/下找到

1.3、其他逻辑类

 <bean id="org.sakaiproject.chat2.model.impl.ChatChannelEntityProvider"class="org.sakaiproject.chat2.model.impl.ChatChannelEntityProvider"><property name="chatManager"><ref bean="org.sakaiproject.chat2.model.ChatManager"/></property></bean><bean id="org.sakaiproject.chat2.model.impl.ChatMessageEntityProvider"class="org.sakaiproject.chat2.model.impl.ChatMessageEntityProvider"><property name="chatManager"><ref bean="org.sakaiproject.chat2.model.ChatManager"/></property></bean>

这些类都可以在chat/chat-impl/impl/src/.../impl/下找到

1.4、为什么bean类(api中)

    <bean id="defaultChatChannelSettings" class="org.sakaiproject.chat2.model.ChatChannel"singleton="true"><property name="filterType"><bean id="org.sakaiproject.chat2.model.ChatChannel.FILTER_ALL"class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"></bean></property><property name="filterParam"><value>3</value></property><property name="timeParam"><value>3</value></property><property name="numberParam"><value>10</value></property><property name="enableUserOverride"><value>true</value></property></bean>

这个是干嘛的暂时还不知道

1.5、总结

chat/chat-impl/pack/src中只有一个一个components.xml文件,所以在将所有逻辑放到sakai容器中的时候会根据该文件进行,它包含的内容主要是api和impl中的内容

2、chat-tools主要是将war文件部署在webapp上,所以除了业务逻辑之外还需要处理页面关系等内容,他的大致结构图如下:

2.1、第①部分,主要是一些java工具类,一般供JSF使用???

2.2、第②部分主要是注册工具,例如sakai.chat.xml文件内容如下

<registration><toolid="sakai.chat"title="Chat Room"description="For real-time conversations in written form."><configuration name="display-date" value="false" /><configuration name="display-time" value="true" /><configuration name="display-user" value="true" /><configuration name="sound-alert" value="true" /><configuration name="filter-type" value="SelectMessagesByTime" /><configuration name="filter-param" value="3" /><configuration name="channel" value="" /><category name="course" /><category name="project" /><configuration name="functions.require" value="chat.read" /> </tool></registration>

其中最主要的是id/title,还有category,其中category表示该工具在哪个site下面展现

2.3、第③部分faces.config.xml文件,因为sakai使用的JSF框架,该文件就是JSF框架的关键配置文件。

2.3.1、application,指的是用于管理JSF应用的相关配置,ChatNavigationHandler就是2.1中的内容

  <application><message-bundle>chat</message-bundle><locale-config><default-locale>en</default-locale></locale-config><navigation-handler>org.sakaiproject.chat2.tool.ChatNavigationHandler</navigation-handler></application>

2.3.2、managed-bean,JSF中所有托管的bean,其中的ChatTool也是2.1中的内容

<managed-bean><description>ChatTool</description><managed-bean-name>ChatTool</managed-bean-name><managed-bean-class>org.sakaiproject.chat2.tool.ChatTool</managed-bean-class><managed-bean-scope>session</managed-bean-scope><managed-property><description>chatManager</description><property-name>chatManager</property-name><value>#{Components["org.sakaiproject.chat2.model.ChatManager"]}</value></managed-property><managed-property><description>Service Dependency: toolManager</description><property-name>toolManager</property-name><value>#{Components["org.sakaiproject.tool.api.ActiveToolManager"]}</value></managed-property></managed-bean>

2.3.3、navigation-rule,管理JSF应用的导航规则

<navigation-rule><from-view-id>*</from-view-id><navigation-case><from-outcome>room</from-outcome><to-view-id>/jsp/room.jsp</to-view-id><redirect/></navigation-case><navigation-case><!-- not needed if using the courier --><from-outcome>roomActions</from-outcome><to-view-id>/jsp/roomActions.jsp</to-view-id><redirect/></navigation-case>...</navigation-rule>

2.4、第④部分,web.xml

2.4.1、filter-mapping内容,有3个,刚好对应第②部分

     <filter-mapping><filter-name>sakai.request</filter-name><servlet-name>sakai.chat</servlet-name><dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher><dispatcher>INCLUDE</dispatcher></filter-mapping><filter-mapping><filter-name>sakai.request</filter-name><servlet-name>sakai.synoptic.chat</servlet-name><dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher><dispatcher>INCLUDE</dispatcher></filter-mapping><filter-mapping><filter-name>sakai.request</filter-name><servlet-name>sakai.chat.deleteMessage</servlet-name><dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher><dispatcher>INCLUDE</dispatcher></filter-mapping>

2.4.2、servlet内容,也有4个,其中有3个也是对应于第②部分

     <servlet><servlet-name>sakai.synoptic.chat</servlet-name><servlet-class>org.sakaiproject.jsf.util.HelperAwareJsfTool</servlet-class><init-param><param-name>path</param-name><param-value>/jsp</param-value></init-param><init-param><param-name>default</param-name><!-- the path is inserted before and .jsp inserted after --><param-value>synoptic</param-value></init-param><init-param><param-name>default.last.view</param-name><param-value>false</param-value></init-param><load-on-startup>1</load-on-startup></servlet>

另外一个如下:

    <servlet><servlet-name>Faces Servlet</servlet-name><servlet-class>javax.faces.webapp.FacesServlet</servlet-class><load-on-startup> 2 </load-on-startup></servlet>

FacesServlet是JSF核心控制器

2.5、最后部署的war文件

sakai项目中chat子模块解读相关推荐

  1. Maven 单独构建多模块项目中的子模块

    在多模块的maven项目中 , 如果需要部署某个子模块 , 单独构建则会报错 , 如果构建整个项目 , 又会非常耗时 . maven为自定义构建部分项目提供了支持 : -pl, --projects构 ...

  2. android+jacoco多模块项目中统计子模块代码覆盖率

    上一次做了单项目的代码覆盖率统计,但是在实际的项目中,都是已模块开发为主. 研究了一下怎么去统计子模块中的代码覆盖率. 整体思路: 1:既然是多模块的代码覆盖率统计,所以子模块必须也要是用jacoco ...

  3. git 子模块在项目中的使用

    在公司的项目中, 经常会遇到一些公共的内容, 多个项目中间通用的, 不可能每次都将整个代码复制一遍, 遇到这种情况有很多不同的解决方案, 一般来说, 项目是通过 git 来管理的, 巧了, git 也 ...

  4. git项目中的子git项目_使用子模块和子树管理Git项目

    git项目中的子git项目 如果您从事开源开发,则可能与Git一起管理源代码. 您可能遇到过具有大量依赖项和/或子项目的项目. 您如何管理它们? 对于开源组织,为社区和产品实现单源文档和依赖性管理可能 ...

  5. maven同一个项目中,一个子模块引用另一个子模块的类的方法

    1.首先在一个项目中创建两个子模块,如: 2.在common-api的pom.xml添加版本号,如: 3.在use-common-api的pom.xml中添加如下依赖: <dependencie ...

  6. 对Android和iOS项目中的模块结构和类结构设计的探讨

    1. 现有的代码规范缺少探讨的部分 1.1 关于项目的代码结构 通常来说,一个项目由多个模块组成:一个模块由多个类组成:一个类由多个方法组成:一个方法由多条语句组成: 按照代码粒度从大到小,可以划分为 ...

  7. C++项目中的extern C {}

    2010-07-10 19:45 by 吴秦, 92864 阅读, 22 评论, 收藏, 编辑 引言 在用C++的项目源码中,经常会不可避免的会看到下面的代码: ? 1 2 3 4 5 6 7 8 9 ...

  8. python导入标准库对象的语句_Python项目中如何优雅的import

    Python项目中如何优雅的import 前言 之前有一篇关于Python编码规范的随笔, 但是写的比较杂乱, 因为提到了import语句, 在篇文章中, 我专门来讲Python项目中如何更好的imp ...

  9. android git提交整个项目_使用子模块和子树来管理 Git 项目 | Linux 中国

    使用子模块和子树来帮助你管理多个存储库中共有的子项目.https://linux.cn/article-12244-1.html作者:Manaswini Das译者:Xiaobin.Liu 如果你参与 ...

最新文章

  1. saber仿真软件_电力电子应用技术的MATLAB仿真
  2. main函数的参数详解,它们是何时何处传入的?(main函数的参数值是从操作系统命令行上获得的)
  3. Flash芯片(硬盘)与RAM芯片(内存)存储信息的区别!
  4. Leetcode_198_House Robber
  5. 二维树状数组 BZOJ 1452 [JSOI2009]Count
  6. 前端(六)——CSS之浮动和定位
  7. [linux] shell脚本编程-统计日志文件中的设备号发通知邮件
  8. function click_click事件的累加问题解决
  9. java 创建日程到期提醒_日程管理工具—Things 3
  10. Bruce Eckel最新演讲:调bug就是浪费生命!放弃吧!(附完整PPT)
  11. 如何估算一个分布式系统的容量
  12. RFID-射频识别技术
  13. 用优启通制作U盘启动盘教程(UEFI版)
  14. css设置单行文本超出部分点点点、多行文本超出部分点点点(两种方法)/解决多行 数字不换行问题。
  15. 谷歌插件.crx文件无法安装
  16. WERTYU - UVA - 10082
  17. idea 编译器注释汉字变繁体字解决办法
  18. 中国电子学会图形化四级编程题:小猫钓鱼
  19. AutoZOOM: Autoencoder-based Zeroth Order Optimization Method for Attacking Black-box Neural Networks
  20. 生成流水号如 LS0000001

热门文章

  1. 安徽GDP首破3万亿 增长8.02%
  2. 客户关系管理(CRM)外包的优势定制的CRM应用
  3. VC6工程升级VS2013汇总
  4. wpf上位机 modbus串口通信,获取收发数据的完整报文
  5. 山东移动用明道云赋能一线,打通业务创新最后一公里
  6. 淘宝客月赚3000元的简单方法
  7. Allegro标注焊盘尺寸
  8. 绿盟科技网络安全威胁周报2017.01 请关注MatrixSSL堆缓冲区溢出漏洞CVE-2016-6890
  9. 企业微信推送天气、课表、纪念日、每日一句等(含源码和详细步骤)
  10. 硬盘零磁道坏的解决办法