??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲AV日韩精品久久久久久久 ,国产偷国产偷亚洲高清在线,亚洲一区二区三区国产精品无码http://m.tkk7.com/tij/archive/2008/05/06/198692.html未必这么写未必这么写Tue, 06 May 2008 06:11:00 GMThttp://m.tkk7.com/tij/archive/2008/05/06/198692.htmlhttp://m.tkk7.com/tij/comments/198692.htmlhttp://m.tkk7.com/tij/archive/2008/05/06/198692.html#Feedback1http://m.tkk7.com/tij/comments/commentRss/198692.htmlhttp://m.tkk7.com/tij/services/trackbacks/198692.html暂时惛_了这么多Q?/p>

eclilpseQ日蚀, 月蚀Q??sun

hibernateQ冬眠) ?spring

jakartaQ雅加达Q与java

tomcat里各个组件从上到下:catalinaQ远E蘪炸机QtomcatQ雄猫蘪炸机f14Qbootstap
(引导Qengine(发动机)host context



未必这么写 2008-05-06 14:11 发表评论
]]>
checked exception和unchecked exception http://m.tkk7.com/tij/archive/2008/05/06/198612.html未必这么写未必这么写Mon, 05 May 2008 18:03:00 GMThttp://m.tkk7.com/tij/archive/2008/05/06/198612.htmlhttp://m.tkk7.com/tij/comments/198612.htmlhttp://m.tkk7.com/tij/archive/2008/05/06/198612.html#Feedback0http://m.tkk7.com/tij/comments/commentRss/198612.htmlhttp://m.tkk7.com/tij/services/trackbacks/198612.html unchecked exception也就是runtime excerption 它的抛出通常是因为我们程序自w的问题 也就是说 我们~的E序问有问题 我们不用抛出q类异常 ~译器会帮我们抛出的
而checked exception是像IOExceptionq样的异?通常是需要程序员抛出?也是通过try catch或者throw来抛出的


未必这么写 2008-05-06 02:03 发表评论
]]>
MessageResourceshttp://m.tkk7.com/tij/archive/2008/05/04/198115.html未必这么写未必这么写Sun, 04 May 2008 07:35:00 GMThttp://m.tkk7.com/tij/archive/2008/05/04/198115.htmlhttp://m.tkk7.com/tij/comments/198115.htmlhttp://m.tkk7.com/tij/archive/2008/05/04/198115.html#Feedback0http://m.tkk7.com/tij/comments/commentRss/198115.htmlhttp://m.tkk7.com/tij/services/trackbacks/198115.html1.usage of MessageResources

import org.apache.struts.util.MessageResources;

MessageResources messages =MessageResources.getMessageResources("cn/edu/ouc/ky2/ApplicationResources");

messages.getMessage("experts.MAJOR_NAME")

2.普通的javac?q样更ؓ通用一?/p>

MessageResources resources =(MessageResources) pageContext.getServletContext().getAttribute(Globals.MESSAGES_KEY);
out.println(resources.getMessage("experts.MAJOR_NAME"));

MessageResources messages = getResources(request);

在ActioncM定义了getResources(HttpServletRequest request)ҎQ该Ҏq回当前默认的MessageResources对象Q它装了Resource Bundle中的文本内容。接下来Actioncd可以通过MessageResources对象来访问文本内宏V例如,如果要读取消息key?#8220;hello.jsp.title”对应的文本内容,可以调用MessageResourcescȝgetMessage(String key)ҎQ?br /> String title=messages.getMessage("hello.jsp.title");


未必这么写 2008-05-04 15:35 发表评论
]]>
Log4j最入门http://m.tkk7.com/tij/archive/2008/05/04/198085.html未必这么写未必这么写Sun, 04 May 2008 07:05:00 GMThttp://m.tkk7.com/tij/archive/2008/05/04/198085.htmlhttp://m.tkk7.com/tij/comments/198085.htmlhttp://m.tkk7.com/tij/archive/2008/05/04/198085.html#Feedback1http://m.tkk7.com/tij/comments/commentRss/198085.htmlhttp://m.tkk7.com/tij/services/trackbacks/198085.htmlLog4j最入门

by zhlmmc

Log4j实在是很熟悉Q几乎所有的Java目都用它啊。但是我一直没有搞明白。终于有一天我受不了了Q定下心ȝ了一把文,才两个小Ӟ我终于搞明白了。一般情况下Log4jL?/span>Apache Commons-logging一L的,我也׃起介l吧。多了个东西不是更麻烦,而是更简单!

<!--[if !supportLists]-->一?/span><!--[endif]-->Log4j的简单思想

Log4j真的很简单,单到令h发指的地步。不是要记录日志吗?那就l你一?/span>LogQ然后你?/span>Log来写东西p了,先来一个完整类CZQ?/span>

package test;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

public class Test {

        static Log log = LogFactory.getLog(Test.class);

        public void log(){

           log.debug("Debug info.");

           log.info("Info info");

           log.warn("Warn info");

           log.error("Error info");

           log.fatal("Fatal info");

        }

        /**

         * @param args

         */

        public static void main(String[] args) {

           Test test = new Test();

           test.log();

        }

}

别怕,看完q篇文章你就会觉得很单了?/span>

        Log4j默认把日志信息分Z个等U?/span>

        debug < info < warn < error < fatal

虽然可以自己d{Q但是我觉得没有必要Q五个够用了吧!你要写入信息的时候就把信息归Z个等U中的一个,然后调用相应的函数即可?/span>

    分五个等U到底有什么用呢?日志信息到底写到哪里MQ?/span>

    “LogFactory.getLog(Test.class)”又是什么意思捏Q接着往下看吧!

Log4j的关键之处在于它的承思想。也是一?/span>Log可以l承另外一?/span>Log的属性(输出到哪里,日志{Q日志格式等{)。怎么l承Q?/span>

Log4j是根?/span>Log的名字来判断l承关系的,比如Q?/span>

名字?#8220;com.zhlmmc.lib”?/span>Log是“com.zhlmmc.lib.log”?/span>parentQ明白了吧!Log4jq有一?/span>rootLoggerQ相当于Java?/span>Object?/span>

回过头来?#8220;LogFactory.getLog(Test.class)”q里?#8220;Test.class”事实上传q去的是Testq个cȝ完整路径Q包?/span>+cdQ,“test.Test”。这样如果存?#8220;test”q个Log那么Testq个Logq承它Q否则就l承rootLogger?/span> 

    那具体的Log属性是在哪里定义的呢?

<!--[if !supportLists]-->二?/span><!--[endif]-->常见的配|文?/span>

虽然可以?/span>xml或者在q行时用Java来配|?/span>Log4jQ但q是properties文g好用啊!

log4j.rootLogger=info, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.

log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

分析一下:

W一行,配置log4j.rootLogger你明白吧。应为它是根Qd配置一下,否则别的Logl承什么啊。其他的Log可以配置也可以不配置。等号后面的W一个参数表C日志别,可以填五个别中的一U,后面的参数都是让Log知道输出到哪里,如果你想让日志输出到两个地方加两个输出参数Q比如:

 

log4j.rootLogger=info, stdout, file

q里?/span>info表示Q该Log的日志别ؓinfoQ所有别小?/span>info的日志都不会被记录。比如用这个配|文件的话,我刚开始D的那个类?/span>

 

log.debug("Debug info.");

q句话是不v作用的,因ؓdebug的别小?/span>info。这样就很容易控制什么信息在调试的时候要昄Q什么信息在发布的时候要L。这些都不用改代码,很方便吧?/span>

但,stdout?/span>file又是什么呢Q?/span>

接着往下看Q就是配|?/span>stdout了,q个名字是随便取的,你可以叫?/span>AQ?/span>

 

log4j.appender.A=org.apache.log4j.ConsoleAppender

那么上面?/span>rootLogger的参?/span>stdout也要ҎAQ其他用到的地方当然也要攏V这里的关键不是名字Q而是appendercdQ比如这里的“ConsoleAppender”Q看明白了吧Q输出到Console。后面两行都是设|日志格式的Q一般情况下你就照抄吧。既然是最入门x于理?/span>Log4j的工作原理,我就不介l?/span>filecd?/span>appender了,一搜一大把?/span>

在实际的目开发中Q很可能遇到所引用的包?/span>Log4j来记录日志,比如Hibernate。那么在q里你可以很Ҏ的控制这个包如何记录日志。比如在上面的配|文件中加一行:

 

log4j.logger.org.hibernate=fatal

    那么所?/span>org.hibernate包下面的cd只会昄很少的信息,因ؓfatal的别最高啊?/span>

<!--[if !supportLists]-->三?/span><!--[endif]-->部v

别怕,q可不是部vTomcat。把log4j的包?/span>commons-logging的包Q加在一h两个Q放?/span>classpath下面。然后把配置文g保存?/span>log4j.propertiesQ也攑֜classpath下面Q如果用Eclipse的话Q放?/span>src目录下即可)。然后你可以跑了?/span>



未必这么写 2008-05-04 15:05 发表评论
]]>
actionMessages()QactionError()介绍http://m.tkk7.com/tij/archive/2008/05/04/198077.html未必这么写未必这么写Sun, 04 May 2008 07:00:00 GMThttp://m.tkk7.com/tij/archive/2008/05/04/198077.htmlhttp://m.tkk7.com/tij/comments/198077.htmlhttp://m.tkk7.com/tij/archive/2008/05/04/198077.html#Feedback2http://m.tkk7.com/tij/comments/commentRss/198077.htmlhttp://m.tkk7.com/tij/services/trackbacks/198077.html管Struts框架提供了有效的异常处理机制Q但不能保证处理所有的错误Q这时Struts框架会把错误抛给Web容器Q在默认情况下Web容器会向用户览器直接返回原始信息。如果想避免直接让用L到这些原始信息,可以在web.xml中配|?lt;error-page>元素Q以下代码演CZ如何避免用户看到HTTP 404、HTTP 500错误和Exception异常?br />
web.xml:
  <error-page>
    <error-code>404</error-code>
    <location>/exception/error404.jsp</location>
  </error-page>
  <error-page>
    <error-code>500</error-code>
    <location>/exception/error500.jsp</location>
  </error-page>
  <error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/exception/default.jsp</location>
  </error-page>
当WEB容器捕获到exception-type或error-code指定的错误时蟩到由location指定的页面?br />
?问题Q当form bean 为动态beanӞ在action中无法对form bean数据q行验证Q因为formbean没有具体实现cRaction中无法引?br /> ?ActionError/ActionErrors/ActionMessage/ActionMessages:

有时候你需要向用户提供相关处理信息Q包括表单验证时发现错误{?br /> 1. 相关cMl:
ActionMessageQ用于保存一个与资源束对应的提示信息。主要构造函数如Q?br /> ActionMessage(String message)Q?br /> ActionMessage(String message,paramater)?br />
ActionMessages:用于保存多个ActionMessage。ƈ在html:errors 和html:messages中v作用?br /> 主要构造函敎ͼ
ActionMessages().
主要Ҏ是add(String property,ActionMessage message)
ActionMessages有一个HashMapcdmessages保存多个ActionMessage对象Q每个ActionMessage对象都有唯一的一个property标识。这个property可以是自定义的Q意字W串Q也可以由org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE指定
html:messages/html:errors使用property属性访问某个资?br />
ActionErrorsQ用于保存一个与资源束对应的错误信息。用法跟ActionMessages差不多?br /> ActionError不赞成用?br />

2. 版本Q?br /> struts1.1中用ActionErrors报告错误Q用ActionMessages提供信息?br /> 在struts1.2中用ActionMessages提供信息和错误,不赞成用ActionError
struts1.3中已l没有ActionErrorcM?br />
3Q?AtionErrors和ActionMessages的区?br />
1Q?ActionErrors是ActionMessages的一个子c,功能几乎相同Q不同点在于标签<html:errors/>?lt;html:messages>的用上的区别?br /> html:errors指定了footer和header属性。默认gؓerrors.header和errors.footer,需要时可以自己指定。如果资源属性文仉|了 errors.header和errors.footerQ则M时候用html:errors时开头和l尾都是q两个属性对应的资源信息?br /> 而html:message默认情况下没有errors.header和errors.footer|当然可以自己指定?br />
2Q?html:errors可以Ҏproperty属性指定显CZ个错误信息。html:messages有一个必添项id。html:messages不能直接昄信息Q它选出的信息放入一个用id标识的Iterator对象里,然后在用ben:write或JSTL c:out标签昄每个信息.例如Q?br /> <html:messages message="true" id="msg">
    <c:out value="${msg}"/><br />
</html:messages>

3. 具体的一个例子:
接受输入面input.jsp:

  <html:form action="/errormessage/input">
    phoneNumber : <html:text property="phoneNumber"/> <html:errors     property="<%=org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE %>"/><br/>
  <html:submit/><html:cancel/>
  </html:form>

struts-config.xml:
  <form-beans >
    <form-bean name="inputForm" type="cn.rolia.struts.form.errorexception.InputForm" />
  </form-beans>
  <action-mappings >
    <action
      attribute="inputForm"
      input="/errormessage/input.jsp"
      name="inputForm"
      path="/errormessage/input"
      scope="request"
      type="com.yourcompany.struts.action.errormessage.InputAction"
      validate="false">
      <forward name="success" path="/errormessage/success.jsp" />
    </action>
  </action-mappings>

InputAction.java:

public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) {
  cn.rolia.struts.form.errorexception.InputForm inputForm = (cn.rolia.struts.form.errorexception.InputForm) form;// TODO Auto-generated method stub
  String phoneNumber = inputForm.getPhoneNumber();
  if(phoneNumber.length()<4){
  ActionErrors messages = new ActionErrors();
    messages.add(org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE,new ActionMessage("error.errormessage.input"));
    this.saveErrors(request, messages);
    return mapping.getInputForward();
  }

  return mapping.findForward("success");
}
解说Q用戯入手机号码,面跌{到InputAction控制层进行处理,若输入数据小?Q则创徏一个ActionMessagecd储相关错误信息。然后再创徏ActionErrorscd此ActionMessage攑օActionErrors。再调用Action的saveErrorsҎ此ActionErrors保存的request范围里,然后q回input.jsp面要求重新输入q用html:errors提示错误信息?br />
4. Action包含saveErrors()Ҏ和saveMessages()Ҏ。如果创建的ActionErrors则应该调用saveErrors()Q若创徏的是ActionMessages则应该调用saveMessages()Ҏ?br /> saveErrors()接收ActionMessages而不是ActionErrors;同时其保存在request中ƈ用一个由org.apache.struts.Globals.ERROR_KEY指定的常?#8221; org.apache.struts.Globals.ERROR_KEY”标识q个ActionMessagesQ便于html:errors查找。saveMessages()Ҏ接收ActionMessages同时其保存在request中ƈ用一个由org.apache.struts.Globals.MESSAGE_KEY指定的常?#8221; org.apache.struts.Globals.MESSAGE_KEY”标识q个ActionMessagesQ进而让html:messages从常量Globals.ERROR_KEY中遍历获取信息。可以将其属性message讄为trueQ那么它从帔RGlobals.MESSAGE_KEY中遍历获取信息?br />
5. 默认情况下html:messages?br /> 如果你想信息保存在session里而不是requestQstruts1.2提供?br /> struts1.1没有的saveMessages(HttpSession session, ActionMessages messages)Ҏ和saveErrors(javax.servlet.http.HttpSession session, ActionMessages errors)Ҏ?br /> InputAction.java:

public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) {
cn.rolia.struts.form.errorexception.InputForm inputForm = (cn.rolia.struts.form.errorexception.InputForm) form;// TODO Auto-generated method stub
  String phoneNumber = inputForm.getPhoneNumber();
  if(phoneNumber.length()<4){
    ActionErrors messages = new ActionErrors();
    messages.add(org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE,new ActionMessage("error.errormessage.input"));
    this.saveErrors(request.getSession(true), messages);
    return mapping.getInputForward();
  }

  return mapping.findForward("success");
}

 



未必这么写 2008-05-04 15:00 发表评论
]]>
SPRING设计思想之工厂模?/title><link>http://m.tkk7.com/tij/archive/2007/11/11/159696.html</link><dc:creator>未必这么写</dc:creator><author>未必这么写</author><pubDate>Sun, 11 Nov 2007 04:23:00 GMT</pubDate><guid>http://m.tkk7.com/tij/archive/2007/11/11/159696.html</guid><wfw:comment>http://m.tkk7.com/tij/comments/159696.html</wfw:comment><comments>http://m.tkk7.com/tij/archive/2007/11/11/159696.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/tij/comments/commentRss/159696.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/tij/services/trackbacks/159696.html</trackback:ping><description><![CDATA[<font style="background-color: #cce8cf">工厂模式Q根据调用数据返回某个类的一个实例,此类可以是多个类的某一个类Q通常Q这些类满共同的规则或父类。调用者只兛_Q是否满xU规范和是否可供自己正常调用?br /> 厂模式定?span lang="EN-US">:提供创徏对象的接?</span> <p><strong><em>Z使用<span lang="EN-US">?</span></em></strong><span lang="EN-US"><br /> 工厂模式是我们最常用的模式了,著名的Jive论坛 ,大量用了工厂模式Q工厂模式在JavaE序pȝ可以说是随处可见?/span></p> <p>Z么工厂模式是如此常用Q因为工厂模式就相当于创建实例对象的<span lang="EN-US">newQ我们经常要ҎcClass生成实例对象Q如A a=new A() 工厂模式也是用来创徏实例对象的,所以以后new时就要多个心|是否可以考虑实用工厂模式Q虽然这样做Q可能多做一些工作,但会l你pȝ带来更大的可扩展性和量的修改量?/span></p> <p>我们以类<span lang="EN-US">SampleZQ?如果我们要创建Sample的实例对?</span></p> <p><span lang="EN-US">Sample sample=new Sample();</span></p> <p>可是Q实际情冉|Q通常我们都要在创?span lang="EN-US">sample实例时做点初始化的工?比如赋?查询数据库等?/span></p> <p>首先Q我们想到的是,可以使用<span lang="EN-US">Sample的构造函敎ͼq样生成实例写?</span></p> <p><span lang="EN-US">Sample sample=new Sample(参数);</span></p> <p>但是Q如果创?span lang="EN-US">sample实例时所做的初始化工作不是象赋DL单的事,可能是很长一D代码,如果也写入构造函CQ那你的代码很难看了Q就需要Refactor重整Q?/span></p> <p>Z么说代码很难看,初学者可能没有这U感觉,我们分析如下Q初始化工作如果是很长一D代码,说明要做的工作很多,很多工作装入一个方法中Q相当于很多鸡蛋放在一个篮子里Q是很危险的Q这也是有背?span lang="EN-US">Java面向对象的原则,面向对象的封?Encapsulation)和分z?Delegation)告诉我们Q尽量将长的代码分派“切割”成每D,每D再“装”h(减少D和D之间偶合联pL?Q这P׃风险分散,以后如果需要修改,只要更改每段Q不会再发生牵一动百的事情?/span></p> <p>在本例中Q首先,我们需要将创徏实例的工作与使用实例的工作分开<span lang="EN-US">, 也就是说Q让创徏实例所需要的大量初始化工作从Sample的构造函C分离出去?/span></p> <p>q时我们需?span lang="EN-US">Factory工厂模式来生成对象了Q不能再用上面简单new Sample(参数)?/span>q有<span lang="EN-US">,如果Sample有个l承如MySample, 按照面向接口~程,我们需要将Sample抽象成一个接?</span>现在<span lang="EN-US">Sample是接?有两个子cMySample 和HisSample .我们要实例化他们?如下:</span></p> <p><span lang="EN-US">Sample mysample=new MySample();<br /> Sample hissample=new HisSample();</span></p> <p>随着目的深?span lang="EN-US">,Sample可能q会"生出很多儿子出来", 那么我们要对q些儿子一个个实例?更糟p的?可能q要对以前的代码q行修改:加入后来生出儿子的实?q在传统E序中是无法避免?</span></p> <p>但如果你一开始就有意识用了工厂模式<span lang="EN-US">,q些ȝ没有了.</span></p> <p><strong>工厂Ҏ<br /> </strong>你会建立一个专门生?span lang="EN-US">Sample实例的工?</span></p> <table style="width: 80%; mso-cellspacing: 2.2pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="3" cellpadding="0" width="80%" border="0"> <tbody> <tr> <td style="padding-right: 2.25pt; padding-left: 2.25pt; background: #cccccc; padding-bottom: 2.25pt; padding-top: 2.25pt"> <p><span lang="EN-US">public class Factory{</span></p> <p>  <span lang="EN-US">public static Sample creator(int which){</span></p> <p>  //getClass <span lang="EN-US">产生Sample 一般可使用动态类装蝲装入cR?br />   if (which==1)<br />     return new SampleA();<br />   else if (which==2)<br />     return new SampleB();</span></p> <p>  <span lang="EN-US">}</span></p> <p><span lang="EN-US">}</span></p> </td> </tr> </tbody> </table> <p>那么在你的程序中<span lang="EN-US">,如果要实例化Sample?׃?/span></p> <p><span lang="EN-US">Sample sampleA=Factory.creator(1);</span></p> <p>q样<span lang="EN-US">,在整个就不涉及到Sample的具体子c?辑ֈ装效果,也就减少错误修改的机?q个原理可以用很通俗的话来比?是具体事情做得多,容易范错误.q每个做q具体工作的人都深有体会,相反,官做得越?说出的话抽象越W统,范错误可能性就少.好象我们从编E序中也能悟Zh生道?呵呵.</span></p> <p>使用工厂Ҏ 要注意几个角Ԍ首先你要定义产品接口Q如上面的Sample,产品接口下有Sample接口的实现类,如SampleA,其次要有一个factoryc,用来生成产品SampleQ如下图Q最双是生产的对象SampleQ?/p> <p><img height="178" src="http://www.jdon.com/designpatterns/images/factory.jpg" width="526" alt="" /></p> <p>q一步稍微复杂一点,是在工厂类上进行拓展,工厂cM有承它的实现类concreteFactory?strong><em>?/em></strong></p> <p><span lang="EN-US"><strong>抽象工厂</strong><br /> 工厂模式中有: 工厂Ҏ(Factory Method) 抽象工厂(Abstract Factory).</span></p> <p style="margin-bottom: 12pt"><span lang="EN-US">q两个模式区别在于需要创建对象的复杂E度上。如果我们创建对象的Ҏ变得复杂?如上面工厂方法中是创Z个对象Sample,如果我们q有新的产品接口Sample2.</span></p> <p style="margin-bottom: 12pt">q里假设QSample有两个concretecSampleA和SamleBQ而Sample2也有两个concretecSample2A和SampleB2</p> <p style="margin-bottom: 12pt"><span lang="EN-US">那么Q我们就上例中Factory变成抽象c?共同部分封装在抽象cM,不同部分使用子类实现Q下面就是将上例中的Factory拓展成抽象工?</span></p> <table style="width: 80%; mso-cellspacing: 2.2pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="3" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td style="padding-right: 2.25pt; padding-left: 2.25pt; background: #cccccc; padding-bottom: 2.25pt; padding-top: 2.25pt"> <p><span lang="EN-US">public abstract class Factory{</span></p> <p>  <span lang="EN-US">public abstract Sample creator();</span></p> <p>  <span lang="EN-US">public abstract Sample2 creator(String name); </span></p> <p><span lang="EN-US">}</span></p> <p><span lang="EN-US">public class SimpleFactory extends Factory{</span></p> <p>  <span lang="EN-US">public Sample creator(){<br />     .........<br />     return new SampleA</span><span lang="EN-US"><br />   }</span></p> <p>  <span lang="EN-US">public Sample2 creator(String name){<br />     .........<br />     return new Sample2A</span><span lang="EN-US"><br />   }</span></p> <p><span lang="EN-US">}</span></p> <p><span lang="EN-US">public class BombFactory extends Factory{</span></p> <p>  <span lang="EN-US">public Sample creator(){<br />     ......<br />     return new SampleB</span><span lang="EN-US"> <br />   }</span></p> <p>  <span lang="EN-US">public Sample2 creator(String name){<br />     ......<br />     return new Sample2B<br />   }</span></p> <p><span lang="EN-US">}</span></p> <p><span lang="EN-US"> </span></p> </td> </tr> </tbody> </table> <p><span lang="EN-US">从上面看C个工厂各自生产出一套Sample和Sample2,也许你会疑问Qؓ什么我不可以用两个工厂方法来分别生Sample和Sample2? </span></p> <p><span lang="EN-US">抽象工厂q有另外一个关键要点,是因?SimpleFactory内,生Sample和生产Sample2的方法之间有一定联p,所以才要将q两个方法捆l在一个类中,q个工厂cL其本w特征,也许刉过E是l一的,比如Q制造工艺比较简单,所以名U叫SimpleFactory?/span><span lang="EN-US"><br /> </span></p> <p>在实际应用中Q工厂方法用得比较多一些,而且是和动态类装入器组合在一起应用,</p> <p><span lang="EN-US"><strong>举例</strong><O:P></O:P></span></p> <p>我们?span lang="EN-US">Jive的ForumFactoryZQ这个例子在前面的Singleton模式中我们讨Q现在再讨论其工厂模?</span></p> <table style="width: 97%; mso-cellspacing: 2.2pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="3" cellpadding="0" width="97%" border="0"> <tbody> <tr> <td style="padding-right: 2.25pt; padding-left: 2.25pt; background: #cccccc; padding-bottom: 2.25pt; padding-top: 2.25pt"> <p><span lang="EN-US">public abstract class ForumFactory {</span></p> <p>  <span lang="EN-US">private static Object initLock = new Object();<br />   private static String className = "com.jivesoftware.forum.database.DbForumFactory";<br />   private static ForumFactory factory = null; </span></p> <p>  <span lang="EN-US">public static ForumFactory getInstance(Authorization authorization) {<br />     //If no valid authorization passed in, return null.<br />     if (authorization == null) {<br />       return null;<br />     }<br />     //以下使用了Singleton 单态模?br />     if (factory == null) {<br />       synchronized(initLock) {<br />         if (factory == null) {<br />             ...... </span></p> <p>          <span lang="EN-US">try {<br />               //动态{载类<br />               Class c = Class.forName(className);<br />               factory = (ForumFactory)c.newInstance();<br />           }<br />           catch (Exception e) {<br />               return null;<br />           }<br />         }<br />       }<br />     }</span></p> <p>    <span lang="EN-US">//Now, q回 proxy.用来限制授权对forum的访?br />     return new ForumFactoryProxy(authorization, factory,<br />                     factory.getPermissions(authorization));<br />   }</span></p> <p>  <span lang="EN-US">//真正创徏forum的方法由l承forumfactory的子cd完成.<br />   public abstract Forum createForum(String name, String description)<br />   throws UnauthorizedException, ForumAlreadyExistsException;</span></p> <p>  <span lang="EN-US">....</span></p> <p><span lang="EN-US">}</span></p> <p><span lang="EN-US"> </span></p> <p><span lang="EN-US"> </span></p> </td> </tr> </tbody> </table> <p>因ؓ现在?span lang="EN-US">Jive是通过数据库系l存放论坛帖子等内容数据,如果希望更改为通过文gpȝ实现,q个工厂ҎForumFactory提供了提供动态接?</span></p> <p><span lang="EN-US">private static String className = "com.jivesoftware.forum.database.DbForumFactory";</span></p> <p>你可以用自己开发的创徏<span lang="EN-US">forum的方法代替com.jivesoftware.forum.database.DbForumFactory可?</span></p> <p>在上面的一D代码中一q了三U模?span lang="EN-US">,除了工厂模式?q有Singleton单态模?以及proxy模式,proxy模式主要用来授权用户对forum的访?因ؓ讉Kforum有两Uh:一个是注册用户 一个是游客guest,那么那么相应的权限就不一?而且q个权限是诏I整个系l的,因此建立一个proxy,cM|关的概?可以很好的达到这个效?  </span></p> <p>看看<span lang="EN-US">Java宠物店中的CatalogDAOFactory:</span></p> <table cellspacing="0" cellpadding="0" width="100%" bgcolor="#cccccc" border="0"> <tbody> <tr> <td>public class CatalogDAOFactory { <p> </p> <p>  /**</p> <p>  * 本方法制定一个特别的子类来实现DAO模式?br />   * 具体子类定义是在J2EE的部|描q器中?br />   */</p> <p>  public static CatalogDAO getDAO() throws CatalogDAOSysException {</p> <p>    CatalogDAO catDao = null;</p> <p>    try {</p> <p>      InitialContext ic = new InitialContext();<br />       //动态装入CATALOG_DAO_CLASS<br />       //可以定义自己的CATALOG_DAO_CLASSQ从而在无需变更太多代码<br />       //的前提下Q完成系l的巨大变更?/p> <p>      String className =(String) ic.lookup(JNDINames.CATALOG_DAO_CLASS);</p> <p>      catDao = (CatalogDAO) Class.forName(className).newInstance();</p> <p>    } catch (NamingException ne) {</p> <p>      throw new CatalogDAOSysException("<br />         CatalogDAOFactory.getDAO: NamingException while <br />           getting DAO type : \n" + ne.getMessage());</p> <p>    } catch (Exception se) {</p> <p>      throw new CatalogDAOSysException("<br />         CatalogDAOFactory.getDAO: Exception while getting <br />           DAO type : \n" + se.getMessage());</p> <p>    }</p> <p>    return catDao;</p> <p>  }</p> <p>}<br /> </p> </td> </tr> </tbody> </table> <p><br style="mso-ignore: vglayout" clear="all" /> </p> <p><span lang="EN-US">CatalogDAOFactory是典型的工厂ҎQcatDao是通过动态类装入器className获得CatalogDAOFactory具体实现子类Q这个实现子cdJava宠物店是用来操作catalog数据库,用户可以Ҏ数据库的cd不同Q定制自q具体实现子类Q将自己的子cdl与CATALOG_DAO_CLASS变量可以?/span></p> <p>由此可见Q工厂方法确实ؓpȝl构提供了非常灵zd大的动态扩展机Ӟ只要我们更换一下具体的工厂ҎQ系l其他地Ҏ需一点变换,有可能系l功能进行改头换面的变化?/p> <p>设计模式如何在具体项目中应用?a target="_blank">《Java实用pȝ开发指南?/a></p> </font> <img src ="http://m.tkk7.com/tij/aggbug/159696.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/tij/" target="_blank">未必这么写</a> 2007-11-11 12:23 <a href="http://m.tkk7.com/tij/archive/2007/11/11/159696.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>千里之行 始于下http://m.tkk7.com/tij/archive/2007/10/26/156229.html未必这么写未必这么写Fri, 26 Oct 2007 11:22:00 GMThttp://m.tkk7.com/tij/archive/2007/10/26/156229.htmlhttp://m.tkk7.com/tij/comments/156229.htmlhttp://m.tkk7.com/tij/archive/2007/10/26/156229.html#Feedback3http://m.tkk7.com/tij/comments/commentRss/156229.htmlhttp://m.tkk7.com/tij/services/trackbacks/156229.html一觉醒来,你会不会茫然无措Q觉得自׃无是处?



未必这么写 2007-10-26 19:22 发表评论
]]>
վ֩ģ壺 Av뾫Ʒһ| ѹۿ.WWW| ޹Ʒۺɫ| ޹Ʒһڶҳ| ƬѸƬ| ѵɫƵ| þѿٸ߳VƬػ| һɫaƬþëƬ| 2022| ߹ۿ| ޹þþþƷ| ޳˰aa߹ۿ| 椸ֻƵ| ĻƵ߿| Ĺѹۿ߲| Թ24| žžþùƷ6| ͵͵APP| ŷպۺϾþþþ| Ļ| ޹Ʒ˾ƷС˵| 츾avһ| Ӱ| ޹Ʒۺɫ| ޹㽶| ޺ݺݾþۺһ77777| պŷAVҹҹ| Ůֻˬ߹ۿ| Ļպ| avŷղһ| ޾ƷƷ벻| պһ| ޾aaվ| ޾Ʒþþþ66| ˳ɾƷþþþ| av뾫ƷϼӰӰԺ| AVһҳƷ| ޻ɫ߹ۿվ| һþ| ߹ۿAVպAV| 鵺̳߹ۿ |