- 浏览: 182073 次
- 性别:
- 来自: 杭州
最新评论
-
yanjingan:
通俗易懂 理解的很深 好文章!
ActiveMQ分享(一)JMS简介 -
xyc717:
我去,也不写怎么登陆
windows下的命令行svn客户端 -
少年中国:
赞一个!
Maven和Maven插件 -
springmvc-freemarker:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
Maven和Maven插件 -
u012049463:
谢谢,如果一开始就看这篇文章,又可以少走多少弯路。很具体也很通 ...
ActiveMQ分享(一)JMS简介
在webwork2.2.6版本中,不管是用ServletDispatcher还是FilterDispatcher充当请求转发器(可在web.xml中配置),都会调用到相关Servlet的init或Filter的init方法。
在init方法中,DispatcherUtils.initialize(getServletContext())的调用完成了配置文件的读取、ObjectFactory的设置(也是根据配置文件)。类Configuration充当了读取配置文件的功能。其子类包括:
webwork提供了默认资源文件类型、property资源文件类型,还有DelegatingConfiguration资源文件类型 ,你也可以实现自己的XMLConnfiguration。
查看Configuration类代码,我们可以看到非静态方法,包括isSetImpl(String name)直接返回false,setImpl(String name, Object value)直接抛出异常,这是一种变态的abstract类设计,在需要使用该类的静态方法,却又不愿意调用者实例化该类并调用非静态方法时候,用这种变通的做法也是不错的选择。(因为我们不能同时让static和abstract修饰一个类)。
另外,该做法实现了多态,在这种多态中,子类可以被任意更换,确只保证只有一个之类实例存在。实现方法是在Configuration中建立静态变量static Configuration configurationImpl;调用端可以通过实例化不同的子类赋予configurationImpl。最后通过Configuration.getConfiguration() 获取唯一的实例。
这样的设计在webwork其他地方也经常可见。如ActionProxyFactory及其子类,但是不同的是ActionProxyFactory是absctract的,因为ActionProxyFactory没有设计有静态方法。
这种设计在策略互换且只允许单个策略的情况下相当有用,今天看了这段代码,且做一个笔记。
代码如下:::
public class Configuration { static Configuration configurationImpl; static Configuration defaultImpl; static Locale locale; // Cached locale private static final Log LOG = LogFactory.getLog(Configuration.class); /** * Sets the current configuration implementation. Can only be called once. * * @param config a Configuration implementation * @throws IllegalStateException if an error occurs when setting the configuration implementation. */ public static void setConfiguration(Configuration config) throws IllegalStateException { configurationImpl = config; locale = null; // Reset cached locale } /** * Gets the current configuration implementation. * * @return the current configuration implementation. */ public static Configuration getConfiguration() { return (configurationImpl == null) ? getDefaultConfiguration() : configurationImpl; } /** * Returns the WebWork2 locale. Keys off the property <tt>webwork.locale</tt> which should be set * as the Java {@link java.util.Locale#toString() toString()} representation of a Locale object (i.e., * "en", "de_DE", "_GB", "en_US_WIN", "de__POSIX", "fr_MAC", etc). <p> * <p/> * If no locale is specified then the default VM locale is used ({@link java.util.Locale#getDefault()}). * * @return the WebWork2 locale if specified or the VM default locale. */ public static Locale getLocale() { if (locale == null) { try { StringTokenizer localeTokens = new StringTokenizer(getString(WebWorkConstants.WEBWORK_LOCALE), "_"); String lang = null; String country = null; if (localeTokens.hasMoreTokens()) { lang = localeTokens.nextToken(); } if (localeTokens.hasMoreTokens()) { country = localeTokens.nextToken(); } locale = new Locale(lang, country); } catch (Throwable t) { // Default LOG.warn("Setting locale to the default locale"); locale = Locale.getDefault(); } } return locale; } /** * Determines whether or not a value has been set. Useful for testing for the existance of parameter without * throwing an IllegalArgumentException. * * @param name the name of the property to test. * @return <tt>true</tt> if the property exists and has a value, <tt>false</tt> otherwise. */ public static boolean isSet(String name) { return getConfiguration().isSetImpl(name); } /** * Returns a property as a String. This will throw an <tt>IllegalArgumentException</tt> if an error occurs * while retrieveing the property or if the property doesn't exist. * * @param name the name of the property to get. * @return the property as a String * @throws IllegalArgumentException if an error occurs retrieveing the property or the property does not exist. */ public static String getString(String name) throws IllegalArgumentException { String val = get(name).toString(); return val; } /** * Returns a property as an Object. This will throw an <tt>IllegalArgumentException</tt> if an error occurs * while retrieveing the property or if the property doesn't exist. * * @param name the name of the property to get. * @return the property as an Object. * @throws IllegalArgumentException if an error occurs retrieveing the property or the property does not exist. */ public static Object get(String name) throws IllegalArgumentException { Object val = getConfiguration().getImpl(name); return val; } /** * Returns an Iterator of all properties names. * * @return an Iterator of all properties names. */ public static Iterator list() { return getConfiguration().listImpl(); } /** * Implementation of the {@link #isSet(String)} method. * * @see #isSet(String) */ public boolean isSetImpl(String name) { // this is dumb.. maybe it should just throw an unsupported op like the rest of the *Impl // methods in this class. return false; } /** * Sets a property. Throws an exception if an error occurs when setting the property or if the * Configuration implementation does not support setting properties. * * @param name the name of the property to set. * @param value the property to set. * @throws IllegalArgumentException if an error occurs when setting the property. * @throws UnsupportedOperationException if the config implementation does not support setting properties. */ public static void set(String name, Object value) throws IllegalArgumentException, UnsupportedOperationException { getConfiguration().setImpl(name, value); } /** * Implementation of the {@link #set(String, Object)} method. * * @see #set(String, Object) */ public void setImpl(String name, Object value) throws IllegalArgumentException, UnsupportedOperationException { throw new UnsupportedOperationException("This configuration does not support updating a setting"); } /** * Implementation of the {@link #get(String)} method. * * @see #get(String) */ public Object getImpl(String aName) throws IllegalArgumentException { return null; } /** * Implementation of the {@link #list()} method. * * @see #list() */ public Iterator listImpl() { throw new UnsupportedOperationException("This configuration does not support listing the settings"); } private static Configuration getDefaultConfiguration() { if (defaultImpl == null) { // Create bootstrap implementation defaultImpl = new DefaultConfiguration(); // Create default implementation try { String className = getString(WebWorkConstants.WEBWORK_CONFIGURATION); if (!className.equals(defaultImpl.getClass().getName())) { try { // singleton instances shouldn't be built accessing request or session-specific context data defaultImpl = (Configuration) ObjectFactory.getObjectFactory().buildBean(Thread.currentThread().getContextClassLoader().loadClass(className), null); } catch (Exception e) { LOG.error("Could not instantiate configuration", e); } } } catch (IllegalArgumentException ex) { // ignore } } return defaultImpl; } public static void reset() { defaultImpl = null; configurationImpl = null; } }
发表评论
-
mvnDebug的配置项
2010-11-22 10:23 7431在maven上debug,经常跟jetty或tomcat插件在 ... -
jmeter性能测试入门
2010-10-08 18:31 0有机会接触了性能测试,对jmeter做一个简单的入门介绍 -
java.lang.LinkageError: loader constraint violation的错误
2010-10-08 17:26 34378java.lang.LinkageError: loader ... -
一次性能测试的总结
2010-10-08 16:02 2451有机会做了一次性能测试工作,主要是预研性质的工作。开发人员有必 ... -
JMX
2010-08-08 14:10 0JMX:Java Management Extensions( ... -
Maven和Maven插件
2010-07-31 15:18 10772人生是一张茶几,上面 ... -
ActiveMQ分享(一)JMS简介
2010-07-31 14:09 16973一、概述 Message,即消息。人与人之间通过消息传递 ... -
BigDecimal的8种舍入方式
2010-04-26 15:32 1944在银行、帐户、计费等领域,BigDecimal提供了精确的数值 ... -
持续集成hudson入门
2010-04-07 13:44 30036极限编程中一项建议实践便是持续集成,持续集成是指在开发 ... -
数值区间正则表达式写法
2010-02-04 09:21 4646数值型正则在实际应用中还是比较多见的,如判读合法IP段 ... -
线程同步模型, 生产者/消费者, 读写同步,线程池,concurrent map
2009-05-31 10:13 216生产者/消费者模型 有了信号量这个利器,我们就可以处理比较 ... -
线程同步
2009-05-31 09:47 72作者 : buaawhl 我们可以 ... -
ibatis 模糊查询单引号处理
2009-05-23 21:57 174ibatis 查询中,我们通常用#或$来获取变量或对象的值作为 ...
相关推荐
webwork 2.2.6 中文版本,然后编译生成chm格式,方面查看。
WebWork 2.2.6 API 是一个针对Java Web应用程序的框架,它提供了一种模型-视图-控制器(MVC)架构,帮助开发者构建可维护、可扩展且易于调试的Web应用。WebWork的核心特性包括强大的动作映射、类型安全的参数绑定、...
WebWork是一个基于Java的MVC(Model-View-Controller)框架,它在早期的Web开发中扮演了重要的角色,提供了强大的Action和表单处理能力。WebWork 2.2.7是该框架的一个版本,其主要目的是为了简化企业级Web应用的开发...
在深入理解WebWork源码之前,我们首先需要了解一些基本概念。 1. **MVC模式**:WebWork基于MVC模式设计,它将应用程序的逻辑分为三部分:模型负责业务处理,视图负责数据展示,控制器负责接收请求并调用模型进行...
WebWork源码分析: WebWork的核心在于它的Action系统,它通过处理用户请求并调用相应的业务逻辑来驱动应用程序。源码中包含了Action、Interceptor、Result等关键组件的实现。Action是处理用户请求的入口点,...
本实例源码是针对初学者的一个基础入门项目,通过它我们可以深入理解WebWork的核心概念和工作原理。 WebWork的核心特性包括: 1. **Action与DispatcherServlet**:WebWork中的Action类是处理用户请求的核心,它们...
通过阅读和分析`oscore-2.2.6.jar`中的源码,我们可以深入理解WebWork如何在后台处理请求,如何将动作映射到具体的业务逻辑,并最终如何将结果呈现给用户。 压缩包中的`webwork`目录可能包含WebWork框架的具体实现...
是webwork中的一个jar包
WebWork框架的特点之一是其灵活性,它允许开发者根据项目需求选择最适合的技术栈。此外,WebWork还提供了丰富的插件和扩展机制,使得定制化变得更加容易。 #### 二、WebWork-2.2.5版本概述 WebWork-2.2.5是该框架...
### 剖析WebWork源码 #### WebWork框架概述 WebWork是一个开源的Java Web应用框架,由OpenSymphony组织开发。它采用MVC(Model-View-Controller)架构模式,旨在帮助开发者构建可扩展、易于维护的Web应用程序。...
webwork-2.1.6.jar
Webwork2是一款基于Java的开源框架,主要用于构建企业级的Web应用程序。这个框架以其强大的MVC(模型-视图-控制器)架构而闻名,能够帮助开发者实现高效、可维护的代码结构。OpenDoc出品的"Webwork2开发指南.pdf"是...
WebWork是早期的一个框架,后来发展成为了Struts2的核心,因此深入理解WebWork的源码对于学习和提升Struts2的应用技能至关重要。 首先,让我们来探讨一下WebWork。WebWork是一个轻量级的MVC框架,它引入了许多创新...
### 剖析webwork源码:深入了解Struts2.0核心技术 #### WebWork与Struts2.0的关系 WebWork框架,作为Struts2.0的核心技术之一,源自于OpenSymphony组织的开源项目,旨在提供一种组件化和代码重用的MVC模式解决方案...
博文链接:https://melet.iteye.com/blog/102700
### 剖析Webwork源码:深入了解Webwork框架的核心机制 #### Webwork框架概览 Webwork,作为OpenSymphony旗下的一款开源项目,自2004年起便以其独特的设计理念吸引了众多开发者的眼球。其核心目标在于提供一种组件...
而"webwork"这个文件可能是一个解压后的目录结构,包含了WebWork1.4的源码、配置文件、示例应用等内容。通过深入研究这些源代码,开发者可以更深入地了解WebWork的工作方式,并学习如何将其应用于实际项目中。对于想...
下面将详细探讨SWFupload的工作原理、主要特性、使用方法以及与Struts1和WebWork2.2.6框架的集成。 ### 1. 工作原理 SWFupload利用了Adobe Flash技术,因为Flash支持在浏览器中处理大文件和多文件上传,而...
《XWork源代码详解——深度剖析WebWork框架基础》 XWork源代码是WebWork框架的核心组成部分,WebWork是一...通过研究XWork源码,开发者可以更好地理解Web应用程序的内部工作原理,从而提升开发技能和解决问题的能力。