1.精通JSF编辑推荐
2.JSF源码分析(一)
3.shaleçä¼å¿
4.用jsf的好处
精通JSF编辑推荐
前端技术是现代Web开发的核心,而JavaScript、Ajax等技术的应用是构建动态、交互性强的网站的关键。JSF(JavaServer Faces)作为一种基于Java的Web应用开发框架,提供了一种简洁、黑程序源码高效的方式来构建复杂的Web应用程序。通过整合JSF与其他关键技术,如Spring、Hibernate、EJB等,开发者能够构建出高性能、可维护的Web应用。 JSF框架不仅提供了一套强大的页面布局方案,还支持JavaScript和Ajax的集成,使得开发者能够在不重新加载整个页面的情况下更新数据,提升了用户体验。此外,JSF的doctor配置Android源码组件系统允许开发者快速构建丰富的Web界面,托管Bean和导航功能则为应用提供了灵活的业务逻辑支持和导航能力。转换器和验证器的使用确保了数据的正确性和一致性,而国际化功能则让应用能够支持多语言环境,增强了应用的全球可用性。 在实战开发方面,文章提供了四大案例来帮助读者提高项目实战水平。留言本系统结合JSF和JDBC,展示了如何通过数据库操作实现用户留言的存储和检索;博客管理系统利用JSF、Facelets和iBATIS,展示了如何构建一个具备用户管理、文章发表和分类展示功能的博客平台;新闻发布系统采用JSF和EJB,展示了复杂业务逻辑的实现和面向服务的架构设计;在线宠物店则通过JSF、Spring和Hibernate的整合,展示了如何构建一个包含商品管理、购物车、用户注册和支付功能的电商平台。每个案例都包含了详细的开发步骤和源代码,帮助读者理解从概念到实现的网站+投票+脚本+源码全过程。 为了进一步增强学习体验,文章提供了长达多分钟的开发视频,涵盖从环境配置到系统实现的每个细节,为读者提供了一站式的解决方案。无论是初学者还是经验丰富的开发者,都能从中受益,提升自己的技能水平。通过本文章的学习,读者不仅能够掌握JSF等前沿技术的实际应用,还能够深入理解Web开发中的各种设计模式和最佳实践,为构建高质量的Web应用奠定坚实的基础。扩展资料
《精通JSF——基于EJBHibernateSpring整合开发与项目实践》适合正在开发JavaWeb应用的架构师、应用开发人员阅读,也可作为大中专院校相关专业学生的教程及编程爱好者的自学用书。JSF源码分析(一)
在深入分析 JSF 框架的源码时,我们首先关注的是核心的功能模块,以帮助我们理解其工作原理。通常,漫画软件源码+js我们从常见的项目 XML 配置文件入手,这些文件包含了 JSF 框架的基本设置。让我们以地址服务的 jsf-provider.xml 文件为例,进行详细的解析。
在 JSF 的配置文件中,虽然没有直接显示注册中心的内容,但作为自研的高性能 RPC 调用框架,高可用的注册中心是其核心功能之一。因此,我们接下来将探索如何在没有提供注册中心地址的情况下,这些标签是如何完成服务的注册和订阅的。
### 配置解析
首先,我们发现配置文件中自定义的 xsd 文件,通过 NamespaceUri 链接到 jsf.jd.com/schema/jsf/j...。随后,基于 SPI(Service Provider Interface)机制,我们在 META-INF 中找到了定义好的 Spring.handlers 文件和 Spring.schemas 文件,这两个文件分别用于配置解析器和 xsd 文件的文章相似度+源码具体路径。
进一步地,我们查询了继承自 NamespaceHandlerSupport 或实现 NamespaceHandler 接口的类。在 JSF 框架中,JSFNamespaceHandler 通过继承 NamespaceHandlerSupport 实现了对自定义命名空间的解析功能。NamespaceHandler 的主要作用是解析我们自定义的 JSF 命名空间,通过 BeanDefinitionParser 对特定标签进行处理,完成对 XML 中配置信息的具体处理。
### 服务暴露
最终,通过 JSFBeanDefinitionParser 实现了 org.springframework.beans.factory.xml.BeanDefinitionParser,完成 XML 配置的解析。解析的结果会注册到 BeanDefinitionRegistry 对象中,进而触发 Bean 的初始化过程。最终,ProviderBean 实例监听上下文事件,在容器初始化完毕后,调用 export() 方法进行服务的暴露。
### 服务注册与暴露
服务暴露的实现逻辑集中在 ProviderConfig#doExport 方法中。首先,方法会对配置进行基本校验和拦截。随后,获取所有 RegistryConfig,如果获取不到注册中心地址,将使用默认的注册中心地址:“i.jsf.jd.com”。接着,根据 Provider 配置中的 server 相关信息启动 server,并使用默认序列化方式(如 msgpack)进行服务编码。然后,通过 ServerFactory 初始化并启动 Server,调用 ServerTransportFactory 生成对应的传输层,实现与注册中心的通信。最后,服务注册通过 JSFRegistry 类完成,该类连接注册中心,如果没有可用的中心,则使用本地文件并开启守护线程,使用两个线程池进行心跳检测、重试机制和连接状态监控。至此,服务从配置装配到服务暴露的过程完成。
### 消费者配置与初始化
对于消费者端(jsf-consumer.xml),注册中心地址(如“i.jsf.jd.com”)被配置在其中,而 Provider 的配置则在 jsf-provider.xml 中。配置解析过程与 Provider 类似,最终解析为 ConsumerConfig 和 RegistryConfig。通过 ConsumerBean 类实现 FactoryBean 接口,以便通过 getObject() 方法获取代理对象,完成客户端的初始化。在这个过程中,消费者会根据配置订阅相关的 Provider 服务。核心代码在 ConsumerConfig#refer 方法中,该方法通过调用子类的 subscribe() 方法开始订阅过程,连接 Provider 服务。
### 框架流程概述
综上所述,JSF 框架通过 Provider、Consumer 和注册中心(Registry)之间的协同工作,实现了高效的服务注册、订阅和通信。具体流程包括:
1. **Provider 端**:启动服务向注册中心注册,并根据配置初始化相关组件。
2. **Consumer 端**:首次获取实体信息时,通过 FactoryBean 接口获取代理对象,完成初始化并订阅 Provider 服务。
3. **注册中心**:提供异步通知机制,监控服务状态变化。
4. **服务调用**:直接调用服务方法。
5. **监控与治理**:框架内置监控机制,支持服务治理和降级容灾策略。
了解这一过程对于深入理解 JSF 框架的内部机制至关重要,也为后续的模块分析和系统优化提供了基础。
shaleçä¼å¿
ç»ä»¶æ¯StrutsåJSFä¹é´æ大çåºå«ãå°±åSwingä¸æ ·ï¼JSFæä¾ä¸°å¯çåºå±æ件å»å¼åç»ä»¶ç¶åæ·»å å°æ åçç»ä»¶éãé£äºåºå±æä»¶è®©ä½ å¾å®¹æççæèªå·±çç»ä»¶å¹¶ä¸åå«äººå ±äº«ãç°å¨æ们å°å¤é½è½çå°èªå®ä¹ç»ä»¶è·³åºæ¥ï¼æ¯å¦è¯´OracleçADFåMyFacesï¼ä¸¤è é½æä¾äºä¸°å¯çç»ä»¶éï¼å°±åjavascriptæ¥åï¼treeççãå½ç¶ï¼ç»ä»¶åªæ¯ä¸é¨åãå ¸åçæ¯ï¼ç»ä»¶é½åä¸ä¸ªç¬ç«çrenderer对åºï¼è¿ç»æ们带æ¥äºçæ£ç好å¤ï¼ç第3æ¡ï¼ãä½æ¯åJSFä¸çå¾å¤ä¸è¥¿ä¸æ ·ï¼ä½ ä¸ä¸å®è¦å¢¨å®æè§ãåªè¦ä½ æ¿æï¼ä½ å¯ä»¥å®ç°renderèªå·±çç»ä»¶ï¼è½ç¶è¿æ ·ä½ ä¼å¤±å»ç»ç»ä»¶å å ¥å«çrendererçè½åã ä½ æçè¿Strutsçæ ç¾çæºä»£ç åï¼å®ç´æ¥çæHTMLãJSFç»ä»¶æ ç¾ä»ä¹é½ä¸çæï¼å®åæå¡å¨ä¸çä¸å¯¹component-renderer对åºãComponentç»´æ¤ç»ä»¶ç¶æï¼renderedè´è´£è·å¾è§å¾ãéç¹æ¯renderersæ¯å¯ææçï¼å³ä½ å¯ä»¥æ ¹æ®èªå·±éæ±å®ç°ç¶åæ¿ä»£æé»è®¤å®ç°ãæ¯å¦è¯´æå¨NFJSä¸é¢çFelixè°è¯ä¸ä¸¾ä¾è¯´æäºæä¹å»å®ç°ä¸ä¸ªèªå®ä¹çlabel rendererãä½ åªéè¦é ç½®ä½ çrendererï¼JSFå°±ä¼èªå¨å¨ä½ çåºç¨ç¨åºéé¢ä½¿ç¨ä»ã
4.Value Binding Expressionsï¼å¼ç»å®è¡¨è¾¾å¼ï¼
å¨Strutsä¸ï¼ä½ è´è´£ææ°æ®ä»Formä¼ éå°æ¨¡å对象ãä½ å®ç°çActionçexecuteæ¹æ³æ¯æFormä½ä¸ºä¸ä¸ªåæ°ãç¶åä½ åæå¨çææ°æ®ä»Form Beanéé¢ååºæ¾å°æ¨¡å对象éé¢ãä½ è¦ä¸ºåºç¨éé¢çæ¯ä¸ªFormåè¿äºäºæ ï¼ç¶èå¨JSFéé¢ï¼ä½ åªéåè¿æ ·ï¼#{ model.property} å°±å¤äºï¼å ¶ä»ç交ç»JSFæ¥å¤çã
5.Event Modelï¼äºä»¶æ¨¡åï¼
JSFçäºä»¶æ¨¡åä½¿ä½ å¯ä»¥å¯¹å¼æ¹åï¼å¨ä½ï¼JSFçå½å¨æé¶æ®µåæ¢çä½åºååºãå¨JSF1.1ä¸ï¼é£äºäºä»¶é½æ¯å¨æå¡å¨ç«¯å¤ççï¼è¿è¯å®æ¯ä¸ä¸ªç¼ºé·ï¼å¥½å¨JSF2.0计åæ¯æ客æ·ç«¯äºä»¶ï¼æç®ä»¥å¾ å§ã
6.Extensibility(å¯æ©å±æ§)
è¿ä¸ªå¾éè¦ãJSFæ6个对象å®ç°äºè¿ä¸ªæ¡æ¶ç大é¨ååè½ï¼èä¸ä½ å¯ä»¥å¾å®¹æçç¨ä½ èªå·±çå®ç°ä»£æ¿åæå®ç°ãæ¯å¦ä½ æ³å ä¸ä¸ªèªå®ä¹åæ°å¨JSF表达å¼è¯è¨éé¢ï¼ææ¯æ·»å ä¸ä¸ªèªå·±çè§å¾æ§å¶å¨ä»¥ä¾¿äºåºåç»ä»¶åHTMLãäºå®ä¸Shaleå®ç°äºä¸é¢çåè½ãå¦æä½ è¿æ²¡æ满足ï¼JSFæä¾äºå 个å°æ¹ä½ å¯ä»¥è½»æ¾çæ§å¶JSFççå½å¨æãShaleç»ä½ çä¼æ´å¤ã
7.Managed Beans(Dependency Injection ä¾èµæ³¨å ¥)
åSpringä¸æ ·ï¼JSFä¹ä½¿ç¨äºä¾èµæ³¨å ¥ï¼DJï¼ï¼ææ§å¶å转ï¼IoCï¼ï¼å»å®ä¾åååå§åBeanãStrutsçç¡®ä¸ºä½ çæäºForm BeanåAction Beanï¼ä½æ¯JSFå¯ä»¥ä¸ºä½ çæåç§åæ ·çManaged Beanã
8.POJO Action Methods
Strutsçè¡ä¸ºæ¯åStrutsçAPIç»å®å¨ä¸èµ·çï¼ä½æ¯JSFçè¡ä¸ºæ¹æ³å¯ä»¥å¨POJPOä¸å®ç°ãè¿æå³çä½ ä¸ç¨å¨è¡¨åå模å对象ä¹é´å®ç°ä¸ä¸ªå¤ä½çè¡ä¸ºå±ã顺便说ä¸ä¸ï¼å¨JSFéé¢æ²¡æè¡ä¸ºå¯¹è±¡ï¼è¡ä¸ºå¨æ¨¡å对象ä¸å®ç°ã
ä½æ¯ä¹è¯·æ³¨æä¸ç¹ï¼å¦æä½ æ¿æä½ ä¹å¯ä»¥çæä¸JSFç¬ç«çè¡ä¸ºå¯¹è±¡ãå¨Strutséé¢ï¼ä½ æForm BeanåAction BeanãForm Beanå å«æ°æ®èAction Beanå å«é»è¾ãOOçä¼æ³å»å并å2è ï¼å¨Strutsä½ åä¸å°ãä½æ¯å¨JSFä¸ï¼ä½ å¯ä»¥åå¼æ°æ®åé»è¾ï¼ä¹å¯ä»¥å并å°ä¸ä¸ªå¯¹è±¡ä¸ï¼ä¸åç±ä½ å³å®ã
9.JSF is the standard(JSFæ¯æ å)
J2EE5.0è¦æä¾ä¸ä¸ªJSFçå®ç°ï¼è¿è¡¨æJSFä¸ä¹ å°ä¼æ å¤ä¸å¨ãè¿å¯è½ä¸ä½ æ å ³ï¼ä½æ¯åå·¥å ·ä¾åºåå¯åç¸å ³ãç°å¨å¤§æ¦æ个Java webåºç¨ç¨åºæ¡æ¶ï¼å·¥å ·ä¾åºåä¸ä¼æ æ¿å»æ¯æä¸ä¸ªç¹å«çæ¡æ¶ï¼ä½æ¯ä»ä»¬ä¼æ¯«ä¸ç¹è±«çå»æ¯æä¸ä¸ªæ åã
èä¸ä¸æ¢ä¾åºåï¼å¼æºé¡¹ç®ä¹ä¼è¿ éçèéå¨JSFçåå¨ï¼äºå æåçå»å®ç°ç¸åçåè½ãæ¯å¦è¯´ï¼ç´å°æ们å»å®ç°æ¬è´¨ä¸åShaleçTapestryå·®ä¸å¤çè§å¾çæ¶åï¼ææç¥éFacaletsãï¼ä»é¿è¿æ¥çï¼æç¸ä¿¡è¿ç§åä½æ¯ä»¶å¥½äºï¼ä¼ç»æ们带æ¥å¥½å¤ï¼
.There's only one Struts(åªæä¸ä¸ªStruts)
Strutsæ¯ä¸ä¸ªå¼æºäº§åï¼ç¶èJSFæ¯ä¸ä¸ªæ åãè¿ä¸ªç»è常常被æ°çJSFå¦ä¹ è 忽ç¥ï¼å ¶å®è¿æ¯æ¾èæè§çï¼å 为æ们æå¤ä¸ªJSFçå®ç°ãè½ç¶JSFè¿å¾ä¸æçï¼ä½æ¯æ们已ç»æäº2个ä¼ç§çJSFå®ç°å¯ä»¥éæ©ï¼Sunçåèå®ç°åApacheçMyFacesãå¦ä¸æ¹é¢ï¼æ们åªæä¸ä¸ªStrutsã
用jsf的好处
JSF本身是个框架,既然是框架,那么有很多组件就是已经写好的了,我们只要往里面嵌套内容和修改样式就好了。譬如一个菜单项,我们可能需要又定义ul标签,又加CSS+JS,实现起来不是很复杂,但是总写这类代码人也会厌烦,那么JSF就提供了tr:panelTabbed标签
<tr:panelTabbed>
<tr:showDetailItem text="标签1">
内容1
</tr:showDetailItem>
<tr:showDetailItem text="标签2">
内容2
</tr:showDetailItem>
<tr:showDetailItem text="标签3">
内容3
</tr:showDetailItem>
</tr:panelTabbed>
就从框架而言这个节省我们的开发时间就是一个相当大的好处。
其他还有JSF安全性比较好,因为很多代码都是他自定义生成的,说实话,我查看源代码的时候脑袋都大了,如果真有耐性的朋友去破解JSF的话,我一点脾气都没有了!
目前JSF的技术也在升级,并且和AJAX的兼容性更好了,1.0版本的JSF和AJAX兼容性不是很好(也许是我学艺不精),在JSF中的AJAX技术也是实现了的,俗称PPR,这个也就是部分刷新机制,效果很不错。
总结下,JSF是一个自定义标签的框架,最好的大处就是便于开发者开发项目。
不管你用没用,反正我用了!