如何学好java

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

2011年4月26日

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

posted @ 2014-01-02 22:50 哈希 阅读(132) | 评论 (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 哈希 阅读(230) | 评论 (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 哈希 阅读(215) | 评论 (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 哈希 阅读(255) | 评论 (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 哈希 阅读(164) | 评论 (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 哈希 阅读(193) | 评论 (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 哈希 阅读(3996) | 评论 (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 哈希 阅读(206) | 评论 (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 哈希 阅读(173) | 评论 (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 哈希 阅读(1153) | 评论 (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 哈希 阅读(161) | 评论 (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 哈希 阅读(315) | 评论 (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 哈希 阅读(152) | 评论 (0)编辑 收藏


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

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

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

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

    posted @ 2012-01-03 15:58 哈希 阅读(126) | 评论 (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 哈希 阅读(698) | 评论 (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 哈希 阅读(287) | 评论 (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 哈希 阅读(142) | 评论 (0)编辑 收藏

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



    posted @ 2011-12-15 15:57 哈希 阅读(181) | 评论 (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 哈希 阅读(403) | 评论 (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 哈希 阅读(390) | 评论 (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 哈希 阅读(312) | 评论 (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 哈希 阅读(1223) | 评论 (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 哈希 阅读(136) | 评论 (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 哈希 阅读(159) | 评论 (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 哈希 阅读(187) | 评论 (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 哈希 阅读(187) | 评论 (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 哈希 阅读(166) | 评论 (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 哈希 阅读(175) | 评论 (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 哈希 阅读(169) | 评论 (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 哈希 阅读(695) | 评论 (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 哈希 阅读(195) | 评论 (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 哈希 阅读(171) | 评论 (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 哈希 阅读(311) | 评论 (0)编辑 收藏

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

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

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

    posted @ 2011-05-17 22:23 哈希 阅读(244) | 评论 (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 哈希 阅读(169) | 评论 (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 哈希 阅读(190) | 评论 (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 哈希 阅读(336) | 评论 (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 哈希 阅读(459) | 评论 (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 哈希 阅读(224) | 评论 (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 哈希 阅读(306) | 评论 (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 哈希 阅读(197) | 评论 (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 哈希 阅读(271) | 评论 (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 哈希 阅读(131) | 评论 (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 哈希 阅读(142) | 评论 (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 哈希 阅读(204) | 评论 (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 哈希 阅读(177) | 评论 (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 哈希 阅读(256) | 评论 (0)编辑 收藏

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

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



    posted @ 2011-04-29 14:40 哈希 阅读(122) | 评论 (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 哈希 阅读(297) | 评论 (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 哈希 阅读(363) | 评论 (0)编辑 收藏

         摘要: 以前的收藏,估计很少有这么全的面试题集了 ^_^ 基础知识: 1.C++或Java中的异常处理机制的简单原理和应用。   当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内 置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发 ...  阅读全文

    posted @ 2011-04-28 15:20 哈希 阅读(84) | 评论 (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 哈希 阅读(171) | 评论 (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 哈希 阅读(178) | 评论 (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 哈希 阅读(154) | 评论 (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 哈希 阅读(176) | 评论 (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)编辑 收藏