最近再看servlet ,我们经常会继承 HttpServlet ,而HttpServlet 中要求我们必须实现下面几个方法,看api的介绍

 

Servlet API Introduce

Provides an abstract class to be subclassed to create an HTTP servlet suitable for a Web site. A subclass of HttpServlet must override at least one method, usually one of these:

  • doGet, if the servlet supports HTTP GET requests
  • doPost, for HTTP POST requests
  • doPut, for HTTP PUT requests
  • doDelete, for HTTP DELETE requests
  • init and destroy, to manage resources that are held for the life of the servlet
  • getServletInfo, which the servlet uses to provide information about itself

 

doget ,dopost ,doput,dodelete  这些get post 我们肯定不会觉得陌生,而后面的两个,我记得我在IIS中配置的时候见过,突然想到有一次面试的时候,人家问我:我们网页的请求都有哪些? 网页请求,其实就是http请求了,我当时之说了 get 和post  ,其他的就不知道了,今天看到这里,突然觉得应该是补一补这个方面的知识了,百度google了一通,发现介绍此类知识的资料很少,后来在csdn中发现了下面的文章, 才知道原来有这么多的请求方式,呵呵,如果你也不清楚就好好看看哦

 

 

转载的文章

孟岩老师将“REST”称为一场Web开发思想的变革,而就我个人理解而言,REST对Mashup应用的价值要远大于对Web应用架构的影响。

这里不想纠缠于REST和MashUp两个概念,关于它们的文章我已经写了一些,不过还暂时不打算发在blog中。

打算介绍一下http协议中涉及的方法,在互联网上搜索了很久,发现中文文章中深究http协议的很少,通常谈到http协议也只是关注于Get和Post两个方法,最多提一下head方法。

因为有需要,所以我就再次做一下科普。

如果可以的话,请进入windows命令行,如果你使用的是非windows操作系统的话,我相信你肯定知道如何进入命令行。

输入:

telnet www.google.com 80

很快你的命令行窗口变得一团漆黑了,而这个时候的你,已经开始访问google的web了。与我们通常使用浏览器后的感觉不同,现在的你无所适从。

如果你愿意尝试,现在的你输入get或者head等都可以获得响应,只不过响应的内容让人有些失望。

通常浏览器会帮助我们构建http的协议头信息,从而向对方服务器发送包,获得响应的http协议头信息和正文内容,再将正文内容解析展示在我们面前。

如果你使用过任何sniffer工具,你都会发现,http协议头中通常我们的起始内容是get或post。虽然浏览器能够帮助我们只是发送head请求,但通常我们不会这样去做。

http协议只有get、post和head方法么?它还包含些什么方法呢?

关于http协议涉及方法的两个名词解释:safe型方法和Idempotent型方法。

safe型方法通常是指不影响服务器端资源的行为,它的操作结果仅仅是读取信息,GET和HEAD多数情况下被认为具有“safe”的特性。

Idempotent型方法正如Idempotent这个词的意思一样,如果一个方法,n次调用与一个独立请求所产生的资源消耗相同,即没有边际损 耗,则我们可以认为这类方法是idempotent型方法,get、head、put、delete、options和trace都具有这样的特性。

http协议通常包括的方法有很多,以下我只列出我在http/1.1协议定义中看到的方法:get、post、head、options、put、delete、trace、connect。

get方法用于获取URI资源,是最为常用的一种方法。

post方法用于向指定URI提交内容,服务器端响应其行为,该方法也极为常用。

head方法向URI发送请求,仅仅只需要获得响应的协议头。

put方法用于向URI发送请求,若URI不存在,则要求服务器端根据请求创建资源。当URI存在时,服务器端必须接受请求内容,将其作为URI资源的修改后版本。

delete方法用于删除URI标识的指定资源。

trace方法用于激活服务器端对请求的循环反馈,反馈作为http响应的正文内容被传输回客户端。

connect方法通常被用于使用代理连接。

对于上面提到的这些方法,相信大家如果肯花时间,自然可以在http协议的标准中看到更加详细的内容。但有一点是我需要说明的,以上提到的方法,除 了get、post和head可以通过浏览器应用外,其它的方法例如put和delete使用起来有些问题。但ajax的出现为我们提供了一种解决的方 式,ajax使用xmlhttprequest进行操作时,在发送请求之前,可以通过设置request type的方式来完成对请求方法的设定。

诸位如果作为servlet开发的人可以尝试一下直接在servlet中实现doPut、doDelete等方法,并在客户端使用ajax对相同的URI使用不同的方法进行请求,相信大家可以玩得愉快:)

posted @ 2008-07-24 10:52 雨中漫步的太阳 阅读(27) | 评论 (0)编辑

OK  简单的说明下,目前使用.net 连接Oracle的数据时候,总是提示需要Oracle的客户端的支持,而一个Oracle客户端压缩格式至少450M  如此庞大的安装程序在我们部署项目的时候非常的不方便. 通过网上看到有朋友提取了最精简的Oracle的客户端,但是需要配置注册表和环境变量, 感觉比较麻烦.

     于是我做了这个安装程序,使用非常的方便,安装程序仅32M 携带方便,傻瓜式安装,自动完成注册表环境变量的配置.

好了废话就不多说了 直接给下载地址

 

点此下载  下载提取码 :  778a58ae

 

下载地址2  下载提取码  0692369831170687

 

如果有什么问题 可以发邮件 suyuan19 # qq.com

posted @ 2008-07-19 22:10 雨中漫步的太阳 阅读(1443) | 评论 (31)编辑
这个是一个js的考题,我刚开始接触到这个题的时候第一想法是用数组,然后将数组排序 下面是我的代码,前提是字符串已经被我按照一定顺序排列好了
function check() 
if(newstr.length>0
{ tempstr = newstr.charAt(0); 
tempnum
=nextstart = newstr.lastIndexOf(tempstr)+1
if(nextstart<newstr.length) 
{ maxstr = newstr.charAt(nextstart); 
maxnum 
= newstr.lastIndexOf(maxstr)+1-nextstart; 
if(tempnum>maxnum) 
{ maxnum = tempnum; maxstr = tempstr; } 
newstr
=newstr.substr(nextstart); 
  check(); 
}
 
}

}
当然这个代码没有调通就被我放弃了 ,感觉太繁琐了.放到这里只是为了说明下我的思路.
其次我还想到一个方法就是用 Dictionary 对象 ,但是对这个对象不是很熟悉,所以刚开始并没有想用这个,不过当发现上面的路走不通的时候,就决定用这个来搞了.通过查阅api,发现并不是很复杂,下面直接上代码:
var str = "abkfjdskfjdskafdsjhfjA9aaaaaaaaaaaaaaaaa";
    
var dir = new ActiveXObject("Scripting.Dictionary");
    
for(i=0;i<str.length;i++)
    
{
        tmp 
= str.charAt(i);
        
if(!dir.Exists(tmp))
        
{
            dir.add(tmp, 
1);

        }
else{
            num 
= dir.Item(tmp)+1;
            dir.Remove(tmp);
            dir.add(tmp,num);
        }

    }

   a 
= (new VBArray(dir.Keys()));   
   maxstr 
="";
   maxnum 
=0;
   
for (i = 0; i < dir.Count; i++)   
   
{
      
if(dir(a.getItem(i)) > maxnum)
      
{
        maxnum 
= dir(a.getItem(i));
        maxstr 
= a.getItem(i);    
      }
    
      
else
      
if(dir(a.getItem(i)) == maxnum)
      
{        
        maxstr 
=maxstr +" and "+ a.getItem(i);    
      }
      
     
   }

   alert(maxstr
+":"+maxnum);

这个看起来是不是清晰的多了 呵呵,只是我是这么认为的.同时这个问题被我发到群里讨论,群里兄弟给出了另外一个代码,也是使用数组排序的方式,不同的是他用的正则,以下是他的代码
 function clac() {
    
var dest_char;
    
var index = -1;

    
var str = "abkfjdskfjdskafdsjhfjA9";
    
var arr = str.split("");
    arr.sort();
    str 
= arr.join("").toString();
    str.replace(
/(\w)(\1)+/g,function($0,$1,$2){
        
if($0.length > index){
            index 
= $0.length;
            dest_char 
= $1;
        }

    }
)

    alert(
"dest_char:"+dest_char + "\n" + "index: " + index);
}
 
 clac();
这个代码给我的感觉就是简洁,的确写的很漂亮 这个不由让我想到上一篇博文中我也提到正则能给我们省很多事情,让我们的程序更加简洁.以后要多学习正则啊 呵呵
群里还有一个朋友给出了他的代码
代码如下:
function showMax(str)
{
var temp = str;
var curNum = 0;
var curLetter = "";
while (temp != "")
{
var tempLetter = temp.substring(0,1);
var tempNum = str.split(tempLetter).length;
if(tempNum > curNum) // 未判断相等时
{
curNum 
= tempNum;
curLetter 
= tempLetter;
}

temp 
= temp.substring(1);
}

alert(
"CurLetter:" + curLetter + "  CurNum:" + curNum);

}
 

这个代码在这里str.split(tempLetter).length;会出现问题,但是我这里说的是思路,他的这个是另外一种思路.
OK就总结到这里吧.
还有一个在这里贴一下,以后警示自己不要犯类似的错误:
var i=0,j=0,k=0;
    
for(i=0;i<6,j<10;i++,j++)
    
{
        k 
= i+j;
        
//alert("i"+i);
        //alert("j"+j);
    }

    alert(k);
一直以为for循环中i<6,j<10 是并且的关系,才知道原来是或者的关系,你知道么?呵呵
posted @ 2008-07-11 19:11 雨中漫步的太阳 阅读(1223) | 评论 (7)编辑
问题:客户输入1000,自动就分1,000,边输入边分割.

边输入变分割好办 直接使用onkeyup 触发我们的function就可以了,分割比较麻烦
我写的代码如下:
<script language="JavaScript">
   
function toFormant(obj)
    {
       
       
var numstr = obj.value;       
       
var num =numstr.replace(/,| /g,"");
       
if(num.length>1)
        {
            num
= num.replace(/\b[0*]/g,"");
        }       
       
if(!num.match(/[^0-9]/g))
        {
           
//alert(num);
            var a = new Array();
           
if(num.length>3)
            {
               
for(i=num.length;i>0;i=i-3)
                {
                    a.push(num.substring(i
-3,i));
                }
                obj.value
=a.reverse().join(",");
            }
           
else
            {
                obj.value
= num.replace(/,/g,"");
            }
        }
       
else
        {
            alert(
"NOT A No.");
        }
    }
 
</script>

论坛里面的一个大牛的代码如下:
<script language="javascript">
       
function show(obj)
        {
            obj.value
=obj.value.replace(/,/g,"")
           
if(/^[1-9]\d*$/.test(obj.value))
            obj.value
= obj.value.replace(/(?=(?!\b)(?:\d{3})+(?!\d))/g,',');
        }
</script>
哎,还是很有差距的啊,继续努力吧,记录+自勉下
posted @ 2008-07-09 16:25 雨中漫步的太阳 阅读(16) | 评论 (0)编辑
这几天一直在看公司分配的工作及项目代码,我负责的工作主要是对lucene api的进一步封装,使其在日后的使用更加的快捷方便. 代码是技术总监写好的一部分,交由我来管理优化.主要实现的目的是通过配置文件(xml) 快速的将lucene应用到项目中,要做的仅仅是一些配置文件和数据的获取工作,数据主要是通过数据库来获取,使用ibatis作用orm框架.
今天上网翻阅资料,发现了compass, 发现这个开源的lucene框架几乎将我的需要完全的封装到了一起,只是对于我来说他似乎有点臃肿,呵呵 提供了hibernate ibatis 等orm接口,包括jdbc数据接口 甚至还包括了spring 接口 把我的工作基本上全部都做了,下一步研究这个框架,结合目前正在做的项目整合整合......消化掉 呵呵
目前版本是2.0,整个项目 包括demo,doc 一共57M多 呵呵 是不是比较庞大啊
网站 http://www.compass-project.org/

posted @ 2008-05-29 22:05 雨中漫步的太阳 阅读(69) | 评论 (0)编辑
     摘要: <html><head><metahttp-equiv="Content-Type"content="text/html;charset=GB2312"/><scriptlanguage="JavaScript"><!--/**//*作者:梅雪香日期:2006-7-29功能:生成与中文字符串相对映的拼音首字母串版本:V1.0alpha*///汉...  阅读全文
posted @ 2008-05-28 15:07 雨中漫步的太阳 阅读(43) | 评论 (0)编辑
使用lucene,首先要做的就是建立索引文件,这是一个非常耗时的工作,特别是针对大数据量进行索引的时候更是如此.
Lucene 提供了几个优化参数
mergeFactor,maxMergeDocs,minMergeDocs,首先说的是mergeFactor, 默认值为10,控制索引段的合并频率和大小,即每当有10个Document对象添加到索引段时,lucene就会在磁盘建立一个新的段,当创建了10个这样的段之后就会将这10个段合并为一个段,以此类推下去,当这个段内的Document对象数量没有超过maxMergeDocs的值的时候,会一直按照这个规则合并下去,同时磁盘目录内的索引段数量控制在10个以内. 
当制定了较小的mergeFactor时,也就意味着将进行大量的磁盘操作,但是带来的好处是生成较少个数的索引文件.于是矛盾就产生了
mergeFactor较小 则制作索引文件非常慢,但是搜索相对会快.
我们如何来解决这样的矛盾呢? 我提出如下的解决方案,并且已经在我们项目中使用了这样的方式.
我先说明下我们的需求.
我们是将数据库中的内容制作成索引文件并提供搜索,数据库中有上百万的数据,制作一次索引大概需要1个半小时时间(数据库和索引制作程序在一个机器上)
好了,不废话了,说我们的方式
lucene 提供了FsDirectory和RamDirectory两种方式,这里我们首先使用RamDirectory,也就是说我们在内存中创建索引文件,存储的Document个数根据你内存而定了,这样不管mergefactor 指定多少,索引段合并多少次,都是在内存中操作了,减少了IO操作,  当Document的个数比如大于5000时 将RamDirectory 中的内容合并到FsDirectory中,通过fsDirectory.addIndexes(Directory[] {RamDirectory});实现.
这样也就意味着每添加5000个Document 才进行了一次IO操作,而假如把mergeFactor设置为5000的话,带来的问题就是,假如你的数据量足够大,而使你产生更多的索引段.

以上就是我的方式,希望有更好的方式可以交流
posted @ 2008-05-21 18:36 雨中漫步的太阳 阅读(147) | 评论 (4)编辑

首先,在安装ORACLE服务器的机器上搜索下列文件,
oci.dll
ocijdbc10.dll
ociw32.dll
orannzsbb10.dll
oraocci10.dll
oraociei10.dll
sqlnet.ora
tnsnames.ora
classes12.jar
ojdbc14.jar
制作成压缩文件,配置目标计算机使用。

1.
oracleinstantclient.rar解压缩到一个目录, d:\oracleinstantclient

2.配置d:\oracleinstantclienttnsnames.ora文件,只需要修改其中的服务器地址、服务名称和端口。 

3、配置环境变量,在PATH变量中加入d:\oracleinstantclient

4、注册表加入下面键值     

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]

"LD_LIBRARY_PATH"="d:\OracleInstantClient"

"NLS_LANG"="AMERICAN_AMERICA.ZHS16GBK"

"TNS_ADMIN"="d:\OracleInstantClient"

5、如果是ASP.NET应用,则要为ASPNET用户分配d:\oracleinstantclient文件夹的读写权限。

 通过上面的设置后,即可实现免安装ORACLE客户端,连接到ORACLE数据库服务器。

 也可以将上面解压缩后的文件和手动过程制作成安装包,实现自动安装。

 注意:

1、用上面的方法,连接oracle9.2,应该也没有问题。

2、如果使用JDBC连接,需要到官网下载instantclient-jdbc-win32-10.1.0.2.zip:   包含JDBC   Driver的包 

posted @ 2008-05-21 09:02 雨中漫步的太阳 阅读(82) | 评论 (0)编辑
有时候需要修改path系统环境变量, 不多说,代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.Win32;//注册表操作要引用的空间
using System.Runtime.InteropServices;//调用API函数需要的引用,来加载非托管类user32.dll


namespace 用程序修改环境变量
{
    
public partial class Form1 : Form
    
{
        
public Form1()
        
{
            InitializeComponent();
        }


        
private void Form1_Load(object sender, EventArgs e)
        
{

        }

        
/// <summary>
        
/// 读取注册表
        
/// path的路径:[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment]
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        private void tbnRead_Click(object sender, EventArgs e)
        
{
            RegistryKey regLocalMachine 
= Registry.LocalMachine;
            RegistryKey regSYSTEM 
= regLocalMachine.OpenSubKey("SYSTEM"true);//打开HKEY_LOCAL_MACHINE下的SYSTEM
            RegistryKey regControlSet001 = regSYSTEM.OpenSubKey("ControlSet001"true);//打开ControlSet001 
            RegistryKey regControl = regControlSet001.OpenSubKey("Control"true);//打开Control
            RegistryKey regManager = regControl.OpenSubKey("Session Manager"true);//打开Control

            RegistryKey regEnvironment 
= regManager.OpenSubKey("Environment"true);//打开MSSQLServer下的MSSQLServer
            this.richTextBox1.Text = regEnvironment.GetValue("path").ToString();//读取path的值
        }


        
private void btnClose_Click(object sender, EventArgs e)
        
{
            Close();
        }


        
/// <summary>
        
/// 
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]//SendMessageTimeout是在user32.dll中定义的
        public static extern IntPtr SendMessageTimeout(
     IntPtr windowHandle,
     
uint Msg,
     IntPtr wParam,
     IntPtr lParam,
     SendMessageTimeoutFlags flags,
     
uint timeout,
     
out IntPtr result
     );

        [Flags]
        
public enum SendMessageTimeoutFlags : uint
        
{
            SMTO_NORMAL 
= 0x0000,
            SMTO_BLOCK 
= 0x0001,
            SMTO_ABORTIFHUNG 
= 0x0002,
            SMTO_NOTIMEOUTIFNOTHUNG 
= 0x0008
        }


 

        
private void btnWrite_Click(object sender, EventArgs e)
        
{

            RegistryKey regLocalMachine 
= Registry.LocalMachine;
            RegistryKey regSYSTEM 
= regLocalMachine.OpenSubKey("SYSTEM"true);//打开HKEY_LOCAL_MACHINE下的SYSTEM
            RegistryKey regControlSet001 = regSYSTEM.OpenSubKey("ControlSet001"true);//打开ControlSet001 
            RegistryKey regControl = regControlSet001.OpenSubKey("Control"true);//打开Control
            RegistryKey regManager = regControl.OpenSubKey("Session Manager"true);//打开Control

            RegistryKey regEnvironment 
= regManager.OpenSubKey("Environment"true);//打开MSSQLServer下的MSSQLServer
            regEnvironment.SetValue("path"this.richTextBox1.Text);//读取path的值


            MessageBox.Show(
"修改成功");
            
//下面利用发送系统消息,就不要重新启动计算机了
           const int HWND_BROADCAST=0xffff;
           
// DWORD dwMsgResult = 0L;
           const uint WM_SETTINGCHANGE = 0;
           
const long SMTO_ABORTIFHUNG = 0x2;
          System.UInt32 dwMsgResult1
=0;
          
long s;
         
// SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (string)"Environment", SMTO_ABORTIFHUNG, 5000,(long)s);

        }

        
/// <summary>
        
/// 重新启动计算机
        
/// </summary>
        
/// <param name="x"></param>
        
/// <param name="y"></param>
        
/// <returns></returns>

        [DllImport("user32.dll")]
        
//主要API是这个,注意:必须声明为static extern 
        private static extern int ExitWindowsEx(int x, int y); 
        
private void button1_Click(object sender, EventArgs e)
        
{
            ExitWindowsEx(
2,0);
        }