如何学好java

如何学好java,其实很简单,只要用心体会,慢慢积累!
posts - 106, comments - 7, trackbacks - 0, articles - 3
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2011年4月22日

http://www.luocong.com/dsaanotes/index-Z-H-1.htm

posted @ 2014-01-02 22:50 哈希 阅读(131) | 评论 (0)编辑 收藏

     摘要: 冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。   冒泡排序算法的运作如下:  比较相邻的元素。如果第一个比第二个大,就交换他们...  阅读全文

posted @ 2014-01-02 22:32 哈希 阅读(189) | 评论 (0)编辑 收藏

http://www.cnblogs.com/szfei/archive/2012/08/08/2628208.html    hashmap遍历

posted @ 2012-12-22 10:45 哈希 阅读(152) | 评论 (0)编辑 收藏

基本介绍:
          showModalDialog()         (IE 4+ 支持)
          showModelessDialog()      (IE 5+ 支持)
          window.showModalDialog()                  方法用来创建一个显示HTML内容的模态对话框。
          window.showModelessDialog()             方法用来创建一个显示HTML内容的非模态对话框。
使用方法:
          vReturnValue = window.showModalDialog(sURL [, vArguments] [,sFeatures])
          vReturnValue = window.showModelessDialog(sURL [, vArguments] [,sFeatures])
参数说明:
         sURL          --  必选参数,类型:字符串。用来指定对话框要显示的文档的URL。
         vArguments    -- 可选参数,类型:变体。用来向对话框传递参数。传递的参数类型不限,包括数组等。对话框通过
 

                          window.dialogArguments来取得传递进来的参数。
         sFeatures     -- 可选参数,类型:字符串。用来描述对话框的外观等信息,可以使用以下的一个或几个,用分号“;”隔开。
----------------
1.    dialogHeight:    对话框高度,不小于100px
2.    dialogWidth:    对话框宽度。
3.    dialogLeft:     离屏幕左的距离。
4.    dialogTop:     离屏幕上的距离。
5.    center:          { yes | no | 1 | 0 } :              是否居中,默认yes,但仍可以指定高度和宽度。
6.    help:             {yes | no | 1 | 0 }:                是否显示帮助按钮,默认yes。
7.    resizable:       {yes | no | 1 | 0 } [IE5+]:     是否可被改变大小。默认no。
8.    status:          {yes | no | 1 | 0 } [IE5+]:      是否显示状态栏。默认为yes[ Modeless]或no[Modal]。
9.    scroll:            { yes | no | 1 | 0 | on | off }:是否显示滚动条。默认为yes。

下面几个属性是用在HTA中的,在一般的网页中一般不使用。
10.    dialogHide:{ yes | no | 1 | 0 | on | off }:在
打印或者打印预览时对话框是否隐藏。默认为no。
11.    edge:{ sunken | raised }:指明对话框的边框样式。默认为raised。
12.    unadorned:{ yes | no | 1 | 0 | on | off }:默认为no。

参数传递:
1. 要想对话框传递参数,是通过vArguments来进行传递的。类型不限制,对于字符串类型,最大为4096个字符。也可以传递对象,例如:
-------------------------------
parent.htm
<script>
          var obj = new Object();
          obj.name="51js";
          window.showModalDialog("modal.htm",obj,"dialogWidth=200px;dialogHeight=100px");
</script>
modal.htm
<script>
          var obj = window.dialogArguments
          alert("您传递的参数为:" + obj.name)
</script>
-------------------------------
2.可以通过window.returnValue向打开对话框的窗口返回信息,当然也可以是对象。例如:
------------------------------
parent.htm
<script>
          str =window.showModalDialog("modal.htm",,"dialogWidth=200px;dialogHeight=100px");
          alert(str);
</script>
modal.htm
<script>
          window.returnValue="http://homepage.yesky.com";
</script>

常见技巧:

一、怎样才让在showModalDialog和showModelessDialog的超连接不弹出新窗口?
  在被打开的网页里加上<base target="_self">就可以了。这句话一般是放在<head>之间的。

二、怎样才刷新showModalDialog和showModelessDialog里的内容?
  在showModalDialog和showModelessDialog里是不能按F5刷新的,又不能弹出菜单。这个只能依靠

javascript了,以下是相关代码:

<body onkeydown="if (event.keyCode==116){reload.click()}">
<a id="reload" href="filename.htm" style="display:none">reload...</a>

  将filename.htm替换成网页的名字然后将它放到你打开的网页里,按F5就可以刷新了,注意,这个要

配合<base target="_self">使用,不然你按下F5会弹出新窗口的。

三、如何用javascript关掉showModalDialog(或showModelessDialog)打开的窗口。
  <input type="button" value="关闭" onclick="window.close()">
  也要配合<base target="_self">,不然会打开一个新的IE窗口,然后再关掉的。

四、Math.random与showModalDialog。

   当你设置的弹出网页固定时(如上面的"modal.htm"页面),ie很可能到临时文件区,下载上次产生的该页面(openPage.html),而没有重新加载,

   对于动态加载的页面来说,这样往往产生误会,如没有及时更新数据,也就更不利于开发者测试。所以,你可以采用如下方式:

      var strPage = “/medal.htm?random="+Math.random();

   这样每次产生的strPage是不一样的,原因也就不言自明了。

 

下面举两个例子

一、返回一个字符串

首先是父页面有个按钮,用来打开Modal页面userList.aspx

复制代码
 function openWin()
    {
         str =window.showModalDialog("userList.aspx",window,"status:0;help:0;edge:sunken;dialogWidth=700px;dialogHeight=400px");

        if(str!=undefined && typeof(str)!=undefined && str!="undefined" && str!="")
        {
          document.getElementById("txtuserid").value=str;
        }else
        {
         document.getElementById("txtuserid").value="";
        }
    }
复制代码

str就是子页面返回过来的数据,我们把它添加到父类的一个表单元素中

子页面

    function getValue()
        {          
         var selectValue=$(":radio:checked").val();
         window.returnValue=selectValue;
         window.close();
        }

在这里我们把子页面里的值返回到父页面里就可以了,然后关闭页面就可以了

二、返回一个数据

父页面

复制代码
     function openWin()
     {
 
        array =window.showModalDialog("demo2.aspx",window,"status:0;help:0;edge:sunken;dialogWidth=700px;dialogHeight=400px;scroll:no");
       
          document.getElementById("username").value=array[0];
          document.getElementById("sex").value=array[0];
         
     
    }
复制代码

子页面

 

复制代码
   function getValue()
       {
         var array=new Array();
         
         array[0]=document.getElementById("username").value;
         Array[1]=document.getElementById("sex").value;
         window.returnValue=array;
         window.close();
       }
复制代码

返回一个数组就可以了,如果用open打开的话,在搜狗或者360浏览器打开的是一个页面或者阻拦什么的

 前段时间在后台使用JS的winodw.showModalDialog来查看静态页面内容,发现不能及时显示更新后的页面内容,用open打开有时也会出现这种问题

解决办法 
  window.showModalDialog(getUrl+"?Rnd="+Math.random(),"","dialogWidth:600px;dialogHeight:400px;help:no;scroll:yes;center:yes;status:no;");
这样就不会有缓存了

多思考,多创新,才是正道!

posted @ 2012-11-26 12:51 哈希 阅读(904) | 评论 (1)编辑 收藏

1.判断select选项中 是否存在Value="paraValue"的Item 
$("#selectid option[@value='paraValue']").length>0
2.向select选项中 加入一个Item 
$("#selectid").append("<option value=''>1111<option>");
3.从select选项中 删除一个Item 
$("#selectid").remove("<option value=''>1111<option>");
4.修改select选项中 value="paraValue"的text为"paraText" 
$("#selectid option:selected").attr("value","paraValue").attr("text","paraText");
5. 设置select中text="paraText"的第一个Item为选中 
$("#selectid option[@text='paraText']").attr("selected","true")
6.设置select中 value="paraValue"的Item为选中 
$("#selectid option[@value='paraValue']").attr("selected","true")

7.设置select中第一 个Item为选中 
$("#selectid option").eq(0).attr('selected', 'true');

8. 得到select的当前选中项的value 
$("#selectid").val();
9.得到select的当前选中项的text 
$("#selectid").text();
10. 得到select的当前选中项的Index 
document.getElementById("select1").selectedIndex;
$("#selectid").get(0).selectedIndex
11. 清空select的项
$("#selectid").empty();

JS版本的:

  • //1.判断select选项中 是否存在Value="paraValue"的Item   
  • function jsSelectIsExitItem(objSelect,objItemValue)   
  • {   
  •      var isExit = false ;   
  •      for ( var i=0;i;I++)   
  •      {   
  •          if (objSelect.options[i].value == objItemValue)   
  •          {   
  •              isExit = true ;   
  •              break ;   
  •          }   
  •      }        
  •      return isExit;   
  • }   
  •   
  • //2.向select选项中 加入一个Item   
  • function jsAddItemToSelect(objSelect,objItemText,objItemValue, objItemPos)   
  • {   
  •      //判断是否存在   
  •      if (jsSelectIsExitItem(objSelect,objItemValue))   
  •      {   
  •          alert( "该Item的 Value值已经存在" );   
  •      }   
  •      else   
  •      {   
  •          var varItem = new Option(objItemText,objItemValue);   
  • //       objSelect.options[objSelect.options.length] = varItem;   
  •          objSelect.options.add(varItem, objItemPos);   
  •          alert( "成功加入" );   
  •      }      
  • }   
  •   
  • //3.从select选项中 删除一个Item   
  • function jsRemoveItemFromSelect(objSelect,objItemValue)   
  • {   
  •      //判断是否存在   
  •      if (jsSelectIsExitItem(objSelect,objItemValue))   
  •      {   
  •          for ( var i=0;i;I++)   
  •          {   
  •              if (objSelect.options[i].value == objItemValue)   
  •              {   
  •                  objSelect.options.remove(i);   
  •                  break ;   
  •              }   
  •          }          
  •          alert( "成功删除" );              
  •      }   
  •      else   
  •      {   
  •          alert( "该 select中 不存在该项" );   
  •      }      
  • }   
  •   
  • //4.修改select选项中 value="paraValue"的text为"paraText"   
  • function jsUpdateItemToSelect(objSelect,objItemText,objItemValue)   
  • {   
  •      //判断是否存在   
  •      if (jsSelectIsExitItem(objSelect,objItemValue))   
  •      {   
  •          for ( var i=0;i;I++)   
  •          {   
  •              if (objSelect.options[i].value == objItemValue)   
  •              {   
  •                  objSelect.options[i].text = objItemText;   
  •                  break ;   
  •              }   
  •          }          
  •          alert( "成功修改" );              
  •      }   
  •      else   
  •      {   
  •          alert( "该 select中 不存在该项" );   
  •      }      
  • }   
  •           
  • //5.设置select中text="paraText"的第一个 Item为选中   
  • function jsSelectItemByValue(objSelect,objItemText)   
  • {      
  •      //判断是否存在   
  •      var isExit = false ;   
  •      for ( var i=0;i;I++)   
  •      {   
  •          if (objSelect.options[i].text == objItemText)   
  •          {   
  •              objSelect.options[i].selected = true ;   
  •              isExit = true ;   
  •              break ;   
  •          }   
  •      }        
  •      //Show出结果   
  •      if (isExit)   
  •      {   
  •          alert( "成功选中" );              
  •      }   
  •      else   
  •      {   
  •          alert( "该 select中 不存在该项" );   
  •      }      
  • }   
  •   
  • //6.设置select中value="paraValue"的Item 为选中   
  • document.all.objSelect.value = objItemValue;   
  •   
  • //7.得到select的当前选中项的value   
  • var currSelectValue = document.all.objSelect.value;   
  •   
  • //8.得到select的当前选中项的text   
  • var currSelectText = document.all.objSelect.options[document.all.objSelect.selectedIndex].text;   
  •   
  • //9.得到select的当前选中项的Index   
  • var currSelectIndex = document.all.objSelect.selectedIndex;   
  •   
  • //10.清空select的项   
  • document.all.objSelect.options.length = 0;  
  • posted @ 2012-11-26 12:46 哈希 阅读(229) | 评论 (0)编辑 收藏

    封装 继承 多态

    面向对象的三个基本特征是:封装、继承、多态。

     

    封装

    封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。

    封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

    继承

    面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

    通过继承创建的新类称为“子类”或“派生类”。

    被继承的类称为“基类”、“父类”或“超类”。

    继承的过程,就是从一般到特殊的过程。

    要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。

    在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。

    继承概念的实现方式有三类:实现继承、接口继承和可视继承。

    Ø 实现继承是指使用基类的属性和方法而无需额外编码的能力;

    Ø 接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;

    Ø 可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。

    在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee 是一个人,Manager 也是一个人,因此这两个类都可以继承 Person 类。但是 Leg 类却不能继承 Person 类,因为腿并不是一个人。

    抽象类仅定义将由子类创建的一般属性和方法,创建抽象类时,请使用关键字 Interface 而不是 Class。

    OO开发范式大致为:划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段。

    多态

    多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

    实现多态,有二种方式,覆盖,重载。

    覆盖,是指子类重新定义父类的虚函数的做法。

    重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

    其实,重载的概念并不属于“面向对象编程”,重载的实现是:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。对于这两个函数的调用,在编译器间就已经确定了,是静态的(记住:是静态)。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!真正和多态相关的是 “覆盖”。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态(记住:是动态!)的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚邦定)。结论就是:重载只是一种语言特性,与多态无关,与面向对象也无关!引用一句Bruce Eckel的话:“不要犯傻,如果它不是晚邦定,它就不是多态。”

    那么,多态的作用是什么呢?我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。

    泛化(Generalization)

     

    在上图中,空心的三角表示继承关系(类继承),在UML的术语中,这种关系被称为泛化(Generalization)。Person(人)是基类,Teacher(教师)、Student(学生)、Guest(来宾)是子类。

    若在逻辑上B是A的“一种”,并且A的所有功能和属性对B而言都有意义,则允许B继承A的功能和属性。

    例如,教师是人,Teacher 是Person的“一种”(a kind of )。那么类Teacher可以从类Person派生(继承)。

    如果A是基类,B是A的派生类,那么B将继承A的数据和函数。

    如果类A和类B毫不相关,不可以为了使B的功能更多些而让B继承A的功能和属性。

    若在逻辑上B是A的“一种”(a kind of ),则允许B继承A的功能和属性。

    聚合(组合)

     

    若在逻辑上A是B的“一部分”(a part of),则不允许B从A派生,而是要用A和其它东西组合出B。

    例如,眼(Eye)、鼻(Nose)、口(Mouth)、耳(Ear)是头(Head)的一部分,所以类Head应该由类Eye、Nose、Mouth、Ear组合而成,不是派生(继承)而成。

    聚合的类型分为无、共享(聚合)、复合(组合)三类。

    聚合(aggregation)

     

    上面图中,有一个菱形(空心)表示聚合(aggregation)(聚合类型为共享),聚合的意义表示has-a关系。聚合是一种相对松散的关系,聚合类B不需要对被聚合的类A负责。

    组合(composition)

     

    这幅图与上面的唯一区别是菱形为实心的,它代表了一种更为坚固的关系——组合(composition)(聚合类型为复合)。组合表示的关系也是has-a,不过在这里,A的生命期受B控制。即A会随着B的创建而创建,随B的消亡而消亡。

    依赖(Dependency)

     

    这里B与A的关系只是一种依赖(Dependency)关系,这种关系表明,如果类A被修改,那么类B会受到影响

    posted @ 2012-11-21 09:32 哈希 阅读(214) | 评论 (0)编辑 收藏

    数列6,10,18,32,“?”,问“?”是几?

      1。什么是3G,2。3C 融合技术,3。对大唐的认识。
      3G有三大制式,GSM升级后的WCDMA,CDMA升级后的CDMA2000,以及我国自主开发的TD-SCDMA。
      第三代移动通信技术(3rd-generation,3G),是指支持高速数据传输的蜂窝移动通讯技术。3G服务能够同时传送声音及数据信息,速率一般在几百kbps以上。目前3G存在四种标准:CDMA2000,WCDMA,TD-SCDMA,WiMAX。
      所谓“3C产品”,就是计算机(Computer)、通信(Communication)和消费类电子产品(ConsumerElectronics)三者结合,亦称“信息家电”。由于3C产品的体积一般都不大,所以往往在中间加一个“小”字,故往往统称为“3C小家电”。
      
      3C指的是计算机(Computer)、通讯(Communication)和消费类电子产品(Consumer Electrics)。3C融合即利用数字信息技术激活其中任何一个环节,通过某种协议使3C的三个方面实现信息资源的共享和互联互通,从而满足人们在任何时间、任何地点通过信息关联应用来方便自己的生活。 无线宽带正是实现数字家庭3C融合的首要步骤。

      第一部分:选择题
      1.相同码元速率下,那种传输方式信息传输速率最高
      QPSK 16QAM BPSK GMSK
      2.下面哪些属于差错控制编码
      3.自由空间传播环境下信号衰减与距离( )次方成比例
      4.下列哪些功能属于网络管理的功能域5a880faf6f?应届生求职网YingJieSheng.COM?c350ade2a4
      故障管理配置管理计费管理性能管理安全管理传输管理路由管理
      5.采用CDMA技术通信系统,扰码的主要作用
      信道估计信道区分信号白化同步
      6.交织的主要作用
      7.数据链路层的协议是
      HDLC ARQ PPP ICMP RTP6fe97759aa?应届生求职网YingJieSheng.COM?b922cfa312
      8.那种ATM协议最适合应用话音业务
      AAL5 AAL4 AAL3 AAL2
      第二部分:填空问答
      1.香农公式表达式
      2.爱尔兰含义
      最大话务量和BHCA分别取决于什么5568161a8c?应届生求职网YingJieSheng.COM?d5792c152c
      3.中继器,网桥.路由器,网关各是两个网络的哪层连接;路由器的功能是( )和( )
      4.解释QPSK调制的原理
      5.简述dB,dBm的概念
      6.画出数字通信系统的模型,简述信源编码和信道编码的区别,及其它们在无线通信系统中的作用
      7.C语言中能否在头文件中定义变量,并说明原因
      8.在Windows系统,能否动态链接库中定义变量,如果可以定义说明有效范围4005f8da13?应届生求职网YingJieSheng.COM?60d149af1f
      9.结构化程序设计中程序=
      面向对象程序设计中程序=
      10.解释return和exit的区别
      11.ATM网络信元长度是( ),所有信息在最底层以( )的方式传送,以保持电路交换适合于传送实时性很强的业务特点.
      12.什么是TDD,什么是FDD,多址方式又指什么?列出你所了解的多址方式
      13.谈谈对OSI或计算机网络中”协议””实体””服务”的理解以及什么是SDU PDU和Primitive?8f07f89ddb?应届生求职网YingJieSheng.COM?4c20a920bf
      14.GSM逻辑信道及分类
      15.谈谈你对移动通信系统组成的理解.

     


    1.    描述一下public,protected,private,final关键字在Java中的用法?
      public表示公共的,定义类的时候工程下任何包都可以读取到,protected是受保护的,只有在相同包内的类才能读取到,private定义方法时候只能在类内部才能读取到。final表示一个终态,是不可改变的。
    2.    Abstract class 和Interface 有什么区别?
      抽象类和接口的区别如下:
      (1、)抽象类是类,接口是接口;
      (2、)抽象类只能继承一个,接口可以多实现;
      (3、)抽象类定义一些静态变量可以,接口中不行;
    3.    Vector 和 ArrayList 有什么区别? HashTable 和 HashMap有什么区别?
      vector 和 Arraylist都是继承自集合类collection,vector是链表的方式实现的,读取熟读快,添加数据时候慢,Arraylist里面添加数据慢读取数据快。
      Hashtable和HashMap最大的区别是HashTable是同步的,HashMap是非同步的,所以性能上相对快一点,HashTable是继承自Dictionary类,而HashMap是继承自Map接口
    4.    Java集合中的Iterator起什么作用?
      java集合中Iterator主要作用是去除重复;
    5.    Java中创建一个对象有哪几种方法,区别是什么?
      java中创建对象可以实例化new
    6.    多线程有几种表示方法,都是什么?同步有几种实现方法,都是什么?
      多线程可以通过实现runable接口,也可以继承Thread类来实现。
      实现同步也有两种,一种是用同步方法,一种是用同步块.. 同步方法就是在方法返回类型后面加上synchronized, 比如:
      public void synchronized add(){...}
      同步块就是直接写:synchronized (这里写需要同步的对象){...}
      wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
      sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
      notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
      Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
    7.    描述一下Java中的异常机制,什么是Checked Exception, Unchecked Exception?
      java中的异常机制要求你对一些存在的问题进行实现的规划,并对相应的Exception的情况进行设定,当程序捕获类似的情况就会抛出异常,你可以定义异常的处理方法,异常并不是致命的,它与错误有着区别,错误只要发生程序就会终止,但是异常会继续执行下去。
      java中的异常包括受检查的异常和不受检查的异常,(1、)受检查的异常:这种在编译时候被强制检查的异常被称作受检查异常,即在方法中声明的异常。(2、)不受检查的异常:在方法得声明中没有声明,但在方法的运行过程中发生的各种异常叫做不受检查的异常,这种异常是错误,会被自动捕获。一些规模较小的程序中,受检查的异常能够提高开发效率,但随着项目规模的扩大,过的的受检查的异常变得难以管理,其带来的好处也消失殆尽。
    8.    描述一下Java ClassLoader 或者 J2EE ClassLoader的工作原理?(可以画图)
      当运行程序是首先运行java虚拟机(JVM),然后把java class加载到JVM里运行,负责加载java class的这部分就叫做java ClsssLoader,
      JVM本身包含一个ClassLoader成为bootstrap ClassLoader,和JVM一样,BootstrapClassLoader使用本地代码实现的,它负责加载核心javaClass(即所有java.*开头的类)。另外JVM还提供两个ClassLoader,他们都是用java语言实现的,都是由BootstrapClassLoader负责加载,其中Extention ClassLoader负责加载扩展的javaclass(例如所有以javax.*开头的类和存放在JRE的ext目录下的类),ApplicationClassLoader负责加载应用程序自身的类。
      当运行一个程序的时候,JVM启动,运行Bootstrapclassloader,该classloader加载核心API(ExtClassloader和AppClassloader也在此时被加载),然后调用Extclassloader加载扩展API,最后AppClassloader加载CLASSPATH目录下定义的Class,这就是一个程序最基本的加载流程。

    9.    MVC的各个部分都有那些技术来实现?如何实现?
      MVC主要包括模型层,视图层,控制层。
      模型层主要由javabean实现,视图层是由jsp实现,控制层主要由servlet实现。
    10.    描述一下Struts的工作方式?
      struts1.2的工作方式主要是MVC实现,struts2是拦截器的方式实现。
    11.    JSP中包含哪几个内置对象?
      jsp包括九个内置对象,分别为:request,response,session,cookie,out,application,pageRequest,Exception,
    12.    JSP中两种跳转方式分别是什么?有什么区别?
      jsp两种跳转方式是重定向和页面跳转,其中重定向方式执行,form表单提交数据会失去,网络地址会变化,页面跳转不会;
    13.    描述一下JSP中taglib的用法?
      jsp中标签可以使java代码嵌入到页面上使用
    14.    Javascript中如何校验数字型?
      正则表达式
    15.    EJB2.0中包括哪些内容? 作用分别是什么?
      EJB2.0
    16.    一个SessionBean包含哪几个组件?各个组件作用是什么?
      
    17.    描述一下一个EJB应用中EJB部署文件,以及你所熟悉的App Server的部署文件的作用?
       
    18.    列举一下你所知道的设计模式(包括EJB,J2EE的设计模式),以及他们应用的场合?
      代理模式:把一个对象注入到一个类中通过这个注入的对象来完成一系列方法,
      工厂模式:一个接口下的所有类的实例可以通过专门的工厂类通过传递不同的参数来实现;
      Adapter(适配器)模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式的用意是将接口不同而功能相同或者相近的两个接口加以转换。
      单例模式:单例模式有两种:
                饿汉模式
          public class Singleton
          {
           private Singleton();
           priavate static Singleton singleton = new Singleton();
           public staic Singleton getInstance()
           {
          return instance;
           }
          }
          懒汉模式:
          public class Singleton
          {
           private static Singleton singleton = new Singleton();
           public static synchronize Singleton()
           {
          if(instance == null)
            {
           instance = new singleton();
            }
            return instance;
           }
          }
    19.    解析XML主要方法有哪些? 各有什么区别?
      1、xml有哪些解析技术?区别是什么?

    2、你在项目中用到了xml技术的哪些方面?如何实现的?

    3、用jdom解析xml文件时如何解决中文问题?如何解析?

    4、编程用JAVA解析XML的方式.

    1、xml有哪些解析技术?区别是什么?
      解析XMl方法主要方法有文件流读取,页面XMLHttp读取。
      DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且dom必须在解析文件之前把整个文档装入内存
      SAX:适合对XML文件的随机访问,不像DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。
      StAX:当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问STAX:Streaming API for XML (StAX)
      2、主要用到了信息存储信息配置两方面,在做数据交换平台时,将不能用数据源的数据组装成xml文件,然后将xml文件压缩打包加密后发给接收者,接受解密解压缩后再同xml文件中还原相关信息进行处理。在做软件配置时候,利用xml文件可以方便的进行,软件的各种配置都存储在xml文件中。
      3、
    20.    您了解Open Source的项目吗? 如果了解请描述几个,并讲述一下他们的作用?
      apchetomcat就是一个比较好的开源项目,主要作为服务器来使用。
      struts是一个主要用于作为控制层的开源框架项目,
      spring是一个轻量级的开源项目,通过控制反转和代理模式实现
      Hibernate是个持久层框架,用来建立与数据库的持久层
    21.    您看过哪些JAVA方面的书籍,能列举一下吗?
      think in java ,core java,jquery in action, struts,spring ,hibernate等等方面的书都有涉猎。

    posted @ 2012-11-20 20:02 哈希 阅读(257) | 评论 (0)编辑 收藏

    <%@ page pageEncoding="utf-8" %> <%@ page language="java" contentType="text/html; charset=GBK" %><%@ page import="java.util.*" %> <%@ page import="java.io.OutputStream" %> <%@ page import="jxl.Workbook" %> <%@ page import="jxl.write.WritableCellFormat" %> <%@ page import="jxl.write.WritableSheet" %> <%@ page import="jxl.write.WritableWorkbook" %> <%@ page import="jxl.write.WriteException" %> <%@ page import="java.text.SimpleDateFormat" %> <% response.reset(); response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-Disposition", "filename=Member.xls");//attachment// WritableWorkbook是JexcelApi的一个类。 // 以下可以理解为创建一个excel文件,然后在excel里面创建一个表 OutputStream os = response.getOutputStream();//取得输出流 WritableWorkbook workbook = Workbook.createWorkbook(os); WritableSheet sheet = workbook.createSheet("First Sheet", 0);// 组织excel文件的内容 jxl.write.Label label = null; int excelCol = 0; int row = 0; try { label = new jxl.write.Label(excelCol++, row, "帐号"); sheet.addCell(label); label = new jxl.write.Label(excelCol++, row, "姓名"); sheet.addCell(label); label = new jxl.write.Label(excelCol++, row, "身份证"); sheet.addCell(label); label = new jxl.write.Label(excelCol++, row, "联系电话"); sheet.addCell(label); label = new jxl.write.Label(excelCol++, row, "生日"); sheet.addCell(label); label = new jxl.write.Label(excelCol++, row, "城市"); sheet.addCell(label); label = new jxl.write.Label(excelCol++, row, "职业"); sheet.addCell(label); label = new jxl.write.Label(excelCol++, row, "已购音箱型号"); sheet.addCell(label); label = new jxl.write.Label(excelCol++, row, "试听与否"); sheet.addCell(label); label = new jxl.write.Label(excelCol++, row, "邮箱"); sheet.addCell(label); label = new jxl.write.Label(excelCol, row, "注册时间"); sheet.addCell(label); //jxl.write.Number number = null; jxl.write.DateTime dateTime; jxl.write.DateFormat customDateFormat = new jxl.write.DateFormat("yyyy-MM-dd");//时间格式 WritableCellFormat dateFormat = new WritableCellFormat(customDateFormat); for(int i=0;i<10;i++){ excelCol = 0; row = i + 1; SimpleDateFormat formatDate = new SimpleDateFormat("yyyy-MM-dd"); sheet.addCell(label); label = new jxl.write.Label(excelCol++, row, "100"); sheet.addCell(label); label = new jxl.write.Label(excelCol++, row, "100"); sheet.addCell(label); label = new jxl.write.Label(excelCol++, row, "100"); sheet.addCell(label); /*字串格式*/ try{ label = new jxl.write.Label(excelCol++, row, formatDate.format("100")); sheet.addCell(label); }catch (Exception e){ //Maybe somebody fogot to input his birthday ,I need do nothing here! } label = new jxl.write.Label(excelCol++, row, "100"); sheet.addCell(label); label = new jxl.write.Label(excelCol++, row, "100"); sheet.addCell(label); label = new jxl.write.Label(excelCol++, row, "100"); sheet.addCell(label); label = new jxl.write.Label(excelCol++, row, "100"); sheet.addCell(label); label = new jxl.write.Label(excelCol++, row, "100"); sheet.addCell(label); /*时间格式*/ //label = new jxl.write.Label(excelCol, row, formatDate.format(rr.getCreateTime())); //sheet.addCell(label); } } catch (Exception e) { e.printStackTrace(); } finally{ // 生成excel文件 workbook.write(); workbook.close(); os.close(); } %>

    posted @ 2012-08-23 21:21 哈希 阅读(254) | 评论 (0)编辑 收藏

    网上的 Jquery ajax Demo 大多都是基于php
    很少 有java的 今天就把自己的Demo贴出来 和大家共同学习
    现在就  Jquery ajax 的 $.ajax(),$.post(),$.get();

    首先是  服务端的Servlet 演示这三个函数的用法对都是用的同一个 服务端
    Java代码 
    package com.june.servlet;  
     
    import javax.servlet.http.HttpServlet;  
    import javax.servlet.http.HttpServletResponse;  
    import javax.servlet.http.HttpServletRequest;  
    import java.io.IOException;  
    import java.io.PrintWriter;  
    import javax.servlet.ServletException;  
     
    public class jqueryAjaxServer extends HttpServlet {  
         public jqueryAjaxServer(){  
             super();  
         }  
         public void doGet(HttpServletRequest request,HttpServletResponse response)  
         throws IOException ,ServletException {  
             response.setContentType("text/html;charset=utf-8");  
             PrintWriter out=response.getWriter();  
             String account=request.getParameter("account");  
             if("iamcrzay".equals(account)){  
                 out.print("Sorry,the user is exist");  
             }  
             else{  
                 out.print("Congratulation,this accont you can use!!!!");  
             }  
             out.close();  
         }  
         public void doPost(HttpServletRequest request,HttpServletResponse response)  
         throws IOException ,ServletException {  
             this.doGet(request, response);  
         }  

    package com.june.servlet;

    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import java.io.IOException;
    import java.io.PrintWriter;
    import javax.servlet.ServletException;

    public class jqueryAjaxServer extends HttpServlet {
         public jqueryAjaxServer(){
          super();
         }
         public void doGet(HttpServletRequest request,HttpServletResponse response)
         throws IOException ,ServletException {
          response.setContentType("text/html;charset=utf-8");
          PrintWriter out=response.getWriter();
          String account=request.getParameter("account");
          if("iamcrzay".equals(account)){
           out.print("Sorry,the user is exist");
          }
          else{
           out.print("Congratulation,this accont you can use!!!!");
          }
          out.close();
         }
         public void doPost(HttpServletRequest request,HttpServletResponse response)
         throws IOException ,ServletException {
          this.doGet(request, response);
         }
    }

     

    下面是WEB.XML
    Xml代码 
    <?xml version="1.0" encoding="UTF-8"?> 
    <web-app version="2.5"   
        xmlns="http://java.sun.com/xml/ns/javaee"   
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
        <servlet> 
           <servlet-name>jqueryAjaxServer</servlet-name> 
           <servlet-class>com.june.servlet.jqueryAjaxServer</servlet-class> 
        </servlet> 
            <servlet-mapping> 
           <servlet-name>jqueryAjaxServer</servlet-name> 
           <url-pattern>/jqueryAjax</url-pattern> 
        </servlet-mapping> 
      <welcome-file-list> 
        <welcome-file>index.jsp</welcome-file> 
      </welcome-file-list> 
    </web-app> 

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5"
     xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
     <servlet>
        <servlet-name>jqueryAjaxServer</servlet-name>
        <servlet-class>com.june.servlet.jqueryAjaxServer</servlet-class>
     </servlet>
            <servlet-mapping>
        <servlet-name>jqueryAjaxServer</servlet-name>
        <url-pattern>/jqueryAjax</url-pattern>
     </servlet-mapping>
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
    </web-app>

     

    下面是Jsp页面
    第一个是 jqueryAjax.jsp  本页使用的是$.ajax()
    Html代码 
    <%@ page language="java"  pageEncoding="utf-8"%> 
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
    <html> 
      <head>    
        <title>jquery ajax</title>   
        <meta http-equiv="pragma" content="no-cache"> 
        <meta http-equiv="cache-control" content="no-cache"> 
        <meta http-equiv="expires" content="0">      
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
        <meta http-equiv="description" content="This is my page"> 
        <script src="js/jquery-1.2.6.js" type="text/javascript"></script> 
        <script language="javascript"> 
             $(function(){  
                   $('.sumbit').click(function(){  
                   if($('#account').val().length==0){  
                       $('.hint').text("用户名不能位空").css({"background-color":"green"});   
                   }  
                   else{  
                   $.ajax({  
                     url:'jqueryAjax',  
                     data:{account:$('#account').val()},  
                     error:function(){  
                     alert("error occured!!!");  
                     },  
                     success:function(data){  
                      $('body').append("<div>"+data+"</div>").css("color","red");  
            
                     }  
                       
                   });}  
                   });  
                   });  
                       
             
                 
        </script> 
      </head> 
        
      <body> 
                    <h3 align="center">jquery AjaX</h3> 
                    <hr> 
                    <label>请输入用户名 :</label> 
                    <input id="account" name="account" type="text"> 
                    <input class="sumbit" type="button" value="检测"> 
                    <div class="hint"> 
                    </div> 
      </body> 
    </html> 

    <%@ page language="java"  pageEncoding="utf-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head> 
        <title>jquery ajax</title>
     <meta http-equiv="pragma" content="no-cache">
     <meta http-equiv="cache-control" content="no-cache">
     <meta http-equiv="expires" content="0">   
     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
     <meta http-equiv="description" content="This is my page">
     <script src="js/jquery-1.2.6.js" type="text/javascript"></script>
     <script language="javascript">
          $(function(){
                $('.sumbit').click(function(){
                if($('#account').val().length==0){
                    $('.hint').text("用户名不能位空").css({"background-color":"green"});
                }
                else{
                $.ajax({
                  url:'jqueryAjax',
                  data:{account:$('#account').val()},
                  error:function(){
                  alert("error occured!!!");
                  },
                  success:function(data){
                   $('body').append("<div>"+data+"</div>").css("color","red");
      
                  }
                 
                });}
                });
                });
                    
       
           
     </script>
      </head>
     
      <body>
                    <h3 align="center">jquery AjaX</h3>
                    <hr>
                    <label>请输入用户名 :</label>
                    <input id="account" name="account" type="text">
                    <input class="sumbit" type="button" value="检测">
                    <div class="hint">
                    </div>
      </body>
    </html>

     

    第二个用的是  $.post()

    Html代码 
    <%@ page language="java"  pageEncoding="utf-8"%> 
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
    <html> 
      <head>    
        <title>jquery ajax</title>   
        <meta http-equiv="pragma" content="no-cache"> 
        <meta http-equiv="cache-control" content="no-cache"> 
        <meta http-equiv="expires" content="0">      
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
        <meta http-equiv="description" content="This is my page"> 
        <script src="js/jquery-1.2.6.js" type="text/javascript"></script> 
        <script language="javascript"> 
             $(function(){  
                 $('.sumbit').click(  
                  function(){  
                    if($('#account').val().length==0){  
                        $('.hint').text("The account is cant't be null").css({"color":"red","background-color":"yellow"});  
                    }  
                    else{  
                    $.post("jqueryAjax","account="+$('#account').val(),function(data){  
                       $('.hint').text(data).css({"color":"red","background-color":"yellow"});  
                    })  
                    }  
                 });  
             });             
        </script> 
      </head> 
        
      <body> 
                    <h3 align="center">jquery Ajax</h3> 
                    <hr> 
                    <label>请输入用户名 :</label> 
                    <input id="account" name="account" type="text"> 
                    <input class="sumbit" type="button" value="检测"> 
                    <div class="hint"> 
                    </div> 
      </body> 
    </html> 

    <%@ page language="java"  pageEncoding="utf-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head> 
        <title>jquery ajax</title>
     <meta http-equiv="pragma" content="no-cache">
     <meta http-equiv="cache-control" content="no-cache">
     <meta http-equiv="expires" content="0">   
     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
     <meta http-equiv="description" content="This is my page">
     <script src="js/jquery-1.2.6.js" type="text/javascript"></script>
     <script language="javascript">
          $(function(){
              $('.sumbit').click(
               function(){
                 if($('#account').val().length==0){
                     $('.hint').text("The account is cant't be null").css({"color":"red","background-color":"yellow"});
                 }
                 else{
                 $.post("jqueryAjax","account="+$('#account').val(),function(data){
                    $('.hint').text(data).css({"color":"red","background-color":"yellow"});
                 })
                 }
              });
          });       
     </script>
      </head>
     
      <body>
                    <h3 align="center">jquery Ajax</h3>
                    <hr>
                    <label>请输入用户名 :</label>
                    <input id="account" name="account" type="text">
                    <input class="sumbit" type="button" value="检测">
                    <div class="hint">
                    </div>
      </body>
    </html>

     

    第三个是用的$.get()

    Html代码 
    <%@ page  pageEncoding="utf-8"%> 
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
    <html> 
      <head>     
        <title>jquery get</title> 
          
        <meta http-equiv="pragma" content="no-cache"> 
        <meta http-equiv="cache-control" content="no-cache"> 
        <meta http-equiv="expires" content="0">      
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
        <meta http-equiv="description" content="This is my page"> 
        <script src="js/jquery-1.2.6.js" type="text/javascript"></script> 
        <script type="text/javascript"> 
             $(function(){  
                    $('.sumbit').click(function(){  
                          if($('#account').val().length==0){  
                             $('.hint').html("用户名不能位空!!!").css({"color":"#ffoo11","background":"blue"});  
                          }  
                          else{  
                              $.get("jqueryAjax","account="+$('#account').val(),  
                                   function(data){  
                                    $('.hint').html(data).css({"color":"#ffoo11","background":"green"});  
                              });  
                          }  
                    });  
             });  
        </script> 
     
      </head> 
        
      <body> 
            <h3 align="center">jquery AjaX</h3> 
                    <hr> 
                    <label>请输入用户名 :</label> 
                    <input id="account" name="account" type="text"> 
                    <input class="sumbit" type="button" value="检测"> 
                    <div class="hint"> 
                    </div> 
      </body> 
    </html> 

    posted @ 2012-05-25 16:43 哈希 阅读(233) | 评论 (0)编辑 收藏

    div#loadPic {
        width: 10%;
        height:40px;
        position:absolute;
        z-index:4;
        margin-top: 50px;
        margin-bottom: 50px;
        margin-left: auto;
        margin-right: auto;
        padding: 0px;
        top:30%;
    }

    posted @ 2012-03-14 13:58 哈希 阅读(162) | 评论 (0)编辑 收藏

    url=jsp?str="你好!" 
    String areaName=(String)request.getParameter("areaname");
    String dpt=new String(dptName.getBytes("ISO8859-1"),"UTF-8");

    posted @ 2012-03-01 18:45 哈希 阅读(192) | 评论 (0)编辑 收藏

      apache-comcat配置虚拟主机和虚拟目录  jquery autocomplete 自动填充文本框、文本域
    JS 导出excel,word实例  2011-10-10 11:55:00|  分类: 默认分类 |  标签:js  excel  word   |字号大

    小 订阅
    用js操作offace中的word,excel 必须首先确保你已经安装office,用js操作word,excel 用到了ActiveXObject类,它是专门用来调用windows操作中的程序的,下面是例子,直接复制到文本文件里,把后缀名改了就可以运行!

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>无标题文档</title>
    <script type="text/javascript" language="javascript">
    function ExcelExport(tableid)   
    {   

      //检索浏览器  
                if(navigator.userAgent.indexOf("MSIE")<0){  
                    alert('请用ie浏览器进行表格导出');  
                    return ;  
                }  
                var oXL = null;   
                try {  
                    oXL = GetObject("", "Excel.Application");  
                }  
                catch (E) {  
                    try {  
                        oXL = new ActiveXObject("Excel.Application");  
                    }  
                    catch (E2) {  
                        alert("请确认:\n1.Microsoft Excel已被安装.\n2.工具 => Internet 选项=> 安全 => 设置 \"启用不安全的 ActiveX\"");  
                        return;  
                    }  
                }  

        var table = document.getElementById(tableid);     
        var workbook = oXL.Workbooks.Add();   
         var sheet = workbook.ActiveSheet;   
         var sel = document.body.createTextRange();  //激活sheet
           
         //把table中的数据移到sel中   
         sel.moveToElementText(table);   
           
         sel.select(); //选中sel中所有数据   
         sel.execCommand("Copy");//复制sel中的数据    
          sheet.Columns("A:Z").ColumnWidth =20;//设置列宽  
         // sheet.Columns("B").ColumnWidth =35;  
          sheet.Rows(1).RowHeight = 35;//设置表头高  
         //将sel中数据拷贝到sheet工作薄中  
         sheet.Paste();           
         oXL.Visible = true; 
      //sheet.Save("F:\\TEST.XLS" ); 
         //通过打印机直接将Excel数据打印出来  
         //sheet.Printout;  
         //ax.UserControl = true;  
      oXL.Quit();
      oXL=null;
    }   
    </script>
    </head>

    <body>
    <table width="100%" border="1" id="mytable">
      <tr>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
      </tr>
      <tr>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
      </tr>
      <tr>
         <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
      </tr>
      <tr>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
      </tr>
      <tr>
         <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
        <td>nihao</td>
      </tr>
    </table>
    <form id="form1" name="form1" method="post" action="">
      <label>
      <input type="button" name="Submit" value="导出excel" onclick="ExcelExport('mytable')" />
      </label>
    </form>
    <p>&nbsp;</p>
    </body>
    </html>

     

    posted @ 2012-02-28 18:16 哈希 阅读(304) | 评论 (0)编辑 收藏

    http://www.wujianrong.com/archives/2007/05/20jspajax.html      简单用例
    http://www.ibm.com/developerworks/cn/web/wa-ajaxintro/          IBM—Ajax讲解
    http://www.w3schools.com/ajax/ajax_example.asp                     Ajax—Example  W3CSchol



    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    ">

    <html>
    <head>
    <script src="ajax.js"></script>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>JSP Page using AJAX</title>
    </head>
    <body>

    <a onclick="sendRequest('GET','index.jsp')" href="#">Server Date Time:</a>
    <div id="ajax_res">Server Date Time will replace this text.</div>
    </body>
    </html>

    index.jsp
    <html>
    <body>
    <%=new java.util.Date()%>
    </body>
    </html>

    ajax.js
    function createRequestObject(){
    var req;
    if(window.XMLHttpRequest){
    //For Firefox, Safari, Opera
    req = new XMLHttpRequest();
    }
    else if(window.ActiveXObject){
    //For IE 5+
    req = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else{
    //Error for an old browser
    alert('Your browser is not IE 5 or higher, or Firefox or Safari or Opera');
    }

    return req;
    }

    //Make the XMLHttpRequest Object
    var http = createRequestObject();

    function sendRequest(method, url){
    if(method == 'get' || method == 'GET'){
    http.open(method,url);
    http.onreadystatechange = handleResponse;
    http.send(null);
    }
    }

    function handleResponse(){
    if(http.readyState == 4 && http.status == 200){
    var response = http.responseText;
    if(response){
    document.getElementById("ajax_res").innerHTML = response;
    }
    }
    }
    run this application may be u get some clue

    posted @ 2012-02-24 23:30 哈希 阅读(178) | 评论 (0)编辑 收藏

    假设:
    1、你的页面在Web-Root下,内容为:  <div id="showMsg"></div><input type="text" id="userName" />,所用编码为utf-8
    2、你的servlet为:  HelloWorldServlet.java  映射路径为   servlet/helloWorldServlet
    步骤:
    1、引入jquery-1.6.4.min.js
    2、编写id为userName的输入框的点击触发函数:
          $("#userName").keyup(function(){
                $.ajax({
                      type: "post",
                      url: "servlet/helloWorldServlet?userName="+$(this).val(),
                      dataType: "json",
                      success: function(data){
                            $("#showMsg").html(data.msg);//修改id为showMsg标签的html
                      }, error: function(){
                            alert("请求出错");
                      }
                })
          })
    3、后台处理接收到的内容:
          request.setCharactorEncoding("utf-8");
          String userName = request.getParameter("userName");
          response.setCharactorEncoding("utf-8");
          PringWriter out = response.getWriter();
          out.print("{\"msg\":\"你好~~"+userName+"!\"}");
    
    注意事项:
    1、这里的编码统一为utf-8
    2、请求路径servlet/helloWorldServlet为相对路径,因此你的页面必须在项目的Web-Root下(也就是默认的web文件夹下,名字可能因项目配置不同而改变)
    
    网上的 Jquery ajax Demo 大多都是基于php 
    很少 有java的 今天就把自己的Demo贴出来 和大家共同学习
    现在就  Jquery ajax 的 $.ajax(),$.post(),$.get();

    首先是  服务端的Servlet 演示这三个函数的用法对都是用的同一个 服务端
     package com.june.servlet;   
     
    import javax.servlet.http.HttpServlet;  
    import javax.servlet.http.HttpServletResponse;  
    import javax.servlet.http.HttpServletRequest;  
    import java.io.IOException;  
    import java.io.PrintWriter;  
    import javax.servlet.ServletException;  
     
    public class jqueryAjaxServer extends HttpServlet {  
         public jqueryAjaxServer(){  
             super();  
         }  
         public void doGet(HttpServletRequest request,HttpServletResponse response)  
         throws IOException ,ServletException {  
             response.setContentType("text/html;charset=utf-8");  
             PrintWriter out=response.getWriter();  
             String account=request.getParameter("account");  
             if("iamcrzay".equals(account)){  
                 out.print("Sorry,the user is exist");  
             }  
             else{  
                 out.print("Congratulation,this accont you can use!!!!");  
             }  
             out.close();  
         }  
         public void doPost(HttpServletRequest request,HttpServletResponse response)  
         throws IOException ,ServletException {  
             this.doGet(request, response);  
         }  

    下面是WEB.XML
    Xml代码 
    <?xml version="1.0" encoding="UTF-8"?> 
    <web-app version="2.5"   
        xmlns="http://java.sun.com/xml/ns/javaee"   
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
        <servlet> 
           <servlet-name>jqueryAjaxServer</servlet-name> 
           <servlet-class>com.june.servlet.jqueryAjaxServer</servlet-class> 
        </servlet> 
            <servlet-mapping> 
           <servlet-name>jqueryAjaxServer</servlet-name> 
           <url-pattern>/jqueryAjax</url-pattern> 
        </servlet-mapping> 
      <welcome-file-list> 
        <welcome-file>index.jsp</welcome-file> 
      </welcome-file-list> 
    </web-app> 

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5"
     xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
     <servlet>
        <servlet-name>jqueryAjaxServer</servlet-name>
        <servlet-class>com.june.servlet.jqueryAjaxServer</servlet-class>
     </servlet>
            <servlet-mapping>
        <servlet-name>jqueryAjaxServer</servlet-name>
        <url-pattern>/jqueryAjax</url-pattern>
     </servlet-mapping>
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
    </web-app>

     

    下面是Jsp页面
    第一个是 jqueryAjax.jsp  本页使用的是$.ajax()
    Html代码 
    <%@ page language="java"  pageEncoding="utf-8"%> 
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
    <html> 
      <head>    
        <title>jquery ajax</title>   
        <meta http-equiv="pragma" content="no-cache"> 
        <meta http-equiv="cache-control" content="no-cache"> 
        <meta http-equiv="expires" content="0">      
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
        <meta http-equiv="description" content="This is my page"> 
        <script src="js/jquery-1.2.6.js" type="text/javascript"></script> 
        <script language="javascript"> 
             $(function(){  
                   $('.sumbit').click(function(){  
                   if($('#account').val().length==0){  
                       $('.hint').text("用户名不能位空").css({"background-color":"green"});   
                   }  
                   else{  
                   $.ajax({  
                     url:'jqueryAjax',  
                     data:{account:$('#account').val()},  
                     error:function(){  
                     alert("error occured!!!");  
                     },  
                     success:function(data){  
                      $('body').append("<div>"+data+"</div>").css("color","red");  
            
                     }  
                       
                   });}  
                   });  
                   });  
                       
             
                 
        </script> 
      </head> 
        
      <body> 
                    <h3 align="center">jquery AjaX</h3> 
                    <hr> 
                    <label>请输入用户名 :</label> 
                    <input id="account" name="account" type="text"> 
                    <input class="sumbit" type="button" value="检测"> 
                    <div class="hint"> 
                    </div> 
      </body> 
    </html> 

    <%@ page language="java"  pageEncoding="utf-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head> 
        <title>jquery ajax</title>
     <meta http-equiv="pragma" content="no-cache">
     <meta http-equiv="cache-control" content="no-cache">
     <meta http-equiv="expires" content="0">   
     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
     <meta http-equiv="description" content="This is my page">
     <script src="js/jquery-1.2.6.js" type="text/javascript"></script>
     <script language="javascript">
          $(function(){
                $('.sumbit').click(function(){
                if($('#account').val().length==0){
                    $('.hint').text("用户名不能位空").css({"background-color":"green"});
                }
                else{
                $.ajax({
                  url:'jqueryAjax',
                  data:{account:$('#account').val()},
                  error:function(){
                  alert("error occured!!!");
                  },
                  success:function(data){
                   $('body').append("<div>"+data+"</div>").css("color","red");
      
                  }
                 
                });}
                });
                });
                    
       
           
     </script>
      </head>
     
      <body>
                    <h3 align="center">jquery AjaX</h3>
                    <hr>
                    <label>请输入用户名 :</label>
                    <input id="account" name="account" type="text">
                    <input class="sumbit" type="button" value="检测">
                    <div class="hint">
                    </div>
      </body>
    </html>

     

    第二个用的是  $.post()

    Html代码 
    <%@ page language="java"  pageEncoding="utf-8"%> 
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
    <html> 
      <head>    
        <title>jquery ajax</title>   
        <meta http-equiv="pragma" content="no-cache"> 
        <meta http-equiv="cache-control" content="no-cache"> 
        <meta http-equiv="expires" content="0">      
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
        <meta http-equiv="description" content="This is my page"> 
        <script src="js/jquery-1.2.6.js" type="text/javascript"></script> 
        <script language="javascript"> 
             $(function(){  
                 $('.sumbit').click(  
                  function(){  
                    if($('#account').val().length==0){  
                        $('.hint').text("The account is cant't be null").css({"color":"red","background-color":"yellow"});  
                    }  
                    else{  
                    $.post("jqueryAjax","account="+$('#account').val(),function(data){  
                       $('.hint').text(data).css({"color":"red","background-color":"yellow"});  
                    })  
                    }  
                 });  
             });             
        </script> 
      </head> 
        
      <body> 
                    <h3 align="center">jquery Ajax</h3> 
                    <hr> 
                    <label>请输入用户名 :</label> 
                    <input id="account" name="account" type="text"> 
                    <input class="sumbit" type="button" value="检测"> 
                    <div class="hint"> 
                    </div> 
      </body> 
    </html> 

    <%@ page language="java"  pageEncoding="utf-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head> 
        <title>jquery ajax</title>
     <meta http-equiv="pragma" content="no-cache">
     <meta http-equiv="cache-control" content="no-cache">
     <meta http-equiv="expires" content="0">   
     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
     <meta http-equiv="description" content="This is my page">
     <script src="js/jquery-1.2.6.js" type="text/javascript"></script>
     <script language="javascript">
          $(function(){
              $('.sumbit').click(
               function(){
                 if($('#account').val().length==0){
                     $('.hint').text("The account is cant't be null").css({"color":"red","background-color":"yellow"});
                 }
                 else{
                 $.post("jqueryAjax","account="+$('#account').val(),function(data){
                    $('.hint').text(data).css({"color":"red","background-color":"yellow"});
                 })
                 }
              });
          });       
     </script>
      </head>
     
      <body>
                    <h3 align="center">jquery Ajax</h3>
                    <hr>
                    <label>请输入用户名 :</label>
                    <input id="account" name="account" type="text">
                    <input class="sumbit" type="button" value="检测">
                    <div class="hint">
                    </div>
      </body>
    </html>

     

    第三个是用的$.get()

    Html代码 
    <%@ page  pageEncoding="utf-8"%> 
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
    <html> 
      <head>     
        <title>jquery get</title> 
          
        <meta http-equiv="pragma" content="no-cache"> 
        <meta http-equiv="cache-control" content="no-cache"> 
        <meta http-equiv="expires" content="0">      
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
        <meta http-equiv="description" content="This is my page"> 
        <script src="js/jquery-1.2.6.js" type="text/javascript"></script> 
        <script type="text/javascript"> 
             $(function(){  
                    $('.sumbit').click(function(){  
                          if($('#account').val().length==0){  
                             $('.hint').html("用户名不能位空!!!").css({"color":"#ffoo11","background":"blue"});  
                          }  
                          else{  
                              $.get("jqueryAjax","account="+$('#account').val(),  
                                   function(data){  
                                    $('.hint').html(data).css({"color":"#ffoo11","background":"green"});  
                              });  
                          }  
                    });  
             });  
        </script> 
     
      </head> 
        
      <body> 
            <h3 align="center">jquery AjaX</h3> 
                    <hr> 
                    <label>请输入用户名 :</label> 
                    <input id="account" name="account" type="text"> 
                    <input class="sumbit" type="button" value="检测"> 
                    <div class="hint"> 
                    </div> 
      </body> 
    </html> 

    <%@ page  pageEncoding="utf-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>  
        <title>jquery get</title>
       
     <meta http-equiv="pragma" content="no-cache">
     <meta http-equiv="cache-control" content="no-cache">
     <meta http-equiv="expires" content="0">   
     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
     <meta http-equiv="description" content="This is my page">
     <script src="js/jquery-1.2.6.js" type="text/javascript"></script>
     <script type="text/javascript">
          $(function(){
                 $('.sumbit').click(function(){
                       if($('#account').val().length==0){
                          $('.hint').html("用户名不能位空!!!").css({"color":"#ffoo11","background":"blue"});
                       }
                       else{
                           $.get("jqueryAjax","account="+$('#account').val(),
                                function(data){
                                 $('.hint').html(data).css({"color":"#ffoo11","background":"green"});
                           });
                       }
                 });
          });
     </script>

      </head>
     
      <body>
            <h3 align="center">jquery AjaX</h3>
                    <hr>
                    <label>请输入用户名 :</label>
                    <input id="account" name="account" type="text">
                    <input class="sumbit" type="button" value="检测">
                    <div class="hint">
                    </div>
      </body>
    </html>

     
    http://iamcrzay.iteye.com/blog/237940 
     
     
     
     

    posted @ 2012-02-24 16:16 哈希 阅读(3995) | 评论 (3)编辑 收藏

    1、将数组转化成字符串,用特殊字符如“|”将数组的元素隔开,用普通的字符串参数传递

    2、使用json方式传递参数

    解析

    C#后台得到的是个string
    string objStr = HttpContext.Current.Request["objStr"];

    objStr内容([{"0": "a", "1": "b", "2": "c", "3": "d"}, {"0": "aa", "1": "bb", "2": "cc", "3": "dd"}{"0": "aa", "1": "bb"}])


    /// <summary>
      /// 从JS数组中解析出JSON对象返回该对象的字符串表示
      /// </summary>
      /// <param name="ArrayStr"></param>
      /// <returns></returns>
      private static string GetJsonStr(string ArrayStr)
      {
      //ArrayStr="[{'0': 'a', '1': 'b', '2': 'c', '3': 'd'},{'0': 'aa', '1': 'bb', '2': 'cc', '3': 'dd'},{'0': 'aa', '1': 'bb'}]";
      string StrJson = ArrayStr;

      //将"[{"和"}]"去除;
      //StrJson="'0': 'a', '1': 'b', '2': 'c', '3': 'd'},{'0': 'aa', '1': 'bb', '2': 'cc', '3': 'dd'},{'0': 'aa', '1': 'bb'";  
      StrJson = StrJson.Substring(2, StrJson.Length - 4);

      //将“},{”替换为“|”便于分割成数组
      //StrJson="'0': 'a', '1': 'b', '2': 'c', '3': 'd'|'0': 'aa', '1': 'bb', '2': 'cc', '3': 'dd'|'0': 'aa', '1': 'bb'";  
      StrJson = StrJson.Replace("},{", "|");  
       
      //以“|”为分隔符将每个JSON对象分割成字符串
      /*结果为:strjson[0]="'0': 'a', '1': 'b', '2': 'c', '3': 'd'";
      strjson[1]="'0': 'aa', '1': 'bb', '2': 'cc', '3': 'dd'";
      strjson[2]="'0': 'aa', '1': 'bb'";*/
      return StrJson.Split('|');
      }

    posted @ 2012-02-20 22:16 哈希 阅读(205) | 评论 (0)编辑 收藏

    ask.jsp

    <script language="javascript" type="text/javascript">
    function Open()
    {

    window.open('<%=path%>/jsp/answer.jsp' ,'_blank','top=250,left=300,width=500 height=100');
    }
    </script>

      <body>
     <form   onsubmit= "return  new_window(); " >
      <input type="text" name="tbValue"><a href="javascript:" onclick="Open();">Open http://www.dwww.cn </a>
      
     </form>
      </body>

    answer.jsp

     <script language="javascript" type="text/javascript">
      function SetValue(value)
      {
      self.opener.document.all("tbValue").value=value;
      self.close();
      }
      </script>

     
     
    <body>
        Values:<br/>
    <a href="javascript:SetValue('1')">value 1</a><br/>
    <a href="javascript:SetValue('2')">value 2</a>

      </body>

     





    posted @ 2012-02-19 12:56 哈希 阅读(172) | 评论 (0)编辑 收藏

    a href 不让页面跳转

    不可以跳转
    <a href="javascript:;" onclick="javascript:ToUrl('http://www.jingzhengli.cn');">
    location.href不跳转测试1</a>  
    <a href="javascript:void(0);"
    onclick="javascript:ToUrl('http://www.jingzhengli.cn');">
    location.href不跳转测试2</a>  


    可以跳转
    <a href="javascript:void(0);"
    onclick="javascript:ToUrl('http://www.jingzhengli.cn');return false;">
    location.href不跳转测试3</a>  
    <a href="#" onclick="javascript:ToUrl('http://www.jingzhengli.cn');">
    location.href不跳转测试4</a>  
    <a href="###" onclick="javascript:ToUrl('http://www.jingzhengli.cn');">
    location.href不跳转测试5</a> 
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/muzai/archive/2010/11/22/6026786.aspx

    posted @ 2012-02-17 13:22 哈希 阅读(1151) | 评论 (0)编辑 收藏


    第一种:
        <script language="javascript" type="text/javascript">
               window.location.href=
    "login.jsp?backurl="+window.location.href;
        </script>

    第二种:
        <script language=
    "javascript">
    alert(
    "返回");
    window.history.back(-1);
       </script>

    第三种:
       <script language=
    "javascript">
    window.navigate(
    "top.jsp");
      </script>

    第四种:
       <script language=
    "JavaScript">
              self.location='top.htm';
       </script>

    第五种:
       <script language=
    "javascript">
              alert(
    "非法访问!");
              top.location='xx.jsp';
       </script>

    posted @ 2012-02-16 23:09 哈希 阅读(160) | 评论 (0)编辑 收藏

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD>
    <TITLE> 显示隐藏列 </TITLE>
    <SCRIPT LANGUAGE="JavaScript">
    <!--
    function setHiddenCol(oTable,iCol)//Writed by QQ:190988779 at 2007-7-24 11:14:09
    {
        for (i=0;i < oTable.rows.length ; i++)
        {
            oTable.rows[i].cells[iCol].style.display = oTable.rows[i].cells[iCol].style.display=="none"?"block":"none";
        }
    }
    function setHiddenRow(oTable,iRow)//Writed by QQ:190988779 at 2007-7-24 11:14:09
    {
        oTable.rows[iRow].style.display = oTable.rows[iRow].style.display == "none"?"block":"none";
    }
    //-->
    </SCRIPT>
    </HEAD>

    <BODY>
    <TABLE id="Table1" cellSpacing="1" cellPadding="1" border="1">

    <TR> <TD width="20%">00</TD> <TD width="20%" bgcolor="#E3E3E3">01</TD> <TD width="20%">02</TD></TR>
    <TR> <TD width="20%" bgcolor="red">10</TD> <TD width="20%" bgcolor="green">11</TD> <TD width="20%" bgcolor="red">12</TD></TR>
    <TR> <TD width="20%">20</TD> <TD width="20%" bgcolor="#E3E3E3">21</TD> <TD width="20%">22</TD></TR>
    </TABLE> </P>


    <INPUT id="btnHiddenCol" type="button" value="显示/隐藏第2列" name="btnHiddenCol" onclick="setHiddenCol(document.getElementById('Table1'),1)">
    <INPUT id="btnHiddenRow" type="button" value="显示/隐藏第2行" name="btnHiddenRow" onclick="setHiddenRow(document.getElementById('Table1'),1)">
    </BODY>
    </HTML>

    posted @ 2012-02-15 11:08 哈希 阅读(859) | 评论 (0)编辑 收藏

    oracle数据库的配置

    一、Oracle的配置

    1、配置net manager

      依次选择开始—>Oracle – OraHome92>Configuration and Migration Tools>Net Manager

    选择本地—>服务命名,点击左侧绿色加号 

    输入Net服务名 172.30.4.205_ora91 点击下一步 

    选择TCP/IPInternet协议) 点击下一步 

    输入主机名172.30.4.205 点击下一步 

    选择(Oracle8i或更高版本)服务名:ora91  点击下一步 

    点击测试 

    选择更改登陆,输入用户名xiecha,口令xiecha 

    点击确定,出现测试成功后选择关闭

    点击完成 

    保存网络配置 
    参见网址:http://wenku.baidu.com/view/7685da64783e0912a2162aa9.html

    posted @ 2012-02-09 11:56 哈希 阅读(153) | 评论 (0)编辑 收藏

    PL/SQL Developer是一个集成开发环境,专门面向Oracle数据库存储程序单元的开发。如今,有越来越多的商业逻辑和应用逻辑转向了Oracle Server,因此,PL/SQL编程也成了整个开发过程的一个重要组成部分。PL/SQL Developer侧重于易用性、代码品质和生产力,充分发挥Oracle应用程序开发过程中的主要优势。PL/SQL(Procedural Language/SQL)是一种过程化语言,属于第三代语言,它与C、C++、Java等语言一样关注于处理细节,可以用来实现比较复杂的业务逻辑。它允许SQL的数据操纵语言和查询语句包含在块结构(block_structured)和代码过程语言中,使PL/SQL成为一个功能强大的事务处理语言。在甲骨文数据库管理方面,PL/SQL是对结构化查询语言(SQL)的过程语言扩展。PL/SQL的目的是联合数据库语言和过程语言。PL/SQL的基本单位叫做一个区段,由三个部份组成:一个申明部份,一个可运行部份,和排除-构建部分。 因为PL/SQL允许混合SQL申明和过程结构,因此可以在将申明发送到甲骨文系统去执行之前使用PL/SQL区段和副程序来组合SQL申明,没有PL/SQL,甲骨文需要就每次处理SQL申明,在网络环境中,这将影响交通流量,而且增加响应时间。PL/SQL区段只被编译一次并且以可运行的形式储存,以降低响应时间。
    Enhancements in PL/SQL Developer 8.0.4
    ======================================
    * SQL Window would always print SQL text, disregarding "Print SQL"
      preference
    * Searching within special text (strings, comments) could be slow
    * Key Configuration preference could reset to default instead of
      using the defined keys when using multiple preference sets
    * Export to Excel would interpret data beginning with = as formula
    * Column names starting with a digit were not implicitly quoted in
      SQL statements
    * Fixed issue with search in selection where incorrect characters
      could be replaced
    * Duplicate items removed from description window
    * View/Edit Data for tables with an owner with special characters
      would not add quotes to the owner
    * UTFE characters were displayed incorrectly when Unicode support
      was enabled
    * Loading the Macro Library could fail on Windows 7/Vista,
      resulting in a "list index out of bounds" error message
    * Debugger could hang after an exception on oracle11g
    * Code Assistant can now complete database link names
    * Copy all to Excel in the SQL Window would not have correct
      formatting on the second sheet
    * To-Do Item List was not up-to-date when opening a package spec &
      body

    下载地址如下
    源程序:http://allroundautomations.swmirror.com/plsqldev804.exe
    语言文件及手册:http://www.allroundautomations.com/plsqldevlang/80/chinese.exe
    注册信息如下
    product code:kfqtle46lqzbbvlzuvsrutst66yn6m7kl8s2trrtsapr
    password:xs374ca
    serial number:1775341736

    posted @ 2012-01-18 18:00 哈希 阅读(314) | 评论 (0)编辑 收藏

    <table>
               <tr>
                <td><div style="margin-top:7px;float:left;">项目进度:</div></td>
                <td>
                 <div style="float:left;background-color:#dde5ea;cursor:hand;margin-top:6px;float:left;width:120px;; height:20; border:1px solid #C7DBF4;" >
                <div style="width:20%; height:20px; background-color: #33CC00; float:left"></div>
            </div>
                </td>
               </tr>
              </table>


    <table>
               <tr>
                <td><div style="margin-top:7px;float:left;">项目进度:</div></td>
                <td>
                 <div onclick="viewProcess('<%=baseRecord.getString("ID","")%>')" style="float:left;background-color:#dde5ea;cursor:hand;margin-top:6px;float:left;width:120px;; height:20; border:1px solid #C7DBF4;" >
                <div style="width:<%=baseRecord.getString("PROGRESS","0") %>%; height:20px; background-color: #33CC00; float:left"></div>
            </div>
                </td>
               </tr>
              </table>

    posted @ 2012-01-17 15:15 哈希 阅读(184) | 评论 (0)编辑 收藏

    <Context path="/roeee" reloadable="true" docBase="C:\Program Files\apache-tomcat-5.5.33\webapps\roeee">
     <Resource
          name="jdbc/ROEEE"
          type="javax.sql.DataSource"
          password="icss"
          driverClassName="oracle.jdbc.driver.OracleDriver"
          maxIdle="2"
          maxWait="5000"
          username="recjl"
          url="jdbc:oracle:thin:@10.17.10.245:1521:AEG"
          maxActive="4"/>
       <Resource
          name="ResourceOne/DataSource"
          type="javax.sql.DataSource"
          password="icss"
          driverClassName="oracle.jdbc.driver.OracleDriver"
          maxIdle="2"
          maxWait="5000"
          username="recjl"
          url="jdbc:oracle:thin:@10.17.10.245:1521:AEG"
          maxActive="4"/>
    </Context>


    放在apache-tomcat-5.5.33\conf\Catalina\localhost  路径下

    posted @ 2012-01-09 16:22 哈希 阅读(151) | 评论 (0)编辑 收藏


    从加入中金黄金项目组以来将近一个月了,在这期间,我对自己所做模块业务非常熟

    悉了,通过这段时间的开发,对项目中所用到的基本技术也熟悉了。在开发中个人技

    术不是很全面遇到问题解决时间较长,经验还是需要积累。在与北京交流过程中有时

    还是不能及时得到反馈,需要消耗时间。项目前期设计不够合理的地方在开发中可能才会遇到。

    posted @ 2012-01-03 15:58 哈希 阅读(125) | 评论 (0)编辑 收藏

    数字标签实例

    Double num = new Double("123456789012.3456");

    整数带千分符显示:

    <fmt :formatNumber value="${num}" type="number"/>

    整数显示:

    <fmt :formatNumber value="${num}" pattern="#" type="number"/>

    两位小数舍入显示:

    <fmt :formatNumber value="${num}" pattern="#.##" type="number"/>

    两位小数舍入,不足两位小数补 0 显示:

    <fmt :formatNumber value="${num}" pattern="#.00" type="number"/>

    货币显示:(与 number 类似扩展 pattern 

    <fmt :formatNumber value="${num}" type="currency"/>

    百分数显示:(与 number 类似扩展 pattern 

    <fmt :formatNumber value="${num}" type="percent"/>

    实例结果

    整数带千分符显示: 123,456,789,012.346

    整数显示: 123456789012

    两位小数舍入显示: 123456789012.35

    两位小数舍入,不足两位小数补 0 显示: 123456789012.35

    货币显示:¥ 123,456,789,012.35

    百分数显示 12,345,678,901,235%

    posted @ 2011-12-28 01:08 哈希 阅读(189) | 评论 (0)编辑 收藏

    {sName: "productId","bSortable":false, "sColumnDataType":'link',
            "sColumnDataTypePro":{'url':"javascript:findmodel('<c:out value="${context_path }"/>/k4_oldGoldStorsge/oldGoldDetail/{id}');",'name':'productId'},aTargets: [2]},


    function findmodel(url){
          var rs = window.showModalDialog(url,"dialogWidth=" + 500 + "px;dialogHeight=" + 90 + "px");
     }

    posted @ 2011-12-24 15:58 哈希 阅读(189) | 评论 (0)编辑 收藏

    //采购申请单——保存状态
     public void updateSpStatus() {
      //要更新的状态 1、待业务审核 2、待财务审核 3、审核退回  4、入款
      String statusId=request().getParameter("status");
      //要更新的id
      String[] idStrings=request().getParameterValues("id");
      //吧要更新的确认单放入集合一起更新
      List<PurchaseAddMoney> list=new ArrayList<PurchaseAddMoney>();
      for(int i=0;i<idStrings.length;i++){
       PurchaseAddMoney pur=new PurchaseAddMoney();
       pur.setId(idStrings[i]);
       pur.setStatusId(statusId);
       //如果是财务确认,要更新财务确认日期
       if(statusId.equals("j208")){    
        //更新完成审批时间  
        pur.setFinishApproveDate(CommonHelper.getCreateTimeToString());
       }
          
       list.add(pur);
      }
      //批量更新到数据库  
      purchaseAddService.batchUpdate(list);
      this.render(SUCCESS);
     }


    public int[] batchUpdate(List list) {  
      return super.batchUpdate(list);
     }

    <form id="purchaseAddApply" name="purchaseAddApply" method="post" action="purchaseAddUpdateStatus">

    posted @ 2011-12-21 23:01 哈希 阅读(697) | 评论 (0)编辑 收藏

    public void changeStates(String states,String id){
      Map<String,String> parameter = new HashMap<String,String>();
      parameter.put("id", id);
      parameter.put("type", states);
      Map<String,Object> result = bankSettelService.updateStates(parameter);  
      this.printHtml(result.get("count"));
     }


    /**
      * <p>修改结算表状态
      * @param parameter
      * @return
      */
     public Map<String,Object> updateStates(Map<String,String> parameter){
      Query query = this.getRepository().createQuery();
      Map<String,Object> result = new HashMap<String,Object>();
      List<Object> sqlParam = new ArrayList<Object>();
      StringBuilder sql = new StringBuilder();
      String[] arrParam = parameter.get("id").split(",");
      String paramIn = "'";//回购单编号
      String type = "";//回购单修改后状态
      int count = 0; //修改行数
      for(String param:arrParam){
       paramIn += param + "','";
      }
      paramIn = paramIn.substring(0,paramIn.length() - 2);
      
      //回购单状态
      if("1".equals(parameter.get("type"))){
       type = REPUR_SETTEL_STATUS03; //待付款
      } else if("2".equals(parameter.get("type"))){
       type = REPUR_SETTEL_STATUS06; //审批退回
      } else if("3".equals(parameter.get("type"))){
       type = REPUR_SETTEL_STATUS04; //作废
      } else if("4".equals(parameter.get("type"))){
       type = REPUR_SETTEL_STATUS05; //已付款
      }
      //修改状态
      if(!StringUtils.isEmpty(type)){
       Update update = new Update();
       //更新回购结算单状态  如果为已付款 同时要更新回购单状态为已付款
       if("4".equals(parameter.get("type"))){
        //更新回购结算单状态
        update.set("BUYBACKSTATEMENT_STATUS = '" + type + "'")
         .set("PAYMENTSTATUS = '1'")
         .set("PAYMENTDATE = '" + CommonHelper.getCreateTimeToString()+"'")
         .update("TB_E_BUYBACKSTATEMENT")
         .where("ID in("+paramIn+")");    
        
        //查看对应的客户回购单客户结算回购状态是否为已付款,如果是,要更改回购单状态已付款
        sql.append(updateBankReStatusSql);
        sql.append("and ID in(" + CL_LF);
        sql.append(getSettleStatusSql);
        sql.append("AND BUYBACKSTATEMENT.ID in(" + paramIn + ")" + CL_LF);
        sql.append(")" + CL_LF);
        sql.append("AND FINANCEAFFIRMSTATSUS = ?" + CL_LF);
        sqlParam.add(REPUR_STATUS09);//回购单状态为已付款
        sqlParam.add(CREPUR_STATUS04);//客户回购单结状态为已付款
        query.execute(sql.toString(),sqlParam);
       }else{
        update.set("BUYBACKSTATEMENT_STATUS = '" + type + "'")
        .update("TB_E_BUYBACKSTATEMENT")
        .where("ID in("+paramIn+")");
       }
       count = query.execute(update);
      }
      result.put("count", count);
      return result;
     }


    function changeStates(flag) {
      var checkValues = getCoulmnValue(oTable,'key');
      if(isEmpty(checkValues)){
       showInfo("请选择数据");
       return false;
      } else {
       if(flag == 1){
        if(confirm('确认审批是否通过?')){
         saveStates(flag,checkValues);
        }
       }else if(flag == 4){
        if(confirm('确认付款?')){
         saveStates(flag,checkValues);
        }
       }else{
        saveStates(flag,checkValues);
       }     
      }
     } 
     //审批数据提交
     function saveStates(flag,checkValues){
      $.ajax({
         type: 'get',
         url: "<c:url value='/j8_bankSettle/changeStates/'/>"+flag+"/"+checkValues,
         dataType: 'html',
         success: function(data){        
          if(data > 0){
            showInfo("操作成功");       
         query();      
          }else{
            showError("操作失败"); 
         return false;
          }
         }
      });
     }



    <c:choose>
           <c:when test="${optype eq 'approval'}">
            <button class="icon-edit" onclick="changeStates(1);">
                审批通过
            </button>
            <button class="icon-edit" onclick="changeStates(2);">
               审批退回
            </button>
            <button class="icon-edit" onclick="changeStates(3);">
               作废
            </button>
           </c:when>
           <c:when test="${optype eq 'payment'}">
            <button class="icon-edit" onclick="changeStates(4);">
                付款
            </button>        
           </c:when>
           </c:choose> 



    { "sName": "id","sColumnDataType":"checkbox","sClass": "keyclass",
                "sColumnDataTypePro":{'name':'key'},"bSortable": false, "aTargets": [ 1 ]},

    posted @ 2011-12-21 22:17 哈希 阅读(167) | 评论 (0)编辑 收藏

    <%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>


     $(function(){$("#sendAddress").change(function(){
     
        var sendAddress=$("#sendAddress").val();
        getCustomerInfo(sendAddress);
        });
      });
      //出货方信息填充
      function getCustomerInfo(id){
           //alert(id);
            $.ajax({
                 type: 'get',
                 url: "
    <c:url value='/k4_oldGoldStorsge/getCustomerInfoByAddressId/'/>"+id,
                 dataType: 'json',
                 success: function(data) {
                    alert(data.name);
                    $("#supplyer").val(data.linkman);   
                    $("#supplyIdentityCard").val(data.identification);        
                    $("#supplyerMobile").val(data.mobile);     
                    $("#supplyerPhone").val(data.tel); 
                    //$("#").val(data.);                        
                }
            });
        }
        
        
        
        $(function(){$("#outStorageList").change(function(){
     
        var outStorageList=$("#outStorageList").val();
        //alert(outStorageList);
        //getCustomerInfo(sendAddress);
         getAddressList(outStorageList)
        });
      });
        
        
        
        
        function getAddressList(id){
           //alert(id);
            $.ajax({
                 type: 'get',
                 url: "
    <c:url value='/k4_oldGoldStorsge/getAddressByCustomerId/'/>"+id,
                 dataType: 'html',
                 success: function(data) {
                  var address=eval(data);
                 //遍历取值             
                  $.each(address,function(i,n){
                     $("#getAddress").append($("
    <option value='"+address[i].id+"'></option>").text(address[i].address));  
                  });
                }
            });
        }
        
        
        
         $(function(){$("#getAddress").change(function(){
             var sendAddress=$("#getAddress").val();
             getMenInfo(sendAddress);
           });
         });
        
        
        
        function getMenInfo(id){
            $.ajax({
                 type: 'get',
                 url: "
    <c:url value='/k4_oldGoldStorsge/getCustomerInfoByAddressId/'/>"+id,
                 dataType: 'json',
                 success: function(data) {
                    $("#receiver").val(data.linkman);   
                    $("#receiverIdentityCard").val(data.identification);        
                    $("#receiverMobile").val(data.mobile);     
                    $("#receiverPhone").val(data.tel); 
                    //$("#").val(d
    /**
         * 收货方ID获取地址信息
         * 
    @return
         
    */

        
    public void getAddressByCustomerId(String id) {
            List
    <Address> list=new ArrayList<Address>();
            list
    =oldGoldStorageService.findAddressList(id);
            StringBuilder json 
    = new StringBuilder();
            json.append(
    "[");
            
    for (int i = 0; i < list.size()-1; i++{
                json.append(
    "{'id':'").append(list.get(i).getId()).append("',");
                json.append(
    "'address':'").append(list.get(i).getAddressDeatil()).append("'},");
            }

            json.append(
    "{'id':'").append(list.get(list.size()-1).getId()).append("',");
            json.append(
    "'address':'").append(list.get(list.size()-1).getAddressDeatil()).append("'}");
            json.append(
    "]");    
            System.out.println(json);
            
    this.renderJSON(json.toString());
        }
    ata.);                        
                }
            });
        }
        
        
        
        
        


    1. <script type="text/javascript">   
    2. $(document).ready(function(){   
    3.  var url='TypeGet?d='+Math.random();/*使用随机数解决jquery的缓存问题*/  
    4.  $.get(url,   
    5.    function dedit(data){   
    6.     var m=eval(data);   
    7.         $.each(m, function(i) {   
    8.            //alert(s[i]);   
    9.            $('#pselect').append('<option value="'+m[i].no+'">' + m[i].name+ '</option>');   
    10.   
    11.      });   
    12.   
    13. });    
    14. </script>  

    1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {   
    2.   // TODO Auto-generated method stub   
    3.   request.setCharacterEncoding("UTF-8");/*解决中文乱码的问题*/  
    4.    response.setCharacterEncoding("UTF-8");   
    5.       
    6.   ArrayList result=new ArrayList();   
    7.   Connection conn=null;   
    8.   Statement st=null;   
    9.   ResultSet rs=null;   
    10.      
    11.   try{   
    12.       
    13.    conn=DBConnection.getConnection();    
    14.    st=conn.createStatement();   
    15.    rs=st.executeQuery("select * from ddpms_devicetype order by name");   
    16.    while(rs.next()){   
    17.     DevicetypeBean dt=new DevicetypeBean();   
    18.     dt.setNo(rs.getInt("no"));   
    19.     dt.setName(rs.getString("name"));   
    20.     result.add(dt);   
    21.    }   
    22.   }catch(Exception e){   
    23.    e.printStackTrace();   
    24.   }   
    25.   finally{   
    26.    try{   
    27.     rs.close();   
    28.     st.close();   
    29.     conn.close();   
    30.    }catch(Exception e){   
    31.     e.printStackTrace();   
    32.    }   
    33.   }   
    34.    response.setContentType("text/html");   
    35.    PrintWriter out= response.getWriter();     
    36.   
    37.    out.write(toString(result));   
    38.  }   
    39.  public String toString(ArrayList s)      
    40.     {      
    41.         String str="[";   
    42.         for(int i=0;i<s.size();i++){   
    43.          DevicetypeBean dt=(DevicetypeBean)s.get(i);   
    44.          str+="{'no':'"+dt.getNo()+"','name':'"+dt.getName()+"'},";   
    45.         }   
    46.         str=str.substring(0,str.length()-1)+"]";    
    47.   return str;     
    48.     }  
    $(function(){$("#logisticsDistributionBook").click(function()
            {
          var checkValues=getCoulmnValue(oTable, 'id');
         // alert(checkValues);
          var aoData = new Array();
          aoData.push( { "name": "ids", "value":checkValues } );
          if(isEmpty(checkValues)){
               showInfo("请选择需要处理的数据行!");
       return false;
            }else if(!isEmpty(checkValues)){
             $.ajax({
              type: 'post',
              url: "<c:url value='/k4_oldGoldStorsge/checkDispatchStatusId/make/1'/>",
              dataType: 'json',
              data: aoData,
              success: function(data) {
              //alert(data);
              if(parseInt(data)>=1){
                 //alert(data);
                 showInfo("必须全部选择没有生成过物流配送书的数据!");
                 return;      
                 }else if (checkProductId()) {
                getHidVal(checkValues);   
                }                 
                }
                 });
            }
           });
        });

    public void checkDispatchStatusId(String type, String id) {
      String myid = request().getParameter("ids");
      String[] ids = myid.split(",");
      int count = 0;
      if ("make".equals(type)) {
       count = oldGoldStorageService.findNumofDispatch(myid);
      }
      this.printHtml(count);
     }

    这两篇也不错!
    http://tochal.iteye.com/blog/722265

    http://blog.csdn.net/huhai463127310/archive/2009/11/29/4901654.aspx

    posted @ 2011-12-21 15:49 哈希 阅读(286) | 评论 (0)编辑 收藏

    --修改TB_C_ACCOUNT_INFO中金账户信息,增加字段:收款人名称、收款人电话。
    --返厂单表 TB_E_BACKFACTORY_BILLS 删除字段:基础金价、产成品ID  CHAR(14 BYTE)
    --alter table TB_E_BACKFACTORY_BILLS drop column CREATETIME;  
    --alter table TB_E_BACKFACTORY_BILLS add CREATETIME CHAR(14 BYTE) not null;
    --2 alter table TB_E_BACKFACTORY_BILLS drop column FINISH_PRODUCT_ID;
    alter table TB_E_BACKFACTORY_BILLS add FACTORY VARCHAR2(64) not null;
    --3alter table TB_E_BACKFACTORY_BILLS add PAYEENAME VARCHAR2(64) not null;
     --alter table TB_E_BACKFACTORY_BILLS add FACTORY VARCHAR2(64);
     --alter table TB_E_BACKFACTORY_BILLS add description VARCHAR2(64);
    --comment on column tb_e_backfactory_bills.description is '备注';     "CREATETIME"            CHAR(14 BYTE) NOT NULL ENABLE,
    --4 alter table TB_E_BACKFACTORY_BILLS add PAYEETEL VARCHAR2(30) not null;
    --5 alter table TB_E_BACKFACTORY_BILLS add ACCOUNT VARCHAR2(64) not null;
    --6 alter table TB_E_BACKFACTORY_BILLS add RETURNDATE CHAR(14) not null;
    --7 comment on column TB_E_BACKFACTORY_BILLS.PAYEENAME is '收款人名称';
    --8 comment on column TB_E_BACKFACTORY_BILLS.PAYEETEL is '收款人电话';
    --9 comment on column TB_E_BACKFACTORY_BILLS.ACCOUNT is '银行帐号';
    --10 comment on column TB_E_BACKFACTORY_BILLS.RETURNDATE is '返厂日期';
    --11alter table TB_L_FINPRODU_FINISH_PRODUCT drop column REMARK
    --12 alter table TB_L_FINPRODU_FINISH_PRODUCT modify AGENCYBUYPRICE default 0 not null;
    --13 alter table TB_L_FINPRODU_FINISH_PRODUCT add AGENCYBUYTOTAL NUMBER(15,4) default 0 not null;
    --14 alter table TB_L_FINPRODU_FINISH_PRODUCT add BASEPRICE NUMBER(15,4) default 0 not null;
    --15 alter table TB_L_FINPRODU_FINISH_PRODUCT add BASEPRICETOTAL NUMBER(15,4) default 0 not null;
    --16 comment on column TB_L_FINPRODU_FINISH_PRODUCT.AGENCYBUYTOTAL is '代回购价格合计';
    --17 comment on column TB_L_FINPRODU_FINISH_PRODUCT.BASEPRICE is '基础价格';
    --18comment on column TB_L_FINPRODU_FINISH_PRODUCT.BASEPRICETOTAL is '基础价格合计';
    --0alter table TB_C_ACCOUNT_INFO add RECEIVERNAME VARCHAR2(64) not null;
    --alter table TB_C_ACCOUNT_INFO add RECEIVERTELEPHONE VARCHAR2(64) ;
    ---comment on column TB_C_ACCOUNT_INFO.RECEIVERNAME is '收款人名称';

    posted @ 2011-12-17 16:00 哈希 阅读(141) | 评论 (0)编辑 收藏

    function savesettle(){
        $(
    "#saveSettle").attr("action","<c:url value='/j8_distributorSummary/saveSettle'/>");
        
        $(
    "#saveSettle").submi
    注意:#id    取值于——form表单的ID值
    t();
    }



    posted @ 2011-12-15 15:57 哈希 阅读(180) | 评论 (0)编辑 收藏

    /**
     * 修改状态
     */
    function changeStates(flag) {
     if(flag == 1){
      if(confirm('确认审批是否通过?')){
       saveStates(flag,"<c:url value='/j8_distributorSettle/listSettle/approval'/>");
      }
     }else if(flag == 4){
      if(confirm('确认付款?')){
       saveStates(flag,"<c:url value='/j8_distributorSettle/listSettle/payment'/>");
      }
     }else{
      saveStates(flag,"<c:url value='/j8_distributorSettle/listSettle/approval'/>");
     }

    //审批数据提交
    function saveStates(flag,url){
     $.ajax({
        type: 'get',
        url: "<c:url value='/j8_distributorSettle/changeStates/'/>"+flag+"/<c:out value='${result.settleMaster.id}'/>",
        dataType: 'html',
        success: function(data){        
         if(data > 0){
           showInfo("操作成功");       
        window.location.href=url; 
         }else{
           showError("操作失败"); 
        return false;
         }
        }
     });
    }

    $(document).ready(function () {
     ConvertMoney();
    });
    /**
     * 修改状态
     */
    function changeStates(states) {
     $.ajax({
        type: 'get',
        url: "<c:url value='/j8_clientSummary/changeStates/'/>"+states+"/<c:out value='${result.repurchseMaster.id}'/>",
        dataType: 'html',
        success: function(data){        
         if(data > 0){
           showInfo("操作成功");
           if(states == 1){
            url = "<c:url value='/j8_clientSummary/summaryList/1'/>";
           }
           if(states == 2){
            url = "<c:url value='/j8_clientSummary/summaryList/2'/>";
           }
           if(states == 3){
            url = "<c:url value='/j8_clientSummary/summaryList/2'/>";
           }
           if(states == 4){
            url = "<c:url value='/j8_clientSummary/summaryList/3'/>";
           }
           window.location.href = url;       
        query();      
         }else{
           showError("操作失败"); 
        return false;
         }
        }
      });
    }

    function create() {
      var checkValues = getCoulmnValue(oTable,'key');
      if(isEmpty(checkValues)){
       showInfo("请选择要结算的行");
       return false;
      } else {
       checkSettle(checkValues);   
      }
     }
     //结算检查
     function checkSettle(checkValues){  
      $.ajax({
         type: 'get',
         url: "<c:url value='/j8_distributorSummary/checkSettle/'/>"+checkValues,
         dataType: 'html',
         success: function(data){        
          if(data == '1'){       
         window.location.href="<c:url value='/j8_distributorSummary/createSettle/'/>"+checkValues;
          }else{
            showInfo("只能对同一客户进行结算");
         return false;
          }
         }
       });
     }


     function changeStates(flag) {
      var checkValues = getCoulmnValue(oTable,'key');
      if(isEmpty(checkValues)){
       showInfo("请选择数据");
       return false;
      } else {
       if(flag == 1){
        if(confirm('确认审批是否通过?')){
         saveStates(flag,checkValues);
        }
       }else if(flag == 4){
        if(confirm('确认付款?')){
         saveStates(flag,checkValues);
        }
       }else{
        saveStates(flag,checkValues);
       }     
      }
     } 
     //审批数据提交
     function saveStates(flag,checkValues){
      $.ajax({
         type: 'get',
         url: "<c:url value='/j8_distributorSettle/changeStates/'/>"+flag+"/"+checkValues,
         dataType: 'html',
         success: function(data){        
          if(data > 0){
            showInfo("操作成功");       
         query();      
          }else{
            showError("操作失败"); 
         return false;
          }
         }
      });
     }

    function changeStates(states) {
      var checkValues = getCoulmnValue(oTable,'key');
      if(isEmpty(checkValues)){
       showInfo("请选择数据");
       return false;
      } else {
       $.ajax({
          type: 'get',
          url: "<c:url value='/j8_clientSummary/changeStates/'/>"+states+"/"+checkValues,
          dataType: 'html',
          success: function(data){        
           if(data > 0){
             showInfo("操作成功");       
          query();      
           }else{
             showError("操作失败"); 
          return false;
           }
          }
        });  
      }
     }

    posted @ 2011-12-15 15:54 哈希 阅读(168) | 评论 (0)编辑 收藏

    function flushleft(){//给表格的第一行加CLASS=flush_left其下所有都局左对齐
          $('.flush_left').parent().find('th').each(function(i){
             
    if($(this).attr('class')=='flush_left'){
             $(
    this).parents().parent().find('tr').each(function(){
                $(
    this).find('td').eq(i).css('text-align','left')
             }
    )
             }
    ;
          }
    );
       }

       
    function flushright(){//给表格的第一行加CLASS=flush_left其下所有都局右对齐
          $('.flush_right').parent().find('th').each(function(i){
             
    if($(this).attr('class')=='flush_right'){
             $(
    this).parent().parent().find('tr').each(function(){
                $(
    this).find('td').eq(i).css('text-align','right')
             }
    )
             }
    ;
          }
    );
       }

       
    function flushcenter(){//给表格的第一行加CLASS=flush_left其下所有都局中对齐
          $('.flush_center').parent().find('th').each(function(i){
             
    if($(this).attr('class')=='flush_center'){
             $(
    this).parent().parent().find('tr').each(function(){
                $(
    this).find('td').eq(i).css('text-align','center')
             }
    )
             }
    ;
          }
    );
       }

    posted @ 2011-12-15 10:49 哈希 阅读(401) | 评论 (0)编辑 收藏

     <td class="tablealignleft" >
                                                
    <select id="status" name="status">
                                                        
    <option value="">全部</option>
                                                        
    <c:forEach var="sta" items="${statusList}">
                                                            
    <option value="<c:out value="${sta.id}"></c:out>"><c:out value="${sta.name}"></c:out></option>                                                        
                                                        
    </c:forEach>
                                                                            
                                                
    </select>
                                            
    </td>    
    jQuery获取Select选择的Text和Value:
    1. $("#select_id").change(function(){//code});    //为Select添加事件,当选择其中一项时触发
    2var checkText=$("#select_id").find("option:selected").text();   //获取Select选择的Text
    3var checkValue=$("#select_id").val();   //获取Select选择的Value
    4var checkIndex=$("#select_id ").get(0).selectedIndex;   //获取Select选择的索引值
    5var maxIndex=$("#select_id option:last").attr("index");   //获取Select最大的索引值
    jQuery添加/删除Select的Option项:
    1. $("#select_id").append("<option value='Value'>Text</option>");   //为Select追加一个Option(下拉项)
    2. $("#select_id").prepend("<option value='0'>请选择</option>");   //为Select插入一个Option(第一个位置)
    3. $("#select_id option:last").remove();   //删除Select中索引值最大Option(最后一个)
    4. $("#select_id option[index='0']").remove();   //删除Select中索引值为0的Option(第一个)
    5. $("#select_id option[value='3']").remove();   //删除Select中Value='3'的Option
    5. $("#select_id option[text='4']").remove();   //删除Select中Text='4'的Option
    内容清空:
    $(
    "#charCity").empty();

    $(function(){$("#status").change(function(){
           var sdelectValue=$("#status").val();
           alert(sdelectValue);
           getCustomerInfo(sdelectValue)
       });
      });
     
     
       function getCustomerInfo(id){
           alert(id);
            $.ajax({
              type: 'get',
              //url: "<c:url value='/k4_oldGoldStorsge/getCustomer/'/>"+id,
              url: "<c:url value='/k4_oldGoldStorsge/getCustomerInfo/'/>"+id,
              dataType: 'json',
              success: function(data) {
                 alert(data.receivername);
                 $("#receiveName").val(data.receivername);   //name
                 $("#description").val(data.description);        //code
                 $("#receiverId").val(data.account);     //account
                 $("#receiverPhone").val(data.receiverTelephone);  //telephone
                 //$("#").val(data.);                       
             }
            });
     }

    posted @ 2011-12-15 09:43 哈希 阅读(389) | 评论 (0)编辑 收藏

     

     function getCustomer(url, param, width, height){
      
    var rs = window.showModalDialog(url,param,"dialogWidth=" + width + "px;dialogHeight=" + height + "px");
      
    var aValues=rs.split(",");
      $(
    "#supplier").val(aValues[0]);
      getCustomerInfo($(
    "#supplier").val());
     $(
    "#suppliername").val(aValues[1]);
     }


     
     
        
    function getCustomerInfo(id){
            alert(id);
           $.ajax(
    {
              type: 'get',
             url: 
    "<c:url value='/k4_oldGoldStorsge/getCustomer/'/>"+id,
             dataType: 'json',
             success: 
    function(data) {
                 alert(data.name);
                 $(
    "#receiveName").val(data.legalperson);   //name
                 $("#receiverId").val(data.account);        //code
                 $("#receiverBank").val(data.baseBank);     //account
                 $("#receiverPhone").val(data.taxpayerTel);  //telephone
                 $("#").val(data.);                        
             }

           }
    );
     }

     

     

    posted @ 2011-12-15 09:37 哈希 阅读(162) | 评论 (0)编辑 收藏

    jquery代码(jquery 读取table tr td值完成修改功能

    var $td
    =$(td).parents('tr').children('td');
     $(
    "#seshu").val($td.eq(0).find('input').val());
     $(
    "#jshuchudan").val($td.eq(1).find('input').val());
     $(
    "#jshuchuqi").val($td.eq(2).find('input').val());
     $(
    "#jchuantongddan").val($td.eq(3).find('input').val());
     $(
    "#jchuantongdqi").val($td.eq(4).find('input').val());
     $(
    "#schuantongddan").val($td.eq(5).find('input').val());
     $(
    "#schuantongdqi").val($td.eq(6).find('input').val());
     $(
    "#zhizuodan").val($td.eq(7).find('input').val());
     $(
    "#zhizuoqi").val($td.eq(8).find('input').val());
     $(
    "#ganbandan").val($td.eq(9).find('input').val());
     $(
    "#ganbanqi").val($td.eq(10).find('input').val());
     $(
    "#pinbandan").val($td.eq(11).find('input').val());
     $(
    "#pinbanqi").val($td.eq(12).find('input').val());
     $(
    "#jjid").val($td.eq(13).find('input').val());
     
     $(
    "#updateform").submit();

     用Jquery获取table中td的值:

              首先建立一个如下一个两行三列的table

               <table id="tb" style="text-align: center;" width="100%" border="1PX">
                    <tr> <td>A1  </td><td> A2 </td> <td>A3</td> </tr>
                    <tr><td>B1</td> <td>  B2</td><td>B3</td> </tr>
               </table>

            Jquery 代码部分

                  <SCRIPT type=text/javascript src="Jquery/jquery-1.4.2.js">//引入Jquery 插件不能少哦</SCRIPT>

                  <SCRIPT language="javascript" type="text/javascript" >

                    $(function(){
                        //使用jquery 取得table 中td里面的值
                           $("#tb td").click(function(){
                                          alert($(this).text());

                             })
               
                    });</SCRIPT >

     用Javascript 获取table中td的值:

          直接就写JS拉,借用上面table

          <script language="javascript" type="text/javascript">
            function GetTdValue()
            {
                //Javascript 取得table 中TD的值
                var VAL=document.getElementById("tb").rows[1].cells[1];
                alert(VAL.innerHTML)
            }
        </script>





    因为这个tr需要动态增加和删除,并且获得td中的值

    <script src="js/jquery-1.3.2.js" type="text/javascript"> </script>
    <script type="text/javascript">
    function addit(){
       
    var n = $("#paramTable tr:last td").eq(1).html();
       
    if(isNaN(n)) n = 1;
       
    else n++;
        $(
    "#paramTable").append("<tr><td>name</td><td>" + n + "</td><td onclick='delit(this);'>删除</td></tr>")
    }
    function delit(obj){ $(obj).parent().remove();} </script>
    <input type="button" onclick="addit()" value="添加">
    <table border=1 id="paramTable">
    <tr>
    <td width=100>
    参数名称
    </td>
    <td width=100>
    对应列号
    </td>
    <td width=60>
    是否删除
    </td>
    </tr>
    <tr>
    <td>name</td>
    <td>1</td>
    <td onclick="delit(this);">删除</td>
    </tr>
    </table>






     function getMerchandiseTable(){
                var arrMerchandise = [];
                $("#tbOrderMerchandise tr").each(function(){
                     var $MerchandiseIdTd = $("td:eq(0)",$(this) );//商品ID
                     
                     var $quantityTd = $("td:eq(3)",$(this) );//数量
                     var $priceTd=$("td:eq(6)",$(this) );//小计
                     var $DescriptionTd = $("td:eq(7)",$(this) );//备注
                    
                    if($MerchandiseIdTd.text()!="")
                    {
                        arrMerchandise.push($MerchandiseIdTd.text()+"|"+$quantityTd.text()+"|"+$priceTd.text()+"|"+$DescriptionTd.text());
                    }
                });
                $("#hidDetailList").val(arrMerchandise.join(","));
            }



    private List<hanvnet.Dto.Page.Table.DeliveryFeePage> GetDeliveryFeeList(string strChargerId)
        {
            string strFeeInput = hdFeeList.Value;

            List<hanvnet.Dto.Page.Table.DeliveryFeePage> lstFee
                = new List<hanvnet.Dto.Page.Table.DeliveryFeePage>();
            hanvnet.Dto.Page.Table.DeliveryFeePage deliveryFeePage = null;

            string[] strFeeList = strFeeInput.Split(Char.Parse(","));
            for (int i = 0; i < strFeeList.Length; i++)
            {
                deliveryFeePage = new hanvnet.Dto.Page.Table.DeliveryFeePage();
                string[] strFeeDetailList = strFeeList[i].Split(Char.Parse("|"));
                deliveryFeePage.DeliveryId = _deliveryId;
                deliveryFeePage.FeeId = int.Parse(strFeeDetailList[0]);
                deliveryFeePage.ReceiveId = strChargerId;
                deliveryFeePage.PlanAmount = decimal.Parse(strFeeDetailList[1]);
                deliveryFeePage.Description = strFeeDetailList[2];
                deliveryFeePage.DataStatus = 1;
                deliveryFeePage.InsDateTime = DateTime.Now;
                deliveryFeePage.InsUserId =       this.Session[hanvnet.Common.Utils.Constraints.C_SESSION_LOGINID].ToString();
              lstFee.Add(deliveryFeePage);
            }
            return lstFee;
        }
    function UnOffOrderAmount(){
            //alert("不优惠");
              var UnoffOrderAmounts=0;
              $("#tbOrderMerchandise tr").each(function(){
                     var $priceTd=$("td:eq(6)",$(this) );//优惠金额
                   
                    UnoffOrderAmounts+=$priceTd.text()*1;
                   
                });
                return UnoffOrderAmounts;
            }

    <td class="tablealigncenter" nowrap>
            <input type="text" name="countId" id="countId" onblur="getAgentAccountMoney(this)"></>
        </td>

     //alert($($($AgentMoney)).find("input").get(0).value);


     function getBillsTable(){
                    var arrbills = [];
                    $("#mainTableBody tr").each(function(){
                    var $productId=$("td:eq(1)",$(this) ); 
                    var $baseGoldPrice=$("td:eq(5)",$(this));
                    var $baseGoldAcountPrice=$("td:eq(6)",$(this));
                    var $AgentMoney=$("td:eq(7)",$(this));
                     //alert($($($AgentMoney)).find("input").get(0).value);
                    var $AgentAccountMoney=$("td:eq(8)",$(this));
                    // alert($($AgentAccountMoney).find("input").get(0).value);
                     if($productId!=null){
                      arrbills.push($productId.text()+"/"+$baseGoldPrice.text()+"/"+$baseGoldAcountPrice.text()+"/"+$($AgentMoney).find("input").get(0).value+"/"+$($AgentAccountMoney).find("input").get(0).value);
                      }
                    });
                    $("#hidTableValue").val(arrbills.join(","));
                    $("#createfrom").attr("action","<c:url value='/k4_oldGoldStorsge/saveFactoryBills'/>");
                    $("#createfrom").submit();
              }

    posted @ 2011-12-15 09:23 哈希 阅读(7822) | 评论 (1)编辑 收藏

     

    1. 班级  科目   分数  
    2. 1     语文   8800  
    3. 1     数学   8420  
    4. 1     英语   7812  
    5. ……  
    6. 2     语文   8715  
    7. 2     数学   8511  
    8. 2     英语   8512  
    9. ……  
    10.    
    11.    
    12. 要求转换成下面这样的结果  
    13. 班级    语文    数学    英语  
    14. 1       8800    8420    7812  
    15. 2       8715    8511    8512  

     

     

    这是一个非常经典的 4属性的表设计模式,顾名思义,这样的表一般有四列,分别是:entity_id, attribute_name, attribute_type, attribute_value ,这样的设计使我们添加字段非常容易,如:我们想添加一个物理成绩是非常简单的,我们只要向表中插入一条记录即可。但是,这样的设计有一个非常严重的问题,那就是:查询难度增加,查询效率非常差。

    要想实现上面的查询有一个原则,那就是:通过case语句创造虚拟字段,使结果集成为二维数组,然后应用聚合函数返回单一记录。怎么样?不理解,仔细看看下面的图和分析下面的语句你就理解了。

     

    1. create table score  
    2. (  
    3.     banji integer,  
    4.     kemu varchar(10),   
    5.     fengshu integer  
    6. )  
    7. go  
    8.    
    9. insert into score values  
    10. (1, '语文', 8800),  
    11. (1, '数学', 8420),  
    12. (1, '英语', 7812),  
    13. (2, '语文', 8715),  
    14. (2, '数学', 8511),  
    15. (2, '英语', 8512)  
    16. go  
    17.    
    18. select banji,  
    19.        max(yuwen)        语文,  
    20.        max(shuxue)       数学,  
    21.        max(yingyu)       英语  
    22. from    
    23.      (select  banji,  
    24.               case kemu  
    25.                when '语文' then fengshu  
    26.                else 0  
    27.              end                         yuwen,  
    28.              case kemu  
    29.                when '数学' then fengshu  
    30.                else 0  
    31.              end                         shuxue,  
    32.              case kemu  
    33.                when '英语' then fengshu  
    34.                else 0  
    35.              end                         yingyu  
    36.       from score  
    37.       ) as inner  
    38. group by inner.banji  
    39. order by 1  
    40. go  

     

     

    你可能正在感叹,这样的解决方案是多么的巧妙,可惜不是我想出来的,在这里,我也不敢把大师的思想据为己有,以上思想来自<SQL语言艺术>的第11章,想了解更全面的信息,大家可以参考。

     

     

    posted @ 2011-12-07 10:36 哈希 阅读(311) | 评论 (0)编辑 收藏

    好久没用List去保存一个JDBC查询结果,查询出来的ResultSet只执行了一次,然后就报NullPointException。明明数据库中有数据,就是执行不了第二次,一到把对象添加到list上面就直接报异常,郁闷了半天。
    Java代码 复制代码 收藏代码
    1. public List<Terminal> getTerm(String user){   
    2.             List<Terminal> termlist= null;//这里出现问题,没有new一个List   
    3.             //改为List<Terminal> termlist= new ArrayList();,   
    4.               //new一个ArrayList就没事了,日,以前初学的时候也得过这种问题...汗   
    5.                         try {   
    6.                 con = DBPool.getPool().getConnection();   
    7.                 ps =con.prepareStatement("select * from gps_termcodetable where kh_user=?");   
    8.                 ps.setString(1, user);   
    9.                 rs = ps.executeQuery();   
    10.                 while(rs.next()){   
    11.                     Terminal term = new Terminal();   
    12.                     String number = rs.getString("hm_number");   
    13.                     String nick = rs.getString("mc_nick");   
    14.                     term.setZhNumber(number);   
    15.                     term.setLisence(rs.getString("mc_nick"));   
    16.                     termlist.add(term);   
    17.                 }   
    18.                 rs.close();   
    19.                 ps.close();   
    20.                 con.close();   
    21.             } catch (SQLException ex) {   
    22.                 Logger.getLogger(GetTerminal.class.getName()).log(Level.SEVERE, null, ex);   
    23.             }   
    24.          return termlist;   
    25.     }  

    后面才发现没有new一个ArrayList,郁闷了,还犯这种错误,久了没用也会生疏

    posted @ 2011-12-05 22:14 哈希 阅读(1222) | 评论 (0)编辑 收藏

    1、 开始->设置->控制面板->管理工具->服务
    停止所有Oracle服务。

    2、 开始->程序->Oracle - OraHome81->Oracle Installation Products->Universal Installer
    卸装所有Oracle产品,但Universal Installer本身不能被删除

    5、 运行regedit,选择HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE,按del键删除这个入口。

    6、 运行regedit,选择HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services,滚动
    这个列表,删除所有Oracle入口。

    7、 运行refedit,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application,
    删除所有Oracle入口。

    8、 开始->设置->控制面板->系统->高级->环境变量
    删除环境变量CLASSPATH和PATH中有关Oracle的设定

    9、 从桌面上、STARTUP(启动)组、程序菜单中,删除所有有关Oracle的组和图标

    10、 删除\Program Files\Oracle目录

    11、 重新启动计算机,重起后才能完全删除Oracle所在目录

    12、 删除与Oracle有关的文件,选择Oracle所在的缺省目录C:\Oracle,删除这个入口目录及所有子目录,并从Windows 2000目录(一般为C:\WINNT)下删除以下文件ORACLE.INI、oradim73.INI、oradim80.INI、oraodbc.ini等等。

    13、 WIN.INI文件中若有[ORACLE]的标记段,删除该段

    14、 如有必要,删除所有Oracle相关的ODBC的DSN

    posted @ 2011-11-30 15:30 哈希 阅读(135) | 评论 (0)编辑 收藏

    1、 开始->设置->控制面板->管理工具->服务
    停止所有Oracle服务。

    2、 开始->程序->Oracle - OraHome81->Oracle Installation Products->Universal Installer
    卸装所有Oracle产品,但Universal Installer本身不能被删除

    5、 运行regedit,选择HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE,按del键删除这个入口。

    6、 运行regedit,选择HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services,滚动
    这个列表,删除所有Oracle入口。

    7、 运行refedit,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application,
    删除所有Oracle入口。

    8、 开始->设置->控制面板->系统->高级->环境变量
    删除环境变量CLASSPATH和PATH中有关Oracle的设定

    9、 从桌面上、STARTUP(启动)组、程序菜单中,删除所有有关Oracle的组和图标

    10、 删除\Program Files\Oracle目录

    11、 重新启动计算机,重起后才能完全删除Oracle所在目录

    12、 删除与Oracle有关的文件,选择Oracle所在的缺省目录C:\Oracle,删除这个入口目录及所有子目录,并从Windows 2000目录(一般为C:\WINNT)下删除以下文件ORACLE.INI、oradim73.INI、oradim80.INI、oraodbc.ini等等。

    13、 WIN.INI文件中若有[ORACLE]的标记段,删除该段

    14、 如有必要,删除所有Oracle相关的ODBC的DSN

    posted @ 2011-11-30 15:30 哈希 阅读(158) | 评论 (0)编辑 收藏

    方法一:
    var re=/正则表达式/;
    re.test($("txtid").val())

    方法二:
    $("txtid").val.match(/正则表达式/);

    验证数字的正则表达式集(转载)
    验证数字:^[0-9]*$
    验证n位的数字:^\d{n}$
    验证至少n位数字:^\d{n,}$
    验证m-n位的数字:^\d{m,n}$
    验证零和非零开头的数字:^(0|[1-9][0-9]*)$
    验证有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
    验证有1-3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
    验证非零的正整数:^\+?[1-9][0-9]*$
    验证非零的负整数:^\-[1-9][0-9]*$
    验证非负整数(正整数 + 0) ^\d+$
    验证非正整数(负整数 + 0) ^((-\d+)|(0+))$
    验证长度为3的字符:^.{3}$
    验证由26个英文字母组成的字符串:^[A-Za-z]+$
    验证由26个大写英文字母组成的字符串:^[A-Z]+$
    验证由26个小写英文字母组成的字符串:^[a-z]+$
    验证由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
    验证由数字、26个英文字母或者下划线组成的字符串:^\w+$
    验证用户密码:^[a-zA-Z]\w{5,17}$ 正确格式为:以字母开头,长度在6-18之间,只能包含字符、数字和下划线。
    验证是否含有 ^%&',;=?$\" 等字符:[^%&',;=?$\x22]+
    验证汉字:^[\u4e00-\u9fa5],{0,}$
    验证Email地址:^\w+[-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
    验证InternetURL:^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ ;^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$
    验证电话号码:^(\(\d{3,4}\)|\d{3,4}-)?\d{7,8}$:--正确格式为:XXXX-XXXXXXX,XXXX-XXXXXXXX,XXX-XXXXXXX,XXX-XXXXXXXX,XXXXXXX,XXXXXXXX。
    验证身份证号(15位或18位数字):^\d{15}|\d{}18$
    验证一年的12个月:^(0?[1-9]|1[0-2])$ 正确格式为:“01”-“09”和“1”“12”
    验证一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$ 正确格式为:01、09和1、31。
    整数:^-?\d+$
    非负浮点数(正浮点数 + 0):^\d+(\.\d+)?$
    正浮点数 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
    非正浮点数(负浮点数 + 0) ^((-\d+(\.\d+)?)|(0+(\.0+)?))$
    负浮点数 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
    浮点数 ^(-?\d+)(\.\d+)?

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
     
    <HEAD>
      
    <TITLE> New Document </TITLE>
      
    <META NAME="Generator" CONTENT="EditPlus">
      
    <META NAME="Author" CONTENT="">
      
    <META NAME="Keywords" CONTENT="">
      
    <META NAME="Description" CONTENT="">
     
    </HEAD>
     
    <script language=JavaScript>
      
    function warn(){
         
    var num=document.getElementById("num").value;
         
         
    var pattern=/^[0-9]{1,20}$/;
        
    if(num.match(pattern)==null || num==""){
          alert(
    "请输入正整数!");
          
    return false;
        }

       }

       
    </script>
     
    <BODY>
      
    <form  onsubmit="return warn()" action="Noname1.html" method="post">
          
          
    <input type="text" id="num"/>
          
          
    <input type ="submit" value="submit" />
          
    <input type="button" value="nihao" onclick="warn()">
          
    <input type="button" id="weituo2" value="返回"  onclick="warn()">
      
    </form>
     
    </BODY>
    </HTML>



    posted @ 2011-11-30 11:46 哈希 阅读(155) | 评论 (0)编辑 收藏

    http://code.google.com/p/j2eewiki/wiki/Struts2Hello

    posted @ 2011-11-28 15:09 哈希 阅读(186) | 评论 (0)编辑 收藏

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>无标题文档</title>
    </head>

    <body>
     <script language="javascript">
      function showBaby()
      {
       var path=window.showModalDialog("花园baby.html","","dialogWidth:400px;dialogHeight:400px");
       
       document.getElementById("img").innerHTML="<img src='"+path+"' width='300' height='300'>";
       
       
      }
     </script>
     <a href="javaScript:showBaby()">我喜欢...</a>
     
     <p id="img">
     </p>
     
    </body>
    </html>



    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>无标题文档</title>
    </head>

    <body>
    <form id="babyFrm" name="babyFrm" method="post" action="">
      <table width="471" height="405" border="1" align="center" cellpadding="0" cellspacing="0">
        <tr>
          <td>
        <img src="imgs/[叮叮车].jpg" width="150" height="150" /><br />
           <input name="gb" type="radio" value="imgs/[叮叮车].jpg" checked="checked"/>
           叮叮车      </td>
          <td><img src="imgs/[唔西·迪西].jpg" width="150" height="150" /><br />
            <input type="radio" value="imgs/[唔西·迪西].jpg" name="gb"/>
          唔西·迪西</td>
          <td>&nbsp;</td>
        </tr>
        <tr>
          <td><img src="imgs/[汤姆布利柏].jpg" width="150" height="150" /><br />
            <input type="radio" value="imgs/[汤姆布利柏].jpg" name="gb"/>
          汤姆布利柏          <br /></td>
          <td>&nbsp;</td>
          <td>&nbsp;</td>
        </tr>
        <tr>
          <td colspan="2" align="center"><input name="btnOk" type="button" id="btnOk" value="我选好了" onclick="selectOk()"/></td>
          <td>&nbsp;</td>
        </tr>
      </table>
    </form>
    <script language="javascript">
     function selectOk(){
      //得到所有的单选按钮,返回被选中的按钮的value
      var gbs=document.getElementsByName("gb");
      var value;
      for(var i=0;i<gbs.length;i++){
       if(gbs[i].type=="radio" && gbs[i].checked){
        value=gbs[i].value;
        break;
       }
      }
      window.returnValue=value;
      window.close();
     }
    </script>

     </body>
    </html>

    posted @ 2011-11-27 22:00 哈希 阅读(186) | 评论 (0)编辑 收藏

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>无标题文档</title>
    <script language="javascript">
     function searchFriend(){
      //得到所有的复选框
      var s=document.getElementById("allFriend");
      var ack=document.getElementsByName("chkFriend");
      for(var i=0;i<ack.length;i++){
       if(ack[i].type=="checkbox"){
        ack[i].checked=s.checked;
       }
      }
     }
     
     function rsearchFriend(){
      var ack=document.getElementsByName("chkFriend");
      for(var i=0;i<ack.length;i++){
       if(ack[i].type=="checkbox"){
        ack[i].checked=!ack[i].checked;
       }
      }
     }
     
     
     
     
    </script>
    </head>

    <body>
    <form name="chkFriend" method="post" action="">
      <p>你想交一个什么样的朋友呢,请选择:</p>
      <p>
       <!-- 所有的复选框名字需要调整一致 -->
        <input type="checkbox" name="chkFriend" value="温柔"> 温柔
        <input type="checkbox" name="chkFriend" value="年轻"> 年轻
        <input type="checkbox" name="chkFriend" value="漂亮"> 漂亮
        <input type="checkbox" name="chkFriend" value="爱洗衣服">爱洗衣服
        <input type="checkbox" name="chkFriend" value="爱做饭">爱做饭
    </p>
      <p>
      <input type="checkbox" onClick="searchFriend()" id="allFriend" name="allFriend" value="以上全选">以上全选
    </p>
    <input type="checkbox" onClick="rsearchFriend()" id="rallFriend" name="rallFriend" value="反选">反选
    </p>
    <p>
    <input type="button" name="Submit" value="寻找目标">
    </p>
    </form>

    </body>
    </html>

    posted @ 2011-11-27 21:54 哈希 阅读(165) | 评论 (0)编辑 收藏

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>无标题文档</title>
    <script language="javascript">
        function show()
    {
            var value
    =window.showModalDialog("b.html","","dialogWidth:200px;dialogHeight:200px;");
            document.write(
    "<h1>"+value+"</h1>");
        }

    </script>
    </head>

    <body onload="show()">
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>无标题文档</title>
    <script language="javascript">
        
    function pass(author){
            window.returnValue
    =author;
            window.close();
    //关掉
        }
    </script>
    </head>

    <body>
        
    <a href="javaScript:pass('大仲马')">大仲马</a><br/>
        
    <a href="javaScript:pass('小仲马')">小仲马</a><br/>
    </body>
    </html>
       
    </body>
    </html>

    posted @ 2011-11-27 21:34 哈希 阅读(173) | 评论 (0)编辑 收藏

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>无标题文档</title>
    <style type="text/css">
     select{
      font-size:30px;
     }
    </style>
    </head>

    <body onload="bornCity('p000')">
     <script language="javascript">
      var pcs=new Array();
      pcs[0]=new Array("p000","==请选择省==","0");
      pcs[1]=new Array("p001","==陕西==","0");
      pcs[2]=new Array("p002","==广东==","0");
      pcs[3]=new Array("p003","==山西==","0");
      pcs[4]=new Array("c001","==西安==","p001");
      pcs[5]=new Array("c002","==渭南==","p001");
      pcs[6]=new Array("c003","==深圳==","p002");
      pcs[7]=new Array("c005","==佛山==","p002");
      pcs[8]=new Array("c006","==东莞==","p002");
      pcs[9]=new Array("c007","==大同==","p003");
      pcs[10]=new Array("c008","==请选择市==","p000");
      
      
      
      function bornCity(value){
       var city=document.getElementById("city");
       //清空
       city.options.length=0;
       
       for(var i=0;i<pcs.length;i++){
        if(pcs[i][2]==value){
         city.options.add(new Option(pcs[i][1],pcs[i][0]));
        }
       }
       
       
       
      }
      
      
      
      
     </script>
     <form name="pcfrm">
      省:
      <select name="province" onchange="bornCity(this.value);">
       <script language="javascript">
        for(var i=0;i<pcs.length;i++){
        
         if(pcs[i][2]=="0")
         {
          document.write("<option value='"+pcs[i][0]+"'>"+pcs[i][1]+"</option>");
         } 
        }
       </script>
      </select>
      市:
      
      <select name="city" id="city">
       
      </select>
     </form>
    </body>
    </html>

    posted @ 2011-11-27 21:29 哈希 阅读(168) | 评论 (0)编辑 收藏


    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>无标题文档</title>
    </head>

    <body>
     <!--放置广告层-->
     <div id="adv" style="position:absolute; left:60px; top:220px; width:100px; height:75px; z-index:2">
      <a href="http://www.xinzhanedu.com">
       <img src="imgs/ad.jpg"/>
      </a>
      
      <div id="close" style="position:absolute; left:79px; top:61px; width:21px; height:14px;">
       <img src="imgs/close.png" style="cursor:pointer;" onClick="closeAdv()"/>
      </div>
      
     </div>
     <script language="javascript">
      var x=0,y=0,ypos=220,xpos=60,step=6,speed=10;
      var adv=document.getElementById("adv");
      function gogogo(){
       adv.style.left=xpos+document.body.scrollLeft;
       adv.style.top=ypos+document.body.scrollTop;
       if(x==0){
        //从左到右
        xpos+=step;
       }else
       {
        xpos-=step;
       }
       
       
       if(xpos>=document.body.clientWidth-100){
        //改变方向
        xpos=document.body.clientWidth-100;
        x=1;
       }
       if(xpos<0){
        xpos=0;
        x=0;
       }
       //纵向
       
       if(y==0){
        //从左到右
        ypos+=step;
       }else
       {
        ypos-=step;
       }
       
       
       if(ypos>=document.body.clientHeight-75){
        //改变方向
        ypos=document.body.clientHeight-75;
        y=1;
       }
       if(ypos<0){
        ypos=0;
        y=0;
       }
       
       
      }
      setInterval("gogogo()",speed);
     </script>

     
     


     <table width="2000" height="1000">
      <tr>
       <td>
        <img src="imgs/bg.jpg" width="1400" height="3417"/>
       </td>
      </tr>
     </table>
    </body>
    </html>

    posted @ 2011-11-27 21:28 哈希 阅读(168) | 评论 (0)编辑 收藏

    b<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>无标题文档</title>
    </head>

    <body>
     <div id="yellow" style="position:absolute; left:0px; top:0px; width:200px; height:200px; background-color:#CCFF33; z-index:20">
      这是一个黄层
     </div>
     <div id="blue" style=" overflow:hidden;position:absolute; left:100px; top:100px; width:200px; height:200px; background-color:#3399FF; z-index:1">
      这是一个蓝层
      <div id="black" style="position:absolute; left:100px; top:100px; width:136px; height:136px; background-color:#000000;">
      </div>
     </div>
    </body>
    </html>

    posted @ 2011-11-27 21:24 哈希 阅读(694) | 评论 (0)编辑 收藏

         摘要: web.xmlCode highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://java.sun.c...  阅读全文

    posted @ 2011-06-11 15:35 哈希 阅读(194) | 评论 (0)编辑 收藏

    Student(S#,Sname,Sage,Ssex) 学生表
    Course(C#,Cname,T#) 课程表
    SC(S#,C#,score) 成绩表
    Teacher(T#,Tname) 教师表

    问题:
    1、查询“001”课程比“002”课程成绩高的所有学生的学号;
      select a.S# from (select s#,score from SC where C#='001') a,(select s#,score
      from SC where C#='002') b
      where a.score>b.score and a.s#=b.s#;
    2、查询平均成绩大于60分的同学的学号和平均成绩;
        select S#,avg(score)
        from sc
        group by S# having avg(score) >60;
    3、查询所有同学的学号、姓名、选课数、总成绩;
      select Student.S#,Student.Sname,count(SC.C#),sum(score)
      from Student left Outer join SC on Student.S#=SC.S#
      group by Student.S#,Sname
    4、查询姓“李”的老师的个数;
      select count(distinct(Tname))
      from Teacher
      where Tname like '李%';
    5、查询没学过“叶平”老师课的同学的学号、姓名;
        select Student.S#,Student.Sname
        from Student  
        where S# not in (select distinct( SC.S#) from SC,Course,Teacher where  SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平');
    6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
      select Student.S#,Student.Sname from Student,SC where Student.S#=SC.S# and SC.C#='001'and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#='002');
    7、查询学过“叶平”老师所教的所有课的同学的学号、姓名;
      select S#,Sname
      from Student
      where S# in (select S# from SC ,Course ,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平' group by S# having count(SC.C#)=
         (select count(C#) from Course,Teacher  where Teacher.T#=Course.T# and Tname='叶平'));
    8、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;
      Select S#,Sname from (select Student.S#,Student.Sname,score ,(select score from SC SC_2 where SC_2.S#=Student.S# and SC_2.C#='002') score2
      from Student,SC where Student.S#=SC.S# and C#='001') S_2 where score2 <score;
    9、查询所有课程成绩小于60分的同学的学号、姓名;
      select S#,Sname
      from Student
      where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60);
    10、查询没有学全所有课的同学的学号、姓名;
        select Student.S#,Student.Sname
        from Student,SC
        where Student.S#=SC.S# group by  Student.S#,Student.Sname having count(C#) <(select count(C#) from Course);
    11、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;
        select S#,Sname from Student,SC where Student.S#=SC.S# and C# in select C# from SC where S#='1001';
    12、查询至少学过学号为“001”同学所有一门课的其他同学学号和姓名;
        select distinct SC.S#,Sname
        from Student,SC
        where Student.S#=SC.S# and C# in (select C# from SC where S#='001');
    13、把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩;
        update SC set score=(select avg(SC_2.score)
        from SC SC_2
        where SC_2.C#=SC.C# ) from Course,Teacher where Course.C#=SC.C# and Course.T#=Teacher.T# and Teacher.Tname='叶平');
    14、查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名;
        select S# from SC where C# in (select C# from SC where S#='1002')
        group by S# having count(*)=(select count(*) from SC where S#='1002');
    15、删除学习“叶平”老师课的SC表记录;
        Delect SC
        from course ,Teacher  
        where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='叶平';
    16、向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“003”课程的同学学号、2、
        号课的平均成绩;
        Insert SC select S#,'002',(Select avg(score)
        from SC where C#='002') from Student where S# not in (Select S# from SC where C#='002');
    17、按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显示: 学生ID,,数据库,企业管理,英语,有效课程数,有效平均分
        SELECT S# as 学生ID
            ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='004') AS 数据库
            ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='001') AS 企业管理
            ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='006') AS 英语
            ,COUNT(*) AS 有效课程数, AVG(t.score) AS 平均成绩
        FROM SC AS t
        GROUP BY S#
        ORDER BY avg(t.score)  
    18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分
        SELECT L.C# As 课程ID,L.score AS 最高分,R.score AS 最低分
        FROM SC L ,SC AS R
        WHERE L.C# = R.C# and
            L.score = (SELECT MAX(IL.score)
                          FROM SC AS IL,Student AS IM
                          WHERE L.C# = IL.C# and IM.S#=IL.S#
                          GROUP BY IL.C#)
            AND
            R.Score = (SELECT MIN(IR.score)
                          FROM SC AS IR
                          WHERE R.C# = IR.C#
                      GROUP BY IR.C#
                        );
    19、按各科平均成绩从低到高和及格率的百分数从高到低顺序
        SELECT t.C# AS 课程号,max(course.Cname)AS 课程名,isnull(AVG(score),0) AS 平均成绩
            ,100 * SUM(CASE WHEN  isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) AS 及格百分数
        FROM SC T,Course
        where t.C#=course.C#
        GROUP BY t.C#
        ORDER BY 100 * SUM(CASE WHEN  isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) DESC
    20、查询如下课程平均成绩和及格率的百分数(用"1行"显示): 企业管理(001),马克思(002),OO&UML (003),数据库(004)
        SELECT SUM(CASE WHEN C# ='001' THEN score ELSE 0 END)/SUM(CASE C# WHEN '001' THEN 1 ELSE 0 END) AS 企业管理平均分
            ,100 * SUM(CASE WHEN C# = '001' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '001' THEN 1 ELSE 0 END) AS 企业管理及格百分数
            ,SUM(CASE WHEN C# = '002' THEN score ELSE 0 END)/SUM(CASE C# WHEN '002' THEN 1 ELSE 0 END) AS 马克思平均分
            ,100 * SUM(CASE WHEN C# = '002' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '002' THEN 1 ELSE 0 END) AS 马克思及格百分数
            ,SUM(CASE WHEN C# = '003' THEN score ELSE 0 END)/SUM(CASE C# WHEN '003' THEN 1 ELSE 0 END) AS UML平均分
            ,100 * SUM(CASE WHEN C# = '003' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '003' THEN 1 ELSE 0 END) AS UML及格百分数
            ,SUM(CASE WHEN C# = '004' THEN score ELSE 0 END)/SUM(CASE C# WHEN '004' THEN 1 ELSE 0 END) AS 数据库平均分
            ,100 * SUM(CASE WHEN C# = '004' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '004' THEN 1 ELSE 0 END) AS 数据库及格百分数
      FROM SC

    21、查询不同老师所教不同课程平均分从高到低显示
      SELECT max(Z.T#) AS 教师ID,MAX(Z.Tname) AS 教师姓名,C.C# AS 课程ID,MAX(C.Cname) AS 课程名称,AVG(Score) AS 平均成绩
        FROM SC AS T,Course AS C ,Teacher AS Z
        where T.C#=C.C# and C.T#=Z.T#
      GROUP BY C.C#
      ORDER BY AVG(Score) DESC
    22、查询如下课程成绩第 3 名到第 6 名的学生成绩单:企业管理(001),马克思(002),UML (003),数据库(004)
        [学生ID],[学生姓名],企业管理,马克思,UML,数据库,平均成绩
        SELECT  DISTINCT top 3
          SC.S# As 学生学号,
            Student.Sname AS 学生姓名 ,
          T1.score AS 企业管理,
          T2.score AS 马克思,
          T3.score AS UML,
          T4.score AS 数据库,
          ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) as 总分
          FROM Student,SC  LEFT JOIN SC AS T1
                          ON SC.S# = T1.S# AND T1.C# = '001'
                LEFT JOIN SC AS T2
                          ON SC.S# = T2.S# AND T2.C# = '002'
                LEFT JOIN SC AS T3
                          ON SC.S# = T3.S# AND T3.C# = '003'
                LEFT JOIN SC AS T4
                          ON SC.S# = T4.S# AND T4.C# = '004'
          WHERE student.S#=SC.S# and
          ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)
          NOT IN
          (SELECT
                DISTINCT
                TOP 15 WITH TIES
                ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)
          FROM sc
                LEFT JOIN sc AS T1
                          ON sc.S# = T1.S# AND T1.C# = 'k1'
                LEFT JOIN sc AS T2
                          ON sc.S# = T2.S# AND T2.C# = 'k2'
                LEFT JOIN sc AS T3
                          ON sc.S# = T3.S# AND T3.C# = 'k3'
                LEFT JOIN sc AS T4
                          ON sc.S# = T4.S# AND T4.C# = 'k4'
          ORDER BY ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) DESC);

    23、统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]
        SELECT SC.C# as 课程ID, Cname as 课程名称
            ,SUM(CASE WHEN score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS [100 - 85]
            ,SUM(CASE WHEN score BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS [85 - 70]
            ,SUM(CASE WHEN score BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS [70 - 60]
            ,SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS [60 -]
        FROM SC,Course
        where SC.C#=Course.C#
        GROUP BY SC.C#,Cname;

    24、查询学生平均成绩及其名次
          SELECT 1+(SELECT COUNT( distinct 平均成绩)
                  FROM (SELECT S#,AVG(score) AS 平均成绩
                          FROM SC
                      GROUP BY S#
                      ) AS T1
                WHERE 平均成绩 > T2.平均成绩) as 名次,
          S# as 学生学号,平均成绩
        FROM (SELECT S#,AVG(score) 平均成绩
                FROM SC
            GROUP BY S#
            ) AS T2
        ORDER BY 平均成绩 desc;
     
    25、查询各科成绩前三名的记录:(不考虑成绩并列情况)
          SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数
          FROM SC t1
          WHERE score IN (SELECT TOP 3 score
                  FROM SC
                  WHERE t1.C#= C#
                ORDER BY score DESC
                  )
          ORDER BY t1.C#;
    26、查询每门课程被选修的学生数
      select c#,count(S#) from sc group by C#;
    27、查询出只选修了一门课程的全部学生的学号和姓名
      select SC.S#,Student.Sname,count(C#) AS 选课数
      from SC ,Student
      where SC.S#=Student.S# group by SC.S# ,Student.Sname having count(C#)=1;
    28、查询男生、女生人数
        Select count(Ssex) as 男生人数 from Student group by Ssex having Ssex='男';
        Select count(Ssex) as 女生人数 from Student group by Ssex having Ssex='女';
    29、查询姓“张”的学生名单
        SELECT Sname FROM Student WHERE Sname like '张%';
    30、查询同名同性学生名单,并统计同名人数
      select Sname,count(*) from Student group by Sname having  count(*)>1;;
    31、1981年出生的学生名单(注:Student表中Sage列的类型是datetime)
        select Sname,  CONVERT(char (11),DATEPART(year,Sage)) as age
        from student
        where  CONVERT(char(11),DATEPART(year,Sage))='1981';
    32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列
        Select C#,Avg(score) from SC group by C# order by Avg(score),C# DESC ;
    33、查询平均成绩大于85的所有学生的学号、姓名和平均成绩
        select Sname,SC.S# ,avg(score)
        from Student,SC
        where Student.S#=SC.S# group by SC.S#,Sname having    avg(score)>85;
    34、查询课程名称为“数据库”,且分数低于60的学生姓名和分数
        Select Sname,isnull(score,0)
        from Student,SC,Course
        where SC.S#=Student.S# and SC.C#=Course.C# and  Course.Cname='数据库'and score <60;
    35、查询所有学生的选课情况;
        SELECT SC.S#,SC.C#,Sname,Cname
        FROM SC,Student,Course
        where SC.S#=Student.S# and SC.C#=Course.C# ;
    36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数;
        SELECT  distinct student.S#,student.Sname,SC.C#,SC.score
        FROM student,Sc
        WHERE SC.score>=70 AND SC.S#=student.S#;
    37、查询不及格的课程,并按课程号从大到小排列
        select c# from sc where scor e <60 order by C# ;
    38、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名;
        select SC.S#,Student.Sname from SC,Student where SC.S#=Student.S# and Score>80 and C#='003';
    39、求选了课程的学生人数
        select count(*) from sc;
    40、查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及其成绩
        select Student.Sname,score
        from Student,SC,Course C,Teacher
        where Student.S#=SC.S# and SC.C#=C.C# and C.T#=Teacher.T# and Teacher.Tname='叶平' and SC.score=(select max(score)from SC where C#=C.C# );
    41、查询各个课程及相应的选修人数
        select count(*) from sc group by C#;
    42、查询不同课程成绩相同的学生的学号、课程号、学生成绩
      select distinct  A.S#,B.score from SC A  ,SC B where A.Score=B.Score and A.C# <>B.C# ;
    43、查询每门功成绩最好的前两名
        SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数
          FROM SC t1
          WHERE score IN (SELECT TOP 2 score
                  FROM SC
                  WHERE t1.C#= C#
                ORDER BY score DESC
                  )
          ORDER BY t1.C#;
    44、统计每门课程的学生选修人数(超过10人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,查询结果按人数降序排列,若人数相同,按课程号升序排列  
        select  C# as 课程号,count(*) as 人数
        from  sc  
        group  by  C#
        order  by  count(*) desc,c#  
    45、检索至少选修两门课程的学生学号
        select  S#  
        from  sc  
        group  by  s#
        having  count(*)  >  =  2
    46、查询全部学生都选修的课程的课程号和课程名
        select  C#,Cname  
        from  Course  
        where  C#  in  (select  c#  from  sc group  by  c#)  
    47、查询没学过“叶平”老师讲授的任一门课程的学生姓名
        select Sname from Student where S# not in (select S# from Course,Teacher,SC where Course.T#=Teacher.T# and SC.C#=course.C# and Tname='叶平');
    48、查询两门以上不及格课程的同学的学号及其平均成绩
        select S#,avg(isnull(score,0)) from SC where S# in (select S# from SC where score <60 group by S# having count(*)>2)group by S#;
    49、检索“004”课程分数小于60,按分数降序排列的同学学号
        select S# from SC where C#='004'and score <60 order by score desc;
    50、删除“002”同学的“001”课程的成绩
    delete from Sc where S#='001'and C#='001'

    posted @ 2011-06-08 17:55 哈希 阅读(131) | 评论 (0)编辑 收藏

    1.列出至少有一个员工的所有部门。(两个表联合查询,及group by...having的用法)
    select dname from dept where deptno in(select deptno from emp group by deptno having count(*)>1);

    2.列出薪金比“SMITH”多的所有员工。(经典的自连接查询)
    select ename from emp where sal>(select sal from emp where ename like'SMITH');

    3.列出所有员工的姓名及其直接上级的姓名。(多次对自己查询,为表的取个别名,内部查询可以像对象一样引用外部的对象的字段,这里引用与编程中的作用域相似,即与{}类比)

    select ename,(select ename from emp where empno in(a.mgr)) from emp a ;

    4.列出受雇日期早于其直接上级的所有员工。(同上,日期可直接拿来比较)

    select ename from emp a where HIREDATE<(select HIREDATE from emp where empno in(a.mgr));

    5.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门(以emp表为主,左连接查询)

    select dname,emp.* from dept left join emp on dept.deptno=emp.deptno;

    6.列出所有“CLERK”(办事员)的姓名及其部门名称。(域,注意())

    select ename,(select dname from dept where deptno in(a.deptno)) as dname from emp a where JOB like'CLERK';

    7.列出最低薪金大于1500的各种工作。
    select job from emp where sal>1500;

    8.列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号。(经典的两个表连接)

    select ename from emp where deptno=(select deptno from dept where dname like'SALES');

    9.列出薪金高于公司平均薪金的所有员工。(反复查自己)

    select ename from emp where sal>( select avg( sal) from emp);

    10.列出与“SCOTT”从事相同工作的所有员工。(排除自己)

    select ename from emp where job in(select job from emp where ename like'SCOTT') and ename!='SCOTT' ;

    11.列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。(any的用法,且排挤)

    select ename,sal from emp where sal=any(select sal from emp wheredeptno=30) and deptno!=30;

    12.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。(max的用法)

    select sal,ename from emp where sal>(select max(sal) from emp where deptno=30);


    13.列出在每个(每个是关键字,对此group by)部门工作的员工数量、平均工资和平均服务期限。(经典的group by用法)

    select deptno,count(*),avg(a.sal),avg(sysdate-HIREDATE) from emp a group by deptno;

    14.列出所有员工的姓名、部门名称和工资.(经典的两个表的连接查询,用具体的名称替换一个表中的主键的id (解决很多人在实际运用中会遇到的不能绑定多列的问题),也可用where来查询 ,与题5比较)

    select ename,sal,(select dname from dept a where a.deptno=b.deptno)as dname from emp b;

    15.列出所有部门的详细信息和部门人数。(因为是*,将显示dept和后面临时表b的全部字段(注意:不只是dept的字段,注意*号))

    select * from dept a left join (select deptno,count(*) from emp group by deptno) b on a.deptno=b.deptno ;

    16.列出各种(与每个同义(参看题13))工作的最低工资。

    select job,min(sal) from emp group by job ;


    17.列出各个部门的MANAGER(经理,经理唯一,不用group by)的最低薪金。

    select min(sal) from emp where job like'MANAGER';(因为MANAGER是值不是字段,所以不能用小写)

    18.列出所有员工的年工资,按年薪从低到高排序。(nvl:空转化函数)

    select ename,sal+nvl(comm,0) as sal from emp order by sal ;

    posted @ 2011-05-28 16:33 哈希 阅读(170) | 评论 (0)编辑 收藏

    简单的说:

    struts 控制用的

    hibernate 操作数据库的

    spring 用解耦的

    详细的说:

    STRUTS 在 SSH 框架中起控制的作用 , 其核心是 Controller, 即 ActionServlet, 而 ActionServlet 的核心就是 Struts-confi g.xml. 主要控制逻辑关系的处理 .

    hibernate 是数据持久化层 , 是一种新的对象、关系的映射工具 , 提供了从 Java 类到数据表的映射,也提供了数据查询和恢复等机制 , 大大减少数据访问的复杂度。把对数据库的直接操作 , 转换为对持久对象的操作 .

    SPRING 是一个轻量级的控制反转 (IoC) 和面向切面 (AOP) 的容器框架 , 面向接口的编程 , 由容器控制程序之间的(依赖)关系,而非传统实现中,由程序代码直接操控。这也就是所谓 “ 控制反转 ” 的概念所在:(依赖)控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。依赖注入,即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中

    起到的主要作用是解耦

    Struts 、 spring 、 Hibernate 在各层的作用

    1 ) struts 负责 web 层 .

    ActionFormBean 接收网页中表单提交的数据,然后通过 Action 进行处理,再 Forward 到对应的网页。

    在 struts-config.xml 中定义 <action-mapping>, ActionServlet 会加载。

    2 ) spring 负责业务层管理,即 Service (或 Manager).

    1 . service 为 action 提供统计的调用接口,封装持久层的 DAO.

    2 .可以写一些自己的业务方法。

    3 .统一的 javabean 管理方法

    4 .声明式事务管理(http://www.cnblogs.com/rushoooooo/archive/2011/08/28/2155960.html

    5. 集成 Hiberante

    3 ) Hiberante ,负责持久化层,完成数据库的 crud 操作

    hibernate 为持久层,提供 OR/Mapping 。

    它有一组 .hbm.xml 文件和 POJO, 是跟数据库中的表相对应的。然后定义 DAO ,这些是跟数据库打交道的类,它们会使用 PO 。

    在 struts+spring+hibernate 的系统中,

    对象的调用流程是: jsp-> Action - > Service ->DAO ->Hibernate 。

    数据的流向是 ActionFormBean 接受用户的数据, Action 将数据从 ActionFromBean 中取出,封装成 VO 或 PO,

    再调用业务层的 Bean 类,完成各种业务处理后再 forward 。而业务层 Bean 收到这个 PO 对象之后,会调用 DAO 接口方法,进行持久化操作。

     

     

     

    spring:Aop管理事务控制,IoC管理各个组件的耦合,DaoTemplate作为常规持久层的快速开发模板!

    struts:控制层Action,页面标签和Model数据,调用业务层

    Hibernate:负责数据库和对象的映射,负责DAO层(Data Access Object:数据访问)

     

    spring整合hibernate和struts,只要在配好了applicationContext.xml,在struts的action中直接调用就可以了。hibernate访问数据库的操作都在spring中实现了,spring的调用又在stuts的action中实现了。这个ssh框架就连到了一起……

     

     

    1 SSH在开发中的位置

    现在J2EE的开源框架多的数不清楚,目前(已经、正在)比较流行的常用框架大概有struts,spring,hibernate,jsf,webwork,而 struts+spring+hibernate(SSH)这种轻量级架构被誉为“黄金组合”。spring和hibernate更是被许多人认为是未来五年内不会被淘汰的技术,犹如当年的struts,今天的开发中依然被广泛采用。

    2 为什么使用SSH  

    其实,就算用Java建造一个不是很烦琐的web应用,也不是件轻松的事情。 在构架的一开始就有很多事情要考虑。从高处看,摆在开发者面前有很多问题:要考虑是怎样建立用户接口?在哪里处理业务逻辑? 怎样持久化的数据。 而这三层构架中,每一层都有他们要仔细考虑的。 各个层该使用什么技术?怎样的设计能松散耦合还能灵活改变? 怎样替换某个层而不影响整体构架?应用程序如何做各种级别的业务处理(比如事务处理)?

        构架一个Web应用需要弄明白好多问题。 幸运的是,已经有不少开发者已经遇到过这类问题,并且建立了处理这类问题的框架。 一个好框架具备以下几点:减轻开发者处理复杂的问题的负担("不重复发明轮子");内部有良好的扩展; 并且有一个支持它的强大的用户团体。 好的构架一般有针对性的处理某一类问题,并且能将它做好(Do One Thing well)。 然而,你的程序中有几个层可能需要使用特定的框架,已经完成的UI(用户接口) 并不代表你也可以把你的业务逻辑和持久逻辑偶合到你的UI部分。 举个例子,你不该在一个Controller(控制器)里面写JDBC代码作为你的业务逻辑, 这不是控制器应该提供的。 一个UI 控制器应该委派给其它给在UI范围之外的轻量级组件。 好的框架应该能指导代码如何分布。 更重要的是,框架能把开发者从编码中解放出来,使他们能专心于应用程序的逻辑(这对客户来说很重要)。 

    他们里面有很我优秀的设计理念及模式应用。比如, struts属于MVC框架,关键是要了解MVC的概念及大致原理,掌握就很容易了;而hibernate属于orm系统,属于持久层的解决方案,同样需要对ORM的概念及原理有一个总体的了解,必要时可以去查查EJB1及EJB2里面用于持久层的Entity Bean的使用。而spring属于应用程序框架,其核心是IOC容器以及AOP,把这两个核心概念(也可称为大模式)了解以后,再加上一定的内力修为,其它就都不难了。Spring中还集成了很多适用东西(不过这些东西80%的在某一个项目中可能一直用不上),比如对JDBC的封装、自己的MVC、对动态语言的简洁访问等,这些你根据自己的项目情况来选择学习,用到的时候再看看他的文档,一个项目下来应该就能把握。

    3 对于SSH的理解

    在SSH框架中,struts用来解决MVC中显示、请求控制部分,spring主要负责访问数据库DAO类的事务控制以及它被人称誉的IOC思想在业务类中的恰当运用,hibernate主要是充当数据访问层组件。由于spring对hibernate的良好支持,在DAO类主要由spring来完成,hibernate更多关注的应是O/R影射文件上的配置,如级联关系,延迟加载等如何设置才能使效率更高。见图1 (框架组合示意图)

    4 收获和问题

    4.1 actionform,PO,VO三对象的运用

    讨论最多的是actionform,PO,VO三对象的运用,本人倾向的观点是:在SSH框架中,PO和VO可以不必区分,即业务层和持久层都可以使用hibernate产生的PO对象,我暂时把对象分成actionform和po两种来分析,action 应该是actionform和po的分界点,po不能穿透业务层,突破action到达页面显示层,同样actionform也不能突破action传到后台业务、持久层。(原因:po是持久对象,到达页面后就脱离了session成为无状态(暂理解为脱管态)的对象,而hibernate的持久对象是有状态(包含数据库主键)的,无状态的对象传到后台在调用hibernate的保存方法时会出错,一定要把无状态的对象先转化成持久态对象才能保存)在action中应该对两对象进行转化,转化的方法目前我还没发现有什么非常好的方法(欢迎高手不惜赐教),最普通的就是用get(),set()方法,也可以使用struts提供的属性复制方法BeanUtils类,但这个好象只支持单个类的转化,对于集合对象不行,需要我们自己扩展。

    4.2 spring事务管理

    在配置spring的事务管理中,最好把事务控制配置在业务类上,而不要配置在DAO类(需要保证多个原子事务操作同时失败回滚时这是一种解决办法);

    4.3 action如何获取业务类

    action中如何获取业务类:写一个父类action,在父类中通过spring的webapplicationcontent获得业务类的实例。struts中的具体action继承该父类,通过调用父类的getService()直接获得业务类的实例。

    4.4 理解AOP思想

    深入理解AOP思想,我暂时感觉到的就是尽量面向接口编程,不管是域对象还是业务类或者是DAO类都设计出接口,在各方法中我们尽量传入对象的接口,这对我们重用这些方法,扩展是很有好处的。

    4.5 分页处理 level

    5 系统包划分

    posted @ 2011-05-20 17:00 哈希 阅读(310) | 评论 (0)编辑 收藏

         摘要: Eclipse快速上手Hibernate--1. 入门实例 < language="javascript" type="text/javascript">document.title="Eclipse快速上手Hibernate--1. 入门实例 - "+document.title     这篇文章主要谈谈Hibernate的入门开发,例子很简单,就是...  阅读全文

    posted @ 2011-05-20 15:30 哈希 阅读(155) | 评论 (0)编辑 收藏

         摘要: 这篇文章将教你快速地上手使用 Spring 框架. 如果你手上有一本《Spring in Action》, 那么你最好从第三部分"Spring 在 Web 层的应用--建立 Web 层"开始看, 否则那将是一场恶梦! 首先, 我需要在你心里建立起 Spring MVC 的基本概念. 基于 Spring 的 Web 应用程序接收到 http://localhost:8080/...  阅读全文

    posted @ 2011-05-17 22:23 哈希 阅读(243) | 评论 (0)编辑 收藏

    所用数据:
    SELECT a.deptno, a.employename, a.salary
      FROM t_salary a

    000001         李可                              1000
    000001         李强                              2000
    000001         杨彦军                            4000
    000002         童家道                            3000
    000002         姜文                              3000
    000002         罗文                              3000
    000003         窨嫡                              3000
    000003         童家道                            3000
    000003         童家道                            3000
    000004         于名                              4000
    SELECT A.deptno, A.employename,A.salary,
    --1 按照名称进行分区,同时按照名称进行合计 
    SUM(A.salary)OVER(PARTITION BY A.employename) AS SUM_INC_ONLY,
    --2 按照名称进行累计 
    SUM(A.salary)OVER(ORDER BY A.employename) AS SUM_INC,
    --3   和 1 效果相同 
    SUM(A.salary)OVER(PARTITION BY A.employename ORDER BY A.employename) AS SUM_INC_NAME,
    --4 按照部门分组,部门内进行合计。名称相同时进行累计 
    SUM(A.salary)OVER(PARTITION BY A.deptno ORDER BY A.employename) AS SUM_INC_DEP,
    --5 按照部门,名称分组,部门名称相同时进行合计 
    SUM(A.salary)OVER(PARTITION BY A.deptno,A.employename ) AS SUM_INC_DEP_NAM
    FROM t_salary A


    所得结果:
    DEPTNO     EMPLOYENAME     SALARY     SUM_INC_ONLY     SUM_INC     SUM_INC_NAME     SUM_INC_DEP     SUM_INC_DEP_NAM
    000002     姜文    3000    3000    3000    3000    3000    3000
    000001     李可    1000    1000    4000    1000    1000    1000
    000001     李强    2000    2000    6000    2000    3000    2000
    000002     罗文    3000    3000    9000    3000    6000    3000
    000002     童家道    3000    9000    18000    9000    9000    3000
    000003     童家道    3000    9000    18000    9000    6000    6000
    000003     童家道    3000    9000    18000    9000    6000    6000
    000001     杨彦军    4000    4000    22000    4000    7000    4000
    000004     于名    4000    4000    26000    4000    4000    4000
    000003     窨嫡    3000    3000    29000    3000    9000    3000

    posted @ 2011-05-13 17:01 哈希 阅读(168) | 评论 (0)编辑 收藏

    缓存是位于应用程序与物理数据源之间,用于临时存放复制数据的内存区域,目的是为了减少应用程序对物理数据源访问的次数,从而提高应用程序的运行性能.
      Hibernate在查询数据时,首先到缓存中去查找,如果找到就直接使用,找不到的时候就会从物理数据源中检索,所以,把频繁使用的数据加载到缓存区后,就可以大大减少应用程序对物理数据源的访问,使得程序的运行性能明显的提升.

     
    Hibernate缓存分类:

    Session缓存,一级缓存.

    SessionFactory的缓存分为内置缓存和外置缓存.内置缓存中存放的是SessionFactory对象的一些集合属性包含的数据(映射元素据 及预定义SQL语句等),对于应用程序来说,它是只读的.外置缓存中存放的是数据库数据的副本,其作用和一级缓存类似.二级缓存除了以内存作为存储介质 外,还可以选用硬盘等外部存储设备.

    Hibernate的缓存范围

    Hibernate的一级缓存和二级缓存都位于均位于持久层,且均用于存放数据库数据的副本,最大的区别就是缓存的范围各不一样.

    缓存的范围分为3类:

    1.事务范围
       事务范围的缓存只能被当前事务访问,每个事务都有各自的缓存,缓存内的数据通常采用相互关联的对象形式.缓存的生命周期依赖于事务的生命周期,只有当事务结束时,缓存的生命周期才会结束.事务范围的缓存使用内存作为存储介质,一级缓存就属于事务范围.
    2.应用范围
       应用程序的缓存可以被应用范围内的所有事务共享访问.缓存的生命周期依赖于应用的生命周期,只有当应用结束时,缓存的生命周期才会结束.应用范围的缓存可以使用内存或硬盘作为存储介质,二级缓存就属于应用范围.
    3.集群范围
       在集群环境中,缓存被一个机器或多个机器的进程共享,缓存中的数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证缓存中的数据的一致,缓存中的数据通常采用对象的松散数据形式.

      Hibernate的缓存管理

    一级缓存的管理:

      evit(Object obj)  将指定的持久化对象从一级缓存中清除,释放对象所占用的内存资源,指定对象从持久化状态变为脱管状态,从而成为游离对象.
      clear()  将一级缓存中的所有持久化对象清除,释放其占用的内存资源
      contains(Object obj) 判断指定的对象是否存在于一级缓存中.
      flush() 刷新一级缓存区的内容,使之与数据库数据保持同步.

      二级缓存的管理:
      
       evict(Class arg0, Serializable arg1)  将某个类的指定ID的持久化对象从二级缓存中清除,释放对象所占用的资源.
      
    Java代码  收藏代码
    1. sessionFactory.evict(Customer.class, new Integer(1));  

       evict(Class arg0)  将指定类的所有持久化对象从二级缓存中清除,释放其占用的内存资源.
      
    Java代码  收藏代码
    1. sessionFactory.evict(Customer.class);  

       evictCollection(String arg0)  将指定类的所有持久化对象的指定集合从二级缓存中清除,释放其占用的内存资源.
      
    Java代码  收藏代码
    1. sessionFactory.evictCollection("Customer.orders");  


    Hibernate的二级缓存的配置

    首先,不是所有的数据都适合放在二级缓存中,看一下,什么样的数据适合放在二级缓存中来?什么样的数据不适合放在二级缓存中来?
      下面这几种情况就不适合加载到二级缓存中:
      1.经常被修改的数据
      2.绝对不允许出现并发访问的数据
      3.与其他应用共享的数据
      下面这己种情况合适加载到二级缓存中:
      1.数据更新频率低
      2.允许偶尔出现并发问题的非重要数据
      3.不会被并发访问的数据
      4.常量数据
      5.不会被第三方修改的数据

    Hibernate的二级缓存功能是靠配置二级缓存插件来实现的,Hibernate为了集成这些插件,Hibernate提供了org.hibernate.cache.CacheProvider借口,它充当缓存插件与Hibernate之间的适配器 .

    常用的二级缓存插件
    EHCache  org.hibernate.cache.EhCacheProvider
    OSCache  org.hibernate.cache.OSCacheProvider
    SwarmCahe  org.hibernate.cache.SwarmCacheProvider
    JBossCache  org.hibernate.cache.TreeCacheProvider

    简单介绍一下EHCache的配置
    hibernate.cfg.xml
    Xml代码  收藏代码
    1. <hibernate-configuration>  
    2.    <session-factory>  
    3.       <!-- 设置二级缓存插件EHCache的Provider类-->  
    4.       <property name="hibernate.cache.provider_class">  
    5.          org.hibernate.cache.EhCacheProvider  
    6.       </property>  
    7.       <!-- 启动"查询缓存" -->  
    8.       <property name="hibernate.cache.use_query_cache">  
    9.          true  
    10.       </property>  
    11.    </session-factory>  
    12.  </hibernate-configuration>  


    ehcache.xml

    Xml代码  收藏代码
    1. <ehcache>  
    2.   <!-- maxElementsInMemory为缓存对象的最大数目, eternal设置是否永远不过期,timeToIdleSeconds对象处于空闲状态的最多秒数,timeToLiveSeconds对象处于缓存状态的最多秒数 -->  
    3.   <diskStore path="java.io.tmpdir"/>  
    4.     <defaultCache maxElementsInMemory="10000" eternal="false"  timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="true"/>  
    5. </ehcache>  


    ****.hbm.xml

    Xml代码  收藏代码
    1. <?xml version="1.0" encoding='UTF-8'?>  
    2. <!DOCTYPE hibernate-mapping PUBLIC  
    3.                             "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    4.                             "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >  
    5.   
    6. <hibernate-mapping>  
    7.        
    8.    <class>  
    9.        <!-- 设置该持久化类的二级缓存并发访问策略 read-only read-write nonstrict-read-write transactional-->  
    10.        <cache usage="read-write"/>      
    11.    </class>  
    12.   
    13. </hibernate-mapping>  


    最近用上了,看看了,有什么不妥的地方,多谢指出.

    posted @ 2011-05-10 18:03 哈希 阅读(189) | 评论 (0)编辑 收藏

    1.关于spring ioc

    这段时间也着实好好的看了下spring的相关书籍,对其也有了大概和初步的认识和理解,虽然之前也一直听说spring是一个非常优秀的开源 框架,可一直没有机会学习和使用(是不是有点落伍了?呵呵),所以呢,这段时间就重点学习了spring(一个星期的时间当然是入门级的啦~~)

    大家一直都说spring的IOC如何如何的强大,其实我倒觉得不是IOC如何的强大,说白了IOC其实也非常的简单。我们先从IOC说起, 这个概念其实是从我们平常new一个对象的对立面来说的,我们平常使用对象的时候,一般都是直接使用关键字类new一个对象,那这样有什么坏处呢?其实很 显然的,使用new那么就表示当前模块已经不知不觉的和new的对象耦合了,而我们通常都是更高层次的抽象模块调用底层的实现模块,这样也就产生了模块依 赖于具体的实现,这样与我们JAVA中提倡的面向接口面向抽象编程是相冲突的,而且这样做也带来系统的模块架构问题。很简单的例子,我们在进行数据库操作 的时候,总是业务层调用DAO层,当然我们的DAO一般都是会采用接口开发,这在一定程度上满足了松耦合,使业务逻辑层不依赖于具体的数据库DAO层。但 是我们在使用的时候还是会new一个特定数据库的DAO层,这无形中也与特定的数据库绑定了,虽然我们可以使用抽象工厂模式来获取DAO实现类,但除非我 们一次性把所有数据库的DAO写出来,否则在进行数据库迁移的时候我们还是得修改DAO工厂类。

    那我们使用IOC能达到什么呢?IOC,就是DAO接口的实现不再是业务逻辑层调用工厂类去获取,而是通过容器(比如spring)来自动的 为我们的业务层设置DAO的实现类。这样整个过程就反过来,以前是我们业务层主动去获取DAO,而现在是DAO主动被设置到业务逻辑层中来了,这也就是反 转控制的由来。通过IOC,我们就可以在不修改任何代码的情况下,无缝的实现数据库的换库迁移,当然前提还是必须得写一个实现特定数据库的DAO。我们把 DAO普遍到更多的情况下,那么IOC就为我们带来更大的方便性,比如一个接口的多个实现,我们只需要配置一下就ok了,而不需要再一个个的写工厂来来获 取了。这就是IOC为我们带来的模块的松耦合和应用的便利性。

    那为什么说IOC很简单呢?说白了其实就是由我们平常的new转成了使用反射来获取类的实例,相信任何人只要会用java的反射机制,那么自己写一个IOC框架也不是不可能的。比如:

    ……
    public ObjectgetInstance(String className) throws Exception
    {
    Object obj = Class.forName(className).newInstance();
    Method[] methods = obj.getClass().getMethods();
    for (Method method : methods) {
    if (method.getName().intern() == "setString") {
    method.invoke(obj, "hello world!");
    }
    }
    }
    ……

    上面的一个方法我们就很简单的使用了反射为指定的类的setString方法来设置一个hello world!字符串。其实可以看到IOC真的很简单,当然了IOC简单并不表示spring的IOC就简单,spring的IOC的功能强大就在于有一系 列非常强大的配置文件维护类,它们可以维护spring配置文件中的各个类的关系,这才是spring的IOC真正强大的地方。在spring的Bean 定义文件中,不仅可以为定义Bean设置属性,还支持Bean之间的继承、Bean的抽象和不同的获取方式等等功能。

    下次俺再把spring的Bean配置的相关心得和大家一起分享下,如果说的不好,大家可以提意见哦,可千万不要仍臭鸡蛋,嘿嘿~~~~


    2.关于spring aop

    反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)
    好长时间没有用过Spring了. 突然拿起书.我都发现自己对AOP都不熟悉了.
    其实AOP的意思就是面向切面编程.
    OO注重的是我们解决问题的方法(封装成Method),而AOP注重的是许多解决解决问题的方法中的共同点,是对OO思想的一种补充!
    还是拿人家经常举的一个例子讲解一下吧:
    比如说,我们现在要开发的一个应用里面有很多的业务方法,但是,我们现在要对这个方法的执行做全面监控,或部分监控.也许我们就会在要一些方法前去加上一条日志记录,
    我们写个例子看看我们最简单的解决方案
    我们先写一个接口IHello.java代码如下:
    1package sinosoft.dj.aop.staticaop;
    2
    3public interface IHello {
    4    /** *//**
    5     * 假设这是一个业务方法
    6     * @param name
    7     */
    8    void sayHello(String name);
    9}
    10
    里面有个方法,用于输入"Hello" 加传进来的姓名;我们去写个类实现IHello接口
    package sinosoft.dj.aop.staticaop;

    public class Hello implements IHello {

        public void sayHello(String name) {
            System.out.println("Hello " + name);
        }

    }

    现在我们要为这个业务方法加上日志记录的业务,我们在不改变原代码的情况下,我们会去怎么做呢?也许,你会去写一个类去实现IHello接口,并依赖Hello这个类.代码如下:
    1package sinosoft.dj.aop.staticaop;
    2
    3public class HelloProxy implements IHello {
    4    private IHello hello;
    5
    6    public HelloProxy(IHello hello) {
    7        this.hello = hello;
    8    }
    9
    10    public void sayHello(String name) {
    11        Logger.logging(Level.DEBUGE, "sayHello method start.");
    12        hello.sayHello(name);
    13        Logger.logging(Level.INFO, "sayHello method end!");
    14
    15    }
    16
    17}
    18
    其中.Logger类和Level枚举代码如下:
    Logger.java
    1package sinosoft.dj.aop.staticaop;
    2
    3import java.util.Date;
    4
    5public class Logger{
    6    /** *//**
    7     * 根据等级记录日志
    8     * @param level
    9     * @param context
    10     */
    11    public static void logging(Level level, String context) {
    12        if (level.equals(Level.INFO)) {
    13            System.out.println(new Date().toLocaleString() + " " + context);
    14        }
    15        if (level.equals(Level.DEBUGE)) {
    16            System.err.println(new Date() + " " + context);
    17        }
    18    }
    19
    20}
    21Level.java

    1package sinosoft.dj.aop.staticaop;
    2
    3public enum Level {
    4    INFO,DEBUGE;
    5}
    6那我们去写个测试类看看,代码如下:
    Test.java
    1package sinosoft.dj.aop.staticaop;
    2
    3public class Test {
    4    public static void main(String[] args) {
    5        IHello hello = new HelloProxy(new Hello());
    6        hello.sayHello("Doublej");
    7    }
    8}
    9运行以上代码我们可以得到下面结果:

    Tue Mar 04 20:57:12 CST 2008 sayHello method start.
    Hello Doublej
    2008-3-4 20:57:12 sayHello method end!
    从上面的代码我们可以看出,hello对象是被HelloProxy这个所谓的代理态所创建的.这样,如果我们以后要把日志记录的功能去掉.那我们只要把得到hello对象的代码改成以下:
    1package sinosoft.dj.aop.staticaop;
    2
    3public class Test {
    4    public static void main(String[] args) {
    5        IHello hello = new Hello();
    6        hello.sayHello("Doublej");
    7    }
    8}
    9
    上面代码,可以说是AOP最简单的实现!
    但是我们会发现一个问题,如果我们像Hello这样的类很多,那么,我们是不是要去写很多个HelloProxy这样的类呢.没错,是的.其实也 是一种很麻烦的事.在jdk1.3以后.jdk跟我们提供了一个API   java.lang.reflect.InvocationHandler的类. 这个类可以让我们在JVM调用某个类的方法时动态的为些方法做些什么事.让我们把以上的代码改一下来看看效果.
    同样,我们写一个IHello的接口和一个Hello的实现类.在接口中.我们定义两个方法;代码如下 :

    IHello.java
    1package sinosoft.dj.aop.proxyaop;
    2
    3public interface IHello {
    4    /** *//**
    5     * 业务处理A方法
    6     * @param name
    7     */
    8    void sayHello(String name);
    9    /** *//**
    10     * 业务处理B方法
    11     * @param name
    12     */
    13    void sayGoogBye(String name);
    14}
    15

    Hello.java

    1package sinosoft.dj.aop.proxyaop;
    2
    3public class Hello implements IHello {
    4
    5    public void sayHello(String name) {
    6        System.out.println("Hello " + name);
    7    }
    8    public void sayGoogBye(String name) {
    9        System.out.println(name+" GoodBye!");
    10    }
    11}
    12
    我们一样的去写一个代理类.只不过.让这个类去实现java.lang.reflect.InvocationHandler接口,代码如下:
    1package sinosoft.dj.aop.proxyaop;
    2
    3import java.lang.reflect.InvocationHandler;
    4import java.lang.reflect.Method;
    5import java.lang.reflect.Proxy;
    6
    7public class DynaProxyHello implements InvocationHandler {
    8
    9    /** *//**
    10     * 要处理的对象(也就是我们要在方法的前后加上业务逻辑的对象,如例子中的Hello)
    11     */
    12    private Object delegate;
    13
    14    /** *//**
    15     * 动态生成方法被处理过后的对象 (写法固定)
    16     *
    17     * @param delegate
    18     * @param proxy
    19     * @return
    20     */
    21    public Object bind(Object delegate) {
    22        this.delegate = delegate;
    23        return Proxy.newProxyInstance(
    24                this.delegate.getClass().getClassLoader(), this.delegate
    25                        .getClass().getInterfaces(), this);
    26    }
    27    /** *//**
    28     * 要处理的对象中的每个方法会被此方法送去JVM调用,也就是说,要处理的对象的方法只能通过此方法调用
    29     * 此方法是动态的,不是手动调用的
    30     */
    31    public Object invoke(Object proxy, Method method, Object[] args)
    32            throws Throwable {
    33        Object result = null;
    34        try {
    35            //执行原来的方法之前记录日志
    36            Logger.logging(Level.DEBUGE, method.getName() + " Method end .");
    37           
    38            //JVM通过这条语句执行原来的方法(反射机制)
    39            result = method.invoke(this.delegate, args);
    40            //执行原来的方法之后记录日志
    41            Logger.logging(Level.INFO, method.getName() + " Method Start!");
    42        } catch (Exception e) {
    43            e.printStackTrace();
    44        }
    45        //返回方法返回值给调用者
    46        return result;
    47    }
    48
    49}
    50
    上面类中出现的Logger类和Level枚举还是和上一上例子的实现是一样的.这里就不贴出代码了.

    让我们写一个Test类去测试一下.代码如下:
    Test.java
    1package sinosoft.dj.aop.proxyaop;
    2
    3public class Test {
    4    public static void main(String[] args) {
    5        IHello hello = (IHello)new DynaProxyHello().bind(new Hello());
    6        hello.sayGoogBye("Double J");
    7        hello.sayHello("Double J");
    8       
    9    }
    10}
    11
    运行输出的结果如下:
    Tue Mar 04 21:24:03 CST 2008 sayGoogBye Method end .
    Double J GoodBye!
    2008-3-4 21:24:03 sayGoogBye Method Start!
    Tue Mar 04 21:24:03 CST 2008 sayHello Method end .
    Hello Double J
    2008-3-4 21:24:03 sayHello Method Start!
    由于线程的关系,第二个方法的开始出现在第一个方法的结束之前.这不是我们所关注的!
    从上面的例子我们看出.只要你是采用面向接口编程,那么,你的任何对象的方法执行之前要加上记录日志的操作都是可以的.他 (DynaPoxyHello)自动去代理执行被代理对象(Hello)中的每一个方法,一个 java.lang.reflect.InvocationHandler接口就把我们的代理对象和被代理对象解藕了.但是,我们又发现还有一个问题,这 个DynaPoxyHello对象只能跟我们去在方法前后加上日志记录的操作.我们能不能把DynaPoxyHello对象和日志操作对象 (Logger)解藕呢?
    结果是肯定的.让我们来分析一下我们的需求.
    我们要在被代理对象的方法前面或者后面去加上日志操作代码(或者是其它操作的代码),
    那么,我们可以抽象出一个接口,这个接口里就只有两个方法,一个是在被代理对象要执行方法之前执行的方法,我们取名为start,第二个方法就是在被代理对象执行方法之后执行的方法,我们取名为end .接口定义如下 :
    1package sinosoft.dj.aop.proxyaop;
    2
    3import java.lang.reflect.Method;
    4
    5public interface IOperation {
    6    /** *//**
    7     * 方法执行之前的操作
    8     * @param method
    9     */
    10    void start(Method method);
    11    /** *//**
    12     * 方法执行之后的操作
    13     * @param method
    14     */
    15    void end(Method method);
    16}
    17
    我们去写一个实现上面接口的类.我们把作他真正的操作者,如下面是日志操作者的一个类:
    LoggerOperation.java
    package sinosoft.dj.aop.proxyaop;

    import java.lang.reflect.Method;

    public class LoggerOperation implements IOperation {

        public void end(Method method) {
            Logger.logging(Level.DEBUGE, method.getName() + " Method end .");
        }

        public void start(Method method) {
            Logger.logging(Level.INFO, method.getName() + " Method Start!");
        }

    }

    然后我们要改一下代理对象DynaProxyHello中的代码.如下:
    1package sinosoft.dj.aop.proxyaop;
    2
    3import java.lang.reflect.InvocationHandler;
    4import java.lang.reflect.Method;
    5import java.lang.reflect.Proxy;
    6
    7public class DynaProxyHello implements InvocationHandler {
    8    /** *//**
    9     * 操作者
    10     */
    11    private Object proxy;
    12    /** *//**
    13     * 要处理的对象(也就是我们要在方法的前后加上业务逻辑的对象,如例子中的Hello)
    14     */
    15    private Object delegate;
    16
    17    /** *//**
    18     * 动态生成方法被处理过后的对象 (写法固定)
    19     *
    20     * @param delegate
    21     * @param proxy
    22     * @return
    23     */
    24    public Object bind(Object delegate,Object proxy) {
    25       
    26        this.proxy = proxy;
    27        this.delegate = delegate;
    28        return Proxy.newProxyInstance(
    29                this.delegate.getClass().getClassLoader(), this.delegate
    30                        .getClass().getInterfaces(), this);
    31    }
    32    /** *//**
    33     * 要处理的对象中的每个方法会被此方法送去JVM调用,也就是说,要处理的对象的方法只能通过此方法调用
    34     * 此方法是动态的,不是手动调用的
    35     */
    36    public Object invoke(Object proxy, Method method, Object[] args)
    37            throws Throwable {
    38        Object result = null;
    39        try {
    40            //反射得到操作者的实例
    41            Class clazz = this.proxy.getClass();
    42            //反射得到操作者的Start方法
    43            Method start = clazz.getDeclaredMethod("start",
    44                    new Class[] { Method.class });
    45            //反射执行start方法
    46            start.invoke(this.proxy, new Object[] { method });
    47            //执行要处理对象的原本方法
    48            result = method.invoke(this.delegate, args);
    49//            反射得到操作者的end方法
    50            Method end = clazz.getDeclaredMethod("end",
    51                    new Class[] { Method.class });
    52//            反射执行end方法
    53            end.invoke(this.proxy, new Object[] { method });
    54
    55        } catch (Exception e) {
    56            e.printStackTrace();
    57        }
    58        return result;
    59    }
    60
    61}
    62
    然后我们把Test.java中的代码改一下.测试一下:
    package sinosoft.dj.aop.proxyaop;

    public class Test {
        public static void main(String[] args) {
            IHello hello = (IHello)new DynaProxyHello().bind(new Hello(),new LoggerOperation());
            hello.sayGoogBye("Double J");
            hello.sayHello("Double J");
           
        }
    }
    结果还是一样的吧.

    如果你想在每个方法之前加上日志记录,而不在方法后加上日志记录.你就把LoggerOperation类改成如下:
    1package sinosoft.dj.aop.proxyaop;
    2
    3import java.lang.reflect.Method;
    4
    5public class LoggerOperation implements IOperation {
    6
    7    public void end(Method method) {
    8        //Logger.logging(Level.DEBUGE, method.getName() + " Method end .");
    9    }
    10
    11    public void start(Method method) {
    12        Logger.logging(Level.INFO, method.getName() + " Method Start!");
    13    }
    14
    15}
    16
    运行一下.你就会发现,每个方法之后没有记录日志了. 这样,我们就把代理者和操作者解藕了!

    下面留一个问题给大家,如果我们不想让所有方法都被日志记录,我们应该怎么去解藕呢.?
    我的想法是在代理对象的public Object invoke(Object proxy, Method method, Object[] args)方法里面加上个if(),对传进来的method的名字进行判断,判断的条件存在XML里面.这样我们就可以配置文件时行解藕了.如果有兴趣的 朋友可以把操作者,被代理者,都通过配置文件进行配置 ,那么就可以写一个简单的SpringAOP框架了.

    posted @ 2011-05-10 17:49 哈希 阅读(335) | 评论 (0)编辑 收藏

    首先来说一下rownum与rowid含义:

    顾名思义rownum就是行数/行号,而rowid就是编码/编号/唯一识别号,所以他是类似“AAAR8gAAEAAAAErAAK”的编号,注意他是没有先后顺序的,也就是说他和数据入库时间没有任何关系,打个比方:他就像磁盘、内存存储数据用的是16进制的地址一样。

    他们都是伪列,可以理解成表中的一个列只是他们并不是你创建的。同样是伪列区别是什么呢?

    rowid是你录入数据时有数据库自动为这条记录添加的唯一的18位编号是一个物理编号用于找到这条记录(顺便说一句这也是为什么数据优调的时候强 调尽量使用rowid的原因),他是不会随着查询而改变的 除非在表发生移动(比如表空间变化,数据导入/导出以后),才会发生变化。

    rownum是根据sql查询后得到的结果自动加上去的,但是他却不受到sql中order by排序的影响,因为他和rowid的顺序一样是系统按照记录插入时的顺序给记录排的号(顺序的、无跳跃)。 但是如果你想让rownum和order by一样的顺序 那么可以使用子查询,形如:select rownum,t.* from (select * from 表空间名 order by 字段名) t  这样的话rownum就是根据该字段进行排序的编号了,为什么会这样呢,本人理解:rownum是根据表记录输出的行号,与筛选语句、排序语句都无关所以 当用子查询时等于生成了一个表于是就按照这张表从1开始排序了。 同样,也可以用下面要提得到的分析函数中的row_number() over(order by 需要排序的字段名)。

      

    值得一提的是MSSQL是没有rownum和rowid的。

    下面说说分析函数row_number()、rank()、dense_rank()

    ROW_NUMBER():
    Row_number函数返回一个唯一的值,当碰到相同数据时,排名按照记录集中记录的顺序依次递增。 row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序),因为row_number()是分析函数而rownum是伪列所以row_number()一定要over而rownum不能over。

    RANK():
    Rank函数返回一个唯一的值,除非遇到相同的数据,此时所有相同数据的排名是一样的,同时会在最后一条相同记录和下一条不同记录的排名之间空出排名。rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)。

    DENSE_RANK():
    Dense_rank函数返回一个唯一的值,除非当碰到相同数据,此时所有相同数据的排名都是一样的。
    dense_rank()是连续排序,有两个第二名时仍然跟着第三名。他和row_number的区别在于row_number是没有重复值的。

    一,什么是伪列RowID?

    1,首先是一种数据类型,唯一标识一条记录物理位置的一个id,基于64位编码的18个字符显示。

    2,未存储在表中,可以从表中查询,但不支持插入,更新,删除它们的值。

    二,RowID的用途

    1,在开发中使用频率应该是挺多的,特别在一些update语句中使用更加频繁。所以oracle ERP中大部份的视图都会加入rowid这个字段。

       在一些cursor定义时也少不了加入rowid。但往往我们在开发过程中,由于连接的表很多,再加上程序的复制,有时忽略了rowid对应的是那一个表中rowid,所以有时过程出错,

       往往发上很多时间去查错,最后查出来既然是update时带的rowid并非此表的rowid,所以在发现很多次的错误时,重视rowid起来了,开发中一定要注意rowid的匹配

    2,能以做快的方式访问表中的一行。

    3,能显示表的行是如何存储的。

    4,作为表中唯一标识。

    三,RowID的组成

    rowid确定了每条记录是在Oracle中的哪一个数据对象,数据文件、块、行上。

    ROWID 的格式如下:

       数据对象编号        文件编号        块编号            行编号

       OOOOOO             FFF                BBBBBB    RRR

       由 data_object_id# + rfile# + block# + row#   组成,占用10个bytes的空间,

        32bit的 data_object_id#,

        10 bit 的 rfile#,

        22bit 的 block#,

        16 bit 的 row#.

       所以每个表空间不能超过1023个 数据文件。

    四,RowID的应用

    1,查找和删除重复记录

       当试图对库表中的某一列或几列创建唯一索引时,

       系统提示 ORA-01452 :不能创建唯一索引,发现重复记录。

        /*conn scott/tiger

        Create table empa as select * from emp;

        插入重复记录

        insert into empa select * from emp where empno = 7369;

        insert into empa select * from emp where empno = 7839;

        insert into empa select * from emp where empno = 7934;

        */

       查找重复记录的几种方法:

        查找大量重复记录

        select empno from empa group by empno having count(*) >1;

        Select * From empa Where ROWID Not In(Select Min(ROWID) From empa Group By empno);

        查找少量重复记录

        select * from empa a where rowid<>(select max(rowid) from empa where empno=a.empno );

       删除重复记录的几种方法:

        (1).适用于有大量重复记录的情况(列上建有索引的时候,用以下语句效率会很高):

        Delete empa Where empno In (Select empno From empa Group By empno Having Count(*) > 1)

        And ROWID Not In (Select Min(ROWID) From empa Group By empno Having Count(*) > 1);

      

        Delete empa Where ROWID Not In(Select Min(ROWID) From empa Group By empno);

      

        (2).适用于有少量重复记录的情况(注意,对于有大量重复记录的情况,用以下语句效率会很低):

        Delete empa a where rowid<>(select max(rowid) from empa where empno=a.empno );

    ---------------------------------------------------------------------------------------------------------------------------------------------------

    注意:rownum从1开始;

               rownum按照记录插入时的顺序给记录排序,所以有order by的子句时一定要注意啊!

               使用时rownum,order by字段是否为主键有什么影响?

               子查询中rownum rn,而rn用到外查询中到底是怎样的序列?

                若id主键是按照从小到大的顺序插入的,select语句没有group by 和order by的子句时,rownum的顺序和id顺序基本一致。

    对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<、<=、!=),并非说用>,& gt;=,=,between..and 时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来,其实您只要理解好了这个 rownum 伪列的意义就不应该感到惊奇,同样是伪列,rownum 与 rowid 可有些不一样,下面以例子说明

    假设某个表 t1(c1) 有 20 条记录

    如果用 select rownum,c1 from t1 where rownum < 10, 只要是用小于号,查出来的结果很容易地与一般理解在概念上能达成一致,应该不会有任何疑问的。

    可如果用 select rownum,c1 from t1 where rownum > 10 (如果写下这样的查询语句,这时候在您的头脑中应该是想得到表中后面10条记录),你就会发现,显示出来的结果要让您失望了,也许您还会怀疑是不谁删了一 些记录,然后查看记录数,仍然是 20 条啊?那问题是出在哪呢?

    先好好理解 rownum 的意义吧。因为ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说 rownum 是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1,而有其他大于1的值。所以您没办法期望得到下面的结果集:

    11 aaaaaaaa

    12 bbbbbbb

    13 ccccccc

    .................

    rownum >10 没有记录,因为第一条不满足去掉的话,第二条的ROWNUM又成了1,所以永远没有满足条件的记录。或者可以这样理解:

    ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第 一条记录则rownum值为1,第二条为2,依次类推。如果你用>,>=,=,between...and这些条件,因为从缓冲区或数据文件 中得到的第一条记录的rownum为1,则被删除,接着取下条,可是它的rownum还是1,又被删除,依次类推,便没有了数据。

    有了以上从不同方面建立起来的对 rownum 的概念,那我们可以来认识使用 rownum 的几种现像

    1. select rownum,c1 from t1 where rownum != 10 为何是返回前9条数据呢?它与 select rownum,c1 from tablename where rownum < 10 返回的结果集是一样的呢?

          因为是在查询到结果集后,显示完第 9 条记录后,之后的记录也都是 != 10,或者 >=10,所以只显示前面9条记录。也可以这样理解,rownum 为9后的记录的 rownum为10,因条件为 !=10,所以去掉,其后记录补上,rownum又是10,也去掉,如果下去也就只会显示前面9条记录了。

    2. 为什么 rownum >1 时查不到一条记录,而 rownum >0 或 rownum >=1 却总显示所有的记录?

          因为 rownum 是在查询到的结果集后加上去的,它总是从1开始。

    3. 为什么 between 1 and 10 或者 between 0 and 10 能查到结果,而用 between 2 and 10 却得不到结果?

           原因同上一样,因为 rownum 总是从 1 开始。从上可以看出,任何时候想把 rownum = 1 这条记录抛弃是不对的,它在结果集中是不可或缺的,少了rownum=1 就像空中楼阁一般不能存在,所以你的 rownum 条件要包含到 1 。

    但如果就是想要用 rownum > 10 这种条件的话话就要用嵌套语句,把 rownum 先生成,然后对他进行查询。

    select *

    from (selet rownum as rn,t1.* from a where ...)

    where rn >10

    一般代码中对结果集进行分页就是这么干的。

    另外:rowid 与 rownum 虽都被称为伪列,但它们的存在方式是不一样的,rowid 可以说是物理存在的,表示记录在表空间中的唯一位置ID,在DB中唯一。只要记录没被搬动过,rowid是不变的。rowid 相对于表来说又像表中的一般列,所以以 rowid 为条件就不会有 rownum那些情况发生。

    另外还要注意:rownum不能以任何基表的名称作为前缀。

    对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀。

    (1) rownum 对于等于某值的查询条件

    如果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件。但是想找到学生表 中第二条学生的信息,使用rownum=2结果查不到数据。因为rownum都是从1开始,但是1以上的自然数在rownum做等于判断是时认为都是 false条件,所以无法查到rownum = n(n>1的自然数)。

    SQL> select rownum,id,name from student where rownum=1;(可以用在限制返回记录条数的地方,保证不出错,如:隐式游标)

    SQL> select rownum,id,name from student where rownum =2;

        ROWNUM ID     NAME

    (2)rownum对于大于某值的查询条件

       如果想找到从第二行记录以后的记录,当使用rownum>2是查不出记录的,原因是由于rownum是一个总是从1开始的伪列,Oracle 认为rownum> n(n>1的自然数)这种条件依旧不成立,所以查不到记录。

    查找到第二行以后的记录可使用以下的子查询方法来解决。注意子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。

    SQL>select * from(select rownum no ,id,name from student) where no>2;

            NO ID     NAME

    ---------- ------ ---------------------------------------------------

             3 200003 李三

             4 200004 赵四

    (3)rownum对于小于某值的查询条件

    rownum对于rownum<n((n>1的自然数)的条件认为是成立的,所以可以找到记录。

    SQL> select rownum,id,name from student where rownum <3;

        ROWNUM ID     NAME

    ---------- ------ ---------------------------------------------------

            1 200001 张一

            2 200002 王二

    查询rownum在某区间的数据,必须使用子查询。例如要查询rownum在第二行到第三行之 间的数据,包括第二行和第三行数据,那么我们只能写以下语句,先让它返回小于等于三的记录行,然后在主查询中判断新的rownum的别名列大于等于二的记 录行。但是这样的操作会在大数据集中影响速度。

    SQL> select * from (select rownum no,id,name from student where rownum<=3 ) where no >=2;

            NO ID     NAME

    ---------- ------ ---------------------------------------------------

             2 200002 王二

             3 200003 李三

    (4)rownum和排序  

    Oracle中的rownum的是在取数据的时候产生的序号,所以想对指定排序的数据去指定的rowmun行数据就必须注意了。

    SQL> select rownum ,id,name from student order by name;

        ROWNUM ID     NAME

    ---------- ------ ---------------------------------------------------

             3 200003 李三

             2 200002 王二

             1 200001 张一

             4 200004 赵四

    可以看出,rownum并不是按照name列来生成的序号。系统是按照记录插入时的顺序给记录排的号,rowid也是顺序分配的。为了解决这个问题,必须使用子查询;

    SQL> select rownum ,id,name from (select * from student order by name);

        ROWNUM ID     NAME

    ---------- ------ ---------------------------------------------------

             1 200003 李三

             2 200002 王二

             3 200001 张一

             4 200004 赵四

    这样就成了按name排序,并且用rownum标出正确序号(有小到大)

    笔者在工作中有一上百万条记录的表,在jsp页面中需对该表进行分页显示,便考虑用rownum来作,下面是具体方法(每页显示20条):

    “select * from tabname where rownum<20 order by name" 但却发现oracle却不能按自己的意愿来执行,而是先随便取20条记录,然后再order by,后经咨询oracle,说rownum确实就这样,想用的话,只能用子查询来实现先排序,后rownum,方法如下:

    "select * from (select * from tabname order by name) where rownum<20",但这样一来,效率会低很多。

    后经笔者试验,只需在order by 的字段上加主键或索引即可让oracle先按该字段排序,然后再rownum;方法不变:    “select * from tabname where rownum<20 order by name"

    取得某列中第N大的行

    select column_name from

    (select table_name.*,dense_rank() over (order by column desc) rank from table_name)

    where rank = &N;

    假如要返回前5条记录:

    select * from tablename where rownum<6;(或是rownum <= 5 或是rownum != 6)

    假如要返回第5-9条记录:

    select * from tablename

    where …

    and rownum<10

    minus

    select * from tablename

    where …

    and rownum<5

    order by name

    选出结果后用name排序显示结果。(先选再排序)

    注意:只能用以上符号(<、<=、!=)。

    select * from tablename where rownum != 10;返回的是前9条记录。

    不能用:>,>=,=,Between...and。由于rownum是一个总是从1开始的伪列,Oracle 认为这种条件不成立。

    另外,这个方法更快:

    select * from (

    select rownum r,a from yourtable

    where rownum <= 20

    order by name )

    where r > 10

    这样取出第11-20条记录!(先选再排序再选)

    要先排序再选则须用select嵌套:内层排序外层选。

    rownum是随着结果集生成的,一旦生成,就不会变化了;同时,生成的结果是依次递加的,没有1就永远不会有2!

    rownum 是在查询集合产生的过程中产生的伪列,并且如果where条件中存在 rownum 条件的话,则:

    1: 假如判定条件是常量,则:

    只能 rownum = 1, <= 大于1 的自然数, = 大于1 的数是没有结果的;大于一个数也是没有结果的

    即 当出现一个 rownum 不满足条件的时候则 查询结束 this is stop key(一个不满足,系统将该记录过滤掉,则下一条记录的rownum还是这个,所以后面的就不再有满足记录,this is stop key);

    2: 假如判定值不是常量,则:

    若条件是 = var , 则只有当 var 为1 的时候才满足条件,这个时候不存在 stop key ,必须进行full scan ,对每个满足其他where条件的数据进行判定,选出一行后才能去选rownum=2的行……

    以下摘自《中国IT实验室》

    1.在oracle中实现select top n

       由于oracle不支持select top语句,所以在oracle中经常是用order by跟rownum的组合来实现select top n的查询。

    简单地说,实现方法如下所示:

    select 列名1...列名n from   

    (select 列名1...列名n from 表名 order by 列名1...列名n)

    where rownum<=n(抽出记录数)

    order by rownum asc

       下面举个例子简单说明一下。

    顾客表customer(id,name)有如下数据:

    ID NAME

       01 first

       02 Second

       03 third

       04 forth

       05 fifth

       06 sixth

       07 seventh

       08 eighth

       09 ninth

       10 last

       则按NAME的字母顺抽出前三个顾客的SQL语句如下所示:

    select * from

       (select * from customer order by name)

       where rownum<=3

       order by rownum asc

       输出结果为:

       ID NAME

       08 eighth

       05 fifth

       01 first

    posted @ 2011-05-10 17:32 哈希 阅读(457) | 评论 (0)编辑 收藏

    一、String,StringBuffer, StringBuilder 的区别是什么?String为什么是不可变的?
    二、VECTOR,ARRAYLIST, LINKEDLIST的区别是什么?
    三、HASHTABLE, HASGMAQ,TreeMap区别
    四、ConcurrentMap和HashMap的区别
    五、Tomcat,apache,jboss的区别
    六、GET POST区别
    七、SESSION, COOKIE区别
    八、Servlet的生命周期
    九、HTTP 报文包含内容
    十、Statement与PreparedStatement的区别,什么是SQL注入,如何防止SQL注入
    十一、redirect, foward区别
    十二、关于JAVA内存模型,一个对象(两个属性,四个方法)实例化100次,现在内存中的存储状态,
    几个对象,几个属性,几个方法。
    十三、谈谈Hibernate的理解,一级和二级缓存的作用,在项目中Hibernate都是怎么使用缓存的
    十四、反射讲一讲,主要是概念,都在哪需要反射机制,反射的性能,如何优化
    十五、谈谈Hibernate与Ibatis的区别,哪个性能会更高一些
    十六、对Spring的理解,项目中都用什么?怎么用的?对IOC、和AOP的理解及实现原理
    十七、线程同步,并发操作怎么控制
    十八、描述struts的工作流程。
    十九、Tomcat的session处理,如果让你实现一个tomcatserver,如何实现session机制
    二十、关于Cache(Ehcache,Memcached)
    二一、sql的优化相关问题
    二二、oracle中 rownum与rowid的理解,一千条记录我查200到300的记录怎么查?
    二三、如何分析ORACLE的执行计划?
    二四、 DB中索引原理,种类,使用索引的好处和问题是什么?
    二五、JVM垃圾回收实现原理。垃圾回收的线程优先级。
    二六、jvm 最大内存设置。设置的原理。结合垃圾回收讲讲。


    1、了解j2EE规范,选择几点进行重点消化。
    2、异常分类,一般性异常和运行期异常,异常捕获。
    3、了解spring mvc框架,和struts mvc框架的区别。
    4、要对spring和ibatis非常熟悉,必须,熟知。
    5、应适当关注需求分析和产品方面的知识。
    6、了解多线程相关知识
    7、了解java5以及java6新特性
    8、熟悉linux相关命令操作。
    9、工厂模式,简单工厂、抽象工厂的区别
    10、动态代理模式
    11、

    一、String,StringBuffer, StringBuilder 的区别是什么?String为什么是不可变的?
    二、VECTOR,ARRAYLIST, LINKEDLIST的区别是什么?
    三、HASHTABLE, HASGMAQ,TreeMap区别
    四、ConcurrentMap和HashMap的区别
    五、Tomcat,apache,jboss的区别
    六、GET POST区别
    七、SESSION, COOKIE区别
    八、Servlet的生命周期
    九、HTTP 报文包含内容
    十、Statement与PreparedStatement的区别,什么是SQL注入,如何防止SQL注入
    十一、redirect, foward区别
    十二、关于JAVA内存模型,一个对象(两个属性,四个方法)实例化100次,现在内存中的存储状态,
    几个对象,几个属性,几个方法。
    十三、谈谈Hibernate的理解,一级和二级缓存的作用,在项目中Hibernate都是怎么使用缓存的
    十四、反射讲一讲,主要是概念,都在哪需要反射机制,反射的性能,如何优化
    十五、谈谈Hibernate与Ibatis的区别,哪个性能会更高一些
    十六、对Spring的理解,项目中都用什么?怎么用的?对IOC、和AOP的理解及实现原理
    十七、线程同步,并发操作怎么控制
    十八、描述struts的工作流程。
    十九、Tomcat的session处理,如果让你实现一个tomcatserver,如何实现session机制
    二十、关于Cache(Ehcache,Memcached)
    二一、sql的优化相关问题
    二二、oracle中 rownum与rowid的理解,一千条记录我查200到300的记录怎么查?
    二三、如何分析ORACLE的执行计划?
    二四、 DB中索引原理,种类,使用索引的好处和问题是什么?
    二五、JVM垃圾回收实现原理。垃圾回收的线程优先级。
    二六、jvm 最大内存设置。设置的原理。结合垃圾回收讲讲。


    广州java开发工程师,昨天下午1,2面,今天3,4面,感觉效率挺高的,就等通知了
    简单说一下流程吧
      1面,一个挺帅气的面试官,不断地问一个算法题,一个基础知识问题,一个项目问题,循环地进行,
    一共5,6轮吧,中间还问了一题情景题,大概一个小时,算法题不难,比如找出乱序数组中的相同元素,整数求二进制的1的个数等,
    感觉考的是你写程序的习惯和思维是否周密,基础题就是jdk,gc,jvm之类的问题,考的很细。最后的问题是内存里一个hashmap
    和一个文本里的内容同步的实现方法,当时答不上来,面试就结束了,后来回学校才想到一个方法。
      2面,两个男的面试官轮流问我问题,同样是问技术的,spring里一些核心原理,jdk1.5的新类库,分布式系统,数据库,linux(这个不懂...)等等,
    感觉是车轮战,看你的知识广度和反应力....
      3面, 产品经理的面试,更多的是针对我项目里的问题提问,会问深入的问题,比如spring的aop是如何用java实现的....
      4面,hr面,比较轻松吧,拉拉家常,随便谈谈,问问我的西装,身高之类的

    感觉我自己尽力了,会的都答上,现在就看淘宝发不发offer给我了,后来还去了阿里巴巴b2b面试,考的内容基本差不多,而且更注重你是如何学习的
    一直觉得java的面经很少,希望这可以帮到大家

    posted @ 2011-05-10 17:31 哈希 阅读(4085) | 评论 (0)编辑 收藏

    1.触发器的作用?
     答:触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。
    2。什么是存储过程?用什么来调用?
    答:存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程。
    3。索引的作用?和它的优点缺点是什么?
    答:索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。
    3。什么是内存泄漏?
    答:一般我们所说的内存泄漏指的是堆内存的泄漏。堆内存是程序从堆中为其分配的,大小任意的,使用完后要显示释放内存。当应用程序用关键字new等创建对象时,就从堆中为它分配一块内存,使用完后程序调用free或者delete释放该内存,否则就说该内存就不能被使用,我们就说该内存被泄漏了。
    4。维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么?
    答:我是这样做的,尽可能使用约束,如check,主键,外键,非空字段等来约束,这样做效率最高,也最方便。其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。
    5。什么是事务?什么是锁?
    答:事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。
     锁:在所以的DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。
    6。什么叫视图?游标是什么?
    答:视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。
     游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。
    7。为管理业务培训信息,建立3个表:

        S(S#,SN,SD,SA)S#,SN,SD,SA分别代表学号,学员姓名,所属单位,学员年龄

        C(C#,CN)C#,CN分别代表课程编号,课程名称

         SC(S#,C#,G) S#,C#,G分别代表学号,所选的课程编号,学习成绩

       (1)使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名?

             答案:select s# ,sn from s where S# in(select S# from c,sc where c.c#=sc.c# and cn=’税收基础’)

         (2) 使用标准SQL嵌套语句查询选修课程编号为’C2’的学员姓名和所属单位?

    答:select sn,sd from s,sc where s.s#=sc.s# and sc.c#=’c2’

         (3) 使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位?

    答:select sn,sd from s where s# not in(select s# from sc where c#=’c5’)

          (4)查询选修了课程的学员人数

    答:select 学员人数=count(distinct s#) from sc

          (5) 查询选修课程超过5门的学员学号和所属单位?

    答:select sn,sd from s where s# in(select s# from sc group by s# having count(distinct c#)>5)


    posted @ 2011-05-08 08:28 哈希 阅读(222) | 评论 (0)编辑 收藏

    一.什么是事务  
         事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。
        事务的结束有两种,当事务中的所以步骤全部成功执行时,事务提交。如果其中一个步骤失败,将发生回滚操作,撤消撤消之前到事务开始时的所以操作。
            二.事务的 ACID
        事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )。这四个特性简称为 ACID 特性。
    1 、原子性
        事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
    2 、一致性  
         事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。  
    3 、隔离性
        一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
    4 、持续性
       也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。

    数据库系统必须维护事务的以下特性 ( 简称 ACID) :

       原子性 (Atomicity)

      一致性 (Consistency)

      隔离性 (Isolation)

      持久性 (Durability)

    原子性 (Atomicity)

    事务中的所有操作要么全部执行,要么都不执行;

    如果事务没有原子性的保证,那么在发生系统

    故障的情况下,数据库就有可能处于不一致状

    态。

     

    原子性 (Atomicity)

    如果故障发生在 write(A) 和 read(B) 之间,则将有可能造成帐户 A 的余额已经减去 50 元钱,而帐户 B 的余额却没有改变,凭空就少了 50 元钱。值得注意的是,即使没有故障发生,系统在某一时刻也会处于不一致状态。原子性的要求就是这种不一致状态除了在事务执行当中出现外,在其他任何时刻都 是不可见的。保证原子性是 DBMS 的责任:即事务管理器和恢复管理器的责任。

     

    一致性 (Consistency)

    主要强调的是,如果在执行事务之前数据库是一致的,那么在执行事务之后数据库也还是一

    致的;所谓一致性简单地说就是数据库中数据的完整性,包括它们的正确性。对于图中的事务 Ti 来说,一致性要求就是事务的执行不改变帐户 A 和帐户 B 的和。否则的话事务就会创造或销毁钱!单个事务的一致性是由对该事务进行编键的应用程序员的责任,但是在某些情况下利用 DBMS 中完整性约束 ( 如触发器 ) 的自动检查功能有助于一致性的维护。

     

    隔离性 (Isolation)

    即使多个事务并发(同时)执行,每个事务都感觉不到系统中有其他的事务在执行,因而也

    就能保证数据库的一致性;事情的起因 : 即使每个事务都能保持一致性和原子性,但如果几个事务并发执行,且访问相同的数据项,则它们的操作会以人们所不希望的某种方式交叉执行,结果导致不一致的状态!访问相同数据项的两个事务并发执行

    解决办法 :

    如果几个事务要访问相同的数据项,为了保证数据库的一致性,可以让这几个事务:

    ① 串行执行:即一个接着一个地执行事务;

    ② 并发执行:即同时执行多个事务,但用并发控制机制来解决不同事务间的相互影响。隔离性的保证 :

    事务的隔离性能够确保事务并发执行后的系统状态与这些事务按某种次序串行执行后的状态是等价的。

    保证隔离性也是 DBMS 的责任:即并发控制管理器的责任。

     

    持久性 (Durability)

    事务成功执行后它对数据库的修改是永久的,即使系统出现故障也不受影响。

    持久性的含义是说:一旦事务成功执行之后,它对数据库的更新是永久的。可以用以下两种

    方式中的任何一种来达到持久性的目的:

    以牺牲应用系统的性能为代价

    以多占用磁盘空间为代价

    以牺牲应用系统的性能为代价:要求事务对数据库系统所做的更新在事务结束前已经写入磁盘;以 多占用磁盘空间为代价:要求事务已经执行的和已写到磁盘的、对数据库进行更新的信息是充分的(例如,数据库日志的信息就足够的多),使得 DBMS 在系统出现故障后重新启动系统时,能够 ( 根据日志 ) 重新构造更新。保证持久性也是 DBMS 的责任:即恢复

    管理器的责任。

     

    事物的状态有如下几种:

    ⑴ 中止事务:执行中发生故障、不能执行完成的

    事务;

    ⑵ 事务回滚:将中止事务对数据库的更新撤消

    掉;

    ⑶ 已提交事务:成功执行完成的事务。

     

    系统的恢复步骤是:

    1 、反向扫描文件日志(即从最后向前扫描日志文件),查找该事务

    的更新操作。

    2 、对该事务的更新操作执行逆操作。即将日志记录 “ 更新前的值 ” 写

    入数据库。这样,如果记录中是插入操作,则相当于做删除操

    作;若记录中是删除操作,则做插入操作;若是修改操作,则相

    当于用修改前的值代替修改后的值。

    3 、继续反向扫描日志文件,查找该事务的其他更新操作,并做和 2

    一样的同样处理。

    4 、如此处理下去,直至读到此事务的开始标记,事务的故障恢复就

    完成了。

    事务的隔离级别

    隔离级别定义了事务与事务之间的隔离程度。

    隔离级别与并发性是互为矛盾的:隔离程度越高,数据库的并发性越差;隔离程度越低,数

    据库的并发性越好。

    ANSI/ISO SQL92 标准定义了一些数据库操作的隔离级别

       未提交读( read uncommitted )

       提交读( read committed )

       重复读( repeatable read )

       串行读( serializable )

    隔离级别的效果更新丢失( lost update ):当系统允许两个事务同时更新同一数据是,发生更新丢失。脏读( dirty read ):当一个事务读取另一个事务尚未提交的修改时,产生脏读。

    不可重复读取( nonrepeatableread ):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生不可重复读取。

    幻像( phantom read ):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。

    posted @ 2011-05-06 21:34 哈希 阅读(305) | 评论 (0)编辑 收藏

        泛型是1.5中引入的一个新的概念,由于 不用进行强制转换类型了,所以具有较高的安全性和易用性。因为泛型其实只是在编译器中实现的而虚拟机并不认识泛型类项,所以要在虚拟机中将泛型类型进行擦除。也就是说,在编译阶段使用泛型,运行阶段取消泛型,即擦除。 擦除是将泛型类型以其父类代替,如String 变成了Object等。其实在使用的时候还是进行带强制类型的转化,只不过这是比较安全的转换,因为在编译阶段已经确保了数据的一致性。
     

    java 泛型的残酷现实就是:

    在泛型代码内部,无法获得任何有关泛型参数类型的信息。

    在使用泛型时,任何具体的类型都被擦除,唯一知道的是你在使用一个对象。比如:List<String>和List<Integer>在运行事实上是相同的类型。他们都被擦除成他们的原生类型,即List。

    snippet 1:

    package com.cognizant.ch15;

    import java.lang.reflect.Array;
    import java.util.Arrays;

    public class ArrayMaker<T> {
        private Class<T> kind;

        public ArrayMaker(Class<T> kind) {
           this.kind = kind;
     }

     @SuppressWarnings("unckecked")
       T[] create(int size) {
           return (T[]) Array.newInstance(kind, size);
     }

      public static void main(String[] args) {
          ArrayMaker<String> stringMaker = new ArrayMaker<String>(String.class);
          String[] stringArray = stringMaker.create(10);
          System.out.println(Arrays.toString(stringArray));
     }
    }
    ouput:[null, null, null, null, null, null, null, null, null, null]

    由于擦除,kind实际上将被存储为了Class,非String.calss。在创建数组的时候,Array.newInstance()实际上并没有拥有kind所含的类型信息,因此就不会产生具体的结果。

    如果要创建一个容器而不是数组,情况却有点不同:

    snippet 2:

    public class ListMaker<T>{

       List<T> create(){

          return new ArrayList<T>();

    }

      public static void main(String[] args){

          ListMaker<String> stringMaker=new ListMaker<String>();

          List<String> stringList=stringMaker.create();

    }

    }

    擦 除使得create()内部的new ArrayList<T>中的<T>被擦除了,在运行时,这个类的内部没有任何<T>,但是又不能把 ArrayList<T>改为ArrayList,否则虽然编译器通过,但会给出警告。

    snippet 3:

    package com.cognizant.ch15;

    import java.util.ArrayList;
    import java.util.List;

    public class FilledListMaker<T> {
       List<T> create(T t, int n) {
       List<T> result = new ArrayList<T>();
        for (int i = 0; i < n; i++) {
           result.add(t);
      }
        return result;
     }

     public static void main(String[] args) {
        FilledListMaker<String> stringMaker = new FilledListMaker<String>();
        List<String> list = stringMaker.create("hello", 6);
        System.out.println(list);
     }
    }

    output:[hello, hello, hello, hello, hello, hello]

    编译器无法知道有关create中T的任何信息,但是他仍然可以在编译期确保放置到result中对象具有T类型。因此就有了一个现象:即使擦除在方法或类内部移除了实际类型的信息,编译器还是可以在方法或类的使用的类型的内部一致性。

    那么就有一个问题:擦除后的不知道又到知道其具体类型,他是这么做到的呢?

    答案是:擦除在方法体中移除了类型信息,所以在运行时的问题就是边界即对象进入和离开方法的地点,这正是编译器在编译期执行类型检查并插入转型代码的地点。

    泛型中的所有动作都发生在边界处:对传递进来的值进行额外的编译期检查,并插入 对传递出去的值的转型。

    由于不用进行强制转换类型了,所以具有较高的安全性和易用性。但泛型其实只是在编译器中实现的而虚拟机并不认识泛型类项,所以要在虚拟机中将泛型类型进行擦除。也就是说,在编译阶段使用泛型,运行阶段取消泛型,即擦除。
    这导致了一个问题:无法创建泛型数组。
    Java的泛型在编译时会擦除类型信息。Java中的数组是通过反射动态建立的。没有了类型信息怎么能构造出数组。

       



    posted @ 2011-05-06 21:16 哈希 阅读(196) | 评论 (0)编辑 收藏

    public class StringBufferTest
    {
    public  void operater(StringBuffer x,StringBuffer y)
    {
    //string.append(String)字符串添加函数
    x.append(y);
    y=x;
    System.out.println("operater输出:"+"a="+x+",b="+y);
    }
    public static void main(String [] args)
    {
    StringBuffer a=new StringBuffer("A");
    StringBuffer b=new StringBuffer("B");
    StringBufferTest test=new StringBufferTest();
    test.operater(a, b);
    System.out.println("main输出:a="+a + ",b=" +b);
    }
    java的引用类型是地址传递,可是在operater中和main中输出结果为什么不一样呢?


    在main中 a => new StringBuffer("A"); b => new StringBuffer("B"); 在test.operater(a, b);这句,传入的是两个引用 在operater方法中,b被重新赋值了,即引用地址改变了 ================ 补充一下:java中任何一个对象变量只是指向创建的对象的一个引用 例如 String a = "KKK"; 那么 “KKK”是创建的String对象, a 则是这个对象的引用,或者说a保存对象“KKK”在内存中的地址

    “==”与“Equals”区别

    ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。 equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。 ==比较的是2个对象的地址,而equals比较的是2个对象的内容。 显然,当equals为true时,==不一定为true;

    posted @ 2011-05-03 16:44 哈希 阅读(270) | 评论 (0)编辑 收藏

    string和stringbuffer区别
    这是好友面试的一道题,其实我知道使用的区别,StringBuffer必须new出来,StringBuffer的append的效率比string的+=的效率高,
    其实发现还有很大的区别,看了看以前scjp的考题

    Test


    答案是 javajavaC
    这是Java参数传递(by value)造成的
    而题目中第七行text = text.append ("C"),append方法会改变text中的值
    而这个text与main中的textBuffer是指向同一个对象,所以对应的输出是javac。
    string的值永远不会改变!
    String a = "a";//假设a指向地址0x0001,
    a = "b";//重新负值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的。
    从表面上看String类型的对象改变了值,但事实是他不能改变值,只能改变指向的地址
    StringBuffer则不同,直接改变指向的地址中保留的值
    还有

    public static void main(String[] args) {
            StringBuffer s1 
    = new StringBuffer("a");
            StringBuffer s2 
    = new StringBuffer("a");
            s1.equals(s2);
    //为什么是false
            System.out.println(s1.equals(s2));
            String s3 
    = new String("a");
            String s4 
    = new String("a");
            s3.equals(s4);
    //为什么是true
            System.out.println(s3.equals(s4));
        }
       


    StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,
    而Object类中的equals方法是用来比较地址的,所以等于false.

    String类中重新定义了equals这个方法,而且比较的是值,而不是地址。所以会是
    true。

    posted @ 2011-05-03 16:02 哈希 阅读(202) | 评论 (0)编辑 收藏

    1、
    输出三角形
    *
    **
    ***
    ****
    ***
    **
    *

    posted @ 2011-05-03 15:19 哈希 阅读(130) | 评论 (0)编辑 收藏

    1、很难理解输出形状吗?
        其实很简单,不要被它吓懵了,首先你要明白输出,就是按行执行的,而且有顺序的输出,好了,要什么形状先画出来,总结规律,写代码依次输出就OK了,如金字塔
    。。。。。*
    。。。。* * *
    。。。* * * * *
     这样理解:左边输出一个梯形,ok,5,4,3,右边三角形1,3,5,for(int i=0;i<3;i++)这是行数,每行要转弯<br/>,for(int j=5;j>3;j--)这是“。”的输出规律,for(int k=1;k<=2i-1;k++);这样就出来了!
     
    js输出金字塔
    2、日历的输出:
      
    日历

    3、数组的使用
      
    数组的使用

    4、
    不间断的字幕

    5、

    posted @ 2011-05-02 12:39 哈希 阅读(140) | 评论 (0)编辑 收藏

      MyEclipse断点调试JavaScript向你介绍了使用MyEclipse断点来调试JavaScript,希望对你有所帮助。

    MyEclipse断点调试JavaScript我们可以从以下的几个步骤来说明:

    1.在站点下准备两个文件:1.js和index.html,在index.html中引入1.js,点击index.html中的按钮,就会调用1.js中的test()方法:

    xml 代码

        
    1. ﹤html﹥  
    2. ﹤head﹥  
    3. ﹤meta http-equiv="Content-Type" content="text/html; charset=gb2312" /﹥  
    4. ﹤/head﹥  
    5. ﹤script type='text/javascript' src='./1.js'﹥﹤/script﹥  
    6. ﹤body﹥  
    7. ﹤input type="button" name="t" value="测试" onclick="test()"/﹥  
    8. ﹤/body﹥  
    9. ﹤/html﹥  

    2.启动tomcat后,用myEclipse的web2.0浏览器浏览页面:

    MyEclipse断点调试JavaScript1 

    MyEclipse断点调试JavaScript浅析图1

    3.在web2.0浏览器中,输入页面地址,出现页面后,点击工具栏中的“js调试”按钮,这时会在“Javascript Scripts Inspector”窗口中列出当前页面设计的所有js文件。选择需要断点调试的js文件,双击进入。

    MyEclipse断点调试JavaScript2 

    MyEclipse断点调试JavaScript浅析图2

    4.进入到1.js文件后,就可以给js代码加断点了:

    MyEclipse断点调试JavaScript3 

    MyEclipse断点调试JavaScript浅析图3

    5.这时再回到刚才web2.0的浏览页面,点击 按钮,调用1.js中的test()方法,系统就会自动跳转到调试状态,并定位到1.js中刚才设置断点的位置了。

    (我用的是myEclipse5,不知道5之前的版本可不可以这样)

    MyEclipse断点调试JavaScript就向你介绍到这里,希望对你有所帮助。

    posted @ 2011-05-01 21:28 哈希 阅读(203) | 评论 (0)编辑 收藏




    第2章 创建网站
    双击自动滚屏/单击停止
    字号:[大  小]
      本章教学目标

      在使用Dreamwear制作网页之前,必须首先创建网站或打开网站,此时Dreamwear会自动将所有网站资源(HTML文档、图片、动画、声音、程序等)都保存到网站文件夹中,从而保证网站发布后网页上的所有元素可以正常浏览。本章教学目标:

      • 学习设计、创建网站的基本步骤
      • 使用Dreamwear 建立本地站点操作方法
      • 使用Dreamwear 建立远程站点的操作方法
    本章主要内容
      2.1 规划网站
     

    2.2 创建本地站点

      2.3 创建远程站点 
      2.4 设置本地计算机为可访问服务器
       本章动画演示  
     
    · 建立本地站点
    · 建立远程站点
    2.1 规划网站

     在建立网站与制作网页之前首先要规划站点:

    ① 规划站点结构:合理的站点结构可以加快对站点的设计,提高工作效率。

    • 用文件夹保存文档:首先建一个根文件夹,然后在其中建若干子文件夹,分类存放网站全部文档。
    • 使用合理的文件名:文件夹名称与文件名称,用容易理解网页内容的英文名(或拼音),最好不要使用大写或中文。这是由于很多网站使用Unix操作系统,该操作系统对大小写敏感,且不能识别中文文件名。
    • 合理分配文档资源:不同的对象放在不同的文件夹中。不要将与网页制作无关的文件放置在该文件夹中。

    ② 规划站点导航机制:提供清晰易懂的浏览方法,采用统一的网页组织形式,引导用户轻松访问网站。

    • 建立返回主页链接:在每个页面上设置,避免迷失方向。
    • 显示网站专题目录:每一页面都应提供网站简明目录结构,引导用户快速进入。
    • 显示当前位置:在显著位置上标出当前页在网站中的位置。
    • 搜索索引反馈:数据网站应设搜索功能。
    • 反馈:设置管理员email信箱、意见反馈表单等功能。

    ③ 构建整体的站点风格:网站中网页风格应该统一,使网站特点鲜明,突出主题。

    • 风格统一:在多个网页上重复出现标识网站特征的某些对象。
    • 使用模板和库:快速批量创建相同风格的网页。
    2.2 创建本地站点 

      在制作 网页之前,必须首先创建网站或打开网站,此后Dreamwear会自动将所有网站资源(HTML文档、图片、动画、声音、程序等)都保存到网站文件夹中, 从而保证网站发布后网页上的所有元素可以正常浏览。网站分为本地站点(网站存放在本机硬盘上)与远程站点(网站存放在用于发布网站的服务器端)。

      使用dreamwear创建创建本地站点方法如下:

    1.打开站点定义”对话框。

     打开Dreamwear 选取站点菜单→选取管理站点项目→点击新建按钮→选取站点项目

    2.给站点命名

     选取站点名称文本方块,输入站点名称

    3.选取或建立站点文件夹

     点击浏览文件夹按钮→点击创建新文件夹按钮→输入新建的站点文件夹名后,选择该文件夹→点击打开按钮→点击选择按钮

    4.选取或建立默认图像文件夹

     选取默认图像文件夹文本框→点击浏览文件夹按钮→打开新建的站点文件夹→点击创建新文件夹按钮→输入图象文件夹名(images)后,选取该文件夹→点击打开按钮→点击选择按钮

    5.设置访问本机网站的Http地址

     选取HTTP 地址文本框→输入访问本机网站时的地址→点击确定按钮→点击完成按钮

     练习2-1
    1.在本机硬盘上创建一个本地站点,文件夹名用mysite,Http地址为
    http://localhost/mysite  
    站点名用自己姓名拼音缩写。
    2.在本地站点创建一个新文件夹(如Image),用于存放图形文件。
    3.在根文件夹下创建一个新文件。命名为default.htm,输入一些内容。
    4.按F12键预览网页

    2.3 创建远程站点 

      在创建了本地站点之后,使用[定义站点]命令设置或改变远程服务器信息。

    1.打开站点定义中远程信息设置对话框。

     选取站点菜单 → 选取管理站点项目 → 选取要编辑的网站 → 点击编辑按钮 → 选取远程信息项目

    2.设置访问类型

     选取访问框进行设置

    • [无]:如果不计划将站点上载到一个服务器时选择该项。
    • [本地/网络]:如果web服务器被映射为一个网络驱动器,或者是在本地机上运行web服务,选择该项。
    • [FTP]:若要使用FTP连接到Web服务器,选择该项。

    3.设置远端文件夹

     点击浏览文件夹按钮 →选取本地磁盘 (C:)项目→打开 Inetpub 文件夹→打开 wwwroot 文件夹→点击创建新文件夹按钮→输入文件夹名mysite(该文件夹名即为远程网站名)→点击选择按钮

    4.设置其它参数

    • 如果需要在添加和删除文件时[站点]窗口的[远端站点]栏可以自动更新,选取[自动刷新远程文件列表]选项。如果要提高向远程站点拷贝文件的速度,请不要选定该选项。(若要在任何时候手工刷新[站点]窗口,点击[站点]窗口的[刷新]按钮。)
    • 如果在协作环境中工作,则可以使用存回/取出系统在本地和远程站点之间传输文件。当文件取出后,Dreamweaver 会在“站点”面板上显示取出该文件的人员的名称,并且在该文件的图标旁显示选中标记。存回文件后本地版本将变为只读,一个锁形符号出现在“站点”面板上该 文件的旁边,以防止更改该文件
    • 如果只有一个人在远程站点上工作,则可以使用“获取”和“上传”命令传输文件,而不用存回或取出文件。

    5. 点击“确定”按钮后点击“完成”按钮

    2.4 设置本地计算机为可访问服务器

     如果要使本地计算机作为服务器接受访问,需要安装服务器程序(例如微软的PWS或IIS)并启动网站.
    一.启动网站方法:

    1) 在已安装IIS的计算机上,选择开始→设置→控制面板→管理工具→Internet信息服务,打开如下面板

    2) 选择网站下的默认网站,点击"启动"按钮

    二.在本地计算机发布网站方法

    方法一:
    1) 在Dreamwear中将远程站点设置为本地机的C:"Inetpub"wwwroot"站点文件夹(例如mysite)
    2) 点击上传文件按钮,将本地站点文件夹所有文件上传至远程站点

    方法二:
    1) 选择开始→程序→资源管理器
    ,找到本地站点文件夹
    2) 右键点击站点文件夹,在弹出的菜单中选择共享
    3)选择web共享选项卡
    4)选择共享文件夹
    5)在别名框中输入要发布的文件夹名称的别名(要求:字母或数字,不能是汉字或全角字符)
    6)点击"确定"

    三.浏览网站方法

     打开浏览器,输入访问地址:

    • 本机访问URL  http://localhost/发布的站点名   
      例如:http://localhost/mysite
    • 其他机访问URL http://IP地址或计算机名/发布的站点名例如:
      例如:http://st11/mysite
      http://10.1.5.128/mysite   
    • 查看本机IP地址方法:
      选择开始→运行→cmd→在dos提示符后输入ipconfig)
    • 查看本机计算机名方法:
      右键点击"我的电脑"→在弹出的菜单中选择"属性"→点击"计算机名"选项卡查看

    练习2-2
    1.在C:"Inetpub"wwwroot"文件夹下新建一个用于存放自己网站的文件夹,文件夹名mysite
    2.设置远程信息,选择服务器为“本地/网络”;远程站点文件的目录地址为C:"Inetpub"wwwroot"mysite
    3.将本地站点上传至远程站点后,刷新远程站点。
    4.使用URL地址访问自己所建的站点:
    本机访问URL  http://localhost/mysite
    其他机访问URL http://IP地址/mysite

    本章要点
    ·规划站点
    1. 用文件夹保存文档:首先建一个根文件夹,然后在其中建若干子文件夹,分类存放网站全部文档。
    2. 使用合理的文件名:文件夹名称与文件名称,用容易理解网页内容的英文名(或拼音),最好不要使用大写或中文。
    3. 合理分配文档资源:不同的对象放在不同的文件夹中。不要将与网页制作列关的文件放置在该文件夹中。

    ·建立本地站点操作步骤

    1. 打开站点定义”对话框
    2. 给站点命名
    3. 选取或建立站点文件夹
    4. 选取或建立默认图像文件夹
    5. 设置访问本机网站的Http地址
    ·建立远程站点操作步骤  1. 打开远程站点定义对话框
    2. 设置远程访问的类型
    3. 建立远程站点文件夹
    4. 设置参数
    5. 上传站点并访问

    posted @ 2011-04-30 00:24 哈希 阅读(175) | 评论 (0)编辑 收藏

    Web.xml
    二话不说看代码:
      
     
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4" 
        xmlns
    ="http://java.sun.com/xml/ns/j2ee" 
        xmlns:xsi
    ="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation
    ="http://java.sun.com/xml/ns/j2ee 
        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
      <servlet>
        
    <description>This is the description of my J2EE component</description>
        
    <display-name>This is the display name of my J2EE component</display-name>
        
    <servlet-name>ValidateView</servlet-name>
        
    <servlet-class>org.man.prj.ValidateView</servlet-class>
      
    </servlet>

      
    <servlet-mapping>
        
    <servlet-name>ValidateView</servlet-name>
        
    <url-pattern>/ValidateView</url-pattern>
      
    </servlet-mapping>
      
    <welcome-file-list>
        
    <welcome-file>index.jsp</welcome-file>
      
    </welcome-file-list>
    </web-app>

    package org.man.prj;

    import java.io.IOException;
    import java.io.PrintWriter;

    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    public class ValidateView extends HttpServlet {

        
    /**
         * The doGet method of the servlet. <br>
         *
         * This method is called when a form has its tag value method equals to get.
         * 
         * 
    @param request the request send by the client to the server
         * 
    @param response the response send by the server to the client
         * 
    @throws ServletException if an error occurred
         * 
    @throws IOException if an error occurred
         
    */
        
    public void doGet(HttpServletRequest request, HttpServletResponse response)
                
    throws ServletException, IOException {

            doPost(request, response);
        }

        
    /**
         * The doPost method of the servlet. <br>
         *
         * This method is called when a form has its tag value method equals to post.
         * 
         * 
    @param request the request send by the client to the server
         * 
    @param response the response send by the server to the client
         * 
    @throws ServletException if an error occurred
         * 
    @throws IOException if an error occurred
         
    */
        
    public void doPost(HttpServletRequest request, HttpServletResponse response)
                
    throws ServletException, IOException {

            response.setContentType(
    "text/html");
            PrintWriter out 
    = response.getWriter();
            out.println(
    "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
            out.println("<HTML>");
            out.println(
    "  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
            out.println(
    "  <BODY>");
            out.print(
    "    This is ");
            out.print(
    this.getClass());
            out.println(
    ", using the POST method");
            out.println(
    "  </BODY>");
            out.println(
    "</HTML>");
            out.flush();
            out.close();
        }

    }
    输入tomcat验证一下:
    http://localhost:8888/Validate/ValidateView


    posted @ 2011-04-29 15:11 哈希 阅读(255) | 评论 (0)编辑 收藏

    这三者存放的都是对象的引用
    Set是无序集合,里边的对象没有先后顺序,而且不能重复(重复是指:同一个类的对象,并且hashCode和equals方法的返回值相同)
    List是有序集合,里边的对象有先后顺序,并且可以重复(重复是指,当取得指定的对象时,同一个类的对象并且equals方法的返回值相同即为重复)
    Map中存放的键值对象的引用,但是键不能重复(键集即无序集合Set【具有Set重复的特性】)

    Set List 继承了Collection接口,可以使用Collection实现多态,而Map没有。



    posted @ 2011-04-29 14:40 哈希 阅读(121) | 评论 (0)编辑 收藏

    二叉树


    posted @ 2011-04-29 12:04 哈希 阅读(128) | 评论 (0)编辑 收藏

    一、oop唯一关心的是接口是什么,就像就像汽车销售商不需要管他是怎么制造的,只要关心他能不能燃烧燃料开动起来,只要知道(can or not)不要关心(how and      why):
    1、多态性:(java对象多态,java中不支持多重继承)
         允许不同类的对象最统一消息做出响应。多态性包括参数化多态和包含性多态性,多态性语言具有灵活抽象,行为共享的优势,很好解决了应用函数同名问题.
    2、封装:(隐藏细节)
         就是把把数据和行为结合在一起,并对对象使用者隐藏隐藏数据的实现过程,一个对象中的数据称为它的实例字段(instance);
    3、继承:(扩展一个类)
        允许在已经存在的类上构建新的类,当你继承一个已经存在的类时候那么你就 复用了这个类的方法和字段,同时你可以在新类中添加心得方法和字段;
    ?4、class(oop最重要的思想,类中构建一个对象,即创建这个类的一个实例)
        为编写可动态操纵java代码的程序提供了强大的功能反射,这项功能为javaBeans特别所有,能够分析类能力的程序角反射器,java中提供的功能包叫java.lang.reflect反射机制十分强大。
    5、接口:(不是一个类,对符合接口要求的类的一套规范)
        实现接口两个步骤:1、声明类需要实现的指定接口;
                          2、提供接口中所有接口的定义;
        接口是一个收集方法和常数的契约,当类执行一个接口,他就许诺在那个接口中声明的所有方法。接口是一个设备或者一个系统,它是用于交互的无关实体。根据这个定义,远程控制是一个你和电视的接口,而英语是两个人之间的接口。在java语言中接口是一种设备,它是用来与其他对象交互的设备。一个接口可能对一个协议是类似的,实际上其他语言也有接口,但是它们调用它的接口协议。
    6、动态绑定调用对象方法的机制
        (1)编译器检查对象声明的类型和方法名;(2)编译器检查方法调用的参数类型;(3)静态绑定:若方法类型为private static final编译器会准确知道调用哪个方法;(4)程序需要调动一个方法时,那么虚拟机必须调用参数所指向的对象的实际类型相匹配的方法。
    7、构造器(特殊的方法,构造对象并将其初始化)
       构造器可以有0个,一个或多个,构造器和类有相同的名字,一个类可以右多个构造器,构造器没有返回值,构造器总是和new字符一起运行的。
    8、final类(系统级的类,不可扩展)
       防止派生新类
    9、equal(判断两个对象是否相等)
    10、toString()返回一个代表该对象的字符串,几乎每一个类都会重载该方法,返回当前状态的正确表示;
    11、通用编程:
          任何类型的所有值都可以都可以用Object类型的变量来代替;
    12、内部类:(定义在一个类的内部的类)
           1、一个内部类的对象能够访问创建它的对象的实现,包括私有数据;
           2、对于同一个包中的类,呢不累可以隐藏起来;
           3、匿名内部类可以很方便的进行回调;
           4、使用内部类可以很方便的编写事件驱动程序;
    13、代理类:(proxy)
         A、指定接口要求所有代码;
         B、Object类定义的所有方法(equals,toString());

      


    posted @ 2011-04-29 11:32 哈希 阅读(296) | 评论 (0)编辑 收藏

    Java基础面试题系列一

    dev.firnow.com    时间 : 2008-02-19  作者:佚名   编辑:本站 点击:  1796 [ 评论 ]

    1、作用域public,private,protected,以及不写时的区别
    答:区别如下:
    作用域    当前类       同一package    子孙类       其他package
    public     √          √             √             √
    protected  √          √             √             ×
    friendly   √          √             ×             ×
    private    √          ×             ×             ×
    不写时默认为friendly


    2Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)
    答:匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现



    3Static Nested Class Inner Class的不同
    答:Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。注: 静态内部类(Inner Class)意味着1创建一个static内部类的对象,不需要一个外部类对象,2不能从一个static内部类的一个对象访问一个外部类对象


    4&&&的区别
    答:&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)


    5Collection Collections的区别
    答:Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
    Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作


    6、什么时候用assert
    答:assertion(断 言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表 达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或 退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布 后,assertion检查通常是关闭的



    7String s = new String("xyz");创建了几个String Object
    答:两个,一个字符对象,一个字符对象引用对象



    8Math.round(11.5)等於多少? Math.round(-11.5)等於多少
    :  Math.round(11.5)==12;Math.round(-11.5)==-11;round方法返回与参数最接近的长整数,参数加1/2后求其floor


    9short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错
    答:short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型)short s1 = 1; s1 += 1;(可以正确编译)


    10Java有没有goto
    答:java中的保留字,现在没有在java中使用



    11、数组有没有length()这个方法? String有没有length()这个方法
    答:数组没有length()这个方法,有length的属性。String有有length()这个方法


    12OverloadOverride的区别。Overloaded的方法是否可以改变返回值的类型
    答:方 法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重 载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重 写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名 的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型


    13Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别
    答:Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等
        equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值



    14、给我一个你最常见到的runtime exception
    答:常 见的运行时异常有如下这些 ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException



    15errorexception有什么区别
    答:error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况
        exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况



    16List, Set, Map是否继承自Collection接口
    答: List,Set是,Map不是


    17abstract classinterface有什么区别
    答:声 明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中 实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或 抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它 类可以在类中实现这些方法
    接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口 中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承 行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它 允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的 类是否实现了接口



    18abstractmethod是否可同时是static,是否可同时是native,是否可同时是synchronized
    都不能

     
    19、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)
    答:接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数


    20、构造器Constructor是否可被override
    答:构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading


    21、是否可以继承String
    答:String类是final类故不可以继承


    22try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后
    答:会执行,在return前执行


    23、用最有效率的方法算出2乘以8等於几
    答:2 << 3


    24、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对
    答:不对,有相同的hash code


    25、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递
    答:是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的


    26swtich是否能作用在byte上,是否能作用在long上,是否能作用在String
    答:witch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich


    27ArrayListVector的区别,HashMapHashtable的区别
    答:就ArrayList与Vector主要从二方面来说.
    一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的
    二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半
    就HashMap与HashTable主要从三方面来说。
    一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现
    二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
    三.值:只有HashMap可以让你将空值作为一个表的条目的key或value

    28char型变量中能不能存贮一个中文汉字?为什么?
    答:是能够定义成为一个中文的,因为java中以unicode编码,一个char占16个字节,所以放一个中文是没问题的


    29GC是什么为什么要有GC
    答:GC 是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至 崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。


    30floatfloat f=3.4是否正确?
    :不正确。精度不准确,应该用强制类型转换,如下所示:float f=(float)3.4
     

    posted @ 2011-04-28 18:02 哈希 阅读(162) | 评论 (0)编辑 收藏

    3.求子数组的最大和
    题目:
    输入一个整形数组,数组里有正数也有负数。
    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
    求所有子数组的和的最大值。要求时间复杂度为O(n)。

    例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
    因此输出为该子数组的和18。


    第10题
    翻转句子中单词的顺序。
    题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。

    句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
    例如输入“I am a student.”,则输出“student. a am I”。


    第14题:
    题目:输入一个已经按升序排序过的数组和一个数字,
    在数组中查找两个数,使得它们的和正好是输入的那个数字。
    要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
    例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。

     

    第17题:
    题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。 
    分析:这道题是2006年google的一道笔试题。

     

    第20题:
    题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。
    例如输入字符串"345",则输出整数345。

     

    第25题:
    写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)
    功能:
    在字符串中找出连续最长的数字串,并把这个串的长度返回,
    并把这个最长数字串付给其中一个函数参数outputstr所指内存。
    例如:"abcd12345ed125ss123456789"的首地址传给intputstr后,函数将返回9,
    outputstr所指的值为123456789


    26.左旋转字符串

    题目:
    定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。

    如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。
    要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。


    37.
    有n个长为m+1的字符串,
    如果某个字符串的最后m个字符与某个字符串的前m个字符匹配,则两个字符串可以联接,
    问这n个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。

     

    45.雅虎:
    1.对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)
    某一个元素也加一,现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到。

    2.一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
      比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1;
      {3,6}{2,4,3} m=2
      {3,3}{2,4}{6} m=3 所以m的最大值为3


    48.微软:
    一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}
    是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数。


    51.和为n连续正数序列。
    题目:输入一个正数n,输出所有和为n连续正数序列。

    例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。
    分析:这是网易的一道面试题。


    53.字符串的排列。
    题目:输入一个字符串,打印出该字符串中字符的所有排列。
    例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串
    abc、acb、bac、bca、cab和cba。

    分析:这是一道很好的考查对递归理解的编程题,
    因此在过去一年中频繁出现在各大公司的面试、笔试题中。

     

    54.调整数组顺序使奇数位于偶数前面。

    题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,
    所有偶数位于数组的后半部分。要求时间复杂度为O(n)。


    56.最长公共字串。
    题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,

    则字符串一称之为字符串二的子串。

    注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。
    请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。

    例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,
    则输出它们的长度4,并打印任意一个子串。

    分析:求最长公共子串(Longest Common Subsequence, LCS)是一道非常经典的动态规划题,
    因此一些重视算法的公司像MicroStrategy都把它当作面试题。


    63.在字符串中删除特定的字符。
    题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。

    例如,输入”They are students.”和”aeiou”,

    则删除之后的第一个字符串变成”Thy r stdnts.”。

    分析:这是一道微软面试题。在微软的常见面试题中,与字符串相关的题目占了很大的一部分,
    因为写程序操作字符串能很好的反映我们的编程基本功。

     

    69.旋转数组中的最小元素。
    题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,

    输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。

        分析:这道题最直观的解法并不难。从头到尾遍历数组一次,就能找出最小的元素,
    时间复杂度显然是O(N)。但这个思路没有利用输入数组的特性,我们应该能找到更好的解法。

     

    73.对策字符串的最大长度。
    题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。
    比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。

    分析:可能很多人都写过判断一个字符串是不是对称的函数,这个题目可以看成是该函数的加强版。

     

    85.又见字符串的问题
    1.给出一个函数来复制两个字符串A和B。
    字符串A的后几个字节和字符串B的前几个字节重叠。
    分析:记住,这种题目往往就是考你对边界的考虑情况。
    2.已知一个字符串,比如asderwsde,寻找其中的一个子字符串比如sde的个数,
    如果没有返回0,有的话返回子字符串的个数。


    88.2005年11月金山笔试题。编码完成下面的处理函数。
    函数将字符串中的字符'*'移到串的前部分,

    前面的非'*'字符后移,但不能改变非'*'字符的先后顺序,函数返回串中字符'*'的数量。
    如原始串为:ab**cd**e*12,
    处理后为*****abcde12,函数并返回值为5。(要求使用尽量少的时间和辅助空间)

     

    93.在一个int数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数。
    直观想法是用两个数组a、b。a[i]、b[i]分别保存从前到i的最大的数和从后到i的最小的数,

    一个解答:这需要两次遍历,然后再遍历一次原数组,
    将所有data[i]>=a[i-1]&&data[i]<=b[i]的data[i]找出即可。

    给出这个解答后,面试官有要求只能用一个辅助数组,且要求少遍历一次。


    94.微软笔试题
    求随机数构成的数组中找到长度大于=3的最长的等差数列9 d- x' W) w9 ?" o3 b0 R
    输出等差数列由小到大:
    如果没有符合条件的就输出
    格式:
    输入[1,3,0,5,-1,6]
    输出[-1,1,3,5]
    要求时间复杂度,空间复杂度尽量小


    96.08年中兴校园招聘笔试题
    1.编写strcpy 函数
    已知strcpy 函数的原型是
    char *strcpy(char *strDest, const char *strSrc);
    其中strDest 是目的字符串,strSrc 是源字符串。
    不调用C++/C 的字符串库函数,请编写函数 strcpy。

     

    ----------------

    1.关于本微软等公司数据结构+算法面试100题系列V0.1版的郑重声明
    http://blog.csdn.net/v_JULY_v/archive/2010/12/02/6050133.aspx
    2.完整100题,请参见,
    [珍藏版]微软等数据结构+算法面试100题全部出炉[100题首次完整亮相]
    http://blog.csdn.net/v_JULY_v/archive/2010/12/06/6057286.aspx
    3.更多详情,请参见,本人博客:
    My Blog:
    http://blog.csdn.net/v_JULY_v
    4.所有的资源(题目+答案)下载地址:
    http://v_july_v.download.csdn.net/
    5.本微软等100题系列V0.1版,永久维护(网友,思路回复)地址:
    http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html

    posted @ 2011-04-28 17:56 哈希 阅读(1311) | 评论 (0)编辑 收藏

    目: 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。   但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。
    1. package com.sw.suanfa.first.ten;  
    2. /** 
    3.  * 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。   
    4.  *  但是要保证汉字不被截半个, 
    5.  *  如“我ABC”4,应该截为“我AB”, 
    6.  *  输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。  
    7.  * @author songwei 
    8.  * 
    9.  *我的处理方式:截取字符串的一个字符,加入StringBuffer中,并取其字节数,并入当前获取字符的总长度中, 
    10.  *如果总长度大于等于输入的长度,则返回StringBuffer的toString值。 
    11.  *getSubString方法传入encoding值。UTF-8中文占3个字节,GBK占2个。结果有所不同,所以还是传入较好。 
    12.  *没有通过判断charAt的值来判定是否为中文等特殊字符。 
    13.  *不知道我这种方式是否正确。【未经过详细测试】 
    14.  */ 
       public class SubStringWithChina {  
              
      public static void main(String[] args) throws Exception{  
                    
                  String a 
      = "我ABC汉DEF" ;  
                  
      int len = 6 ;  
                  String encoding 
      = "UTF-8" ;  
                    
                  System.out.println( getSubString(a, len,encoding) );  
                  a 
      = "我ABC";  
                  len 
      = 4 ;  
                  encoding 
      = "gbk" ;  
                  System.out.println( getSubString(a, len,encoding) );  
              }  
                
              
      /** 
               *  
               * 
      @param str 传入字符串 
               * 
      @param len 截取字节数 
               * 
      @param encoding 编码方式 
               * 
      @return 返回截取后的字符串 
               * 
      @throws Exception 
               
      */  
              
      public static String getSubString(String str,int len,String encoding) throws Exception{  
                  
      if(str == null || str.length()<1return null ;  
                  
      if(len<1return null ;  
                  StringBuffer sb 
      = new StringBuffer();  
                  
      int all = 0 ;  
                  
      for(int i=0;i<str.length();i++){  
                      String tmp 
      = str.substring(i,i+1);  
                      sb.append(tmp);  
                      
      byte[] tmpB = tmp.getBytes(encoding);  
                      all 
      +=tmpB.length ;  
                      
      if(all>=len){  
                          
      break ;  
                      }  
                  }  
                  
      return sb.toString() ;  
              }  
          }
    15. 判断字符串中是否含有汉字:

       String str = "test中文汉字";
      String regEx = "[\\u4e00-\\u9fa5]";

      /**
      * 判断有没有中文
      */
      if (str.getBytes().length == str.length()) {
       System.out.println("无汉字");
      } else {
       System.out.println("有汉字");
      }

      /**
      * 如果有则打印出来
      */
      Pattern p = Pattern.compile(regEx);
      Matcher m = p.matcher(str);
      while (m.find()) {
       System.out.print(m.group(0) + "");
      }

      如题

    posted @ 2011-04-28 16:31 哈希 阅读(361) | 评论 (0)编辑 收藏

         摘要: 以前的收藏,估计很少有这么全的面试题集了 ^_^ 基础知识: 1.C++或Java中的异常处理机制的简单原理和应用。   当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内 置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发 ...  阅读全文

    posted @ 2011-04-28 15:20 哈希 阅读(83) | 评论 (0)编辑 收藏

    如下分成5个步骤
    1,建立xml文件
    2,建立bean的接口
    3,建立bean
    4,写测试程序
    5,测试

    准备工作
    环境配置如下,需要spring.jar和common-logging.jar两个jar文件

    开始
    1,建立xml文件
    文件名:beans.xml
    文件位置:src目录下
    文件内容:
    <?xml version="1.0" encoding="UTF-8"?>

    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

      <!-- the application context definition for the springapp DispatcherServlet -->

      <bean id="sayhello" class="test.service.impl.HelloBean"/>
       
    </beans>

    2,建立bean的接口
    文件名:Hello.java
    文件内容:
    package test.service;

    public interface Hello {

        public void sayHello();

    }

    3,建立bean
    文件名:HelloBean.java
    文件内容:
    package test.service.impl;

    import test.service.Hello;

    public class HelloBean implements Hello {
       
        /* (non-Javadoc)
         * @see test.service.impl.Hello#sayHello()
         */
        public void sayHello() {
            System.out.println("这是一个测试程序");
        }

    }

    4,写测试程序
    文件名:FirstSpring.java
    文件内容:
    package test.spring;

    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;

    import test.service.Hello;

    public class FirstSpring {
       
        public static void main(String[] args) {
            testHello();
        }
       
        public static void testHello() {
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
            Hello hello =(Hello) applicationContext.getBean("sayhello");
            hello.sayHello();
           
        }
    }

    5,测试
    运行FirstSpring.java文件,得到输出结果如下:
    2009-6-30 3:33:58 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    信息: Loading XML bean definitions from class path resource [beans.xml]
    2009-6-30 3:33:59 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory
    信 息: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@7259da]: org.springframework.beans.factory.support.DefaultListableBeanFactory@2e7820
    2009-6-30 3:33:59 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
    信 息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@2e7820: defining beans [sayhello]; root of factory hierarchy
    这是一个测试程序

    上面红字是spring输出的调试信息,蓝字是hellobean实际输入的内容。

    简单总结:
    1,环境配置中不要忘记了common-logging.jar文件,我最开始忘记了,还是用junit测试的,结果就是不通过。出错的原因也不明白。后来直接改成普通的main方法测试,才明白原因。

    2,bean的接口和实现的分离在spring中被贯彻执行。同时理解一下IOC(控制反转)的概念。
    3,spring中的bean,应该指的是执行各种业务的业务bean才是。不同于strut的formbean和对应db表对象的valuebean。

    posted @ 2011-04-28 12:19 哈希 阅读(170) | 评论 (0)编辑 收藏


    MyEclipse 怎样手动编译整个项目

    作者 Neot 写于 2008-12-31 | 3,737 次浏览

    MyEclipse 菜单 Project->Build Automatically 选中后,项目的文件会被自动编辑。要想手动编译整个项目,可使用菜单 Project->Build All 或 Project->Build Project。还有个比较笨的方法,就是运行整个项目。运行项目时,MyEclipse 会先对项目进行编译。

    但是有个问题,Build All、Build Project 菜单项常常是恢掉的,不可执行。其实,这是因为我们勾选了 Project->Build Automatically 项。取消掉 Project->Build Automatically 后,Build All 和 Build Project 菜单项就可以用了。

    [ 标签: myeclipse, 编译 ]
    [ 固定链接:http://blog.tanggaowei.com/2008/12/myeclipse-2.html ]

    为什么取消 MyEclipse 验证后还是有许多红叉叉

    作者 Neot 写于 2008-12-31 | 2,610 次浏览

    在 MyEclipse 的 windows–>perferences–>myeclipse–>validation 下,把除了manual 下面的全部点掉,build下只留 classpath dependency Validator,这样设置后,MyEclipse就不会老是验证 xml、jsp、html 等文件了。参考如下文章:

    Eclipse+MyEclipse的优化

    但是,我设置好了,在 Package Explorer 窗口却还是有许多的红叉叉。翻来覆去弄了好几次,情况都一样。最后,终于发现,在 Package Explorer 窗口 对项目点击右键,在出现的菜单中执行“MyEclipse->Remove All Validation Markers”,所有的红叉叉就都不见了。

    [ 标签: myeclipse, 优化, 验证 ]
    [ 固定链接:http://blog.tanggaowei.com/2008/12/myeclipse.html ]

    Eclipse 中怎样添加 Subversion 插件

    作者 Neot 写于 2008-10-30 | 3,280 次浏览

    Eclipse 中可以从菜单添加插件:[菜单]Help / Software Updates / Find and Install。在出现的 Install 窗口,选择“Search for new features to install”项,点击“Next”进入下一页。然后点击右侧的“New Remote Site”按钮,在出现的窗口中,设置“Name”项为“Subversion”,“URL”项为“http://subclipse.tigris.org/update/”,点击“OK”按钮。再点击“Finish”按钮,Ecplise 就会开始自动下载 Subversion 插件,并安装了。

    像 MyEclipse、Carbide 这些基于 Eclipse 的开发工具,同样适用这个方法。

    [ 标签: Carbide, eclipse, myeclipse, subversion ]
    [ 固定链接:http://blog.tanggaowei.com/2008/10/eclipse-subversion.html ]

    MyEclipse开发SSH(Struts+Spring+Hibernate)入门

    作者 Neot 写于 2007-12-13 | 16,744 次浏览

    (本文参考自 oksonic 的“Struts+Spring+Hibernate练习(完整)”)

    源码下载:http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=2857703

    1. 准备

    工具:MyEclipse 6.0.1 GAmysql-connector-java-5.0.4-bin.jarMySql GUI Tools 5.0(便于管理MySql数据库,不是必须)

    环境:Tomcat 5.5MySql 5.0

    1.1. 新建工程

    操作:[Menu] File/New/Web Project

    工程名:login

    2. Struts 部分


    2.1. 添加 Struts 功能支持

    操作:[Menu] MyEclipse/Project Capabilities/Add Struts Capabilities

    将 “yourcompany” 替换成 “login”。

    2.2. 创建 ActionForm 类

    操作:[Ctrl+N] MyEclipse/Web-Struts/Struts 1.2 Form

    类名:LoginForm

    在 “Use case” 里输入 “Login” 后,Name、Form type 等会自动填充。

    在 “Form Properties” 选项卡为 loginForm 新增两个属性:username、password,”Type” 和 “JSP input type” 分别保持默认的 “java.lang.String” 和 “text”;

    在 “JSP” 选项卡钩选 “Create JSP form” 选项,将新建路径改为 “/login.jsp”(login.jsp文件将被自动创建)。

    2.3. 创建 Action 类

    操作:[Ctrl+N] MyEclipse/Web-Struts/Struts 1.2 Action

    类名:LoginAction

    在 “Form” 选项卡的 “Name” 项选择 “loginForm”,”Input Source” 项输入 “/login.jsp”。

    2.4. 创建 index.jsp 文件

    如果没有,创建 index.jsp 文件,并添加一个指向 login.jsp 的链接:<a href = “login.jsp”>Login</a>

    2.5. 创建Forword类

    操作:[Ctrl+N] MyEclipse/Web-Struts/Struts 1.2 Forword

    类名:indexForword

    “Name” 项输入 “indexForword” ,”Path” 项选择 “/index.jsp” 。

    2.6. 修改 LoginAction.java 文件

    修改 LoginAction 类的 execute 方法:

    public class LoginAction extends Action {

    public ActionForward execute ( ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response ) {
    LoginForm loginForm = ( LoginForm ) form;

    String username = loginForm.getUsername();
    String password = loginForm.getPassword();

    if ( username.equals ( “test” ) && password.equals ( “test” ) ) {
    return mapping.findForward ( “indexForword” );
    } else {
    return mapping.getInputForward();
    }
    }
    }

    2.7. 修改 login.jsp 文件

    修改 <html:form> 标签:<html:form action=”/login”>

    2.8. 测试

    操作:[Menu] Run/Run,选择 MyEclipse Server Application 方式运行

    要正常执行Run操作,需先安装 Tomcat5.5 。

    点击 index.jsp 页面的 “Login” 链接,跳转到 login.jsp 页面。在 login.jsp 页面输入 “test/test”,应该会登录成功,然后跳转到 index.jsp 页面;输入 “test/123″ ,应该保持在 login.jsp 页面。

    如果测试成功,证明 Structs 运行正常。

    如果运行出错,请参考文章最后的“5. 问题集”。

    3. Spring 部分


    3.1. 添加 Spring 功能支持

    操作:[Menu] MyEclipse/Project Capabilities/Add Spring Capabilities

    Spring 版本( Spring version )选择 “Spring 1″;

    开发包(libraries)选择 “Spring 1.2 AOP Libraries、Spring 1.2 Core Libraries、Spring 1.2 Persistence Core Libraries、Spring 1.2 Persistence JDBC Libraries” 四项;

    JAR Library Installation 选择 “copy checked…” ,”Library Folder” 项选择 “/WebRoot/WEB-INF/lib”(这样的话所需的类库都将拷贝到项目目录,方便以后的布署)。

    点击 “下一步(Next)” 创建配置文件,修改文件路径(Folder)到 “WebRoot/WEB-INF” 目录(以便和Struts配置文件一起管理),文件名称为默认的”applicationContext.xml”。

    点击 “完成(Finish)” 。

    3.2. 配置 struts-config.xml 文件

    添加 Spring 插件(在 <message-resources> 标签后面添加):

    <plug-in className=”org.springframework.web.struts.ContextLoaderPlugIn”>
    <set-property property=”contextConfigLocation” value=”/WEB-INF/applicationContext.xml” />
    </plug-in>

    修改 LoginAction 的配置(只需修改 type 属性):

    <action-mappings >
    <action
    attribute=”loginForm”
    input=”/login.jsp”
    name=”loginForm”
    path=”/login”
    scope=”request”
    type=”org.springframework.web.struts.DelegatingActionProxy” />

    </action-mappings>

    绿色字体部份为被修改过的内容,这里将使用 spring 的代理器 DelegatingActionProxy 来对 Action 进行控制。

    3.3. 修改 Spring 配置文件 applicationContext.xml

    <?xml version=”1.0″ encoding=”UTF-8″?>
    <!DOCTYPE beans PUBLIC “-//SPRING//DTD BEAN//EN” “http://www.springframework.org/dtd/spring-beans.dtd”>

    <beans>
    <bean name=”/login” class=”com.login.struts.action.LoginAction” singleton=”false”></bean>
    </beans>

    绿色字体是关于接受和处理 Action 控制权的配置内容,”com.login.struts.action.LoginAction” 即为原 struts 里的配置。

    3.4. 测试

    同上一次测试。测试成功证明 Spring 运行正常。

    如果运行出错,请参考文章最后的“5. 问题集”。

    4. Hibernate 部分

    下面开始 Hibernate 部分,将原例修改为使用数据库进行用户名/密码验证。

    4.1. 创建 mysql 数据库和表

    添加表的代码如下:

    CREATE TABLE user_table(
    ID int NOT NULL auto_increment,
    USERNAME varchar(45) NOT NULL default ”,
    PASSWORD varchar(45) NOT NULL default ”,
    PRIMARY KEY (ID)
    )

    再添加一条记录:

    insert into user_table (USERNAME,PASSWORD) values (‘test’,'test’)

    4.2. 创建 MyEclipse 数据库驱动(DB Driver)

    操作:[Menu] MyEclipse/Prefrences/MyEclipse/Database Explorer/Database Driver/DB Brower

    在 DB Brower 的菜单中选择 “New” ,”Driver Name” 项输入 “login-conn” ,”Connection URL” 项输入 “jdbc:mysql://localhost:3306/test” ,然后输入 MySql 的用户名(User Name)和密码(Password),按实际情况输入;

    在 “Driver JARs” 项添加 “mysql-connector-java-5.0.4-bin.jar” (可从网上下载),在 “Driver classname” 里选择 “com.mysql.jdbc.Driver” ,其它自选。

    点击 “完成(Finish)”。

    4.3. 添加 Hibernate 功能支持

    操作:[Menu] MyEclipse/Project Capabilities/Add Hibernate Capabilities

    Hibernate 版本(Hibernate Specification)选择 “Hibernate 3.1″ ,开发包(libraries)选择 Hibernate 3.1 Core Libraries 一项;

    JAR Library Installation 选择 “copy checked…” ,”Library Folder” 选择 “/WebRoot/WEB-INF/lib” 。

    点击 “下一步(Next)” 设置配置文件:

    选择 “Spring configuration file (applicationContext.xml)” 。

    “下一步(Next)” 设置 Spring-Hibernate:

    选择 “Existing Spring configuration file” ,”SessionFactory ID” 项输入 “sessionFactory” 。

    “下一步(Next)” 创建数据源对象:

    在 Bean Id 中输入 dataSource,”DataSource” 项选择 “Use JDBC Dirver” ,DB Driver 项选择 “login-conn” ,其余项会自动填充。

    记得选中 “Copy DB driver jar(s) to project and add to buidpath” 项,以便将数据连接的库文件复制到项目,方便以后的布署。

    “下一步(Next)” 创建 SessionFactory 类:

    “Java package” 项设置为 “com.login.Hibernate” (如果没有,点击 “New” 按钮添加),”Class name” 项修改为 “SessionFactory” ,Java Compliance Level 选择和创建项目时选择的 Java 版本。(本例中并没有用到 SessionFactory 类,留作今后扩展)

    点击 “完成(Finish)”。

    4.4. 创建对象关系映射(ORM)的相关文件

    操作:[Menu] Window/Open Perspective/MyEclipse Database Explorer

    选中 user_table 表,点击右键,在出现的菜单中选择 “Hibernate Reverse Engnieering” 。

    在弹出的窗口中保持 “Java package” 项为 “com.login” ;

    选中 “Hibernate mapping file (*.hbm.xml) for each databases table” ,并保持 “Update hibernate…” 项选中;

    选中 “Java Data Object” 项,并保持 “Create abstract class” 选中;

    “Base persistent class” 项留空;

    取消 “Java Data Access Object…” 项和 “Use custom templates” 项。

    点击 “下一步(Next)” ,再点击 “下一步(Next)” ,在 “Configure reverse engineering details” 页选中 “user_table” 表,在右边出现的 “Class Name” 项中输入 “com.login.User”,其它不变。

    点击 “完成(Finish)”。

    完成此操作,会在 “com.login” 包下创建三个文件:AbstractUser.java、User.java、User.hbm.xml。

    4.5. 创建 UserDAO.java 接口

    操作:[Ctrl+N] Interface,点击 “下一步( Next )”

    在出现的 “New Java Interface” 窗口中,将 “Source Folder” 设置为 “login/src”,将 “Package” 设置为 “com.login”, 将 “Name”  项设为 “UserDAO”,然后点击 “完成( Finish )” 按钮。

    UserDAO.java 内容如下:

    package com.login;

    public interface UserDAO {
    public abstract boolean isValidUser( String username, String password );
    }

    4.6. 创建 UserDAOImpl.java 类

    操作:[Ctrl+N] Class,点击 “下一步( Next )”

    在出现的 “New Java Class” 窗口中,将 “Source Folder” 设置为 “login/src”,将 “Package” 设置为 “com.login”, 将 “Name”  项设为 “UserDAOImpl”,在 “Supperclass” 项输入 “org.springframework.orm.hibernate3.support.HibernateDaoSupport”,在 “Interface” 项中添加 “com.login.UserDAO” 接口,然后点击 “完成( Finish )” 按钮。

    UserDAOImpl 通过 Hibernate 访问数据库,做用户验证。

    UserDAOImpl.java 内容如下:

    package com.login;

    import java.util.List;
    import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

    public class UserDAOImpl extends HibernateDaoSupport implements UserDAO {
    private static String hql = “from User u where u.username=? “;

    public boolean isValidUser( String username, String password ) {
    // 验证用户
    List userList = this.getHibernateTemplate().find( hql, username );
    if ( userList.size() > 0 ) {
    return true;
    }
    return false;
    }
    }

    4.7. 修改 LoginAction.java 文件

    使用 UseDAO 对象来验证:

    package com.login.struts.action;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.struts.action.Action;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;
    import com.login.struts.form.LoginForm;
    import com.login.UserDAO;

    public class LoginAction extends Action {
    private UserDAO userDAO;

    public UserDAO getUserDAO() {
    return userDAO;
    }

    public void setUserDAO(UserDAO userDAO) {
    this.userDAO = userDAO;
    }

    public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) {

    LoginForm loginForm = (LoginForm) form;
    String username=loginForm.getUsername();
    String password=loginForm.getPassword();

    if( userDAO.isValidUser( username, password ) ){
    return mapping.findForward( “indexForword” );
    }else{
    return mapping.getInputForward();
    }
    }
    }

    绿色字体为修改部分。

    4.8. Spring 的最终配制文件 applicationContext.xml

    <?xml version=”1.0″ encoding=”UTF-8″?>
    <!DOCTYPE beans PUBLIC “-//SPRING//DTD BEAN//EN” “
    http://www.springframework.org/dtd/spring-beans.dtd”>

    <beans>

    <bean id=”dataSource” class=”org.apache.commons.dbcp.BasicDataSource”>
    <property name=”driverClassName” value=”com.mysql.jdbc.Driver”></property>
    <property name=”url” value=”jdbc:mysql://localhost:3306/test”></property>
    <property name=”username” value=”root”></property>
    <property name=”password” value=”root”></property>
    </bean>

    <!– 配置sessionFactory, 注意这里引入的包的不同 –>
    <bean id=”sessionFactory” class=”org.springframework.orm.hibernate3.LocalSessionFactoryBean”>
    <property name=”dataSource”>
    <ref local=”dataSource” />
    </property>
    <property name=”mappingResources”>
    <list>
    <value>com/login/User.hbm.xml</value>
    </list>
    </property>
    <property name=”hibernateProperties”>
    <props>
    <prop key=”hibernate.dialect”>org.hibernate.dialect.MySQLDialect</prop>
    <prop key=”hibernate.show_sql”>true</prop>
    </props>
    </property>
    </bean>

    <bean id=”transactionManager” class=”org.springframework.orm.hibernate3.HibernateTransactionManager”>
    <property name=”sessionFactory”>
    <ref local=”sessionFactory” />
    </property>
    </bean>

    <bean id=”userDAO” class=”com.login.UserDAOImpl”>
    <property name=”sessionFactory”>
    <ref local=”sessionFactory” />
    </property>
    </bean>

    <bean id=”userDAOProxy” class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”>
    <property name=”transactionManager”>
    <ref bean=”transactionManager” />
    </property>
    <property name=”target”>
    <ref local=”userDAO” />
    </property>
    <property name=”transactionAttributes”>
    <props>
    <prop key=”insert*”>PROPAGATION_REQUIRED</prop>
    <prop key=”get*”>PROPAGATION_REQUIRED,readOnly</prop>
    <prop key=”is*”>PROPAGATION_REQUIRED,readOnly</prop>
    </props>
    </property>
    </bean>

    <bean name=”/login” class=”com.login.struts.action.LoginAction” singleton=”false”>
    <property name=”userDAO”>
    <ref bean=”userDAOProxy” />
    </property>
    </bean>

    </beans>

    4.9. 测试

    同第一次测试。

    如果运行出错,请参考文章最后的“5. 问题集”。

    5. 问题集

    5.1. Console 错误信息: java.net.BindException: Address already in use: JVM_Bind:8080

    • 原因:有其它进程占用了 8080 端口,导致绑定失败。
    • 解决:如果是有 Tomcat 启动了,将其关闭,MyEclipse 会自己启动 Tomcat。

    5.2. HTTP 错误信息:message Servlet action is not available

    • 原因:找不到相关类。可能配置文件中的某些类或文件的路径填写错误,或是缺少 jar 包。
    • 解决:如果是在添加 Spring 特性后产生的,可能是 /WEB-INF/lib/ 中缺少 spring.jar 包。从 MyEclipse 目录搜索出 1.2 版的 spring.jar,并将其复制到项目的 /WEB-INF/lib/ 目录下。

    5.3. Console 错误信息:java.sql.SQLException: Access denied for user: ‘root@localhost’ (Using password: YES)

    • 原因:数据库访问被拒绝。可能由于 MySQL 密码被设置成空,而 MyEclipse 又不支持空密码。
    • 解决:将 MySQL 的 root 用户密码设置成非空,如 “root”,然后修改 MyEclipse 中刚才添加的 login-conn 数据源信息的密码项。
    [ 标签: hibernate, j2ee, myeclipse, spring, struts ]
    [ 固定链接:http://blog.tanggaowei.com/2007/12/myeclipsesshstrutsspringhibernate.html ]

    订阅

     

    手机访问

    http://blog.tanggaowei.com/wap/
    
    Google
     

    posted @ 2011-04-28 09:39 哈希 阅读(177) | 评论 (0)编辑 收藏

    public class TestClass {

        
    public TestClass() {
            System.out.println(
    "wll");
        }
         
         
        
        
    public static void main(String[] args) {
            TestClass tc
    =new TestClass();
        }
        
        
        
    }

    继承



    排序




    posted @ 2011-04-27 14:48 哈希 阅读(153) | 评论 (0)编辑 收藏


    区别一:

      重定向时浏览器上的网址改变

      转发是浏览器上的网址不变

    区别二:

      重定向实际上产生了两次请求

    转发只有一次请求 

    重定向: 

      发送请求 -->服务器运行-->响应请求,返回给浏览器一个新的地址与响应码-->浏览器根据响应码,判定该响应为重定向,自动发送一个新的请求给服务器,请求地址为之前返回的地址-->服务器运行-->响应请求给浏览器 

    转发: 

      发送请求 -->服务器运行-->进行请求的重新设置,例如通过request.setAttribute(name,value)-->根据转发的地址,获取该地址的网页-->响应请求给浏览器 

    区别三:

      重定向时的网址可以是任何网址

      转发的网址必须是本站点的网址

    详解:

      重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。
    转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。

    正文开始: 

      先是看上去不同,他们的调用分别如下:
    request.getRequestDispatcher("apage.jsp").forward(request, response);//转发到apage.jsp
    response.sendRedirect("apage.jsp");//重定向到apage.jsp
    在jsp页面中你也会看到通过下面的方式实现转发:
    <jsp:forward page="apage.jsp" />
    我在初学jsp的时候,对这两个概念非常模糊,看别人的例子的时候,也是一头雾水,不知道什么时候该用哪个。希望下面的解说能对你有所帮助。
    提到转发和重定向就不得不提到request作用域。很多初学者都知道当我们提交一个表单时,就创建了一个新的请求。实际上,当我们点击一个链接时,也创建了一个新的请求。那么一个请求的作用于到底有多大呢?例如:
    在页面a.jsp中有一个链接<a href="b.jsp?id=1">这是指向b的一个链接,而且还带了一个参数</a>。当我们点击这个连接的时候,就产生了一个请求,为了明确起见,我们把它叫做requestA->B。现在,在b.jsp页面中我们就可以从这个请求中获取信息了。在b.jsp中你可以写入out.println(request.getParameter("id"))进行测试。下面更复杂一点,我们在b.jsp页面中增加下面的语句:
    request.setAttribute("name","funcreal");
    out.println(request.getAttriblute("name"));//成功显示了name变量的值。
    现在在b.jsp中再增加一个链接:<a href="c.jsp?age=23">这是指向c的一个链接,而且还带了一个参数</a>,当我们点击这个连接的时候,将产生一个新的请求,这时requestA-B也就安息了,新的请求叫做requestB-C。同样的道理,在c.jsp中,我们可以访问到的变量只有age,因为id,name这两个变量都属于requestA-B,此时他已经不存在了。下面是源代码:
    a.jsp
    <%@ page contentType="text/html; charset=GBK" %>
    <html>
    <body bgcolor="#ffffff">
    <a href="b.jsp?id=1">指向b.jsp,而且还带了一个参数id=1。requestA-B现在诞生了</a>
    </body>
    </html> 

    b.jsp
    <%@ page contentType="text/html; charset=GBK" %>
    <html>
    <body bgcolor="#ffffff">
    <%
    out.println("id=" + request.getParameter("id"));
    request.setAttribute("name","Func Real");
    out.println("name=" + request.getAttribute("name"));
    %>
    <a href="c.jsp?age=23">requestA-B已经结束了。指向c.jsp,而且还带了一个参数age=23</a>
    </body>
    </html> 

    c.jsp
    <%@ page contentType="text/html; charset=GBK" %>
    <html>
    <body bgcolor="#ffffff">
    <%
    out.println("id=" + request.getParameter("id"));
    out.println("name=" + request.getAttribute("name"));
    out.println("age=" + request.getParameter("age"));
    %>
    </body>
    </html> 

      那么转发又是怎么回事呢?现在增加一个页面叫做d.jsp,并且在c.jsp中</body>前面增加一句<jsp:forward page="d.jsp"/>
    d.jsp
    <%@ page contentType="text/html; charset=GBK" %>
    <html>
    <body bgcolor="#ffffff">
    requestB-C的魔爪已经伸到了d.jsp页面
    <%
    out.println("age=" + request.getParameter("age"));
    %>
    </body>
    </html>
    运行程序,你会发现c页面中的内容没有显示出来,因为forward是自动执行的,地址栏中虽然是c.jsp但实际上,但浏览器中显示的已经是d.jsp的内容了,而且看到了从b.jsp传过来的参数。你可以简单得这样理解:转发,就是延长了requestB-C的作用域,<jsp:forward page="d.jsp"/>,这一句话实际上是把c.jsp和d.jsp粘到了一起,他们就像是在一个页面中。
    如果你用过struts,那么你就知道为什么在Action中,最后一句几乎总是mapping.findForward("xxx");了。因为我们在这个Action中设置的请求作用域的变量都将会在下一个页面(也许是另一个Action)中用到,所以要用转发。 

    总结:
    用重定向和转发不是一个习惯问题。而是什么情况下必须用什么的问题。

    posted @ 2011-04-26 23:13 哈希 阅读(174) | 评论 (0)编辑 收藏

         摘要: 核心提示:现在开发的一个项目使用S2SH框架,配置环境用了一两天, 现在把当时配置环境时写的文档整理下发出来,也算加强点记忆。 1 开发环境 MyEclipse5.5 JDK 1.6 Java EE 5.0 Tomcat6.0 Struts2.1.6 Spring2.5.6 Hibernate3.3.1 2 为 ssh 做好准备 2.1 下载包 Struts2   ...  阅读全文

    posted @ 2011-04-26 21:14 哈希 阅读(230) | 评论 (0)编辑 收藏

        曾几何时,感觉自己是个很有梦想的人,记得少年那不经事的心理,恍若昨天的事情!
        孩童时光,令人回忆,不管到了多大年纪,最令80后忘怀不了的是,小时候在街头打弹珠,拍画片的场面。最津津乐道的是克塞号,还有机器猫,孙悟空,葫芦娃,变形金刚...
        大概我们这一代的童年时光是非常美好的,我相信同龄人都有相同感觉吧,上初中了时候,我们开始了新的追求,学习好像还不是很重要,懵懂期的开始对异性的好奇,想着将来找个怎样的女朋友,现在想想孩子时期的想法很天真。初中课上,我们最重要的课好像是班主任的课,不管什么原因,大家都要好好学习他的课,呵呵,语文课上,我们能够感觉到划分段落的快乐,感觉到人物命运幸与不幸,感觉到鲁迅笔下的描述的人物,事情的真实,社会,数学课上,我们要开始代数,几何了,代数,看上去真的好简单,那时候人人都会来两下,但是稍改一下,要你些概念,填空,很多人傻眼了,为啥呢,因为我们还不懂啥叫理论,还好,枯燥之余还有几何学的陪伴,我想大家都喜欢画圆,那时候最羡慕数学老师在黑板上画的圆很漂亮,觉得只有画的很漂亮了才能够学好几何,于是拿起圆规再接再厉!直到画的很好的一个圆,才会会心的一笑!到了画坐标图时候,感觉一个点对应一个数,那时候稍微有了点数学结合坐标的知识!还有最重要的一个知识点,那就是学习如何算利率,我想大家都认可吧!物理课呢,大家记忆深刻的是第一课的误差和错误吧,最喜欢的也许是拿尺子测铅笔的周长吧,我想当时很多人还不一定会呢,最喜欢的故事是阿基米德洗了个澡洗出了了浮力定律,最大的理想是给我个杠杆我要翘起地球吧,还有牛顿的惯性定律真神奇啊的感觉,而最津津乐道的是上点学的时候,做实验,大家都自豪小时候就会串联电路了。学习化学了,刚开始谁也不愿意记住那个化学元素表中的元素,我想是不知道会有啥用吧,等到些化学方程式了,大家一下子都记住了符号,还记住了属性,呵呵,大概孩子们感觉到了“好处”,大家开始学习化学物质的特征了,实验也好,计算也好,回忆起来真的很美好啊!初中是一个重理轻文的时代,我估计大家都会是地理,历史考试考过不及格吧,呵呵,没啥的,长大了一些知识就都学会了也。
         高中的生活,是充满理想和激情的,那时候同学们一起风发,好像整个城市的金精英们都集中在了一起,大家感觉很自豪,而且要较量一下,证明自己是个人才,每个人心中憋足了劲头,相信大家都相信会有一个美好的明天。高中生活的重点当然是学习了,大家很用功,当然,这个年龄大家也有爱好啊,足球,篮球成了大家的最好之一,每次比赛时候,同学们齐心协力,为了集体的荣誉,大家在加油,汗水淋漓,然而其乐无穷,生活在那种环境下,感觉很充实,这时期,当然男生女生也会来电小故事啊,美丽的爱情在一些人身上发生了,有迷失的,也有相互奋进的,人生百态么!
        高考又成了一道分水岭,把大家又分到了天南地北,从此大家又开始了新的生活,这里是一个集中营,人们来自各地,大家说着不同口音的话,刚开始肯定有些交流困难,时间成了,大家学会了几门方言,从此人人自乐,见识增加了,哈哈,大学四年,快乐的时光真的很是让人回忆,
    相信大学里面属于自由的世界,时间上每个人可以自由分配了,所以除了学习,大家在一起可以找到共同爱好的朋友,做自己喜欢的事情了,当然不能耽误学习啊,呵呵,男孩子开始了强烈的追求异性的活动,好像这个时期是应该了似的,大家晚上洗了等也在讨论如何追求女生的方法,你一眼,我一句好像都是专家似的。
        天下没有不散的宴席,总是离人泪,四年很快结束了,从此又要走向社会了大多数的人,一部分深造了,呵呵,从此同为天涯沦落人,相逢何必曾相识!80后到了社会开始感觉到的压力随之而来,房价涨得令人咋舌,而工作难找得很,工资也低的令人不敢诉说,人们的心寒了,世界也开始对于这批曾经对未来憧憬的孩子变得陌生了!
        生活本来就是一本百科书,我们每个人只是书中的一个小故事,所以大家要把生命看的美好一点,写下一点快乐的篇章,让世人分享!

                                                                                            



     







    posted @ 2011-04-24 15:35 哈希 阅读(114) | 评论 (0)编辑 收藏

         摘要: 开始:   首先来研究一下级联吧:   知道级联的原理吗?很简单,根据前一个选它有关系的下一个哦,呵呵!   那做起来代码怎么写呢:肯定一点,必须要用到js技术了,你要有事件的么,你看好了,级联要这样写啊:javascript:new Option(text, value) Code highlighting produced by Actipro C...  阅读全文

    posted @ 2011-04-24 14:36 哈希 阅读(135) | 评论 (0)编辑 收藏

    我个人的理解啊:
       dwr其实就是一个servlet包,它已经实现了功能,我们呢只需要调用就可以啊,关键在配置:
       好了,二二话不说,看啥叫犀利吧:
       第一步:web.xml配置
      
    <?xml version="1.0" encoding="UTF-8"?> 
    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> 
      
    <web-app> 
      
    <servlet> 
        
    <servlet-name>dwr-invoker</servlet-name> 
        
    <display-name>DWR Servlet</display-name> 
        
    <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class> 
        
    <init-param> 
          
    <param-name>debug</param-name> 
          
    <param-value>true</param-value> 
        
    </init-param> 
      
    </servlet> 
      
    <servlet-mapping> 
        
    <servlet-name>dwr-invoker</servlet-name> 
        
    <url-pattern>/dwr/*</url-pattern> 
      </servlet-mapping> 
      
      <welcome-file-list> 
        <welcome-file>index.jsp</welcome-file> 
      </welcome-file-list> 
    </web-app>


       第二步:dwr配置(先倒入jar包dwr.jar)
     
    <?xml version="1.0" encoding="gbk"?> 
    <!DOCTYPE dwr PUBLIC 
        
    "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" 
        
    "http://www.getahead.ltd.uk/dwr/dwr10.dtd"> 
      
    <dwr> 
      
    <allow> 
       <create creator="new" javascript="us"> 
       <param name="class" value="org.man.prj.Hello" /> 
        </create>
        <create creator="new" javascript="Students">
          <param name="class" value="org.man.prj.Students"/>
        </create>

      
      
    </allow> 
    </dwr>
    第三步:写java代码
    根据你的需要了啊
    第四步:index.jsp
    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <html> 
      
    <script src="/mydwr/dwr/interface/Students.js"></script> 
    <script src="/mydwr/dwr/engine.js"></script> 
    <script src="/mydwr/dwr/util.js"></script> 

    <script type="text/javascript"> 
                var dwr_callback = function(data){  
                   alert(data);  
               }  
           </script> 
    <select name="classid" id="classid" onchange="javascript:update2();"></select> 

    <body>
        This is my JSP page. <br>
         <input type="button" value="invoke" onclick="us.hellodwr(dwr_callback)" /> 
      </body>

    好了这样就可以使用dwr了,很方便哦!
    不懂的话就和他们联系!QQ群:110703194





    posted @ 2011-04-24 10:49 哈希 阅读(115) | 评论 (0)编辑 收藏

    http://js.alixixi.com/

    posted @ 2011-04-22 23:25 哈希 阅读(67) | 评论 (0)编辑 收藏


    函数:split()
    功能:使用一个指定的分隔符把一个字符串分割存储到数组
    例子:
    str=”jpg|bmp|gif|ico|png”;
    arr=theString.split(”|”);
    //arr是一个包含字符值”jpg”、”bmp”、”gif”、”ico”和”png”的数组

    函数:John()
    功能:使用您选择的分隔符将一个数组合并为一个字符串
    例子:
    var delimitedString=myArray.join(delimiter);
    var myList=new Array(”jpg”,”bmp”,”gif”,”ico”,”png”);
    var portableList=myList.join(”|”);
    //结果是jpg|bmp|gif|ico|png

    函数:substring()
    功能:字符串截取,比如想从”MinidxSearchEngine”中得到”Minidx”就要用到substring(0,6)

     

    函数:indexOf()
    功能:返回字符串中匹配子串的第一个字符的下标
    var myString=”JavaScript”;
    var w=myString.indexOf(”v”);w will be 2
    var x=myString.indexOf(”S”);x will be 4
    var y=myString.indexOf(”Script”);y will also be 4
    var z=myString.indexOf(”key”);z will be -1

    posted @ 2011-04-22 18:35 哈希 阅读(108) | 评论 (0)编辑 收藏

    floor 向下取整
    ceil  向上取整
    round 则是4舍5入的计算,round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。

    Math.floor(1.4)=1.0
    Math.round(1.4)=1
    Math.ceil(1.4)=2.0
    Math.floor(1.5)=1.0
    Math.round(1.5)=2
    Math.ceil(1.5)=2.0
    Math.floor(1.6)=1.0
    Math.round(1.6)=2
    Math.ceil(1.6)=2.0
    Math.floor(-1.4)=-2.0
    Math.round(-1.4)=-1
    Math.ceil(-1.4)=-1.0
    Math.floor(-1.5)=-2.0
    Math.round(-1.5)=-1
    Math.ceil(-1.5)=-1.0
    Math.floor(-1.6)=-2.0
    Math.round(-1.6)=-2
    Math.ceil(-1.6)=-1.0

    posted @ 2011-04-22 17:44 哈希 阅读(142) | 评论 (0)编辑 收藏

    字符串学习:
     String strss
    =null;
           String [] str
    ={"hello","world","janaury","february","thirsday","monday"};    
             
    for(int i=0;i<str.length;i++){
            strss
    =str[i]+"/";
               }
           
    //String strs="nihao a he llo worl d dsa a d f a d";        
            String [] sr=strss.split("/");
           
    for(int i=0;i<str.length;i++){
            System.out.println(str[i]);

     String strs="nihao a he llo worl d dsa a d f a d";        
            String [] str
    =strs.split("");
            
    for(int i=0;i<str.length;i++){
            System.out.println(str[i]);
            }

    posted @ 2011-04-22 17:24 哈希 阅读(134) | 评论 (0)编辑 收藏

    好了,开始这是我自己用形状,大小来描述桥梁模式的方式:
      可以分为四种:大圆,小圆,大矩形,小矩形
      看代码:
      
    public interface Shape {

        
    public abstract void DrawShape();

    }

    public class Circle implements Shape {

        
    public Circle() {
            
    // TODO Auto-generated constructor stub
        }

        
    public void DrawShape() {
            
    // TODO Auto-generated method stub
            System.out.println("我是圆");
        }
        
    }

    public class Triangle implements Shape {

        
    public Triangle() {
            
    // TODO Auto-generated constructor stub
        }

        
    public void DrawShape() {
            
    // TODO Auto-generated method stub
            System.out.println("我是矩形!");
        }
        
    }

    public abstract class Type {
         
    public abstract void draw(String str);
         
    protected Shape GetShape(String type){
         
    if(type.equals("circle")){
             
    return new Circle();
         }
    else if(type.equals("triangle")){
             
    return new Triangle();
         }
    else{
             
    return Circle();
            }
         }
        
    private Shape Circle() {
            
    // TODO Auto-generated method stub
            return new Circle();
        }
    }

    public class Big extends Type {
        
    private Shape shape;
        
    public Big(String tr){
            shape
    =GetShape(tr);
        }
        
    public void draw(String str) {
        
    // TODO Auto-generated method stub
        System.out.println(str);
            System.out.println(
    "");
            shape.DrawShape();
        }
    }

    public class Small extends Type {
        
    private Shape shape;

        
    public Small(String str) {
           shape
    =GetShape(str);
        }
        
    public void draw(String tr){
            System.out.println(tr);
            System.out.println(
    "");
            shape.DrawShape();
        }
    }

    可以测试一下啊:
    public class Test {
       
    public static void main(String[] args) {
           System.out.println(
    "=============小类型================");
           
    //small类型时候
           Type type=new Small("triangle");
           type.draw(
    "triangle");
           Type type2
    =new Small("circle");
           type2.draw(
    "circle");
          System.out.println(
    "=============大类型================");
           
    //Big类型时候
           Type type3=new Big("circle");
           type3.draw(
    "circle");
           Type type4
    =new Big("triangle");
           type4.draw(
    "triangle");
       }
    }
     设计模式相当强悍啊!能帮助大家学习一点本人心得也算很愉快了!我会继续吧所学贡献出来的!

    posted @ 2011-04-22 16:35 哈希 阅读(115) | 评论 (0)编辑 收藏

       今天决定好好学习一下设计模式:代码也敲了,谈一下我个人的心得吧:
          一、适配器模式:
              这种模式在继承父类的时候实现接口的情况下,实现父类的构造方法;通过该类可以实现调用接口的方法,还可以调用父类的方法,实例如下
              
    public interface Myshape {
       
    public void draw();
       
    public void  write();
       
    }
        
    public class Translator {
        
    private String tran;

        
    public String getTran() {
            
    return tran;
        }

        
    public void setTran(String tran) {
            
    this.tran = tran;
        }


        
    public Translator() {
            
    // TODO Auto-generated constructor stub
        }
        
        
        
    }
      一、 调用方法如下:
      
    public class Test extends Text implements Myshape {
           
    private Translator tran;

        
    public void draw() {
            
    // TODO Auto-generated method stub
            System.out.println("实现了接口Myshape的draw()方法!");
        }

        
    public void write() {
            
    // TODO Auto-generated method stub
            System.out.println("实现了接口Myshape的write()方法?");
        }
        

        
    public static void main(String[] args) {
            Test t
    =new Test();
            t.draw();
            t.write();
            String str
    ="没天理!";
            t.SetContent(
    "这是我" +
                     str  
    +
                    
    "设置的值" +
                    
    "你好啊!" +
                    
    "美眉!");
            System.out.println(t.GetContent());
        }
    }

    二、此方法正体现面向对象的思想,通过另一个类把对象套用在构造方法里面,由此实现适配器模式!
    public class TestObject implements Myshape {
        
    /*
         * 对象
         
    */
        
    private Translator tst;

        
    public TestObject(Translator t) {
            
    // TODO Auto-generated constructor stub
              tst=t;
        }
       
        
    public String getTran() {
            
    return tst.getTran();
        }

        
    public void setTran(String str) {
            tst.setTran(str);
        }


        
    public void draw() {
            
    // TODO Auto-generated method stub
            System.out.println("实现1");
        }

        
    public void write() {
            
    // TODO Auto-generated method stub
            System.out.println("实现2");
        }

        
    public static void main(String[] args) {
            Translator ts
    =new Translator();
            TestObject test
    =new TestObject(ts);
            test.setTran(
    "好了我可以用我的秘书翻译了!");
            System.out.println(test.getTran());
           
        }
       
       
       
    }

      自己个人理解,还望指教!

    posted @ 2011-04-22 14:25 哈希 阅读(123) | 评论 (0)编辑 收藏

    我在Java论坛看到这篇文章,作者以轻松的语言比喻了java的23种模式,有很好的启发作用,但可惜没有给出具体的意思,我就在后边加上了。这些都是最简单的介绍,要学习的话建议你看一下阎宏博士的《Java与模式》一书。

    创建型模式

    1、FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory

    工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。

    2、BUILDER—MM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语 言都有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻松搞掂,这就是我的“我爱 你”builder。(这一定比美军在伊拉克用的翻译机好卖)

    建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。

    3、FACTORY METHOD—请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。

    工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

    4、PROTOTYPE—跟MM用QQ聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要copy出来放到QQ里面就行了,这就是我的情话prototype了。(100块钱一份,你要不要)

    原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减 少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。

    5、SINGLETON—俺有6个漂亮的老婆,她们的老公都是我,我就是我们家里的老公Sigleton,她们只要说道“老公”,都是指的同一个人,那就是我(刚才做了个梦啦,哪有这么好的事)

    单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。
    结构型模式

    6、ADAPTER—在朋友聚会上碰到了一个美女Sarah,从香港来的,可我不会说粤语,她不会说普通话,只好求助于我的朋友kent了,他作为我和Sarah之间的Adapter,让我和Sarah可以相互交谈了(也不知道他会不会耍我)

    适配器(变压器)模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。

    7、BRIDGE—早上碰到MM,要说早上好,晚上碰到MM,要说晚上好;碰到MM穿了件新衣服,要说你的衣服好漂亮哦,碰到MM新做的发型,要说你的头发好漂亮哦。不要问我“早上碰到MM新做了个发型怎么说”这种问题,自己用BRIDGE组合一下不就行了

    桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。

    8、COMPOSITE—Mary今天过生日。“我过生日,你要送我一件礼物。”“嗯,好吧,去商店,你自己挑。”“这件T恤挺漂亮,买,这条裙子好看, 买,这个包也不错,买。”“喂,买了三件了呀,我只答应送一件礼物的哦。”“什么呀,T恤加裙子加包包,正好配成一套呀,小姐,麻烦你包起 来。”“……”,MM都会用Composite模式了,你会了没有?

    合成模式:合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。

    9、DECORATOR—Mary过完轮到Sarly过生日,还是不要叫她自己挑了,不然这个月伙食费肯定玩完,拿出我去年在华山顶上照的照片,在背面写 上“最好的的礼物,就是爱你的Fita”,再到街上礼品店买了个像框(卖礼品的MM也很漂亮哦),再找隔壁搞美术设计的Mike设计了一个漂亮的盒子装起 来……,我们都是Decorator,最终都在修饰我这个人呀,怎么样,看懂了吗?

    装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。

    10、FACADE—我有一个专业的Nikon相机,我就喜欢自己手动调光圈、快门,这样照出来的照片才专业,但MM可不懂这些,教了半天也不会。幸好相 机有Facade设计模式,把相机调整到自动档,只要对准目标按快门就行了,一切由相机自动调整,这样MM也可以用这个相机给我拍张照片了。

    门面模式:外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。

    11、FLYWEIGHT—每天跟MM发短信,手指都累死了,最近买了个新手机,可以把一些常用的句子存在手机里,要用的时候,直接拿出来,在前面加上 MM的名字就可以发送了,再不用一个字一个字敲了。共享的句子就是Flyweight,MM的名字就是提取出来的外部特征,根据上下文情况使用。

    享元模式:FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴 状态。内蕴状态存储在享元内部,不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,它们是相互独立的。将可以共享 的状态和不可以共享的状态从常规类中区分开来,将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被 共享的对象。享元模式大幅度的降低内存中对象的数量。

    12、PROXY—跟MM在网上聊天,一开头总是“hi,你好”,“你从哪儿来呀?”“你多大了?”“身高多少呀?”这些话,真烦人,写个程序做为我的Proxy吧,凡是接收到这些话都设置好了自动的回答,接收到其他的话时再通知我回答,怎么样,酷吧。

    代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情 况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以 并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。

    行为模式

    13、CHAIN OF RESPONSIBLEITY—晚上去上英语课,为了好开溜坐到了最后一排,哇,前面坐了好几个漂亮的MM哎,找张纸条,写上“Hi,可以做我的女朋友 吗?如果不愿意请向前传”,纸条就一个接一个的传上去了,糟糕,传到第一排的MM把纸条传给老师了,听说是个老处女呀,快跑!

    责任链模式:在责任链模式中,很多对象由每一个对象对其下家的引用而接

    起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求,系统可以在不影响客户端的情 况下动态的重新组织链和分配责任。处理者有两个选择:承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。

    14、COMMAND—俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,她对我有什么指示,就写一张纸条让她弟弟带给我。 这不,她弟弟又传送过来一个COMMAND,为了感谢他,我请他吃了碗杂酱面,哪知道他说:“我同时给我姐姐三个男朋友送COMMAND,就数你最小气, 才请我吃面。”,

    命令模式:命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方和 发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否执行,何时被执行以及是怎么被执行的。系统 支持命令的撤消。

    15、INTERPRETER—俺有一个《泡MM真经》,上面有各种泡MM的攻略,比如说去吃西餐的步骤、去看电影的方法等等,跟MM约会时,只要做一个Interpreter,照着上面的脚本执行就可以了。

    解释器模式:给定一个语言后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。解释器模 式将描述怎样在有了一个简单的文法后,使用模式设计解释这些语句。在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合。在解释器模式中需要 定义一个代表文法的命令类的等级结构,也就是一系列的组合规则。每一个命令对象都有一个解释方法,代表对命令对象的解释。命令对象的等级结构中的对象的任 何排列组合都是一个语言。

    16、ITERATOR—我爱上了Mary,不顾一切的向她求婚。

    Mary:“想要我跟你结婚,得答应我的条件”

    我:“什么条件我都答应,你说吧”

    Mary:“我看上了那个一克拉的钻石”

    我:“我买,我买,还有吗?”

    Mary:“我看上了湖边的那栋别墅”

    我:“我买,我买,还有吗?”

    Mary:“我看上那辆法拉利跑车”

    我脑袋嗡的一声,坐在椅子上,一咬牙:“我买,我买,还有吗?”

    ……

    迭代子模式:迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集,聚集对象是能够包容一组对象的容 器对象。迭代子模式将迭代逻辑封装到一个独立的子对象中,从而与聚集本身隔开。迭代子模式简化了聚集的界面。每一个聚集对象都可以有一个或一个以上的迭代 子对象,每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。

    17、MEDIATOR—四个MM打麻将,相互之间谁应该给谁多少钱算不清楚了,幸亏当时我在旁边,按照各自的筹码数算钱,赚了钱的从我这里拿,赔了钱的也付给我,一切就OK啦,俺得到了四个MM的电话。

    调停者模式:调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些对象之间的作用发生改变时,不会 立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。调停者模式将多对多的相互作用转化为一对多的相互作用。调停者模式将对象的行为和协 作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理。

    18、MEMENTO—同时跟几个MM聊天时,一定要记清楚刚才跟MM说了些什么话,不然MM发现了会不高兴的哦,幸亏我有个备忘录,刚才与哪个MM说了什么话我都拷贝一份放到备忘录里面保存,这样可以随时察看以前的记录啦。

    备忘录模式:备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。

    19、OBSERVER—想知道咱们公司最新MM情报吗?加入公司的MM情报邮件组就行了,tom负责搜集情报,他发现的新情报不用一个一个通知我们,直接发布给邮件组,我们作为订阅者(观察者)就可以及时收到情报啦

    观察者模式:观察者模式定义了一种一队多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

    20、STATE—跟MM交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,比如你约她今天晚上去看电影,对你没兴趣的MM就会说“有事情 啦”,对你不讨厌但还没喜欢上的MM就会说“好啊,不过可以带上我同事么?”,已经喜欢上你的MM就会说“几点钟?看完电影再去泡吧怎么样?”,当然你看 电影过程中表现良好的话,也可以把MM的状态从不讨厌不喜欢变成喜欢哦。

    状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对 象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。状态模式需要对每一个系统 可能取得的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选的子类。

    21、STRATEGY—跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,单目的都是为了得到MM的芳心,我的追MM锦囊中有好多Strategy哦。

    策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况 下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影 响到环境和客户端。

    22、TEMPLATE METHOD——看过《如何说服女生上床》这部经典文章吗?女生从认识到上床的不变的步骤分为巧遇、打破僵局、展开追求、接吻、前戏、动手、爱抚、进去八 大步骤(Template method),但每个步骤针对不同的情况,都有不一样的做法,这就要看你随机应变啦(具体实现);

    模板方法模式:模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类 可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。

    23、VISITOR—情人节到了,要给每个MM送一束鲜花和一张卡片,可是每个MM送的花都要针对她个人的特点,每张卡片也要根据个人的特点来挑,我一 个人哪搞得清楚,还是找花店老板和礼品店老板做一下Visitor,让花店老板根据MM的特点选一束花,让礼品店老板也根据每个人特点选一张卡,这样就轻 松多了;

    访问者模式:访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。访问者模式 适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化。访问者模式使得增加新的操作变的很 容易,就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中。当使用访问者模式时,要将尽可能多的对 象浏览逻辑放在访问者类中,而不是放到它的子类中。访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。

    posted @ 2011-04-22 10:42 哈希 阅读(106) | 评论 (0)编辑 收藏

    CSS方法解决IE6最小高度,IE6最小宽度,IE6最大高度,IE6最大宽度,
    兼容IE6/' target='_blank'>兼容IE6/IE7/IE8/火狐
    ====================
    IE6最小高度
    .min_height{
      min-height:200px;
      _height:expression(this.scrollHeight < 200 ? "200px" : "auto");
    }
    --------------------------------
    IE6最大高度
    .max_height{
      max-height:400px;
      _height:expression(this.scrollHeight > 400 ? "400px" : "auto");
    }
    --------------------------------
    IE6最小宽度
    max-width: 600px;
     _width:expression(document.body.clientWidth > 600 ? "600px" : "auto");
     /*_width:expression(document.body.clientWidth < 300 ? "300px" : "auto"); 这是min-width */
    --------------------------------
    IE6最大最小宽度
    .min_and_max_width{
      min-width:300px;
      max-width:600px;
      _width: expression(
        document.body.clientWidth < 300 ? "300px" :
           ( document.body.clientWidth > 600 ? "600px" : "auto")
      );
    }
    --------------------------------
    IE6最大最小高度
    .min_and_max_height{
      min-height:200px;
      max-height:400px;
      _height: expression(
        this.scrollHeight < 200 ? "200px" :
          ( this.scrollHeight > 400 ? "400px" : "auto")
      );
    }

    posted @ 2011-04-22 09:45 哈希 阅读(129) | 评论 (0)编辑 收藏

        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>HTML+CSS水平居中其实很简</title>
        <style>
        body,p{ 
        padding:0px; 
        margin:0px; 
        padding-top:20px; 
        font-size:10pt; 
        font-family:"宋体"; 
        } 
        .demo{ 
            width:800px; 
            height:400px; 
            margin:0 auto;/*CSS才是水平居中全靠他了*/ 
            border: 1px solid #999999; 
        } 
        p{ 
        width:90%; 
        height:auto; 
        margin:20px 0px 0px 20px;} 
        
        </style>
        </head>
        
        <body>
        <div class="demo">
            <p>哈哈DIV水平居中了哦</p>
            <p>margin:0 auto;/*CSS才是水平居中全靠他了*/  你可以测试兼容目前的各种主流浏览器,如有不兼容现象欢迎留言讨论</p>
            <p>CSS body,p{}是为了清理页面边距和各种浏览器的差异</p>
            <p>当然,所谓HTML+CSS就是说所有的html标签都是可以使用的,不一定要是DIV。</p>
        </div>
        </body>
        </html>

    posted @ 2011-04-22 09:42 哈希 阅读(151) | 评论 (0)编辑 收藏

    1)cookie和session的作用以及他们的应用场合
    两者都是记录用户访问网站信息,但他们的保持状态不同,cookie是采用客户端保持,而session是采用服务端保持,一般来说cookie不是很安 全,因为别人可以分析本地的cookie进行cookie欺骗,考虑到安全的问题应该使用session,session是保持在服务端,但当访问增多 时,会增加服务器的压力。
    在应用场合中,建议建用户登录,交易重要信息存放session,其他信息可以存放在cookie中,根据实际需求两者可以交替搭配使用。

    2)怎样让jvm加载一个Class的同时执行一段代码
    使用Class.forName()动态加载类(题目中有"同时",是否启用另一线程?)

    3)post和get区别
    从http动词协议来看,get是从服务器获取数据,post是向服务器上传数据
    get方式会把数据出现在url中,post则不会
    get提交的数据有大小限制,post则无

    4)事务的属性有哪些?写出spring或jdbc管理事务的例子
    有原子性,一致性,隔离性,持久性
    spring提供了丰富的事务模型,主要是针对jdbc事务,jta事务,还有一些自定义事务(如果有人能从一张白纸写出spring transaction的例子,那真是佩服之极)
    还是写一个简单jdbc事务
    try{
    class.forName("***");
    ...
    conn=DriverManager.getConnection(url,user,password);
    conn.createStartement().executeUpdate("****");//更新操作
    conn.commit();//事务提交
    }catch(Exception e){
    ..
    conn.rollback();//事务回滚
    ..
    }

    5)实现一个高并发、高性能的hashmap。写出伪代码
    什么叫做高性能,高并发的hashmap? 是要考hashmap的数据结构??

    6)解析一段xml,拼接成一个url
    xml,url???这两者有什么联系吗?

    7)怎么解决并发?怎么解决集群环境下的并发?
    (有很多点可以并发,web请求可以并发,数据库请求可以并发,怎么那么空泛)
    高并发最重要的还是考虑到锁的问题,如数据库该用表锁用表锁,该用排他锁用排它锁,程序中要注意非线程安全的问题
    高并发还有带来性能问题,缓存,负载均衡,这些看情况而定

    8)java GC的原理.
    又来,不回答你

    9)mysql支持事务吗?mysql存储引擎有哪些?
    支持,常用的是inndb和myisam

    10)数据库数据查找比较慢的时候,如何解决?
    假如是mysql
    1.漏了索引,用explain看看查询语句是不是没使用索引或者索引使用有问题
    2.使用show processlist看看是不是有sql卡住了
    3.还有一种情况就是sql写得过于复杂,如goroupby,多表关联等等,使用desc来进行分析
    4.还有就是配置的问题,如key_buffer等参数,这个看文档吧
    5.最后一种就是机器负荷过高,调整结构来解决吧,比如使用mysql-proxy代理等等

    11)学生 课程 选课的一个sql语句书写
    ??

    12)查找日志文件中某一个信息出现的次数
    cat 日志 | grep 信息 | wc -l

    13) 32位linux操作系统中,最多支持多少个线程?
    上网查了,写得很复杂,附上文章
    http://www.517sou.net/Article/Linux-maximum-number-of-threads-and-the-maximum-number-of-processes.aspx

    14)关于TreeMap操作的
    TreeMap就是一颗平衡排序二叉树,操作的。。后面是什么??

    15)重写类A的equals和hascode方法。类A有个属性private B b;
    ??

    16)实现一个mysql的sequence
    mysql的last_insert_id()大致可以满足,如果不行就写触发器吧

    posted @ 2011-04-22 08:59 哈希 阅读(223) | 评论 (0)编辑 收藏

    java 学习步骤-_-
    J2EE又包括许多组件,如JSP,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。
    那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。如果你学过HTML,那么事情要好办的多,如果没有,
    那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。然后你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生
    成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流
    程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
    还好,SUN提供了Javabean可以把你的JSP中的Java代码封装起来,便于调用也便于重用。接着就是EJB了,EJB就是Enterprise JavaBean,看名字好象它是Javabean,
    可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的Weblogic,
    Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。至于JDBC,就不用我多说了,你如果用java
    编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看JavaMail了。 好了,对Java和J2EE有了一些基本概念之后,你就应该编一些程序了,千万不要纸上谈兵哦。最好找一些有实例且带光盘的书来看,这样看到好的程序就可
    以直接Ctrl+C再Ctrl+V,也不用劳您老大架再亲自把它 再输一遍吧,再说直接复制还不用怕出错,何乐而不为呢!还有就是要经常上一些好的Java编程文章,
    有好的文章要Cut下来,有问题尽管问,只要问题不是太傻,一般高手都会回答你的。下面介绍几个好的Java方面的编程网站: CSDN论坛 http://www.csdn.net/ 中国最有名的技术论坛,《程序员》杂志就是他们出版的,你可以在上面提出问题,马上就有人回答你,如果你觉得好,
    你可以给那人加分; 那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出
    去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!
    你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。所以你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),
    在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他还愿意不厌其烦地教你,这样好象有点难哦! 还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,
    铿锵有力(对不起,偶最近《金装四大才子》看多了)。学Java必读的两个开源程序就是Jive和Pet Store。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库
    的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,
    却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的
    感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能
    开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,
    如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站 http://www.jdon.com/ 去下载,或到同济技术论坛的服务器上
    ftp://nro.shtdu.edu.cn 去下,安装上有什么问题,可以到论坛上去提问。 Pet Store(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要错过了。 你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。其实说这种话的人
    就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计
    模式了。设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例
    中的灵活应用和智慧,让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的
    程序尽可能的可重用。 关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/ ,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
    有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)吧,现在很流行的Struts就是它的一种实现方式,不过Struts用起来实在是很繁,我们只
    要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring(重整)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成
    立一个工作室吧,你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,
    所以Money就哗啦啦的来了。。。。。。 当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,
    天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢? 下面介绍两个好的开源项目网站:http://www.java2s.com/CN/Tutorial/Java/0020__Language/Catalog0020__Language.htm

    posted @ 2011-04-22 08:42 哈希 阅读(111) | 评论 (0)编辑 收藏