sakai项目中chat子模块解读
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子模块解读相关推荐
- Maven 单独构建多模块项目中的子模块
在多模块的maven项目中 , 如果需要部署某个子模块 , 单独构建则会报错 , 如果构建整个项目 , 又会非常耗时 . maven为自定义构建部分项目提供了支持 : -pl, --projects构 ...
- android+jacoco多模块项目中统计子模块代码覆盖率
上一次做了单项目的代码覆盖率统计,但是在实际的项目中,都是已模块开发为主. 研究了一下怎么去统计子模块中的代码覆盖率. 整体思路: 1:既然是多模块的代码覆盖率统计,所以子模块必须也要是用jacoco ...
- git 子模块在项目中的使用
在公司的项目中, 经常会遇到一些公共的内容, 多个项目中间通用的, 不可能每次都将整个代码复制一遍, 遇到这种情况有很多不同的解决方案, 一般来说, 项目是通过 git 来管理的, 巧了, git 也 ...
- git项目中的子git项目_使用子模块和子树管理Git项目
git项目中的子git项目 如果您从事开源开发,则可能与Git一起管理源代码. 您可能遇到过具有大量依赖项和/或子项目的项目. 您如何管理它们? 对于开源组织,为社区和产品实现单源文档和依赖性管理可能 ...
- maven同一个项目中,一个子模块引用另一个子模块的类的方法
1.首先在一个项目中创建两个子模块,如: 2.在common-api的pom.xml添加版本号,如: 3.在use-common-api的pom.xml中添加如下依赖: <dependencie ...
- 对Android和iOS项目中的模块结构和类结构设计的探讨
1. 现有的代码规范缺少探讨的部分 1.1 关于项目的代码结构 通常来说,一个项目由多个模块组成:一个模块由多个类组成:一个类由多个方法组成:一个方法由多条语句组成: 按照代码粒度从大到小,可以划分为 ...
- C++项目中的extern C {}
2010-07-10 19:45 by 吴秦, 92864 阅读, 22 评论, 收藏, 编辑 引言 在用C++的项目源码中,经常会不可避免的会看到下面的代码: ? 1 2 3 4 5 6 7 8 9 ...
- python导入标准库对象的语句_Python项目中如何优雅的import
Python项目中如何优雅的import 前言 之前有一篇关于Python编码规范的随笔, 但是写的比较杂乱, 因为提到了import语句, 在篇文章中, 我专门来讲Python项目中如何更好的imp ...
- android git提交整个项目_使用子模块和子树来管理 Git 项目 | Linux 中国
使用子模块和子树来帮助你管理多个存储库中共有的子项目.https://linux.cn/article-12244-1.html作者:Manaswini Das译者:Xiaobin.Liu 如果你参与 ...
最新文章
- saber仿真软件_电力电子应用技术的MATLAB仿真
- main函数的参数详解,它们是何时何处传入的?(main函数的参数值是从操作系统命令行上获得的)
- Flash芯片(硬盘)与RAM芯片(内存)存储信息的区别!
- Leetcode_198_House Robber
- 二维树状数组 BZOJ 1452 [JSOI2009]Count
- 前端(六)——CSS之浮动和定位
- [linux] shell脚本编程-统计日志文件中的设备号发通知邮件
- function click_click事件的累加问题解决
- java 创建日程到期提醒_日程管理工具—Things 3
- Bruce Eckel最新演讲:调bug就是浪费生命!放弃吧!(附完整PPT)
- 如何估算一个分布式系统的容量
- RFID-射频识别技术
- 用优启通制作U盘启动盘教程(UEFI版)
- css设置单行文本超出部分点点点、多行文本超出部分点点点(两种方法)/解决多行 数字不换行问题。
- 谷歌插件.crx文件无法安装
- WERTYU - UVA - 10082
- idea 编译器注释汉字变繁体字解决办法
- 中国电子学会图形化四级编程题:小猫钓鱼
- AutoZOOM: Autoencoder-based Zeroth Order Optimization Method for Attacking Black-box Neural Networks
- 生成流水号如 LS0000001