﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-beauty_beast-随笔分类-开源框架</title><link>http://www.blogjava.net/beauty_beast/category/7390.html</link><description>上善若水   厚德载物 
</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 06:06:30 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 06:06:30 GMT</pubDate><ttl>60</ttl><item><title>Spring学习笔记二----Web MVC</title><link>http://www.blogjava.net/beauty_beast/archive/2006/06/24/54840.html</link><dc:creator>柳随风</dc:creator><author>柳随风</author><pubDate>Sat, 24 Jun 2006 02:59:00 GMT</pubDate><guid>http://www.blogjava.net/beauty_beast/archive/2006/06/24/54840.html</guid><wfw:comment>http://www.blogjava.net/beauty_beast/comments/54840.html</wfw:comment><comments>http://www.blogjava.net/beauty_beast/archive/2006/06/24/54840.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/beauty_beast/comments/commentRss/54840.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beauty_beast/services/trackbacks/54840.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 花了两个星期学习				Spring WebMVC				，				总体感觉收获不少，感受比较深的是				Spring				框架的确解决了在				j2EE				开发中经常遇到的问题				,				自己也写了一个覆盖框架主要功能的简单例子，和大家一起交流、分享一下，如有错误，欢迎大家多指正。								－、相对于WebWork的特性	...&nbsp;&nbsp;<a href='http://www.blogjava.net/beauty_beast/archive/2006/06/24/54840.html'>阅读全文</a><img src ="http://www.blogjava.net/beauty_beast/aggbug/54840.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beauty_beast/" target="_blank">柳随风</a> 2006-06-24 10:59 <a href="http://www.blogjava.net/beauty_beast/archive/2006/06/24/54840.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring框架学习二篇外----在WEBMVC学习遇到的问题</title><link>http://www.blogjava.net/beauty_beast/archive/2006/05/25/48086.html</link><dc:creator>柳随风</dc:creator><author>柳随风</author><pubDate>Thu, 25 May 2006 10:10:00 GMT</pubDate><guid>http://www.blogjava.net/beauty_beast/archive/2006/05/25/48086.html</guid><wfw:comment>http://www.blogjava.net/beauty_beast/comments/48086.html</wfw:comment><comments>http://www.blogjava.net/beauty_beast/archive/2006/05/25/48086.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/beauty_beast/comments/commentRss/48086.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beauty_beast/services/trackbacks/48086.html</trackback:ping><description><![CDATA[
		<p>这两天在学习SpringMVC遇到两个比较郁闷的问题，估计新学者很容易遇到，和大家分享一下，避免出现类似的问题。<br />1、 No request handling method with name 'insert' in class  "ClassName"，页面显示为404错误<br />这个问题出现在使用多操作控制器情况下，相关的操作方法中对应的方法参数前两位必须是request,response对象，必须要有，否则会报如上异常。<br />2、这个问题困惑了我半天，在网上也有类似的问题，但没有正确解决方法，异常如下：<br />javax.servlet.ServletException: ModelAndView [ModelAndView: materialized View is [null]<br />这个问题可能出现的场景很多，我所描述的只是其中之一，没有相关解决方法，只有查看相关源代码，开源就是有这个好处。<br />异常抛出代码为：<br />        at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:924)<br />查看了相关源代码，一层一层看下去<br />首先在ModelAndView 类实例是在DispatcherServlet类中的doDispatch方法中创建的，<br />再跟踪doDispatch方法中相关代码行<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">HandlerAdapter ha </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> getHandlerAdapter(mappedHandler.getHandler());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />mv </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> ha.handle(processedRequest, response, mappedHandler.getHandler());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
		</div>
		<p>ha是一个接口实现类，在该场景下，对应的接口实现类为：<br />org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter<br /><br />SimpleControllerHandlerAdapter类中对应的实现代码为：</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">((Controller) handler).handleRequest(request, response)</span>
		</div>
		<p>调用的是对应的Controller接口中方法，当前Controller对应的接口实现类为我们配置的自定义控制类，一般继承于org.springframework.web.servlet.mvc.SimpleFormController;一层一层再跟踪发现：<br />SimpleFormController继层于同包AbstractFormController类，而<br />AbstractFormController继承于同包AbstractController类，对应的<br />handleRequest(request,response)在AbstractController类中实现，最终调用代码如下：<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000"> handleRequestInternal(request, response)</span>
		</div>
		<p>handleRequest方法为一个抽象方法，在AbstractFormController类中实现，终于找到原因了，呵呵<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">protected</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">final</span>
				<span style="COLOR: #000000"> ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)<br /><img id="Codehighlighter1_129_1027_Open_Image" onclick="this.style.display='none'; Codehighlighter1_129_1027_Open_Text.style.display='none'; Codehighlighter1_129_1027_Closed_Image.style.display='inline'; Codehighlighter1_129_1027_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_129_1027_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_129_1027_Closed_Text.style.display='none'; Codehighlighter1_129_1027_Open_Image.style.display='inline'; Codehighlighter1_129_1027_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />            </span>
				<span style="COLOR: #0000ff">throws</span>
				<span style="COLOR: #000000"> Exception </span>
				<span id="Codehighlighter1_129_1027_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_129_1027_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000"> Form submission or new form to show?</span>
						<span style="COLOR: #008000">
								<br />
								<img id="Codehighlighter1_207_926_Open_Image" onclick="this.style.display='none'; Codehighlighter1_207_926_Open_Text.style.display='none'; Codehighlighter1_207_926_Closed_Image.style.display='inline'; Codehighlighter1_207_926_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_207_926_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_207_926_Closed_Text.style.display='none'; Codehighlighter1_207_926_Open_Image.style.display='inline'; Codehighlighter1_207_926_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000">        </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> (isFormSubmission(request)) </span>
						<span id="Codehighlighter1_207_926_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_207_926_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> Form submission: in session-form mode, we need to find<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> the form object in the HTTP session.</span>
								<span style="COLOR: #008000">
										<br />
										<img id="Codehighlighter1_338_625_Open_Image" onclick="this.style.display='none'; Codehighlighter1_338_625_Open_Text.style.display='none'; Codehighlighter1_338_625_Closed_Image.style.display='inline'; Codehighlighter1_338_625_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_338_625_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_338_625_Closed_Text.style.display='none'; Codehighlighter1_338_625_Open_Image.style.display='inline'; Codehighlighter1_338_625_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">            </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (isSessionForm()) </span>
								<span id="Codehighlighter1_338_625_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_338_625_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                HttpSession session </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> request.getSession(</span>
										<span style="COLOR: #0000ff">false</span>
										<span style="COLOR: #000000">);<br /><img id="Codehighlighter1_488_620_Open_Image" onclick="this.style.display='none'; Codehighlighter1_488_620_Open_Text.style.display='none'; Codehighlighter1_488_620_Closed_Image.style.display='inline'; Codehighlighter1_488_620_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_488_620_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_488_620_Closed_Text.style.display='none'; Codehighlighter1_488_620_Open_Image.style.display='inline'; Codehighlighter1_488_620_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />                </span>
										<span style="COLOR: #0000ff">if</span>
										<span style="COLOR: #000000"> (session </span>
										<span style="COLOR: #000000">==</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">null</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #000000">||</span>
										<span style="COLOR: #000000"> session.getAttribute(getFormSessionAttributeName(request)) </span>
										<span style="COLOR: #000000">==</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">null</span>
										<span style="COLOR: #000000">) </span>
										<span id="Codehighlighter1_488_620_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
												<img src="http://www.blogjava.net/images/dot.gif" />
										</span>
										<span id="Codehighlighter1_488_620_Open_Text">
												<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                    </span>
												<span style="COLOR: #008000">//</span>
												<span style="COLOR: #008000"> Cannot submit a session form if no form object is in the session.</span>
												<span style="COLOR: #008000">
														<br />
														<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
												</span>
												<span style="COLOR: #000000">                    </span>
												<span style="COLOR: #0000ff">return</span>
												<span style="COLOR: #000000"> handleInvalidSubmit(request, response);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />                }</span>
										</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> Found form object in HTTP session: fetch form object,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> bind, validate, process submission.</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">            Object command </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> getCommand(request);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            ServletRequestDataBinder binder </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> bindAndValidate(request, command);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> processFormSubmission(request, response, command, binder.getErrors());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
								<img id="Codehighlighter1_936_1024_Open_Image" onclick="this.style.display='none'; Codehighlighter1_936_1024_Open_Text.style.display='none'; Codehighlighter1_936_1024_Closed_Image.style.display='inline'; Codehighlighter1_936_1024_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_936_1024_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_936_1024_Closed_Text.style.display='none'; Codehighlighter1_936_1024_Open_Image.style.display='inline'; Codehighlighter1_936_1024_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
						<span style="COLOR: #0000ff">else</span>
						<span style="COLOR: #000000"> </span>
						<span id="Codehighlighter1_936_1024_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_936_1024_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> New form to show: render form view.</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">            </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> showNewForm(request, response);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span>
				</span>
		</div>
		<p>原因实际很简单，就因为我在要提交的表单中没有采用post方法，呵呵<br />而isFormSubmission(request)就是根据此项判断，所以其实际执行的代码为：<br />return showNewForm(request, response);<br />而我在对应的配置属性中没有配置对应属性 formView值，因为我本来就不是要展现一个新表单。<br />故最后返回的ModelAndView为空。<br /><br />问题都解决了，只是没想到对提交表单这么严格，其他web框架是没有这种限制，不过也没多大关系，在实际开发中我们大都是采用post方式提交表单的。<br /><br /></p>
<img src ="http://www.blogjava.net/beauty_beast/aggbug/48086.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beauty_beast/" target="_blank">柳随风</a> 2006-05-25 18:10 <a href="http://www.blogjava.net/beauty_beast/archive/2006/05/25/48086.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring框架学习一----基本配置</title><link>http://www.blogjava.net/beauty_beast/archive/2006/05/25/48064.html</link><dc:creator>柳随风</dc:creator><author>柳随风</author><pubDate>Thu, 25 May 2006 08:39:00 GMT</pubDate><guid>http://www.blogjava.net/beauty_beast/archive/2006/05/25/48064.html</guid><wfw:comment>http://www.blogjava.net/beauty_beast/comments/48064.html</wfw:comment><comments>http://www.blogjava.net/beauty_beast/archive/2006/05/25/48064.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/beauty_beast/comments/commentRss/48064.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beauty_beast/services/trackbacks/48064.html</trackback:ping><description><![CDATA[
		<p>         花了两三天看了相关文档，只是初步了解相关配置，没有做深入了解，才达到基本会使用配置的目的。<br /><br /><strong>个人理解：</strong><br />         Spring 最基本的的功能是提供通过配置管理任意类，提供了Bean管理容器。这也是Spring最基础，最核心的功能，在Spring框架中，一切皆为Bean,实际上在我们的日常开发中，往往更多的是和Bean相关的开发，并且都是短生命周期，除了一些缓存功能，其他很多重要的功能都是由开源框架完成。<br />        实现方式也是框架常用的反射机制,因此使用Spring前提在JVM启动参数中不能加安全管理配置。<br />        Spring中所有的Bean相关配置均为一个文件，非常集中，个人感觉这有利有弊，利大于弊。<br />        统一配置比较方便集中，我最近的项目就是有很多子系统，除了一些公用的配置文件，还有很多子系统的配置文件，每次迁移环境是非常累的事，如果只有一个配置文件，那工作就会轻松多了。<br />        缺点也就在于很集中，如果配置有误，整个系统不可用，这种情况往往发生在系统升级阶段，也比较少，即使出现问题也比较好定位。<br />         Spring提供了Bean管理容器，这个功能可以大大简化业务系统的配置开发工作。<br />         个人感觉将来的开发工作更多的是配置，编写业务相关的Bean以及业务方法,其他功能均会有很多优秀的开源框架实现，重要的工作是选择符合项目的框架、熟悉框架，最重要的还是苦修内功，深入学习java，因为万变不如其中，再说开源不是万能的，有时候还是要靠自己的。<br />         <br /></p>
		<p>
				<strong>学习心得</strong>：<br />Spring提供三种创建类实例方法:<br />    a、通过构造函数，访问属性可以是任意<br />    b、通过对应类的静态工厂方法，注意不能是私有的<br />     c、通过工厂类的实例工厂方法，是非静态的方法<br /><br />－、bean节点相关主要属性：<br />     id/name          实例名/别名<br />     class              必须、类全名<br />     singleton        是否为单实例，默认为true<br />     init-method     初始化方法<br />     depends-on    指定依赖Bean,实现在被依赖Bean实例创建前，对依赖的一个或多个Bean的实例化,  <br />                           init-method在对应Bean实例已经创建后调用<br />     destroy-method   释放回调方法，常用于资源释放<br />     dependency-check 依赖检查<br />     parent           指定父Bean实例，减少因继承关系的重复配置</p>
		<p>     说明除配置init-method,destory以外，可以在对应Bean中实现InitializingBean,DisposableBean两个接口方法<br />     Spring容器不负责管理非单实例的Bean</p>
		<p>配置bean事项：<br />1、注意在通过构造器参数匹配时，必须指定参数的序号，同时建议明确说明类型，<br />  &lt;constructor-arg index="0"&gt;&lt;value&gt;128&lt;/value&gt;&lt;/constructor-arg&gt;<br />  &lt;constructor-arg index="1"&gt;&lt;value&gt;teststring&lt;/value&gt;&lt;/constructor-arg&gt; <br />  最好说明相关参数类型类型  <br />  &lt;constructor-arg index="0" type="int"&gt;&lt;value&gt;128&lt;/value&gt;&lt;/constructor-arg&gt;<br />  &lt;constructor-arg index="1" type="java.lang.String"&gt;&lt;value&gt;teststring&lt;/value&gt;&lt;/constructor-arg&gt; <br />  可以使用简化配置<br />  &lt;constructor-arg index="0" type="int"  value="128"/&gt;<br />  &lt;constructor-arg index="1" type="java.lang.String" value="testString"/&gt;<br />    <br />2、属性为空<br />    &lt;property name="pro1&gt;&lt;null/&gt;&lt;/property&gt;<br />3、空串 <br />    &lt;property name="pro1&gt;&lt;value&gt;&lt;/value&gt;&lt;/property&gt;   </p>
		<p>二、常用elements<br />bean | ref | idref | value | null | list | set | map | props</p>
		<p>说明：<br />     bean      创建一个新的bean实例<br />     ref         引用已经创建的bean实例<br />     value      简单数据类型<br />     null         空指针<br />     list         创建java.util.ArrayList对象实例<br />     set         创建java.util.LinkedHashSet对象实例<br />     map       创建java.util.LinkedHashMap对象实例<br />     props     创建java.util.Properties实例    </p>
		<p>list,set,map可以多层嵌套配置</p>
		<p>
				<br />遗留问题：<br />idref 配置没有起作用，类似value配置，测试输出为字符串对象，是否配置不正确?<br /><br />上述配置范围基本覆盖了我们开发时的bean使用情况，详见配置可以参考dtd<br /><a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a></p>
		<p>
				<br />ApplicationContext 继承于BeanFactory相关接口，针对企业应用级的，占有内存较多<br />BeanFactory     提供配置框架和基本功能，适用于对内存有限制的相关应用<br />功能：<br />1、提供消息访问，ApplicationContext 本身继承于MessageSource接口，<br />   ApplicationContext 加载时查找对应的MessageSource Bean, bean id 必须为messageSource<br />   Spring框架提供两个MessageResource实现：<br />    org.springframework.context.support.ResourceBundleMessageSource <br />    org.springframework.context.support.StaticMessageSource<br />2、事件传递<br />3、使用资源<br /><br /></p>
<img src ="http://www.blogjava.net/beauty_beast/aggbug/48064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beauty_beast/" target="_blank">柳随风</a> 2006-05-25 16:39 <a href="http://www.blogjava.net/beauty_beast/archive/2006/05/25/48064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring框架学习前言---我的开源框架使用心得体会</title><link>http://www.blogjava.net/beauty_beast/archive/2006/05/16/46421.html</link><dc:creator>柳随风</dc:creator><author>柳随风</author><pubDate>Tue, 16 May 2006 07:45:00 GMT</pubDate><guid>http://www.blogjava.net/beauty_beast/archive/2006/05/16/46421.html</guid><wfw:comment>http://www.blogjava.net/beauty_beast/comments/46421.html</wfw:comment><comments>http://www.blogjava.net/beauty_beast/archive/2006/05/16/46421.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/beauty_beast/comments/commentRss/46421.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beauty_beast/services/trackbacks/46421.html</trackback:ping><description><![CDATA[
		<p>
		</p>
		<p>
				<strong>目的：</strong>
				<br />在实际项目中出于稳定性以及团队开发技能我一直没考虑采用Spring框架，最近有时间就计划学习Spring框架，为以后的项目开发做相关的技术储备。</p>
		<p>
				<br />
				<strong>回顾：</strong>
				<br />开源框架在以前的项目中用过不少， struts,webwork,hibernate,前两者属于web框架，后者属于ORM框架，这些框架基本都是侧重于应用的某个层面，不能称之为J2EE全面的框架，往往是需要和其他框架相结合，我开发的项目采用过如下组合，有的根本就没有框架，只是自己做了设计封装<br />a、servlet+jdbc,<br />b、servlet+jsp+javabean+jdbc,<br />c、struts+BD+DAO ,<br />d、webwork+ejb+hibernate <br /><br /><strong>使用体会：</strong></p>
		<p> a、b就不要说了，那时候的代码结构真是天马行空，我当时初学，维护公司一个项目代码，1个jsp实现一个模块所有功能，我花了好长时间才 读懂代码。<br />  时代总是向前发展的，慢慢的系统结构层次上是越来越清晰，开发效率也越来越高，维护也越来越容易（基于一定的培训成本）。<br /> <br /><font color="#6666ff"> 相对而言出于设计理念来讲，个人更喜欢webwork+hibernate框架组合。</font> <br /><br /> 常有人讨论同等开发层面框架的优缺点，我所属产品的另外一个项目团队曾经为项目后续开发 应该采用struts还是webwork争论的不可开交， 其实个人认为struts,webwork都是非常好的web框架，都有自身的优缺点：<br /> struts开创web MVC框架之先河，2003－2004年开发的项目基本都是采用struts框架（当时招聘人的时候常问会不会struts，会基本就招了 ），实际MVC设计理念很早就提出了，在j2SE中有很多使用之处，但当时没有一个web框架开发中很好的贯彻该设计理念，直到struts 出现（可能有，只是没有apache更引人注意）。<br /><br /> struts优点使用用户多，相关技术文档比较全面，开发遇到的问题相关案例也比较多、比较容易解决，框架更加稳定(这一点非常重要）。<br /> <br /> webwork相对于struts来讲，的确有不少优异之处，（也是情理之中的事，后发布的框架如果再没有优点别人也不会使用）<br /> 个人认为在开发上主要有以下几点：<br /><br /> 1、页面数据封装成值对象功能比struts强大，webwork采用ognl类型转化。<br /> struts只能对简单类型的数据对象以及文件对象封装成值对象, 而webwork封装的值对象基本没有限制，值对象属性还可以是List,Map这些对象（这个特性在我们开发一些批量数据、复杂数据处理时非常方便），减少很多代码量，代码非常整洁。<br /> <br /> 2、拦截器功能<br /> 拦截器是webwork的一个亮点，实际上也是业界比较流行的AOP的一个体现，在实际开发中你可以配置默认的拦截器， 也可以为单独的模块指定特定的拦截器，并且可自定义拦截器，action执行前后拦截都可以。 <br /> <br /> 3、单元测试比较方便<br /> 最早使用struts框架开发测试时，相关的单元测试基本是不好做的，无法脱离web环境，测试都是只做集成测试、系统测试。<br /> 使用webwork可以简单对action相关属性赋值，可以相关的单元测试，当然前提是在对应action中没有引用web环境相关的对象。 <br /> 其实webwork框架核心还是xwork框架，最早框架使用在C/S结构下，webwork只是xwork的一个在web环境的实现，只是ActionContext 上下文发生了变化，所以说action能够做到脱离web环境也是情理之中的。</p>
		<p>
				<br />4、配置文件<br />webwork配置文件可以采用引用、继承其他配置文件方式，在团队开发一般都是分模块开发，这样比较方便，配置管理更容易，不会冲突。<br /><br />5、模板技术集成<br /> 我在实际应用项目中是采用velocity模板做视图展现，因为在对应版本的webwork框架中和velociy集成的相当好，比较方便， 比直接写jsp代码更整洁、同时利用velocity模板特性结合每个action的配置文件，可实现比较通用的页面查询、录入等视图的展现。<br /> 而struts是没有相关模板集成，不过struts的tag相对而言比webwork的tag好用，webwork如果视图是jsp类型，相关的tag真的比较麻烦, 虽然tag 库很丰富，这也是我为什么使用velocity做视图的原因 。 <br /> <br />6、 框架的效验功能<br /> 老实说，两者框架的效验功能都比较麻烦，相对而言webwork更加麻烦点，配置较多，验证接口实现太麻烦，我实际项目使用中还是 自定义了相关后台验证接口， 要验证的相关action只要实现相关接口即可，相关拦截器负责拦截验证， 大部分的效验根据配置数据以及html对象自定义属性通过javascript通用效验，实际上现在基于XmlHttp的ajax技术应用成熟的话, 后台验证接口的用途会逐渐淡化。 <br /> <br /><font style="BACKGROUND-COLOR: #ffffff" color="#6666ff"> 说明上述比较版本为 struts 1.0 /webwork 2.1.6，后续struts框架扩展很多功能，不是很了解，可能和上诉描述不一定很吻合。<br /></font> <br /> 现在两者已经合并，希望能结合两者的优势，发展出更好web框架。<br /> <br />7、关于Hibernate还是DAO模式，个人建议采用hibernate+DAO相集合的模式，hibernate占主导地位。<br /> 虽然DAO模式通过自动生成代码效率不会低，但如果需求变更就比较麻烦，维护修改代码较多，测试工作量也较大， 但Hibernate不是万能的，在一些必要的应用还是采用DAO模式，特别是性能相关的部分。 <br /> <br /> <br /> 废话一大堆，也算把我的工作回顾了一遍，呵呵，这两天简单了解Spring框架，个人感觉Spring更像一个全面的J2EE框架解决方案, 希望能够有时间系统的学习一把，大家有兴趣的请多多交流,我会将我的学习心得和大家分享。<br /> <br /> </p>
		<p>
				<br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> </p>
		<p>
				<br /> </p>
<img src ="http://www.blogjava.net/beauty_beast/aggbug/46421.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beauty_beast/" target="_blank">柳随风</a> 2006-05-16 15:45 <a href="http://www.blogjava.net/beauty_beast/archive/2006/05/16/46421.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于log4j实现统一日志管理</title><link>http://www.blogjava.net/beauty_beast/archive/2006/03/16/35681.html</link><dc:creator>柳随风</dc:creator><author>柳随风</author><pubDate>Thu, 16 Mar 2006 08:49:00 GMT</pubDate><guid>http://www.blogjava.net/beauty_beast/archive/2006/03/16/35681.html</guid><wfw:comment>http://www.blogjava.net/beauty_beast/comments/35681.html</wfw:comment><comments>http://www.blogjava.net/beauty_beast/archive/2006/03/16/35681.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/beauty_beast/comments/commentRss/35681.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beauty_beast/services/trackbacks/35681.html</trackback:ping><description><![CDATA[<P>背景：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一般操作系统级的告警有相关的软件，但我们应用级日志往往无法统一监控、分析。因为最近的项目是比较大的一个平台，有七、八个子系统，weblogic域也有三、四个。如果用户自身能够实时监控到应用级致命异常日志 如OutOfMemory,线程挂死、应用接口无法链接等等。那么我们监控维护人员工作就大大简化，不然要查看所有域的日志信息，只需集中看一处，系统故障也能够更快的解决，恢复正常。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用户的需求是要求我们将日志输出到一个第三方厂家的日志Server。</P>
<P>设想：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; weblogic platform域的日志输出是可配置的，在$bea/weblogic/common/lib/workshopLogCfg.xml, 原先的一个项目所有的日志输出均在此文件中配置。其他中间件本人很少使用，相信也有类似的功能，log4j日志框架支持统一日志管理功能,简单实现原理（启动一个SocketServer,处理各个客户端机器连接的Socket输入，<BR>而每个应用打印日志使用Socket方式将日志内容输出到SocketServer端）。如果能将重要的的中间件异常日志以及应用异常日志到统一日志服务器，实时分析，这样就方便日常监控，有点类似于设备告警的功能，如果再开发出相关日志分析软件，个人觉得会是平台级产品的一个亮点，正如《少林足球》说的有点搞头。</P>
<P>实践：<BR>&nbsp;&nbsp;&nbsp; 实践证明现实和理想总归有一定的差距，呵呵。下面描述验证、学习心得：<BR>&nbsp;&nbsp;&nbsp; 首先描述log4j是如何实现统一日志管理该功能的。<BR>&nbsp;&nbsp;&nbsp; 核心类：<BR>&nbsp;&nbsp;&nbsp; 一、org.apache.log4j.net.SocketServer&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;主要功能：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、启动SocketServer<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、接受Socket请求<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、初始化对应Socket的日志输出配置，如没有，就采用通用配置<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、另启线程处理客户端Socket和服务端交互<BR>&nbsp;&nbsp;&nbsp; 一个比较标准的多线程处理实现。<BR>&nbsp;&nbsp;&nbsp;&nbsp; 启动Server需要有三个运行参数：端口号、log4j配置文件、客户端日志在Server端输出配置文件目录<BR>&nbsp;&nbsp;&nbsp;&nbsp; 运行命令如下：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java -classpath ../lib/log4j-1.2.8.jar;.; test.logserver.FixSocketServer&nbsp;&nbsp; 8088&nbsp;&nbsp; server.properties&nbsp; d:/temp<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;说明：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a、客户端日志在Server端输出配置文件命名规则 $ip.lcf&nbsp;,&nbsp;&nbsp;&nbsp;&nbsp;如 10.21.11.10.lcf&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该类在解析该配置文件的代码中 应该存在个bug（版本1.2.9)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 代码176&nbsp;行&nbsp;&nbsp; String key = s.substring(0,i);改为:&nbsp;&nbsp; String key = s.substring(i+1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b、配置文件内容和一般log4j配置内容雷同，categories、appenders、layouts&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;二、org.apache.log4j.net.SocketAppender<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该类继承于AppenderSkeleton，如果我们需要自定义Appender,可以继承AppenderSkeleton类，实现方法：</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">protected</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;append(LoggingEvent&nbsp;event);</SPAN></DIV>
<P>&nbsp;&nbsp;&nbsp;&nbsp;主要功能：&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、连接到SocketServer,并创建一个到SocketServer的对象输出实例<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、如果连接失败，会启动一个守护线程，每隔三十秒钟重新连接<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、日志输出时，将日志事件对象输出到SocketServer<BR>&nbsp;&nbsp;&nbsp;&nbsp; 相对应的日志配置：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">log4j.appender.mysocket</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">test.logserver.SocketAppender&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>log4j.appender.mysocket.RemoteHost</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">10.243</SPAN><SPAN style="COLOR: #000000">.</SPAN><SPAN style="COLOR: #000000">17.85</SPAN><SPAN style="COLOR: #000000">&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>log4j.appender.mysocket.Port</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">8088</SPAN><SPAN style="COLOR: #000000">&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>log4j.appender.mysocket.LocationInfo</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>log4j.appender.mysocket.layout</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">org.apache.log4j.PatternLayout&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>log4j.appender.myConsole.layout.ConversionPattern</SPAN><SPAN style="COLOR: #000000">=%</SPAN><SPAN style="COLOR: #000000">5p&nbsp;[</SPAN><SPAN style="COLOR: #000000">%</SPAN><SPAN style="COLOR: #000000">t]&nbsp;(</SPAN><SPAN style="COLOR: #000000">%</SPAN><SPAN style="COLOR: #000000">F:</SPAN><SPAN style="COLOR: #000000">%</SPAN><SPAN style="COLOR: #000000">L)&nbsp;</SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">%</SPAN><SPAN style="COLOR: #000000">m</SPAN><SPAN style="COLOR: #000000">%</SPAN><SPAN style="COLOR: #000000">n</SPAN></DIV>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 三、org.apache.log4j.net.SocketNode<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该类相对简单，一个线程类<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;主要功能：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;负责接收客户端对应输出对象，根据对应的配置，输出相关日志。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以看出是通过对象进行传输的，如果第三方不是采用java语言的，实际解决时只需改写SocketAppender的append方法，输出日志内容就可。对方实现SocketServer功能就可（编程语言基本都支持该功能）。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 遗憾的是在weblogic 一般server域中我没有找到可以改变日志输出的地方（上次看到weblogic9.0中有日志服务，不知道能不能改变），所以实际差距还是比较大的，关于性能问题，因为是重要的日志(warning、error、fetal)才输出,采用socket方式问题应该不大。<BR><BR>篇外话：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查看代码中无意中发现log4j框架一部分源码都是一些人捐献的。虽然代码不复杂，但感觉为自己喜欢的框架很热心，希望它变的越来越好，真的希望我们国内也能有一些优秀的开源项目，并且大家都去支持它，发展它。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;实际我在项目中使用log4j使用的都是一些基本功能，对它的设计、结构不是很清楚，谁有相关学习文档，请给我一份，不甚感激（使用手册已有）。<BR><BR><BR><BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P><img src ="http://www.blogjava.net/beauty_beast/aggbug/35681.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beauty_beast/" target="_blank">柳随风</a> 2006-03-16 16:49 <a href="http://www.blogjava.net/beauty_beast/archive/2006/03/16/35681.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>