<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>realnicky</title>
    <description></description>
    <link>http://realnicky.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>票据打印</title>
        <author>realnicky</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://realnicky.javaeye.com">realnicky</a>&nbsp;
          链接：<a href="http://realnicky.javaeye.com/blog/91095" style="color:red;">http://realnicky.javaeye.com/blog/91095</a>&nbsp;
          发表时间: 2007年06月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="simpletable smalltxt" style="WIDTH: 98%; HEIGHT: 3944px">
<div class="subtable altbg1"><span class="right">2005-1-2 12:43</span> <strong>黄新</strong></div>
<div class="subtable altbg2 t_msg" style="WIDTH: auto; HEIGHT: auto"><strong>票据打印<font face="Arial">http://bbs.ywsy.net/archiver/?tid-47631.html</font></strong><br />
<br />
票据打印<br />
主要由三部分构成:页面内容及布置,设置页面(页面css的控制和打印参数的保存),打印<br />
<br />
一、页面内容及布置<br />
&nbsp;&nbsp;用div控制把需要打印的内容用相对位置固定下来,可用扫描仪把需要打印的票据扫描进去然后确定需要打印内容的相对位置.<br />
<br />
二、 设置页面(页面css的控制)<br />
&nbsp;&nbsp;这里主要是字体的大小
<div style="heigtht: 12"><br />
&nbsp;&nbsp;fontSize_i = font + fonti(i是一个变值,以此来控制各个部分的字体大小)<br />
&nbsp;&nbsp;left_i&nbsp; &nbsp;=&nbsp; &nbsp;top + topi (i是一个变值,以此来控制各个部分的相对左边距)<br />
&nbsp;&nbsp;top_i&nbsp; &nbsp; =&nbsp; &nbsp;left + lefti (i是一个变值,以此来控制各个部分的相对上边距)在这个阶段主要确定fonti,topi,lefti<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;在最外面可用一个
<div><br />
&nbsp;&nbsp;top&nbsp; &nbsp;(用于保存整体的上边距)<br />
&nbsp;&nbsp;left&nbsp;&nbsp;(用于保存整体的左边距)<br />
&nbsp;&nbsp;font&nbsp;&nbsp;(用于保存页面的基本字体大小) 这三个可保存于cookie或数据库中，如果使用的打印机不一样不推荐使用数据库，不同的打印机和不同的驱动对打印结果影响很大。<br />
三、打印网上非常的打印方法。需要解决的问题：去页眉页脚、上边距和左边距控制、打印输出<br />
&nbsp;&nbsp;网上有非常多的web打印方法，像web打印代码大全一摞一摞的如：FileSystem组件、98系统以上自带的<object name="wb" id="wb" height="0" classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2" width="0"></object>也有别人开发的打印控件等等。<br />
&nbsp;&nbsp;FileSystem组件直接把数据流传到打印机上，可以实现真正的打印边距为零。但是打印的格式不好控制，pass。<br />
&nbsp;&nbsp;如果不使用ActiveX空间的话比较笨的办法就是在regedit里边删除页眉页脚和把上边距左边距设 为零，但是有一点是这需要IE的安全级别比较低。<br />
&nbsp;&nbsp;最后还是用菠萝找的控件<object name="factory" id="factory" viewastext="" classid="clsid:1663ed61-23eb-11d2-b92f-008048fdd814" codebase="ScriptX.cab#Version=5,60,0,375" style="DISPLAY: none"></object>控制页眉页脚再用<object name="wb" id="wb" height="0" classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2" width="0"></object>控制打印<br />
<br />
[ Last edited by GShadow on 2005-1-3 at 18:00 ]</div>
</div>
<br />
<div class="simpletable smalltxt" style="WIDTH: 98%">
<div class="subtable altbg1"><span class="right">2005-1-2 12:50</span> <strong>黄新</strong></div>
<div class="subtable altbg2 t_msg" style="WIDTH: auto; HEIGHT: auto"><strong>票据打印</strong><br />
<br />
如果用cookie控制打印三数，可设成自定义的用以下<br />
<!--page contentType="text/html; charset=GBK"--><br />
<!--r  />
  String leftDist = request.getParameter("leftDist");<br  />
  String topDist = request.getParameter("topDist");<br  />
  String fontSize = request.getParameter("fontSize");<br  />
--><br />
<link href="../cust_css/hxy_god.css" rel="stylesheet" type="text/css" /><br />
<br />
<br />
<br />
<script language="JavaScript"><br />
  function bodyKeyDown()<br />
      {<br />
        //if (event.keyCode==13) event.keyCode=9;<br />
        if (event.keyCode==118) {<br />
          //F7<br />
          event.keyCode=0;<br />
          setProp();<br />
          return true;<br />
        }<br />
        if(event.keyCode==120){<br />
          //F9<br />
          event.keyCode = 0;<br />
          window.close();<br />
        }<br />
        if(event.keyCode==121){<br />
          //F10<br />
          event.keyCode=0;<br />
          window.form1.reset();<br />
          return true;<br />
        }<br />
}<br />
</script><br />
<script language="javascript" id="clientEventHandlersJS"><br />
<!--<br />
function tabclick() {<br />
    if (window.event.keyCode==13) {<br />
      setProp();<br />
        //window.event.keyCode=9<br />
    }<br />
}<br />
--><br />
</script><br />
<script language="javascript"><br />
function isNum(str){//判断是否 为数字<br />
var isnum = true;<br />
for(var i=0;i<str.length;i++){<br />
   var lls=str.substring(i,i+1);<br />
   if(!(lls>='0'&&lls<='9')){<br />
      return isnum =false;<br />
          break;<br />
          }<br />
   }<br />
return isnum;<br />
}<br />
function setProp()<br />
{<br />
  var left = document.form1.leftDist.value;<br />
  if(!isNum(left)||left=='')<br />
  {<br />
        alert('左边距必须为数字，请从新填写');<br />
        form1.leftDist.focus();<br />
        form1.leftDist.select();<br />
        return;<br />
  }<br />
  var top = document.form1.topDist.value;<br />
  if(!isNum(top)||top=='')<br />
  {<br />
        alert('上边距必须为数字，请从新填写');<br />
        form1.topDist.focus();<br />
        form1.topDist.select();<br />
        return;<br />
  }<br />
  var fontSize = document.form1.fontSize.value;<br />
  if(!isNum(fontSize)||fontSize=='')<br />
  {<br />
        alert('上边距必须为数字，请从新填写');<br />
        form1.fontSize.focus();<br />
        form1.fontSize.select();<br />
        return;<br />
  }<br />
  window.opener.form1.leftDist.value = left;<br />
  window.opener.form1.topDist.value = top;<br />
  window.opener.form1.fontSize.value= fontSize;<br />
  window.returnValue=true;<br />
  window.opener.test();<br />
  window.close();<br />
}<br />
</script><br />
<br />
<br />
<form name="form1">
    <br />
    &nbsp;&nbsp;
    <table cellspacing="0" border="1" align="center" width="380" cellpadding="0">
        <tbody>
            <tr>
                <td height="42" align="center" valign="middle" width="203">左边距</td>
                <td align="center" valign="middle" width="170"><input name="leftDist" onkeydown="tabclick()" value="&lt;%=leftDist%&gt;" /></td>
            </tr>
            <tr>
                <td height="45" align="center" valign="middle">上边距：</td>
                <td align="center" valign="middle"><input name="topDist" onkeydown="tabclick()" value="&lt;%=topDist%&gt;" /></td>
            </tr>
            <tr>
                <td height="41" align="center" valign="middle">字体大小：</td>
                <td align="center" valign="middle"><input name="fontSize" onkeydown="tabclick()" value="&lt;%=fontSize%&gt;" /></td>
            </tr>
            <tr>
                <td height="53" align="center" valign="middle"><input type="button" value="确定(F7)" onclick="setProp()" /></td>
                <td align="center" valign="middle"><input type="button" value="关闭(F9)" onclick="javascript:window.close();" /></td>
            </tr>
            <tr>
                <td height="2">&nbsp;</td>
                <td>&nbsp;</td>
            </tr>
        </tbody>
    </table>
    <br />
    &nbsp;&nbsp;<br />
</form>
<br />
<br />
</div>
</div>
<br />
<div class="simpletable smalltxt" style="WIDTH: 98%">
<div class="subtable altbg1"><span class="right">2005-1-2 12:51</span> <strong>黄新</strong></div>
<div class="subtable altbg2 t_msg" style="WIDTH: auto; HEIGHT: auto"><strong>票据打印-打印页面（修改注册表）</strong><br />
<br />
<!--page contentType="text/html; charset=GBK"--><br />
<br />
<br />
<br />
<script language="javascript"><br />
  function Format(num,dotLen) {<br />
//将num按小数位为dotLen来进行格式化  如无小数位参数则为2位小数<br />
      var dot=0<br />
      var num1=0<br />
      if (typeof dotLen=="undefined" || dotLen==null )<br />
          dot=2<br />
      else<br />
          dot=dotLen<br />
      if (isNaN(parseFloat(num)))<br />
          return 0<br />
      else<br />
          num1=parseFloat(num)<br />
      var n1=Math.pow(10,dot)<br />
      if (n1==0)<br />
          var iValue= Math.round(num1)<br />
      else<br />
          var iValue=    Math.round(num1*n1)/n1<br />
    var sValue = iValue.toString();<br />
    if (sValue.indexOf(".") == -1)<br />
    {<br />
        sValue = sValue + ".00";<br />
    }<br />
    else<br />
    {<br />
        if (sValue.indexOf(".") == sValue.length - 1)<br />
        {<br />
            sValue = sValue + "00";<br />
        }<br />
        else if (sValue.indexOf(".") == sValue.length - 2)<br />
        {<br />
            sValue = sValue + "0";<br />
        }<br />
    }<br />
  return sValue<br />
}<br />
//修改注册表属性<br />
//修改了 开始打印的位置<br />
//去掉 顶部的空白区<br />
<br />
  function changeIEPrintINRegedit(){<br />
    try{<br />
      var margin_top,margin_bottom,margin_left,margin_right,footer,header<br />
      var regedit = new ActiveXObject("WScript.Shell");<br />
      margin_top=regedit.RegRead ("HKEY_CURRENT_USER\\Software\\Microsoft\\Internet Explorer\\PageSetup\\margin_top");<br />
      margin_bottom=regedit.RegRead ("HKEY_CURRENT_USER\\Software\\Microsoft\\Internet Explorer\\PageSetup\\margin_bottom");<br />
      margin_left=regedit.RegRead ("HKEY_CURRENT_USER\\Software\\Microsoft\\Internet Explorer\\PageSetup\\margin_left");<br />
      margin_right=regedit.RegRead ("HKEY_CURRENT_USER\\Software\\Microsoft\\Internet Explorer\\PageSetup\\margin_right");<br />
      //footer=regedit.RegRead ("HKEY_CURRENT_USER\\Software\\Microsoft\\Internet Explorer\\PageSetup\\footer");<br />
      //header=regedit.RegRead ("HKEY_CURRENT_USER\\Software\\Microsoft\\Internet Explorer\\PageSetup\\header");<br />
      var print_top =0;<br />
      var print_bottom=0;<br />
      var print_left=0;<br />
      var print_right=0;<br />
      regedit.RegWrite("HKEY_CURRENT_USER\\Software\\Microsoft\\Internet Explorer\\PageSetup\\margin_top",print_top);<br />
      regedit.RegWrite("HKEY_CURRENT_USER\\Software\\Microsoft\\Internet Explorer\\PageSetup\\margin_bottom",print_bottom);<br />
      regedit.RegWrite("HKEY_CURRENT_USER\\Software\\Microsoft\\Internet Explorer\\PageSetup\\margin_left",print_left);<br />
      regedit.RegWrite("HKEY_CURRENT_USER\\Software\\Microsoft\\Internet Explorer\\PageSetup\\margin_right",print_right);<br />
<br />
      //设置网页打印的页眉页脚为空<br />
      print_footer = "";<br />
      print_header = "";<br />
      regedit.RegWrite("HKEY_CURRENT_USER\\Software\\Microsoft\\Internet Explorer\\PageSetup\\footer",print_footer);<br />
      regedit.RegWrite("HKEY_CURRENT_USER\\Software\\Microsoft\\Internet Explorer\\PageSetup\\header",print_header);<br />
      return true;<br />
    }<br />
    catch(Exception ){<br />
      return false;<br />
    }<br />
  }<br />
</script><br />
<br />
&nbsp; &nbsp;<script language="JavaScript"><br />
//执行打印输出；<br />
     function doPrint()<br />
{<br />
  aa.style.display='none';<br />
  try{<br />
    document.all.WebBrowser1.ExecWB(6,1);<br />
  }catch(Exception){<br />
    alert("打印失败，请重试！！");<br />
  }<br />
  aa.style.display ='';<br />
  form1.btnCloseWin.disabled='';<br />
}<br />
   </script><br />
<br />
<script src="cookie.js" language="Javascript"></script><br />
<script language="Javascript"><br />
//cookieInfo 的格式： left:top:fontSize<br />
  function makeCookie(str){<br />
     var today = new Date();<br />
     var expires = new Date(today.getTime() + Cookie.year);<br />
     setCookie('Cust_VehSFprintInfo',str, expires);<br />
   }<br />
   function test(){<br />
     if(!changeIEPrintINRegedit()){<br />
       alert("您ＩＥ当前的级别太高，请调低ＩＥ级别后重试！！");<br />
     }<br />
     else<br />
       getInfo(document.form1);<br />
   }<br />
   function showCookie(){<br />
     var myCookie = getCookie('Cust_VehSFprintInfo');<br />
     if(myCookie ==null)<br />
     {<br />
       alert('请重新设置打印格式');<br />
       //从弹出窗口取得打印页面的属性<br />
       reSetCookie();<br />
     }<br />
     else{<br />
       makeCookie(myCookie);<br />
       splitCookieInfo(myCookie);<br />
     }<br />
   }<br />
   function getInfo(frmObj)//从表单中获取信息并加入cookie中<br />
   {<br />
     var regeditTop;         //如果注册表未被修改则为－1 被修改晚了为0<br />
     var left = frmObj.leftDist.value;<br />
     var top = frmObj.topDist.value;<br />
     var fontSize = frmObj.fontSize.value;<br />
     makeCookie(left+':'+top+':'+fontSize);<br />
     window.setCookie1.innerHTML ='<div id= setCookie1></div>';<br />
     showCookie();<br />
   }<br />
<br />
   function splitCookieInfo(str)<br />
   {<br />
     var strArray = str.split(':');<br />
     var left_num = parseInt(strArray[0]) ;<br />
     var top_num = parseInt(strArray[1]) ;<br />
     var fontSize_num = parseInt(strArray[2]) ;<br />
     makePrintContent(left_num,top_num,fontSize_num);<br />
     //执行打印输出<br />
     doPrint();<br />
   }<br />
</script><br />
<!---整个打印的模块最靠上边即年月日部分的做为初试距离用top2确定--><br />
<!---整个打印的模块最靠左边的即项目做为初试距离left--><br />
<br />
<script language="javascript"><br />
<%<br />
<br />
  String sfdy = ConverCode.solveCh(request.getParameter("sfdy")) ;<br />
  String sfmx_print = ConverCode.solveCh(request.getParameter("sfmx_print"));<br />
//String sfdy = "|||"+year+"|||"+month+"|||"+day+"|||"+jkdw+"|||"+jkr+"|||"+bz+"|||"+jbr+"|||"+hj+"|||"+rmbdx+"|||";<br />
%><br />
  function check(obj){<br />
  if(obj=="null"){<br />
    return '';<br />
  }<br />
  return obj;<br />
}<br />
function makePrintContent(numLeft,numTop,numSize)<br />
{<br />
var str = '<%=sfdy%>';<br />
var sfmx_print = '<%=sfmx_print%>';<br />
  var arrayStr = str.split("|||");<br />
  var arraysfmx_print = sfmx_print.split("::");<br />
  //项目数<br />
var projectAmount = 8;<br />
//初始字体大小为3<br />
var fontSize = numSize;<br />
//                 if(numSize<10)<br />
//                   fontSize=12;<br />
//初试left 初试值即默认值为130  ||60<br />
var left = 60;<br />
left = numLeft;<br />
//添加时间及系列号 初是高度50<br />
var top2 = 50;<br />
top2 = numTop;<br />
<br />
str='<br>';<br />
str+='<div style="font-size: '+fontSize+'pt">';<br />
var left_I= 0 ;<br />
left_I = left + 115;<br />
str+='<DIV ID="year " style="position: absolute;width :54; heigtht:12; left:'+left_I+';top:'+top2+';">'+check(arrayStr[1])+'</DIV>';<br />
left_I = left + 190;<br />
str+='<DIV ID="month" style="position: absolute;width :27; heigtht:12; left:'+left_I+';top:'+top2+';">'+check(arrayStr[2])+'</DIV>';<br />
left_I = left + 240;<br />
str+='<DIV ID="day  " style="position: absolute;width :27; heigtht:12; left:'+left_I+';top:'+top2+';">'+check(arrayStr[3])+'</DIV>';<br />
left_I = left + 390;<br />
str+='<DIV ID="no   " style="position: absolute;width :27; heigtht:12; left:'+left_I+';top:'+top2+';">'+''+'</DIV>';<br />
<br />
//添加姓名及单位<br />
top2+=35;<br />
<br />
left_I = left + 76;<br />
str+='<DIV ID="companyName" style="position: absolute;width :290; heigtht:20; left:'+left_I+';top:'+top2+';">'+check(arrayStr[4])+'</DIV>';<br />
left_I = left + 397;<br />
str+='<DIV ID="Name       " style="position: absolute;width :92 ; heigtht:20; left:'+left_I+';top:'+top2+';">'+check(arrayStr[5])+'</DIV>';<br />
//添加项目 信息栏<br />
TOP = top2+45;<br />
var top = TOP;<br />
var TOP1 = TOP;<br />
var sub_arraysfmx_print;<br />
for(var j=0;j<arraysfmx_print.length;j++)<br />
{<br />
  sub_arraysfmx_print = arraysfmx_print[j].split("|||");<br />
  left_I = left;<br />
      str+='<DIV style="position: absolute;width :72; heigtht:10; left:'+left_I+';top:'+top+';">'+sub_arraysfmx_print[0]+'</DIV>';<br />
            left_I +=72+2;<br />
       str+='<DIV style="position: absolute;width :58; heigtht:10; left:'+left_I+';top:'+top+';">'+sub_arraysfmx_print[1]+'</DIV>';<br />
         left_I +=58+2;<br />
       str+='<DIV style="position: absolute;width :47; heigtht:10; left:'+left_I+';top:'+top+';">'+sub_arraysfmx_print[2]+'</DIV>';<br />
         left_I +=47+2;<br />
       str+='<DIV style="position: absolute;width :47; heigtht:10; left:'+left_I+';top:'+top+';">'+sub_arraysfmx_print[3]+'</DIV>';<br />
         left_I +=47+2;<br />
       str+='<DIV align = right style="position: absolute;width :47; heigtht:10; left:'+left_I+';top:'+top+';">'+Format(sub_arraysfmx_print[4])+'</DIV>';<br />
         left_I +=47+10;<br />
       str+='<DIV align = right style="position: absolute;width :85; heigtht:10; left:'+left_I+';top:'+top+';">'+Format(sub_arraysfmx_print[5])+'</DIV>';<br />
         top = top + 25;<br />
}<br />
//根据 projectAmount来生成输出的项目<br />
//添加合计部分<br />
TOP1 += 8*25-1;<br />
left_I = left +66;<br />
str +='<DIV ID="sum" style="position: absolute;width :300; heigtht:10;left:'+left_I+';top:'+TOP1+';">'+check(arrayStr[8])+'</DIV>';<br />
<br />
TOP1 += 25;<br />
left_I = left + 66;<br />
str +='<DIV ID="daxie" style="position: absolute;width :400; heigtht:10; left:'+left_I+';top:'+TOP1+';">'+check(arrayStr[9])+'</DIV>';<br />
<br />
//添加备注及经办人<br />
left_I = left + 395;<br />
str +='<DIV ID="beizhu" style="position: absolute;width :90; heigtht:80; left:'+left_I+';top:'+TOP +';">'+check(arrayStr[6])+'</DIV>';<br />
var i =TOP+124;<br />
left_I = left + 395;<br />
str +='<DIV ID="beizhu" style="position: absolute;width :90; heigtht:80; left:'+left_I+';top:'+i+';">'+check(arrayStr[7])+'</DIV>';<br />
<br />
str+='</div>';<br />
<br />
window.printLayer.innerHTML=str;<br />
<br />
}<br />
      </script><br />
<br />
<script language="javascript"><br />
  function PrintOut()<br />
      {<br />
        contentStr = '';<br />
        showCookie();<br />
      }<br />
  function bodyKeyDown()<br />
      {<br />
        //if (event.keyCode==13) event.keyCode=9;<br />
        if (event.keyCode==118) {<br />
          //F7<br />
          event.keyCode=0;<br />
          PrintOut();<br />
          return true;<br />
        }<br />
        if (event.keyCode==119) {<br />
          //F8<br />
          event.keyCode=0;<br />
          reSetCookie();<br />
          return true;<br />
        }<br />
        if(event.keyCode==120){<br />
          //F9<br />
          event.keyCode = 0;<br />
          if(form1.btnCloseWin.disabled==true){<br />
            alert("请先打印票据再行关闭窗口");<br />
          }<br />
          else<br />
            window.close();<br />
        }<br />
        if(event.keyCode==121){<br />
          //F10<br />
          event.keyCode=0;<br />
          window.location.reload();<br />
          return true;<br />
        }<br />
}<br />
</script><br />
<br />
<br />
<br />
<form name="form1">
    <br />
    &nbsp;&nbsp;<input name="leftDist" type="hidden" /><br />
    &nbsp;&nbsp;<input name="topDist" type="hidden" /><br />
    &nbsp;&nbsp;<input name="fontSize" type="hidden" /><br />
    <div id="printLayer"></div>
    <br />
    <!----隐藏部分----><br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <div id="aa" align="center"><br />
    <!---控制打印输出部分--><br />
    <input name="Button" type="button" value="打印(F7)" onclick="PrintOut()" /><br />
    <input type="button" value="打印设置(F8)" onclick="reSetCookie()" /><br />
    <input name="btnCloseWin" type="button" value="关闭(F9)" onclick="javascript:window.close()" /><br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <script language="javascript"><br />
function reSetCookie(){<br />
  var iniCookie = getCookie('Cust_VehSFprintInfo');<br />
  var leftDist = 60;<br />
  var topDist = 50;<br />
  var fontSize = 10;<br />
  if(iniCookie ==null){<br />
    leftDist = 60;<br />
    topDist = 50;<br />
    fontSize = 10;<br />
  }<br />
  else {<br />
    var strArray = iniCookie.split(':');<br />
    leftDist = parseInt(strArray[0]) ;<br />
    topDist = parseInt(strArray[1]) ;<br />
    fontSize = parseInt(strArray[2]) ;<br />
  }<br />
//  deleteCookie('Cust_VehSFprintInfo');//删除cookie<br />
  var p =<br />
      window.open('getPageProp.jsp?leftDist='+leftDist+'&topDist='+topDist+'&fontSize='+fontSize+'',<br />
      '','height=220, width=400, top=0, left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no');<br />
  return;<br />
}<br />
</script><br />
    <object id="WebBrowser1" height="0" classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2" width="0"></object><br />
    <script language="javascript"><br />
//初始化页面设置<br />
  function iniPage(){<br />
  var iniCookie = getCookie('Cust_VehSFprintInfo');<br />
  if(iniCookie ==null)    {<br />
    makePrintContent(60,50,10);<br />
  }<br />
  else  {<br />
    var strArray = iniCookie.split(':');<br />
    var left_num = parseInt(strArray[0]) ;<br />
    var top_num = parseInt(strArray[1]) ;<br />
    var fontSize_num = parseInt(strArray[2]) ;<br />
    makePrintContent(left_num,top_num,fontSize_num);<br />
  }<br />
}<br />
</script><br />
    <script language="javascript"><br />
  iniPage();<br />
  form1.btnCloseWin.disabled="disabled";<br />
</script><br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <div id="setCookie1"></div>
    <br />
    </div>
    <br />
</form>
<br />
<br />
<br />
<br />
[ Last edited by 黄新 on 2005-1-2 at 12:53 ]</div>
</div>
<br />
<div class="simpletable smalltxt" style="WIDTH: 98%">
<div class="subtable altbg1"><span class="right">2005-1-2 12:56</span> <strong>黄新</strong></div>
<div class="subtable altbg2 t_msg" style="WIDTH: auto; HEIGHT: auto"><strong>票据打印-打印页面（数据库保存参数）</strong><br />
<br />
<!--page contentType="text/html; charset=GBK"--><br />
<br />
<!--设置页面格式<br  />
  VehCode vehcode = new VehCode();<br  />
  String top = "";<br  />
  String left = "";<br  />
  String size = "";<br  />
  String dmz = "";<br  />
  String dmsm = "";<br  />
--><br />
<br />
<br />
<link href="../cust_css/hxy_god.css" rel="stylesheet" type="text/css" /><br />
<script language="javascript"><br />
  function Format(num,dotLen) {<br />
//将num按小数位为dotLen来进行格式化  如无小数位参数则为2位小数<br />
  var dot=0<br />
  var num1=0<br />
  if (typeof dotLen=="undefined" || dotLen==null )<br />
    dot=2<br />
    else<br />
      dot=dotLen<br />
      if (isNaN(parseFloat(num)))<br />
        return 0<br />
        else<br />
          num1=parseFloat(num)<br />
          var n1=Math.pow(10,dot)<br />
          if (n1==0)<br />
            var iValue= Math.round(num1)<br />
            else<br />
              var iValue=    Math.round(num1*n1)/n1<br />
              var sValue = iValue.toString();<br />
  if (sValue.indexOf(".") == -1)<br />
  {<br />
    sValue = sValue + ".00";<br />
  }<br />
  else<br />
  {<br />
    if (sValue.indexOf(".") == sValue.length - 1)<br />
    {<br />
      sValue = sValue + "00";<br />
    }<br />
    else if (sValue.indexOf(".") == sValue.length - 2)<br />
    {<br />
      sValue = sValue + "0";<br />
    }<br />
  }<br />
  return sValue<br />
}<br />
</script><br />
<br />
&nbsp; &nbsp; <br />
<script defer><br />
function SetPrintSettings() {<br />
  factory.printing.header = "";<br />
  factory.printing.footer = "";<br />
  factory.printing.leftMargin = 0.0;<br />
  factory.printing.topMargin = 0.0 ;<br />
}<br />
</script><br />
<script language="JavaScript"><br />
function doPrint()<br />
{<br />
  aa.style.display='none';<br />
  try{<br />
    SetPrintSettings();<br />
    document.all.WebBrowser1.ExecWB(6,1);<br />
  }catch(Exception){<br />
    alert("打印失败，请重试！！");<br />
  }<br />
  aa.style.display ='';<br />
  form1.btnCloseWin.disabled='';<br />
}<br />
</script><br />
<script language="javascript"><br />
<%<br />
<br />
  String sfdy = ConverCode.solveCh(request.getParameter("sfdy")) ;<br />
   String sfmx_print = ConverCode.solveCh(request.getParameter("sfmx_print"));<br />
//String sfdy = "|||"+year+"|||"+month+"|||"+day+"|||"+jkdw+"|||"+jkr+"|||"+bz+"|||"+jbr+"|||"+hj+"|||"+rmbdx+"|||";<br />
%><br />
  function check(obj){<br />
  if(obj=="null"){<br />
    return '';<br />
  }<br />
  return obj;<br />
}<br />
function makePrintContent(numLeft,numTop,numSize)<br />
{<br />
var str = '<%=sfdy%>';<br />
var sfmx_print = '<%=sfmx_print%>';<br />
  var arrayStr = str.split("|||");<br />
  var arraysfmx_print = sfmx_print.split("::");<br />
  //项目数<br />
  var projectAmount = 8;<br />
  var fontSize = numSize;<br />
  var left = 60;<br />
  left = numLeft;<br />
  var top2 = 50;<br />
  top2 = numTop;<br />
  str='<br>';<br />
  str+='<div style="font-size: '+fontSize+'pt">';<br />
  var left_I= 0 ;<br />
  left_I = left + 115;<br />
  str+='<DIV ID="year " style="position: absolute;width :54; heigtht:12; left:'+left_I+';top:'+top2+';">'+check(arrayStr[1])+'</DIV>';<br />
  left_I = left + 190;<br />
  str+='<DIV ID="month" style="position: absolute;width :27; heigtht:12; left:'+left_I+';top:'+top2+';">'+check(arrayStr[2])+'</DIV>';<br />
  left_I = left + 240;<br />
  str+='<DIV ID="day  " style="position: absolute;width :27; heigtht:12; left:'+left_I+';top:'+top2+';">'+check(arrayStr[3])+'</DIV>';<br />
  left_I = left + 390;<br />
  str+='<DIV ID="no   " style="position: absolute;width :27; heigtht:12; left:'+left_I+';top:'+top2+';">'+''+'</DIV>';<br />
  top2+=35;<br />
  left_I = left + 76;<br />
  str+='<DIV ID="companyName" style="position: absolute;width :290; heigtht:20; left:'+left_I+';top:'+top2+';">'+check(arrayStr[4])+'</DIV>';<br />
  left_I = left + 397;<br />
  str+='<DIV ID="Name       " style="position: absolute;width :92 ; heigtht:20; left:'+left_I+';top:'+top2+';">'+check(arrayStr[5])+'</DIV>';<br />
  TOP = top2+45;<br />
  var top = TOP;<br />
  var TOP1 = TOP;<br />
  var sub_arraysfmx_print;<br />
  for(var j=0;j<arraysfmx_print.length;j++)<br />
  {<br />
    sub_arraysfmx_print = arraysfmx_print[j].split("|||");<br />
    left_I = left;<br />
    str+='<DIV style="position: absolute;width :72; heigtht:10; left:'+left_I+';top:'+top+';">'+sub_arraysfmx_print[0]+'</DIV>';<br />
    left_I +=72+2;<br />
    str+='<DIV style="position: absolute;width :58; heigtht:10; left:'+left_I+';top:'+top+';">'+sub_arraysfmx_print[1]+'</DIV>';<br />
    left_I +=58+2;<br />
    str+='<DIV style="position: absolute;width :47; heigtht:10; left:'+left_I+';top:'+top+';">'+sub_arraysfmx_print[2]+'</DIV>';<br />
    left_I +=47+2;<br />
    str+='<DIV style="position: absolute;width :47; heigtht:10; left:'+left_I+';top:'+top+';">'+sub_arraysfmx_print[3]+'</DIV>';<br />
    left_I +=47+2;<br />
    str+='<DIV align = right style="position: absolute;width :47; heigtht:10; left:'+left_I+';top:'+top+';">'+Format(sub_arraysfmx_print[4])+'</DIV>';<br />
    left_I +=47+10;<br />
    str+='<DIV align = right style="position: absolute;width :85; heigtht:10; left:'+left_I+';top:'+top+';">'+Format(sub_arraysfmx_print[5])+'</DIV>';<br />
    top = top + 25;<br />
  }<br />
  TOP1 += 8*25-1;<br />
  left_I = left +66;<br />
  str +='<DIV ID="sum" style="position: absolute;width :300; heigtht:10;left:'+left_I+';top:'+TOP1+';">'+check(arrayStr[8])+'</DIV>';<br />
  TOP1 += 25;<br />
  left_I = left + 66;<br />
  str +='<DIV ID="daxie" style="position: absolute;width :400; heigtht:10; left:'+left_I+';top:'+TOP1+';">'+check(arrayStr[9])+'</DIV>';<br />
  left_I = left + 395;<br />
  str +='<DIV ID="beizhu" style="position: absolute;width :90; heigtht:80; left:'+left_I+';top:'+TOP +';">'+check(arrayStr[6])+'</DIV>';<br />
  var i =TOP+124;<br />
  left_I = left + 395;<br />
  str +='<DIV ID="beizhu" style="position: absolute;width :90; heigtht:80; left:'+left_I+';top:'+i+';">'+check(arrayStr[7])+'</DIV>';<br />
<br />
  str+='</div>';<br />
<br />
  window.printLayer.innerHTML=str;<br />
<br />
}<br />
</script><br />
<script language="javascript"><br />
      function bodyKeyDown()<br />
      {<br />
        //if (event.keyCode==13) event.keyCode=9;<br />
        if (event.keyCode==118) {<br />
          //F7<br />
          event.keyCode=0;<br />
          doPrint();<br />
          return true;<br />
        }<br />
        if(event.keyCode==120){<br />
          //F9<br />
          event.keyCode = 0;<br />
          if(form1.btnCloseWin.disabled==true){<br />
            alert("请先打印票据再行关闭窗口");<br />
          }<br />
          else<br />
            window.close();<br />
        }<br />
        if(event.keyCode==121){<br />
          //F10<br />
          event.keyCode=0;<br />
          window.location.reload();<br />
          return true;<br />
        }<br />
      }<br />
</script><br />
<br />
<br />
<br />
<form name="form1">
    <br />
    &nbsp;&nbsp;<input name="leftDist" type="hidden" /><br />
    &nbsp;&nbsp;<input name="topDist" type="hidden" /><br />
    &nbsp;&nbsp;<input name="fontSize" type="hidden" /><br />
    <div id="printLayer"></div>
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <div id="aa" align="center"><br />
    <input name="Button" type="button" value="打印(F7)" onclick="doPrint();" /><br />
    <input name="btnCloseWin" type="button" value="关闭(F9)" onclick="javascript:window.close()" /><br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <object id="WebBrowser1" height="0" classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2" width="0"></object><br />
    <script language="javascript"><br />
  function iniPage(){<br />
    form1.btnCloseWin.disabled = "disabled";<br />
    makePrintContent(<%=left%>,<%=top%>,<%=size%>);//  (numLeft,numTop,numSize)<br />
  }<br />
  iniPage();<br />
</script><br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    </div>
</form>
<br />
<br />
</div>
</div>
</div>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://realnicky.javaeye.com/blog/91095#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 17 Jun 2007 01:19:00 +0800</pubDate>
        <link>http://realnicky.javaeye.com/blog/91095</link>
        <guid>http://realnicky.javaeye.com/blog/91095</guid>
      </item>
      <item>
        <title>axis—安装 </title>
        <author>realnicky</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://realnicky.javaeye.com">realnicky</a>&nbsp;
          链接：<a href="http://realnicky.javaeye.com/blog/90730" style="color:red;">http://realnicky.javaeye.com/blog/90730</a>&nbsp;
          发表时间: 2007年06月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="2"><span lang="ZH-CN">从今天开始我将学习</span><span>axis</span><span lang="ZH-CN">的经验以笔记的形式共享给大家希望能对大家的工作有所帮助。</span><span><o:p></o:p></span></font></p>
<p><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span><span lang="ZH-CN">相信大家对</span><span>webservice</span><span lang="ZH-CN">有一定的了解我在这里就不再复述</span><span>webservice</span><span lang="ZH-CN">的一些基本概念。</span></font></p>
<p><font size="2"><span lang="ZH-CN"></span></font><font size="2"><span>axis1.3</span><span lang="ZH-CN">是</span><span>soap1.2</span><span lang="ZH-CN">协议的一个实现框架。在工作中我们可以方便的通过</span><span>axis</span><span lang="ZH-CN">进行</span><span>webservice</span><span lang="ZH-CN">的开发。</span></font></p>
<p><font size="2"><span lang="ZH-CN">废话少说，我们开始安装</span><span>axis.<o:p></o:p></span></font></p>
<p><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span><span lang="ZH-CN">我们可以从</span><span>axis</span><span lang="ZH-CN">的官方网站上下载</span><span>(<a href="http://ws.apache.org/axis/"><font color="#006699">http://ws.apache.org/axis/).</font></a></span><span lang="ZH-CN">解压缩</span><span>axis-bin-1_3.zip</span><span lang="ZH-CN">。在</span><span>lib</span><span lang="ZH-CN">中包含</span><span>axis</span><span lang="ZH-CN">必须使用的</span><span>jar</span><span lang="ZH-CN">包。</span><span>docs</span><span lang="ZH-CN">中包含</span><span>axis</span><span lang="ZH-CN">的文档，通常使用用户指南就可以解决大部分问题。</span><span>samples</span><span lang="ZH-CN">中包含很多</span><span>webservice</span><span lang="ZH-CN">的例子，以后会对这些例子进行进一步讲解。</span><span>webapps</span><span lang="ZH-CN">文件夹中包含了一个</span><span>axis web application</span><span lang="ZH-CN">你可以直接把他部署到</span><span>tomcat</span><span lang="ZH-CN">中，然后在这个</span><span>axis</span><span lang="ZH-CN">应用上发布你的</span><span>webservice,</span><span lang="ZH-CN">发布成功后就可以调用了。</span><span>build</span><span lang="ZH-CN">文件夹用来存放用</span><span>ant</span><span lang="ZH-CN">编译的</span><span>axis</span><span lang="ZH-CN">安装包的</span><span>classes</span><span lang="ZH-CN">文件。</span><span><o:p></o:p></span></font></p>
<p><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span><span lang="ZH-CN">第一个步骤：安装</span><span>axis.( Axis 1.3,tomcat 5.028, jdk 1.42)<o:p></o:p></span></font></p>
<p><font size="2"><span>copy&nbsp; axis-bin-1_3</span><span lang="ZH-CN">安装包下</span><span>webapps</span><span lang="ZH-CN">文件夹中的</span><span>axis</span><span lang="ZH-CN">目录到</span><span>tomcat</span><span lang="ZH-CN">的</span><span>webapps</span><span lang="ZH-CN">下发布你的</span><span>axis</span><span lang="ZH-CN">应用。重新启动</span><span>tomcat.</span><span lang="ZH-CN">访问</span><span><a href="http://localhost:8080/axis"><font color="#006699">http://localhost:8080/axis</font></a> </span><span lang="ZH-CN">。这时就会出现</span><span>axis</span><span lang="ZH-CN">的欢迎画面</span><span>.</span><span lang="ZH-CN">进入</span><span>Validation</span><span lang="ZH-CN">链接以检查</span><span>axis</span><span lang="ZH-CN">所使用的</span><span>jar</span><span lang="ZH-CN">包是否全都存在。如果不存在就会显示一下画面：</span></font></p>
<p><font size="2"><span lang="ZH-CN"><img src="http://yangyang.javaeye.com/upload/picture/pic/2359/94d9b390-1049-4ac3-acb2-e616be6fb528.bmp" alt="" /></span></font></p>
<p><font size="2"><span lang="ZH-CN"></span></font></p>
<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">
<p class="MsoNormal"><font size="2"><span lang="ZH-CN">我们可以根据链接下载</span><font face="Arial">axis</font><span lang="ZH-CN">缺少的</span><font face="Arial">jar</font><span lang="ZH-CN">文件，下载之后</span><font face="Arial">copy</font><span lang="ZH-CN">到</span><font face="Arial">tomcat\webapps\myaxis\WEB-INF\lib</font><span lang="ZH-CN">下即可。一般情况下还会有一些</span><font face="Arial">warning</font><span lang="ZH-CN">消息，里面列出的的选项不是必须存在的</span><font face="Arial">jar</font><span lang="ZH-CN">包。当所有必须的</span><font face="Arial">jar</font><span lang="ZH-CN">文件全部安装完毕，则会出现以下画面。</span></font></p>
<p class="MsoNormal"><font size="2"><span lang="ZH-CN"><img src="http://yangyang.javaeye.com/upload/picture/pic/2360/e3e71bcd-7c1d-4150-99a4-f9e3cf74342d.bmp" alt="" /></span></font></p>
<p class="MsoNormal"><span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial"><font size="2"></font></span></p>
<p class="MsoNormal"><span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial"><font size="2"></font></span></p>
<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">
<p class="MsoNormal"><font size="2"><span lang="ZH-CN">表示</span><font face="Arial">axis</font><span lang="ZH-CN">已经具备所有需要的</span><font face="Arial">jar</font><span lang="ZH-CN">文件！</span></font></p>
<p class="MsoNormal"><o:p><font size="2" face="Arial">&nbsp;</font></o:p></p>
<p class="MsoNormal"><font size="2"><span><font face="Arial">&nbsp;</font></span><span lang="ZH-CN">第二步骤</span><font face="Arial">:</font><span lang="ZH-CN">测试</span><font face="Arial">axis</font><span lang="ZH-CN">。</span></font></p>
<p class="MsoNormal"><font size="2"><span><font face="Arial">&nbsp; </font></span><span lang="ZH-CN">在测试</span><font face="Arial">axis</font><span lang="ZH-CN">之前我们需要一些准备工作。我们首先要把</span><font face="Arial">axis</font><span lang="ZH-CN">用到的</span><font face="Arial">jar</font><span lang="ZH-CN">包添加到</span><font face="Arial">CLASSPATH</font><span lang="ZH-CN">环境变量中去。如下：</span></font></p>
<p class="MsoNormal"><font size="2" face="Arial">C:\tomcat5\webapps\axis\WEB-INF\lib\axis.jar;</font></p>
<p class="MsoNormal"><font size="2" face="Arial">C:\tomcat5\webapps\axis\WEB-INF\lib\jaxrpc.jar;</font></p>
<p class="MsoNormal"><font size="2" face="Arial">C:\tomcat5\webapps\axis\WEB-INF\lib\saaj.jar;</font></p>
<p class="MsoNormal"><font size="2" face="Arial">C:\tomcat5\webapps\axis\WEB-INF\lib\commons-discovery-0.2.jar;</font></p>
<p class="MsoNormal"><font size="2" face="Arial">C:\tomcat5\webapps\axis\WEB-INF\lib\commons-logging-1.0.4.jar;</font></p>
<p class="MsoNormal"><font size="2" face="Arial">C:\tomcat5\webapps\axis\WEB-INF\lib\wsdl4j-1.5.1.jar;</font></p>
<p class="MsoNormal"><font size="2" face="Arial">C:\tomcat5\webapps\axis\WEB-INF\lib\activation.jar;</font></p>
<p class="MsoNormal"><font size="2" face="Arial">C:\tomcat5\webapps\axis\WEB-INF\lib\mail.jar</font></p>
<p class="MsoNormal"><span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial"><font size="2">注意路径是根据自己部属情况而定，上面的只是参考。</font></span></p>
<p class="MsoNormal"><font size="2"><span lang="ZH-CN">我们通过</span><span>JWS (Java Web Service)</span><span lang="ZH-CN">文件的方式来发布一个</span><span>webservice</span><span lang="ZH-CN">。首先在安装包的</span><span>axis-bin-1_3\axis-1_3\samples\userguide\example2</span><span lang="ZH-CN">目录下找到</span><span>Calculator .java</span><span lang="ZH-CN">文件，将其改名为</span><span>Calculator .jws</span><span lang="ZH-CN">然后</span><span>copy</span><span lang="ZH-CN">到</span><span>tomcat</span><span lang="ZH-CN">的</span><span>webapps/axis/</span><span lang="ZH-CN">下。发布这个</span><span>webservice</span><span lang="ZH-CN">。这个</span><span>webservice</span><span lang="ZH-CN">提供了两个功能即加减功能。</span><span><o:p></o:p></span></font></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span><font size="2">Webservice code:<o:p></o:p></font></span></strong></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2">public class Calculator {<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp; </span>public int add(int i1, int i2)<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp; </span>{<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp; </span>return i1 + i2; <o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp; </span>}<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><o:p><font size="2">&nbsp;</font></o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><o:p><font size="2">&nbsp;</font></o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp; </span>public int subtract(int i1, int i2)<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp; </span>{<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp; </span>return i1 - i2;<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp; </span>}<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2">}<o:p></o:p></font></span></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span><font size="2">Client code:<o:p></o:p></font></span></strong></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2">package samples.userguide.example2 ;<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><o:p><font size="2">&nbsp;</font></o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2">import org.apache.axis.client.Call;<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2">import org.apache.axis.client.Service;<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2">import org.apache.axis.encoding.XMLType;<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2">import org.apache.axis.utils.Options;<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><o:p><font size="2">&nbsp;</font></o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2">import javax.xml.rpc.ParameterMode;<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><o:p><font size="2">&nbsp;</font></o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2">public class CalcClient<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2">{<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp; </span>public static void main(String [] args) throws Exception {<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Options options = new Options(args);<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String endpoint = &quot;http://localhost:&quot; + options.getPort() +<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&quot;/axis/Calculator.jws&quot;;<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>args = options.getRemainingArgs();<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (args == null || args.length != 3) {<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>System.err.println(&quot;Usage: CalcClient arg1 arg2&quot;);<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return;<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String method = args[0];<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (!(method.equals(&quot;add&quot;) || method.equals(&quot;subtract&quot;))) {<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.err.println(&quot;Usage: CalcClient arg1 arg2&quot;);<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return;<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Integer i1 = new Integer(args[1]);<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Integer i2 = new Integer(args[2]);<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><o:p><font size="2">&nbsp;</font></o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Service<span>&nbsp; </span>service = new Service();<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Call<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>call<span>&nbsp;&nbsp;&nbsp; </span>= (Call) service.createCall();<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><o:p><font size="2">&nbsp;</font></o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>call.setTargetEndpointAddress( new java.net.URL(endpoint) );<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>call.setOperationName( method );<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>call.addParameter( &quot;op1&quot;, XMLType.XSD_INT, ParameterMode.IN );<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>call.addParameter( &quot;op2&quot;, XMLType.XSD_INT, ParameterMode.IN );<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>call.setReturnType( XMLType.XSD_INT );<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><o:p><font size="2">&nbsp;</font></o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Integer ret = (Integer) call.invoke( new Object [] { i1, i2 });<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.println(&quot;Got result : &quot; + ret);<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2"><span>&nbsp;&nbsp; </span>}<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><font size="2">}<o:p></o:p></font></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: Verdana"><o:p><font size="2">&nbsp;</font></o:p></span></p>
<pre><font size="2"><font size="+0"><span lang="ZH-CN" style="COLOR: black; FONT-FAMILY: SimSun; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">下面我们来进行调用。首先进入客户端源代码所在位置，也可以将源代码所在目录添加到</span><span>classpath</span><span lang="ZH-CN">中</span></font></font></pre>
<pre><font size="2"><font size="+0"><span lang="ZH-CN" style="COLOR: black; FONT-FAMILY: SimSun; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">（</span><span>C:\Documents and Settings\y41yang\Desktop\software\axis-bin-1_3\axis-1_3;</span><span lang="ZH-CN">）：</span><span><o:p></o:p></span></font></font></pre>
<pre><font size="2"><font size="+0"><span lang="ZH-CN" style="COLOR: black; FONT-FAMILY: SimSun; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">然后输入</span></font></font><span><font size="2"><font size="+0">java samples.userguide.example2.CalcClient -p8080 add 2 5</font></font></span></pre>
<pre><span style="COLOR: black"><font size="2"><font size="+0"> </font></font></span><font size="2"><font size="+0"><span lang="ZH-CN" style="COLOR: black; FONT-FAMILY: SimSun; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">这时如果结果为</span><span>Got result : 7 </span><span courier="" lang="ZH-CN">则说明</span><span>axis</span><span courier="" lang="ZH-CN">安装成功！如果失败了请检查</span><span>classpath</span></font><span courier="" lang="ZH-CN"><font size="+0">设置，</font></span></font></pre>
<pre><font size="2"><span courier="" lang="ZH-CN"><font size="+0">是否将所有用到</font><font size="+0">的</font></span><font size="+0"><span style="COLOR: black">jar</span><span courier="" lang="ZH-CN">文件加入</span><span>classpath</span><span courier="" lang="ZH-CN">中。</span></font></font><font size="2"><span lang="ZH-CN">到这里</span><font face="Arial">axis</font><span lang="ZH-CN">就已经安装成功了！</span></font></pre>
</span></span>
          <br/>
          <span style="color:red;">
            <a href="http://realnicky.javaeye.com/blog/90730#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 15 Jun 2007 11:28:47 +0800</pubDate>
        <link>http://realnicky.javaeye.com/blog/90730</link>
        <guid>http://realnicky.javaeye.com/blog/90730</guid>
      </item>
      <item>
        <title>SQL中Convert转化函数的用法</title>
        <author>realnicky</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://realnicky.javaeye.com">realnicky</a>&nbsp;
          链接：<a href="http://realnicky.javaeye.com/blog/89149" style="color:red;">http://realnicky.javaeye.com/blog/89149</a>&nbsp;
          发表时间: 2007年06月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>　Convert的使用方法：</p>
<p>　　格式：</p>
<div style="OVERFLOW: auto; WIDTH: 500px">
<pre style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: black 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: black 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: rgb(237,237,237)"><div><!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--><span style="COLOR: rgb(0,0,0)">Convert(data_type,expression[,style])</span></div>
</pre>
</div>
<p>　　说明：此样式一般在时间类型(datetime,smalldatetime)与字符串类型(nchar,nvarchar,char,varchar)相互转换的时候才用到.</p>
<p>　　例子：</p>
<div style="OVERFLOW: auto; WIDTH: 500px">
<pre style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: black 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: black 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: rgb(237,237,237)"><div><!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--><span style="COLOR: rgb(0,0,0)">SELECT Convert(varchar(</span><span style="COLOR: rgb(0,0,0)">30</span><span style="COLOR: rgb(0,0,0)">),getdate(),</span><span style="COLOR: rgb(0,0,0)">101</span><span style="COLOR: rgb(0,0,0)">) now</span></div>
</pre>
</div>
<p>　　结果为</p>
<p>　　now</p>
<p>　　09/15/2001</p>
<p>　　style数字在转换时间时的含义如下：
<table cellspacing="1" border="1" align="center" width="450" cellpadding="1" style="WIDTH: 450px; HEIGHT: 435px">
    <tbody>
        <tr>
            <td>Style(2位表示年份)</td>
            <td>Style(4位表示年份)</td>
            <td>输入输出格式</td>
        </tr>
        <tr>
            <td>&nbsp;0 </td>
            <td>100&nbsp; </td>
            <td>mon dd yyyy hh：miAM(或PM) </td>
        </tr>
        <tr>
            <td>1&nbsp;&nbsp;&nbsp; </td>
            <td>101&nbsp;</td>
            <td>mm/dd/yy</td>
        </tr>
        <tr>
            <td>2</td>
            <td>102</td>
            <td>yymmdd </td>
        </tr>
        <tr>
            <td>3</td>
            <td>103</td>
            <td>dd/mm/yy </td>
        </tr>
        <tr>
            <td>4</td>
            <td>104</td>
            <td>ddmmyy </td>
        </tr>
        <tr>
            <td>5</td>
            <td>105</td>
            <td>ddmmyy </td>
        </tr>
        <tr>
            <td>6</td>
            <td>106</td>
            <td>dd mon yy </td>
        </tr>
        <tr>
            <td>7</td>
            <td>107</td>
            <td>mon dd,yy </td>
        </tr>
        <tr>
            <td>8</td>
            <td>108</td>
            <td>hh：mm：ss</td>
        </tr>
        <tr>
            <td>9</td>
            <td>109</td>
            <td>mon dd yyyy hh：mi：ss：mmmmAM(或PM)</td>
        </tr>
        <tr>
            <td>10</td>
            <td>110</td>
            <td>mmddyy </td>
        </tr>
        <tr>
            <td>11</td>
            <td>111</td>
            <td>yy/mm/dd </td>
        </tr>
        <tr>
            <td>12</td>
            <td>112</td>
            <td>yymmdd</td>
        </tr>
        <tr>
            <td>13</td>
            <td>113</td>
            <td>dd mon yyyy hh：mi：ss：mmm(24小时制)</td>
        </tr>
        <tr>
            <td>14</td>
            <td>114</td>
            <td>hh：mi：ss：mmm(24小时制)</td>
        </tr>
        <tr>
            <td>20</td>
            <td>120</td>
            <td>yyyymmdd hh：mi：ss(24小时制) </td>
        </tr>
        <tr>
            <td>21</td>
            <td>121</td>
            <td>&nbsp;yyyymmdd hh：mi：ss：mmm(24小时制)</td>
        </tr>
    </tbody>
</table>
</p>
          <br/>
          <span style="color:red;">
            <a href="http://realnicky.javaeye.com/blog/89149#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 11 Jun 2007 15:06:55 +0800</pubDate>
        <link>http://realnicky.javaeye.com/blog/89149</link>
        <guid>http://realnicky.javaeye.com/blog/89149</guid>
      </item>
      <item>
        <title>ArrayList用法</title>
        <author>realnicky</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://realnicky.javaeye.com">realnicky</a>&nbsp;
          链接：<a href="http://realnicky.javaeye.com/blog/64601" style="color:red;">http://realnicky.javaeye.com/blog/64601</a>&nbsp;
          发表时间: 2007年03月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>**<br />
<font color="#ffffff">&nbsp;</font><font color="#3f5fbf">*Output:&nbsp;</font><br />
<font color="#3f5fbf">Original&nbsp;contents&nbsp;of&nbsp;al:&nbsp;C&nbsp;A&nbsp;E&nbsp;B&nbsp;D&nbsp;F&nbsp;</font><br />
<font color="#3f5fbf">Modified&nbsp;list&nbsp;backwards:&nbsp;F+&nbsp;D+&nbsp;B+&nbsp;E+&nbsp;A+&nbsp;C+&nbsp;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;</font><font color="#3f5fbf">*/</font><br />
<font color="#ffffff"></font><br />
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">java.util.ArrayList;</font><br />
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">java.util.Iterator;</font><br />
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">java.util.ListIterator;</font><br />
<font color="#ffffff"></font><br />
<font color="#7f0055"><strong>public&nbsp;class&nbsp;</strong></font><font color="#000000">MainClass&nbsp;</font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;static&nbsp;</strong></font><font color="#7f0055"><strong>void&nbsp;</strong></font><font color="#000000">main</font><font color="#000000">(</font><font color="#000000">String&nbsp;args</font><font color="#000000">[])&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">ArrayList&lt;String&gt;&nbsp;al&nbsp;=&nbsp;</font><font color="#7f0055"><strong>new&nbsp;</strong></font><font color="#000000">ArrayList&lt;String&gt;</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">al.add</font><font color="#000000">(</font><font color="#2a00ff">&quot;C&quot;</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">al.add</font><font color="#000000">(</font><font color="#2a00ff">&quot;A&quot;</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">al.add</font><font color="#000000">(</font><font color="#2a00ff">&quot;E&quot;</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">al.add</font><font color="#000000">(</font><font color="#2a00ff">&quot;B&quot;</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">al.add</font><font color="#000000">(</font><font color="#2a00ff">&quot;D&quot;</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">al.add</font><font color="#000000">(</font><font color="#2a00ff">&quot;F&quot;</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.out.print</font><font color="#000000">(</font><font color="#2a00ff">&quot;Original&nbsp;contents&nbsp;of&nbsp;al:&nbsp;&quot;</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">Iterator&lt;String&gt;&nbsp;itr&nbsp;=&nbsp;al.iterator</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>while&nbsp;</strong></font><font color="#000000">(</font><font color="#000000">itr.hasNext</font><font color="#000000">())&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">String&nbsp;element&nbsp;=&nbsp;itr.next</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.out.print</font><font color="#000000">(</font><font color="#000000">element&nbsp;+&nbsp;</font><font color="#2a00ff">&quot;&nbsp;&quot;</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.out.println</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">ListIterator&lt;String&gt;&nbsp;litr&nbsp;=&nbsp;al.listIterator</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>while&nbsp;</strong></font><font color="#000000">(</font><font color="#000000">litr.hasNext</font><font color="#000000">())&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">String&nbsp;element&nbsp;=&nbsp;litr.next</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">litr.set</font><font color="#000000">(</font><font color="#000000">element&nbsp;+&nbsp;</font><font color="#2a00ff">&quot;+&quot;</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;Now,&nbsp;display&nbsp;the&nbsp;list&nbsp;backwards.</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.out.print</font><font color="#000000">(</font><font color="#2a00ff">&quot;Modified&nbsp;list&nbsp;backwards:&nbsp;&quot;</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>while&nbsp;</strong></font><font color="#000000">(</font><font color="#000000">litr.hasPrevious</font><font color="#000000">())&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">String&nbsp;element&nbsp;=&nbsp;litr.previous</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.out.print</font><font color="#000000">(</font><font color="#000000">element&nbsp;+&nbsp;</font><font color="#2a00ff">&quot;&nbsp;&quot;</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#000000">}</font></p>
<p>&nbsp;</p>
<p><font face="Arial">http://demo.q139.cn/Code/JavaAPI/java.util/ArrayListiterator.htm</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://realnicky.javaeye.com/blog/64601#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 22 Mar 2007 10:25:10 +0800</pubDate>
        <link>http://realnicky.javaeye.com/blog/64601</link>
        <guid>http://realnicky.javaeye.com/blog/64601</guid>
      </item>
      <item>
        <title>2007年2月11日 营销赢思维－－营销实战和营销创新</title>
        <author>realnicky</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://realnicky.javaeye.com">realnicky</a>&nbsp;
          链接：<a href="http://realnicky.javaeye.com/blog/53822" style="color:red;">http://realnicky.javaeye.com/blog/53822</a>&nbsp;
          发表时间: 2007年02月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>张利：清华大学、北京大学、中共中央党校特邀教授、著名战略营销专家，企业经营模式研究专家</p>
<p>标力大厦省建行四楼</p>
<p>笔记：</p>
<p>营销不是专业</p>
<p>战胜不复－－－别自以为是，要自以为非</p>
<p>君子务本，本定而道生。</p>
<p>企业经营目的不等于利润；有价值的产品肯定是有其特色的。</p>
<p>赚钱 生意的三要素</p>
<p>&nbsp;a 能否产生现金？－－现金流大于一切</p>
<p>&nbsp;b 能否获得一个很好的资产收益率（资产收益率＝利润率&times;周转率 宏图三胞具有每年50次的资金周转率）</p>
<p>c 能否持续的成长</p>
<p>经营企业三原则：现金流第一，利润第二，规模第三 </p>
<p>不赌博</p>
<p>高必以下为基，贵必以贱为本！－－老子&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>追求市场份额：细分市场第一 区域市场第一 做隐形冠军</p>
<p>做小池塘里的大鱼，不做大池塘里的小鱼</p>
<p>马太效应：强者占有资源，赢家通吃</p>
<p>能提高效益的手段就是最有效的管理手段（对政府腐败是比较有效的管理手段）</p>
<p>营销起源于竞争 标杆营销适合于小企业</p>
<p>产品＋服务－&gt;解决方案</p>
<p>顾客不一定是上帝，谁稀缺谁上帝。</p>
<p>没有选择余地的客户是最忠诚的&nbsp; 台湾&ldquo;7－11&rdquo;小商店</p>
<p>《韩非子.奸劫弑臣》</p>
<p>顾客价值＝解决问题的功能/购买代价</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://realnicky.javaeye.com/blog/53822#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 11 Feb 2007 23:20:06 +0800</pubDate>
        <link>http://realnicky.javaeye.com/blog/53822</link>
        <guid>http://realnicky.javaeye.com/blog/53822</guid>
      </item>
      <item>
        <title>7、面向对象设计：共性VS个性</title>
        <author>realnicky</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://realnicky.javaeye.com">realnicky</a>&nbsp;
          链接：<a href="http://realnicky.javaeye.com/blog/53557" style="color:red;">http://realnicky.javaeye.com/blog/53557</a>&nbsp;
          发表时间: 2007年02月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>一尺之捶，日取其半，万世不竭！</p>
<p>7.2 对象和类的粒度</p>
<p>7.2.1 CPU难题</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 处理有包容关系的类，用继承机制还是聚合机制？</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 多态性的机制可以大量减少条件判断语句的重复。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 继承和动态绑定</p>
<p>&nbsp;&nbsp;7.2.2 继承的粒度</p>
<p>类的定义：类是对象的抽象，是一系列既有共性又有个性的对象的高度概括。</p>
<p>对象的共性和个性是相对的而不是绝对的。</p>
<p>对继承粒度问题的认识：</p>
<p>1.必须基于需求来确定继承的粒度。如果提取对象的某一个共性对于我们要解决的问题没有任何帮助，或只有很小的帮助，那就没有必要因为提取共性而增加继承数的复杂度。</p>
<p>2.对象的某些共性更适合于用属性而不是用新的基类和派生类来表达。</p>
<p>3.利用类和对象是模拟现实世界的手段而不是目的。我们不能为了提取类而提取类。我们最终的目的是最大限度地实现代码复用，提高软件质量。因此，如果不能达到复用代码地目的，就没有必要再提取新地类了。</p>
          <br/>
          <span style="color:red;">
            <a href="http://realnicky.javaeye.com/blog/53557#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 09 Feb 2007 16:53:57 +0800</pubDate>
        <link>http://realnicky.javaeye.com/blog/53557</link>
        <guid>http://realnicky.javaeye.com/blog/53557</guid>
      </item>
      <item>
        <title>6、架构分析：功能分解VS对象分解</title>
        <author>realnicky</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://realnicky.javaeye.com">realnicky</a>&nbsp;
          链接：<a href="http://realnicky.javaeye.com/blog/52924" style="color:red;">http://realnicky.javaeye.com/blog/52924</a>&nbsp;
          发表时间: 2007年02月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>天下莫大于秋毫之末，而大山为小......</p>
<p>6.2.2 架构分析的作用</p>
<p>&nbsp;a、架构分析为软件定义了科学的结构和规则，可以有效地控制软件地复杂性，易于理解、实现和管理</p>
<p>架构模式描述了软件系统基本的结构组织策略</p>
<p>&nbsp;</p>
<p>设计要求：</p>
<p>层和层之间的耦合应该尽可能地松散</p>
<p>级别相同、指责类似的元素应该北组织到同一层中；</p>
<p>复杂的模块应该被继续分解为粒度更细的层或子系统；</p>
<p>应尽量将可能发生变化的元素封装到一个层中，这样，变化发生时我们只要改变受影响的层就可以了</p>
<p>每一层只调用下一层提供的功能服务，决不能调用上一层提供的功能服务，避免循环依赖</p>
          <br/>
          <span style="color:red;">
            <a href="http://realnicky.javaeye.com/blog/52924#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 07 Feb 2007 11:35:48 +0800</pubDate>
        <link>http://realnicky.javaeye.com/blog/52924</link>
        <guid>http://realnicky.javaeye.com/blog/52924</guid>
      </item>
      <item>
        <title>第五章 分析模型：实体类vs软件类</title>
        <author>realnicky</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://realnicky.javaeye.com">realnicky</a>&nbsp;
          链接：<a href="http://realnicky.javaeye.com/blog/51223" style="color:red;">http://realnicky.javaeye.com/blog/51223</a>&nbsp;
          发表时间: 2007年01月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>不，我不想要自由；我只要条出路，向左或是向右，到哪儿都行。</p>
<p>5.2 面向对象的思维方式：围绕对象和类来分析、设计软件系统</p>
<p>5.3 面向对象分析</p>
<p>&nbsp;&nbsp; 面向对象分析的主要任务就是根据用户需求，建立一个准确的、完整的、一致的系统模型。这个过程的输入是软件的功能性需求。该过程产生三个分析模型：</p>
<p>a、功能模型：把用户的功能性需求转化为开发人员和用户都能理解的一种表达方式，其结果就是我们此前谈到的用例模型</p>
<p>b、对象模型：通过对用例模型的分析，把系统分解成互相协作的分析类。一般情况下，我们通过类图和对象图来描述系统中所有对象、对象属性、及对象之间的相互关系。对象模型就是系统的静态模型</p>
<p>c、动态模型：描述系统的动态行为，一般用顺序图和协作图来描述系统中对象之间的交互关系</p>
<p>&nbsp;</p>
<p>5.3.2 实体类和软件类</p>
<p>5.3.2.1 实体类 （Entity class）是应用领域中的核心类，一般是从现实世界中的实体对象归纳和抽象出来的，用于长期保存系统中的信息，以及提供针对这些信息的相关处理行为。一般情况下，实体类的对象实例和应用系统本身有着相同的生命周期</p>
<p>5.3.2.2 边界类和控制类</p>
<p>边界类（boundary class）：边界类是系统内的对象和系统外的参与者的联系媒体，外界的消息只能通过边界类的对象实例才能发送给系统</p>
<p>控制类（control class）：实体类和边界类之间的润滑剂，是从控制对象中归纳和抽象出来的，用于协调系统内边界类和实体类之间的交互</p>
<p>&nbsp;</p>
<p>5.4</p>
<p>5.4.1 提取实体对象和实体类（物理或实在的对象；人的角色；组织；事件；地点；故则说明或事物描述；规则和策略）</p>
<p>5.4.2 提取属性</p>
<p>5.4.3 提取关系（&ldquo;有&hellip;&hellip;&rdquo;，&ldquo;是&hellip;&hellip;的一部分&rdquo;，&ldquo;包含&rdquo;，&ldquo;包括&rdquo;，&ldquo;管理&rdquo;，&ldquo;报告&rdquo;） 1：1； 1：m； m：n ；归纳关系</p>
<p>5.4.4 添加边界类</p>
<p>5.4.5 添加控制类</p>
<p>5.4.6 绘制类图 </p>
<p>5.4.7 绘制顺序图</p>
<p>5.4.8 变化的需求</p>
<p>5.4.9 编制术语表</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://realnicky.javaeye.com/blog/51223#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 30 Jan 2007 12:43:01 +0800</pubDate>
        <link>http://realnicky.javaeye.com/blog/51223</link>
        <guid>http://realnicky.javaeye.com/blog/51223</guid>
      </item>
      <item>
        <title>第四章 模式：变化之美 vs 永恒之美</title>
        <author>realnicky</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://realnicky.javaeye.com">realnicky</a>&nbsp;
          链接：<a href="http://realnicky.javaeye.com/blog/51209" style="color:red;">http://realnicky.javaeye.com/blog/51209</a>&nbsp;
          发表时间: 2007年01月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>见山是山 见水是水；见山不是山，见水不是水；见山只是山，见水只是水；</p>
<p>GoF 《设计模式》</p>
<p>设计模式中蕴涵的面向对象设计原则和设计思路：</p>
<p>a、设计模式最根本的意图是适应需求变化</p>
<p>b、针对接口编程，而不是针对实现编程</p>
<p>c、优先使用聚合，而不是继承</p>
<p>4.3.6 设计模式的分类</p>
<p>a、按设计模式的目的分类（主要用来完成什么工作）：创建型模式（封装对象的创建过程）、结构型模式（处理类或对象的组织结构）、行为型模式（指导类和对象之间的交互以及职责分配关系）</p>
<p>b、按处理范围不同：类模式（处理类和派生类之间的继承关系）、对象模式（处理对象之间的组织关系）</p>
          <br/>
          <span style="color:red;">
            <a href="http://realnicky.javaeye.com/blog/51209#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 30 Jan 2007 11:27:43 +0800</pubDate>
        <link>http://realnicky.javaeye.com/blog/51209</link>
        <guid>http://realnicky.javaeye.com/blog/51209</guid>
      </item>
      <item>
        <title>《分析模式：可重用对象模型》-- 责任模式 </title>
        <author>realnicky</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://realnicky.javaeye.com">realnicky</a>&nbsp;
          链接：<a href="http://realnicky.javaeye.com/blog/50402" style="color:red;">http://realnicky.javaeye.com/blog/50402</a>&nbsp;
          发表时间: 2007年01月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <table cellspacing="0" border="0" align="center" width="760" cellpadding="0">
    <tbody>
        <tr>
            <td class="title" height="56" align="center" valign="middle"><strong><font size="3" color="#ff0000"><br />
            <!-- #EndEditable --></font></strong></td>
        </tr>
        <tr>
            <td class="formtitle" height="40" align="center"><!-- #BeginEditable "2" -->作者：无<!-- #EndEditable --></td>
        </tr>
    </tbody>
</table>
<table cellspacing="0" border="0" align="center" height="65" width="760" cellpadding="0">
    <tbody>
        <tr>
            <td class="content" height="65"><!-- #BeginEditable "3" -->
            <table align="center" width="760">
                <tbody>
                    <tr>
                        <td class="content">
                        <table class="p11" cellspacing="0" border="0" align="center" width="647" cellpadding="0" style="WIDTH: 647px; HEIGHT: 2601px">
                            <tbody>
                                <tr>
                                    <td class="content" style="WORD-WRAP: break-word">
                                    <p>1 责任模式 <br />
                                    这一章关注的重点是关系，以及怎样为错综复杂的关系建立模型，另外，所有的插图都来自原书（《Analysis Patterns：Reusable Object Models》），并遵循UML标准。 </p>
                                    <p>1.1 Party模式 <br />
                                    在这一章中，首先我们接触到是是Party模式，在进行系统分析和概念模型设计的时候，经常发现人和各种各样的组织有着同样的行为，例如，固定电话的计费可能是针对个人，也可能是一个单位；需要各种服务的时候，你可能求助于一个服务公司，或者服务公司一个特定的业务员。总之，因为人（Person）和组织（Organization）表现上的一致性，如下图所见，我们从中抽象出Party，作为Person 和Organization的抽象父类。</p>
                                    <p><img src="http://uml.org.cn/sjms/IMAGES/160.jpg" height="284" alt="" width="546" /></p>
                                    <p>&nbsp;</p>
                                    <p>1.2 组织（Organization）的内部结构 <br />
                                    第二步，如果我们把注意力转移到组织（Organization）的内部结构，就会发现一些有趣的问题，通常最常见的一种结构是金字塔结构，因此建模时可能按照这样的结构建立线性的模型，例如：</p>
                                    <p><img src="http://uml.org.cn/sjms/IMAGES/161.jpg" height="118" alt="" width="546" /></p>
                                    <p>这样的模型并没有错误，但是有缺陷，首先不能满足比较复杂的组织关系，更严重的是，一旦需要更多的层次关系，例如存在部门直接上下级关系以及区域附属管理方式，必将引起整个模型的更改，对系统的影响可想而知，在这种情况下，最通常的改进措施是引入层次关系，如下图所示：</p>
                                    <p align="center"><img src="http://uml.org.cn/sjms/IMAGES/162.gif" height="279" alt="" width="428" /></p>
                                    <p>通过增加新的关联关系，可以灵活实现组织（Organization）之间的各种关系以及可能的变化。在上图中，{hierarchy}是一个约束（constraint）来限定关系。</p>
                                    <p>1.3 组织关系抽象 <br />
                                    第三步，在一般的情况下，以上的模式已经足够解决问题，但当这样的层次和组织关系很多而且复杂时（超过两种），例如现在流行的矩阵管理，就可以将关系本身抽取出来独立处理，如下图所示，作者此时考虑到组织结构的有效时段，所以加入了一个时间段属性来记录组织结构的存在时间。</p>
                                    <p><img src="http://uml.org.cn/sjms/IMAGES/163.jpg" height="333" alt="" width="576" /></p>
                                    <p>请注意，在这个模式中，Organization Structure才是模式的核心，在系统中，由两个Organization的实例（分别充当parent和subsidiary），以及一个Type实例来说明该结构的类型。在这样的结构中，可能存在许多的规则（Rule），这些规则可以根据情况分别处理：如果Type很多，而且规则主要跟Type有关，就分配给与Type相关联；如果Type并不多，但主要根据Organization的子类型变化，就可以分布到Organization的子类型中。</p>
                                    <p>1.4 责任（Accountability）模式 <br />
                                    第四步，从第一步看到，Party是Person和Organization的抽象父类，因此把Party代入上面的模式（有点象我们小时侯代数里常用的代入），正式形成责任（Accountability）模式。 </p>
                                    <p><img src="http://uml.org.cn/sjms/IMAGES/164.jpg" height="318" alt="" width="521" /></p>
                                    <p>1.5 知识层（Knowledge level）和操作层（Operational level）分离 <br />
                                    出现这样一种想法是考虑到以下情况：当Accountablity Type的数量比Accountability的数量多很多的时候，处理Accountablity Type的规则也变得更为复杂，要解决这样的问题，就可以引入知识层和操作层的分离。</p>
                                    <p>由下图可见，用虚线隔离开的，就是知识层（Knowledge level）和操作层（Operational level），在这个模型中，知识层（Knowledge level）由三个类协作完成，它们分别是Accountablity Type、Connection Rule、Party Type，在Connection Rule中定义合法的Party关系规则，并通过Accountablity Type对Accountablity进行创建时的合法性检验。它的另一个好处就是，可以将知识层的实例化独立出来，作为操作层（Operational level）运行时的配置；换句话说，当知识层的规则改变时，系统的行为将被改变，而不需要任何其他代码的改动，这当然是一种比较理想化的情况。</p>
                                    <p>&nbsp;</p>
                                    <p>由此想到，构建专家系统的设计思路也可以从这个模式得到一些启发，这是笔者一时的感触。</p>
                                    <p>在原书中，如何实现这样的模型提得比较模糊，但是笔者认为，可以将它们作为正常的模型来实现，两个层次的区分只是表明它们各自担负的任务和地位不同。知识层倾向于描述系统可能存在的各种形式，并设定判断系统是否有效的各种规则；操作层则描述在这样的配置下系统实际的行为。通过改变内在的配置来改变外在的行为，就是这个模式的目的。</p>
                                    <p>由于这个模式的特点，改变系统行为时不必更改操作层的代码，但是，并不意味着改变系统行为连测试也不必要做。同样，也需要调试、配置管理。</p>
                                    <p>作者也提到，这样的模式用起来并不轻松，甚至在一般的系统中也不必要，但当你发现有必要用它的时候，别犹豫（感觉象用降落伞一样）！</p>
                                    <p>1.6 小结 <br />
                                    从简单到复杂，前面分五步介绍了适用于解决Party及其关系的各种模式，每种推荐的模式都有其表现的机会，希望我这篇文章可以起到一些抛砖引玉的作用，并欢迎大家对其中的错误进行指正，欢迎发表意见，进行交流。</p>
                                    <p>&nbsp;</p>
                                    <p><br />
                                    </p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
          <br/>
          <span style="color:red;">
            <a href="http://realnicky.javaeye.com/blog/50402#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 25 Jan 2007 16:32:26 +0800</pubDate>
        <link>http://realnicky.javaeye.com/blog/50402</link>
        <guid>http://realnicky.javaeye.com/blog/50402</guid>
      </item>
      <item>
        <title>面向对象设计模式与原则</title>
        <author>realnicky</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://realnicky.javaeye.com">realnicky</a>&nbsp;
          链接：<a href="http://realnicky.javaeye.com/blog/49189" style="color:red;">http://realnicky.javaeye.com/blog/49189</a>&nbsp;
          发表时间: 2007年01月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>设计模式简介</strong>
<p>每一个模式描述了一个在我们周围不断重复发生的问题，以及该问题的解决方案的核心。<br />
-- Christopher Alexander</p>
<p>设计模式描述了软件设计过程中某一类常见问题的一般性的解决方案。面向对象设计模式描述了面向对象设计过程中、特定场景下、类与相互通信的对象之间常见的组织关系。</p>
<p><strong>GoF23 种设计模式</strong></p>
<p>历史性著作《设计模式：可复用面向对象软件的基础》一书中描述了23种经典面向对象设计模式，创立了模式在软件设计中的地位。该书<br />
四位作者被人们并称为Gang of Four （GoF），&ldquo;四人组&rdquo;，该书描述的23种经典设计模式又被人们称为GoF23 种设计模式。</p>
<p>由于《设计模式：可复用面向对象软件的基础》一书确定了设计模式的地位，人们通常所说的设计模式隐含地表示&ldquo;面向对象设计模式&rdquo;。<br />
但这并不意味&ldquo;设计模式&rdquo;就等于&ldquo;面向对象设计模式&rdquo;，也不意味着GoF23种模式就表示了所有的&ldquo;面向对象设计模式&rdquo;。除了&ldquo;面向对象设计模式&rdquo;外，还有其他设计模式。除了GoF23 种设计模式外，还有更多的面向对象设计模式。</p>
<p>GoF23 种设计模式是学习面向对象设计模式的起点，而非终点；本培训课程的目标是让学员在建立在有效方法的基础上，掌握GoF23种设计模式。</p>
<p><strong>设计模式与面向对象</strong></p>
<p>面向对象设计模式解决的是&ldquo;类与相互通信的对象之间的组织关系，包括它们的角色、职责、协作方式几个方面。</p>
<p>面向对象设计模式是&ldquo;好的面向对象设计&rdquo;，所谓&ldquo;好的面向对象设计&rdquo;是那些可以满足&ldquo;应对变化，提高复用&rdquo;的设计。</p>
<p>面向对象设计模式描述的是软件设计，因此它是独立于编程语言的，但是面向对象设计模式的最终实现仍然要使用面向对象编程语言来表达，本课程基于C#语言，但实际上它适用于支持.NET框架的所有.NET语言，如Visual Basic.NET、C++/CLI等。</p>
<p>面向对象设计模式不像算法技巧，可以照搬照用，它是建立在对&ldquo;面向对象&rdquo;纯熟、深入的理解的基础上的经验性认识。掌握面向对象设计模式的前提是首先掌握&ldquo;面向对象&rdquo;！ </p>
<p><strong>从编程语言直观了解面向对象</strong></p>
<p>各种面向对象编程语言相互有别，但都能看到它们对面向对象三大机制的支持，即： &ldquo;封装、继承、多态&rdquo;</p>
<blockquote>&ndash; 封装，隐藏内部实现<br />
&ndash; 继承，复用现有代码<br />
&ndash; 多态，改写对象行为</blockquote>
<p>使用面向对象编程语言（如C#），可以推动程序员以面向对象的思维来思考软件设计结构，从而强化面向对象的编程范式。</p>
<p>C#是一门支持面向对象编程的优秀语言，包括：各种级别的封装支持；单实现继承+多接口实现；抽象方法与虚方法重写。</p>
<p><strong>但OOPL并非面向对象的全部</strong></p>
<p>通过面向对象编程语言（OOPL）认识到的面向对象，并不是面向对象的全部，甚至只是浅陋的面向对象。</p>
<p>OOPL的三大机制&ldquo;封装、继承、多态&rdquo; 可以表达面向对象的所有概念，但这三大机制本身并没有刻画出面向对象的核心精神。换言之，既可以用这三大机制做出&ldquo;好的面向对象设计&rdquo;，也可以用这三大机制 做出&ldquo;差的面向对象设计&rdquo;。不是使用了面向对象的语言（例如C#），就实现了面向对象的设计与开发！因此我们不能依赖编程语言的面向对象机制，来掌握面向对象。</p>
<p>OOPL没有回答面向对象的根本性问题&mdash;&mdash;我们为什么要使用面向对象？我们应该怎样使用三大机制来实现&ldquo;好的面向对象&rdquo;？ 我们应该遵循什么样的面向对象原则？</p>
<p>任何一个严肃的面向对象程序员（例如C#程序员），都需要系统地学习面向对象的知识，单纯从编程语言上获得的面向对象知识，不能够胜任面向对象设计与开发。</p>
<p><strong>从一个示例谈起</strong></p>
<p>示例场景：</p>
<p>我们需要设计一个人事管理系统，其中的一个功能是对各种不同类型的员工，计算其当月的工资&mdash;&mdash;不同类型的员工，拥有不同的薪金计算制度。</p>
<p>结构化做法</p>
<p>1.获得人事系统中所有可能的员工类型<br />
2.根据不同的员工类型所对应的不同的薪金制度，计算其工资<br />
enumEmployeeType<br />
{<br />
Engineer;<br />
Sales;<br />
Manager;<br />
&hellip;<br />
}<br />
// 计算工资程序<br />
if ( type == EmployeeType.Engineer) <br />
{<br />
&hellip;&hellip;<br />
}<br />
else if (type == Employeetype.Sales) <br />
{<br />
&hellip;&hellip;<br />
}</p>
<p>面向对象设计</p>
<p>1.根据不同的员工类型设计不同的类，并使这些类继承自一个Employee抽象类，其中有一个抽象方法GetSalary。<br />
2.在各个不同的员工类中，根据自己的薪金制度，重写（override）GetSalary方法。<br />
abstract class Employee<br />
{<br />
&hellip;<br />
public abstract int GetSalary();<br />
}<br />
class Engineer: Employee<br />
{<br />
&hellip;<br />
public override int GetSalary() <br />
{<br />
&hellip;<br />
}<br />
}<br />
class Sales: Employee<br />
{<br />
&hellip;<br />
public override int GetSalary() <br />
{<br />
&hellip;<br />
}<br />
}<br />
// 显示工资程序<br />
Employee e = emFactory.GetEmployee(id);<br />
MessageBox.Show( e.GetSalary());</p>
<p>示例场景：</p>
<p>现在需求改变了&hellip;&hellip;随着客户公司业务规模的拓展，又出现了更多类型的员工，比如钟点工、计件工&hellip;&hellip;等等，这对人事管理系统提出了挑战&mdash;&mdash;原有的程序必须改变。</p>
<p>结构化做法</p>
<p>几乎所有涉及到员工类型的地方（当然包括&ldquo;计算工资程序&rdquo;）都需要做改变&hellip;&hellip;这些代码都需要重新编译，重新部署&hellip;&hellip;.</p>
<p>面向对象做法</p>
<p>只需要在新的文件里增添新的员工类，让其继承自Employee抽象类，并重写GetSalary()方法，然后在EmployeeFactory.GetEmployee方法中根据相关条件，产生新的员工类型就可以了。其他地方（显示工资程序、Engineer类、Sales类等）则不需要做任何改变。</p>
<p><strong>重新认识面向对象</strong></p>
<p>对于前面的例子，从宏观层面来看，面向对象的构建方式更能适应软件的变化，能将变化所带来的影响减为最小</p>
<p>从微观层面来看，面向对象的方式更强调各个类的&ldquo;责任&rdquo;，新增员工类型不会影响原来员工类型的实现代码&mdash;&mdash;这更符合真实的世界，也<br />
更能控制变化所影响的范围，毕竟Engineer类不应该为新增的&ldquo;钟点工&rdquo;来买单&hellip;&hellip;</p>
<p>对象是什么？ </p>
<blockquote>&ndash; 从概念层面讲，对象是某种拥有责任的抽象。<br />
&ndash; 从规格层面讲，对象是一系列可以被其他对象使用的公共接口。<br />
&ndash; 从语言实现层面来看，对象封装了代码和数据。</blockquote>
<p>有了这些认识之后，怎样才能设计&ldquo;好的面向对象&rdquo;？</p>
<blockquote>&ndash; 遵循一定的面向对象设计原则<br />
&ndash; 熟悉一些典型的面向对象设计模式</blockquote>
<p><strong>从设计原则到设计模式</strong></p>
<p>针对接口编程，而不是针对实现编程</p>
<p>&ndash; 客户无需知道所使用对象的特定类型，只需要知道对象拥有客户所期望的接口。</p>
<p>优先使用对象组合，而不是类继承</p>
<p>&ndash; 类继承通常为&ldquo;白箱复用&rdquo;，对象组合通常为&ldquo;黑箱复用&rdquo;。继承在某种程度上破坏了封装性，子类父类耦合度高；而对象组合则只要求被组合的对象具有良好定义的接口，耦合度低。</p>
<p>封装变化点</p>
<p>&ndash; 使用封装来创建对象之间的分界层，让设计者可以在分界层的一侧进行修改，而不会对另一侧产生不良的影响，从而实现层次间的松耦合。</p>
<p>使用重构得到模式&mdash;&mdash;设计模式的应用不宜先入为主，一上来就使用设计模式是对设计模式的最大误用。没有一步到位的设计模式。敏捷软件开发实践提倡的&ldquo;Refactoring to Patterns &rdquo;是目前普遍公认的最好的使用设计模式的方法。</p>
<p><strong>几条更具体的设计原则</strong></p>
<p>单一职责原则（SRP）：</p>
<p>&ndash; 一个类应该仅有一个引起它变化的原因。</p>
<p>开放封闭原则（OCP）：</p>
<p>&ndash; 类模块应该是可扩展的，但是不可修改（对扩展开放，对更改封闭）</p>
<p>Liskov 替换原则（LSP）:<br />
&ndash; 子类必须能够替换它们的基类</p>
<p>. 依赖倒置原则（DIP）：</p>
<p>&ndash; 高层模块不应该依赖于低层模块，二者都应该依赖于抽象。</p>
<p>&ndash; 抽象不应该依赖于实现细节，实现细节应该依赖于抽象。</p>
<p>接口隔离原则（ISP）：</p>
<p>&ndash; 不应该强迫客户程序依赖于它们不用的方法。</p>
<p><strong>总结</strong></p>
<p>设计模式描述了软件设计过程中某一类常见问题的一般性的解决方 案。面向对象设计模式描述了面向对象设计过程中、特定场景下、类与相互通信的对象之间常见的组织关系。</p>
<p>深刻理解面向对象是学好设计模式的基础，掌握一定的面向对象设计原则才能把握面向对象设计模式的精髓，从而实现灵活运用设计模<br />
式。</p>
<p>三大基本面向对象设计原则</p>
<blockquote>&ndash; 针对接口编程，而不是针对实现编程<br />
&ndash; 优先使用对象组合，而不是类继承<br />
&ndash; 封装变化点</blockquote>
<p>使用重构得到模式。敏捷软件开发实践提倡的&ldquo;Refactoring to Patterns&rdquo;是目前普遍公认的最好的使用设计模式的方法。<br />
</p>
          <br/>
          <span style="color:red;">
            <a href="http://realnicky.javaeye.com/blog/49189#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 22 Jan 2007 17:33:01 +0800</pubDate>
        <link>http://realnicky.javaeye.com/blog/49189</link>
        <guid>http://realnicky.javaeye.com/blog/49189</guid>
      </item>
      <item>
        <title>关于J2EE层次设计架构实例的分析详解</title>
        <author>realnicky</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://realnicky.javaeye.com">realnicky</a>&nbsp;
          链接：<a href="http://realnicky.javaeye.com/blog/49057" style="color:red;">http://realnicky.javaeye.com/blog/49057</a>&nbsp;
          发表时间: 2007年01月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>Part 1 层 </strong></p>
<p>层（layer）这个概念在计算机领域是非常了不得的一个概念。计算机本身就体现了一种层的概念：系统调用层、设备驱动层、操作系统层、CPU指令集。每个层都负责自己的职责。网络同样也是层的概念，最著名的OSI的七层协议。 </p>
<p>层到了软件领域也一样好用。为什么呢？我们看看使用层技术有什么好处： </p>
<ul>
    <li>你使用层，但是不需要去了解层的实现细节。 </li>
    <li>可以使用另一种技术来改变基础的层，而不会影响上面的层的应用。 </li>
    <li>可以减少不同层之间的依赖。 </li>
    <li>容易制定出层标准。 </li>
    <li>底下的层可以用来建立顶上的层的多项服务。 当然，层也有弱点： </li>
    <li>层不可能封装所有的功能，一旦有功能变动，势必要波及所有的层。 </li>
    <li>效率降低。 </li>
</ul>
<p>当然，层最难的一个问题还是各个层都有些什么，以及要承担何种责任。 </p>
<p><strong>典型的三层结构 </strong></p>
<p>三层结构估计大家都很熟悉了。就是表示（presentation）层, 领域（domain）层, 以及基础架构（infrastructure）层。 </p>
<p>表示层逻辑主要处理用户和软件的交互。现在最流行的莫过于视窗图形界面（wimp）和基于html的界面了。表示层的主要职责就是为用户提供信息，以及把用户的指令翻译。传送给业务层和基础架构层。 </p>
<p>基础架构层逻辑包括处理和其他系统的通信，代表系统执行任务。例如数据库系统交互，和其他应用系统的交互等。大多数的信息系统，这个层的最大的逻辑就是存储持久数据。 </p>
<p>还有一个就是领域层逻辑，有时也被叫做业务逻辑。它包括输入和存储数据的计算。验证表示层来的数据，根据表示层的指令指派一个基础架构层逻辑。 </p>
<p>领域逻辑中，人们总是搞不清楚什么事领域逻辑，什么是其它逻辑。例如，一个销售系统中有这样一个逻辑：如果本月销售量比上个月增长10％，就要用红色标记。要实现这个功能，你可能会把逻辑放在表示层中，比较两个月的数字，如果超出10％，就标记为红色。 </p>
<p>这样做，你就把领域逻辑放到了表示层中了。要分离这两个层，你应该现在领域层中提供一个方法，用来比较销售数字的增长。这个方法比较两个月的数字，并返回boolean类型。表示层则简单的调用该方法，如果返回true，则标记为红色。 </p>
<p><strong>例子 </strong></p>
<p>层技术不存在说永恒的技巧。如何使用都要看具体的情况才能够决定，下面我就列出了三个例子： </p>
<p>例子1：一个电子商务系统。要求能够同时处理大量用户的请求，用户的范围遍及全球，而且数字还在不断增长。但是领域逻辑很简单，无非是订单的处理，以及和库存系统的连接部分。 </p>
<p>这就要求我们1、表示层要友好，能够适应最广泛的用户，因此采用html技术；2、支持分布式的处理，以胜任同时几千的访问； 3、考虑未来的升级。 </p>
<p>例子2：一个租借系统。系统的用户少的多，但是领域逻辑很复杂。这就要求我们制作一个领域逻辑非常复杂的系统，另外，还要给他们的用户提供一个方便的输入界面。这样，wimp是一个不错的选择。 </p>
<p>例子3：简单的系统。非常简单，用户少、逻辑少。但是也不是没有问题，简单意味着要快速交付，并且还要充分考虑日后的升级。因为需求在不断的增加之中。</p>
<p><strong>何时分层</strong> </p>
<p>这样的三个例子，就要求我们不能够一概而论的解决问题，而是应该针对问题的具体情况制定具体的解决方法。这三个例子比较典型。 </p>
<p>第二个例子中，可能需要严格的分成三个层次，而且可能还要加上另外的中介（mediating）层。例3则不需要，如果你要做的仅是查看数据，那仅需要几个server页面来放置所有的逻辑就可以了。 </p>
<p>我一般会把表示层和领域层/基础架构层分开。除非领域层/基础架构层非常的简单，而我又可以使用工具来轻易的绑定这些层。这种两层架构的最好的例子就是在VB、PB的环境中，很容易就可以构建出一个基于SQL数据库的windows界面的系统。 </p>
<p>这样的表示层和基础架构层非常的一致，但是一旦验证和计算变得复杂起来，这种方式就存在先天缺陷了。 </p>
<p>很多时候，领域层和基础架构层看起来非常类似，这时候，其实是可以把它们放在一起的。可是，当领域层的业务逻辑和基础架构层的组织方式开始不同的时候，你就需要分开二者。 </p>
<p><strong>更多的层模式 </strong></p>
<p>三层的架构是最为通用的，尤其是对IS系统。其它的架构也有，但是并不适用于任何情况。 </p>
<p>第一种是Brown model [Brown et al]。它有五个层：表示层（Presentation），控制/中介层（Controller/Mediator），领域层（Domain）, 数据映射层（Data Mapping）, 和数据源层（Data Source）。它其实就是在三层架构种增加了两个中间层。控制/中介层位于表示层和领域层之间，数据映射层位于领域层和基础架构层之间。 </p>
<p>表示层和领域层的中介层，我们通常称之为表示-领域中介层，是一个常用的分层方法，通常针对一些非可视的控件。例如为特定的表示层组织信息格式，在不 同的窗口间导航，处理交易边界，提供Server的facade接口（具体实现原理见设计模式）。最大的危险就是，一些领域逻辑被放到这个层里，影响到其 它的表示层。 </p>
<p>我常常发现把行为分配给表示层是有好处的。这可以简化问题。但表示层模型会比较复杂，所以，把这些行为放到非可视化的对象中，并提取出一个表示-领域中介层还是值得的。 </p>
<p>Brown ISA </p>
<p>表示层 表示层 </p>
<p>控制/中介层 表示-领域中介层 </p>
<p>领域层 领域层 </p>
<p>数据映射层 数据库交互模式中的Database Mapper </p>
<p>数据源层 基础架构层 </p>
<p>领域层和基础架构层之间的中介层属于本书中提到的Database Mapper模式，是三种领域层到数据连接的办法之一。和表示-领域中介层一眼，有时候有用，但不是所有时候都有用。 </p>
<p>还有一个好的分层架构是J2EE的架构，这方面的讨论可以见『J2EE核心模式』一书。他的分层是客户层（Client），表示层（Presentation），业务层（Business ），整合层（Integration），资源层（Resource）。差别如下： </p>
<p>J2EE核心 ISA </p>
<p>客户层 运行在客户机上的表示层 </p>
<p>表示层 运行在服务器上的表示层 </p>
<p>业务层 领域层 </p>
<p>整合层 基础架构层 </p>
<p>资源层 基础架构层通信的外部数据 </p>
<p>微软的DNA架构定义了三个层：表示层（presentation），业务层（business），和数据存储层（data access），这和我的架构相似，但是在数据的传递方式上还有很大的不同。 </p>
<p>在微软的DNA中，各层的操作都基于数据存储层传出的SQL查询结果集。这样的话，实际上是增加了表示层和业务层同数据存储层之间的耦合度。DNA的记录集在层之间的动作类似于Data Transfer Object。 </p>
<p><strong>Part 2 组织领域逻辑 </strong></p>
<p>要组织基于层的系统，首要的是如何组织领域逻辑。领域逻辑的组织有好几种模式。但其中最重要的莫过于两种方法：Transation Script和Domain Model。 </p>
<p>选定了其中的一种，其它的都容易决定。不过，这两者之间并没有一条明显的分界线。所以如何选取也是门大学问。一般来说，我们认为领域逻辑比较复杂的系统可以采用Domain Model。 </p>
<p>Transation Script就是对表示层用户输入的处理程序。包括验证和计算，存储，调用其它系统的操作，把数据回传给表示层。用户的一个动作表示一个程序，这个程序可 以是script，也可以是transation，也可以是几个子程序。在例子1中，检验，在购物车中增加一本书，显示递送状态，都可以是一个 Transation Script。 </p>
<p>Domain Model是要建立对应领域名词的模型，例如例1中的书、购物车等。检验、计算等处理都放到领域模型中。 </p>
<p>Transation Script属于结构性思维，Domain Model属于OO思维。Domain Model比较难使用，一旦习惯，你能够组织更复杂的逻辑，你的思想会更OO。到时候，即使是小的系统，你也会自然的使用Domain Model了。 </p>
<p>但如何抉择呢？如果逻辑复杂，那肯定用Domain Model：如果只需要存取数据库，那Transation Script会好一些。但是需求是在不断进化的，你很难保证以后的需求还会如此简单。 </p>
<p>如果你的团队不善于使用Domain Model，那你需要权衡一下投入产出比。另外，即使是Transation Script，也可以做到把逻辑和基础架构分开，你可以使用Gateway。 </p>
<p>对例2，毫无疑问要使用Domain Model。对例1就需要权衡了。而对于例3，你很难说它将来会不会像例2那样，你现在可以使用Transation Script，但未来你可能要使用Domain Model。所以说，架构的决策是至关紧要的。 </p>
<p>除了这两种模式，还有其它中庸的模式。Use Case Controller就是处于两者之间。只有和单个的用例相关的业务逻辑才放到对象中。所以大致上他们还是在使用Transation Script，而Domain Model只是Database Gateway的一组集合而已。我不太用这种模式。 </p>
<p>Table Module是另一个中庸模式。很多的GUI环境依托于SQL查询的返回结果。你可以建立内存中的对象，来把GUI和数据库分开来。为每个表写一个模块，因此每一行都需要关键字变量来识别每一个实例。 </p>
<p>Table Module适用于很多的组件构建于一个通用关系型数据库之上，而且领域逻辑不太复杂的情况。Microsoft COM 环境，以及它的带ADO.NET的.NET环境都适合使用这种模式。而对于Java，就不太适用了。 </p>
<p>领域逻辑的一个问题是领域对象非常的臃肿。因为对象的行为太多了，类也就太大了。它必须是一个超集。这就要考虑哪些行为是通用的，哪些不是，可以由其它的类来处理，可能是Use Case Controller，也可能是表示层。 </p>
<p>还有一个问题，复制。他会导致复杂和不一致。这比臃肿的危害更大。所以，宁可臃肿，也不要复制。等到臃肿为害时再处理它吧。 </p>
<p><strong>选择一个地方运行领域逻辑 </strong></p>
<p>我们的精力集中在逻辑层上。领域逻辑要么运行在Client上，要么运行在Server上。 </p>
<p>比较简单的做法是全部集中在Server上。这样你需要使用html的前端以及web server。这样做的好处是升级和维护都非常的简单，你也不用考虑桌面平台和Server的同步问题，也不用考虑桌面平台的其它软件的兼容问题。 </p>
<p>运行在Client适合于要求快速反应和没有联网的情况。在Server端的逻辑，用户的一个再小的请求，也需要信息从Client到Server绕一圈。反应的速度必然慢。再说，网络的覆盖程度也不是说达到了100％。 </p>
<p>对于各个层来说，又是怎么样的呢？ </p>
<p>基础架构层：一般都是在Server啦，不过有时候也会把数据复制到合适的高性能桌面机，但这是就要考虑同步的问题了。 </p>
<p>表示层在何处运行取决于用户界面的设计。一个Windows界面只能在Client运行。而一个Web界面就是在Server运行。也有特别的例子，在桌面机上运行web server的，例如X Server。但这种情况少的多。 </p>
<p>在例1中，没有更多的选择了，只能选在Server端。因此你的每一个bit都会绕一个大圈子。为了提高效率，尽量使用一些纯html脚本。 </p>
<p>人们选用Windows界面的原因主要就是需要执行一些非常复杂的任务，需要一个合适的应用程序，而web GUI则无法胜任。这就是例2的做法。不过，人们应该会渐渐适应web GUI，而web GUI的功能也会越来越强大。 </p>
<p>剩下的是领域逻辑。你可以全部放在Server，也可以全部放在Client，或是两边都放。 </p>
<p>如果是在Client端，你可以考虑全部逻辑都放在Client端，这样至少保证所有的逻辑都在一个地方。而把web server移至Client，是可以解决没有联网的问题，但对反应时间不会有多大的帮助。你还是可以把逻辑和表示层分离开来。当然，你需要额外的升级和维护的工作。 </p>
<p>在Client和Server端都具有逻辑并不是一个好的处理办法。但是对于那些仅有一些领域逻辑的情况是适用的。有一个小窍门，把那些和系统的其它部分没有联系的逻辑封装起来。 领域逻辑的接口 </p>
<p>你的Server上有一些领域逻辑，要和Client通信，你应该有什么样的接口呢？要么是一个http接口，要么是一个OO接口。 </p>
<p>http接口适用于web browser，就是说你要选择一个html的表示层。最近的新技术就是web service，通过基于http、特别是XML进行通信。XML有几个好处：通信量大，结构好，仅需一次的回路。这样远程调用的的开销就小了。同时，XML还是一个标准，支持平台异构。XML又是基于文本的，能够通过防火墙。 </p>
<p>虽然XML有那么多的好处，不过一个OO的接口还是有它的价值的。hhtp的接口不明显，不容易看清楚数据是如何处理的。而OO的接口的方法带有变量和名字，容易看出处理的过程。当然，它无法通过防火墙，但可以提供安全和事务之类的控制。 </p>
<p>最好的还是取二者所长。OO接口在下，http接口在上。但这样做就会使得实现机制非常的复杂。 </p>
<p><strong>Part 3 组织web Server </strong></p>
<p>很多使用html方式的人，并不能真正理解这种方式的优点。我们有各种各样好用的工具，但是却搞到让程序难以维护。在web server上组织程序的方式大致可以分为两种：脚本和server page。 </p>
<p>脚本方式就是一个程序，用函数和方法来处理http调用。例如CGI脚本和java servlet。它和普通的程序并没有什么两样。它从web页面上获得html string形态的数据，有时候还要做一些表达式匹配，这正是perl能够成为CGI脚本的常用语言的原因。 </p>
<p>而Java servelet则是把这种分析留给程序员，但它允许程序员通过关键字接口来访问信息，这样就会少一些表达式的判断。这种格式的web server输出是另一种html string，称为response，可以通过流数据来操作。 </p>
<p>糟糕的是流数据是非常麻烦的，因此就导致了server page的产生，例如PHP，ASP，JSP。 </p>
<p>server page的方式适合回应（response）的处理比较简单的情况。例如&ldquo;显示歌曲的明细&rdquo;，但是你的决策取决于输入的时候，就会比较杂乱。例如&ldquo;通俗和摇滚的显示格式不同&rdquo;。 </p>
<p>脚步擅长于处理用户交互，server page擅长于处理格式化回应信息。所以很自然的就会采用脚本处理请求的交互，使用server page处理回应的格式化。这其实就是著名的MVC（Model View Controller）模式中的view/controller的处理。 </p>
<p>应用Model View Controller模式首要的一点就是模型要和web服务完全分离开来。使用Transaction Script或Domain Model模式来封装处理流程。 </p>
<p>接下来，我们就把剩余的模式归入两类模式中：属于Controller的模式，以及属于View的模式。 </p>
<p>View模式 </p>
<p>View这边有三种模式：Transform View，Template View和Two Step View。Transform View和Template View的处理只有一步，将领域数据转换为html。Two Step View要经过两步的处理，第一步把领域数据转换为逻辑表示形式，第二步把逻辑表示转换为html。 </p>
<p>两步处理的好处是可以将逻辑集中于一处，如果只有一步，变化发生时，你就需要修改每一个屏幕。但这需要你有一个很好的逻辑屏幕结构。如果一个web应用有很多的前端用户时，两步处理就特别的好用。例如航空订票系统。使用不同的第二步处理，就可以获得不同的逻辑屏幕。 </p>
<p>使用单步方法有两个可选的模式：Template View，Transform View。Template View其时就是把代码嵌入到html页面中，就像现在的server page技术，如ASP，PHP，JSP。这种模式灵活，强大，但显得杂乱无章。如果你能够把逻辑程序逻辑在页面结构之外进行很好的组织，这种模式还是有它的优点的。 </p>
<p>Transform View使用翻译方式。例如XSLT。如果你的领域数据是用XML处理的，那这种模式就特别的好用。 </p>
<p>Controller模式 </p>
<p>Controller有两种模式。一般我们会根据动作来决定一项控制。动作可能是一个按钮或链接。所这种模式就是Action Controller模式。 </p>
<p>Front Controller更进一步，它把http请求的处理和处理逻辑分离开来。一般是只有一个web handle来处理所有的请求。你的所有的http请求的处理都由一个对象来负责。你改变动作结构的影响就会降到最小。<br />
</p>
<p><font face="Arial">http://www.uml.org.cn/sjms/200601241.htm</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://realnicky.javaeye.com/blog/49057#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 22 Jan 2007 11:23:00 +0800</pubDate>
        <link>http://realnicky.javaeye.com/blog/49057</link>
        <guid>http://realnicky.javaeye.com/blog/49057</guid>
      </item>
      <item>
        <title>道法自然第三章 设计方法：面向过程VS面向对象</title>
        <author>realnicky</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://realnicky.javaeye.com">realnicky</a>&nbsp;
          链接：<a href="http://realnicky.javaeye.com/blog/48833" style="color:red;">http://realnicky.javaeye.com/blog/48833</a>&nbsp;
          发表时间: 2007年01月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>思想的真正客观性应该是：思想不仅是我们的思想，同时也是事物的自身，或对象性的东西的本质</p>
<p>衡量软件的设计质量：可读性、可复用性、可扩展性、可维护性</p>
<p>面向对象的基本概念：</p>
<p>封装：对现实世界的模拟，反映某一种事物的共性</p>
<p>&nbsp;继承 ：遗传</p>
<p>多态性 ：静态多态性，动态多态性</p>
<p>抽象</p>
<p>面向对象的基本原则：</p>
<p>&nbsp;开闭原则：一个模块对扩展应是开放的，对修改应是关闭的</p>
<p>完全替换原则：派生类应该能完全替换掉基类</p>
<p>依赖倒置原则：依赖于抽象，而不要依赖于具象</p>
<p>非循环依赖原则：包和包之间不能有循环依赖关系</p>
<p>只实现你真正需要的东西，不要去实现你认为需要的东西</p>
<p>不要重复自己：任何代码都只出现一次</p>
<p>保持简化的设计</p>
<p>为人写代码，而不是为机器写代码</p>
<p>3.4.4 面向对象的开发过程 </p>
<p>a、面向对象分析：根据用户需求，建立准确、完整、一致的系统模型，该模型描述软件需要解决的问题是什么，我们称之为分析模型</p>
<p>b、架构分析：宏观上考虑一个软件系统应该如何组织，以及该软件系统需要满足的设计约定、规则、和模式等</p>
<p>c、面向对象设计：以分析模型作为输入，把分析模型转化成描述如何解决问题的系统模型，得出完整的解决方案</p>
<p>d、编码：实