romkk-shi

RMI使用手记

我现在的编程方法,不再是以前的整块应用,和C/S应用的两层架构,现在流行的编程方式是三层架构,就是表示层,商业逻辑,还有数据库都相互独立。
    远程方法调用正是基于三层架构设计的中间层。远程方法调用的原理是桩和骨架结构。主要有三层,分别是桩/骨架层,远程引用层,还有传输层。
    要完成一个简单的RMI应用要分为以下几个简单的步骤:
    1。定义远程接口
    2。定义和实现RMI服务器类
    3。定义和实现客户端类
    4。编译以上的源码
    5。生成桩/骨架
    6。创建安全策略
    7。启动RMI注册表
    8。启动服务器
    9。启动客户端
 
我们来做一个例子,在服务器上有一个连接数据库,插入值的方法,我们在客户端要使用这个方法,来真正的插入一个值!
    第一步:先编写一个接口AccountServer.java,这个接口要继承Remote接口,并且提供一个远程方法insertDetails(),这个方法要抛出RemoteException异常,代码如下:

    import java.rmi.Remote;
import java.rmi.RemoteException;

public interface AccountServer extends Remote
{
    public String insertDetails(String firstName, String lastName,
            String phone, String income, String accountType)
            throws RemoteException;
}

    第二步:实现远程对象类,就是RMI服务器,AccountServerImpl.java,这个类要继承UnicastRemoteObject类,并且要实现自己写的远程接口类AccountServer,首先要定义远程对象构造器,然后就是要实现远程接口中的方法,这个方法来连接mysql数据库,并且插入值.然后我们main方法中,设置安全管理程序,然后创建远程对象,接着注册远程对象.代码如下:

import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class AccountServerImpl extends UnicastRemoteObject implements
        AccountServer
{
    private Connection con;

    public AccountServerImpl() throws RemoteException
    {
        super();
    }

    public String insertDetails(String firstName, String lastName,
            String phone, String income, String accountType)
            throws RemoteException
    {
        int rowsAffected = 0;
        String sReturn = "fail";
        try
        {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager
                    .getConnection(
                            "jdbc:mysql://127.0.0.1/jsptest?useUnicode=true&characterEncoding=GBK",
                            "root", "");
            PreparedStatement ps = con
                    .prepareStatement("insert into User_info values(?,?,?,?,?)");
            ps.setString(1, "firstName");
            ps.setString(2, "lastName");
            ps.setString(3, "phone");
            ps.setString(4, "income");
            ps.setString(5, "accountType");

            rowsAffected = ps.executeUpdate();

            if (rowsAffected > 0)
            {
                sReturn = "success";
            }

        }
        catch (Exception e)
        {
            e.printStackTrace();           
        }
        return sReturn;
    }

    public static void main(String[] args)
    {
 //设置安全管理程序
        System.setSecurityManager(new RMISecurityManager());

        try
        {
     //创建远程对象
            AccountServerImpl as = new AccountServerImpl();
            //注册远程对象
            Naming.rebind("AccountServer", as);
            System.out.println("RMI服务器启动成功");
        }
        catch (RemoteException e)
        {
            e.printStackTrace();
        }
        catch (Exception e1)
        {
            e1.printStackTrace();
        }
    }

}
       第三步:编写客户端代码,Client.java 这个代码中有两个重要的任务,就是得到远程对象的应用,然后调用远程对象,其余的都是界面部分,就不再讲解,代码如下:

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.rmi.Naming;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Client
{
    public static void main(String[] args)
    {
        ClientFrame frame = new ClientFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.show();
    }
}

class ClientFrame extends JFrame
{
    public ClientFrame()
    {
        setTitle("客户端");
        setSize(200, 220);

        Container con = getContentPane();
        ClientPanel panel = new ClientPanel();
        con.add(panel);
    }
}

class ClientPanel extends JPanel
{
    private JLabel lfirst, llast, lphone, lincome, ltype;

    private JTextField ffirst, flast, fphone, fincome, ftype;

    private JButton submit;

    public ClientPanel()
    {
        lfirst = new JLabel("   姓:");
        llast = new JLabel("   名:");
        lphone = new JLabel("电话:");
        lincome = new JLabel("来自:");
        ltype = new JLabel("类型:");

        ffirst = new JTextField(10);
        flast = new JTextField(10);
        fphone = new JTextField(10);
        fincome = new JTextField(10);
        ftype = new JTextField(10);

        submit = new JButton(" 提  交 ");
        submit.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                try
                {
                    //得到远程对象
                    AccountServer as = (AccountServer) Naming
                            .lookup("rmi://localhost/AccountServer");
                    String firstName = ffirst.getText();
                    String lastName = flast.getText();
                    String phone = fphone.getText();
                    String income = fincome.getText();
                    String accountType = ftype.getText();
             //调用远程方法
                    String str = as.insertDetails(firstName, lastName, phone,
                            income, accountType);
                    if ("fail".equals(str))
                    {
                        JOptionPane.showMessageDialog(null, "插入失败");
                    }
                    else
                    {
                        JOptionPane.showMessageDialog(null, "插入成功");
                    }

                }
                catch (Exception e2)
                {
                    e2.printStackTrace();
                }
            }
        });

        add(lfirst);
        add(ffirst);
        add(llast);
        add(flast);
        add(lphone);
        add(fphone);
        add(lincome);
        add(fincome);
        add(ltype);
        add(ftype);
        add(submit);
    }
}

       第四步:在Dos下,进入代码所在目录,使用javac *.java 来编译所有代码
       第五步:在class文件所在目录使用 rmic AccountServerImpl来生成桩和骨架(AccountServerImpl_Skel.class和AccountServerImpl.Stub.class)
       第六步:用policytool工具来创建安全策略文件,放开所有的权限,保存.java.policy文件在C:\Documents and Settings\Administrator文件夹下
       第七步:使用start rmiregistry命令来启动注册表,默认使用1099端口,我们不需要改变
       第八步:java -Djava.rmi.server.codebase=file:/e:/aa/ -classpath .;%CLASSPATH% AccountServerImpl来启动服务器,注意由于服务器中要使用Mysql数据库,所有我们引入使用数据库的jar包,将mysql的jar包添加的CLASSPATH,就OK呢
       第九步:使用java Client来启动客户端,和得到图形界面的客户端,填入数据,点击提交,数据就会添加进入数据库

附:
数据库名称:jsptest
表名:user_info
表结构:
CREATE TABLE user_info (
  firstName varchar(50) NOT NULL default '',
  lastName varchar(50) NOT NULL default '',
  phone varchar(20) NOT NULL default '',
  income varchar(30) NOT NULL default '',
  accountType varchar(50) NOT NULL default '',
  PRIMARY KEY  (firstName)
)


posted @ 2007-08-02 09:59 路边的石头-java 阅读(361) | 评论 (0) | 编辑 收藏
 
java 分布式RMI的简单使用
一 .RMI概述

RMI(Remote Method Invocation)
    RMI是分布式对象软件包,它简化了在多台计算机上的JAVA应用之间的通信。必须在jdk1.1以上

RMI用到的类
     java.rmi.Remote                   所有可以被远程调用的对象都必须实现该接口
     java.rmi.server.UnicastRemoteObject  所有可以被远程调用的对象都必须扩展该类

什么是RMI
    远程方法调用是一种计算机之间对象互相调用对方函数,启动对方进程的一种机制,
使用这种机制,某一台计算机上的对象在调用另外一台计算机上的方法时,使用的程
序语法规则和在本地机上对象间的方法调用的语法规则一样。


优点
这种机制给分布计算的系统设计、编程都带来了极大的方便。
只要按照RMI规则设计程序,可以不必再过问在RMI之下的网络细节了,如:TCP和Socket等等。
任意两台计算机之间的通讯完全由RMI负责。调用远程计算机上的对象就像本地对象一样方便。

1、面向对象:
RMI可将完整的对象作为参数和返回值进行传递,而不仅仅是预定义的数据类型。
也就是说,可以将类似Java哈西表这样的复杂类型作为一个参数进行传递。

2、可移动属性:
RMI可将属性从客户机移动到服务器,或者从服务器移动到客户机。

3、设计方式:
对象传递功能使您可以在分布式计算中充分利用面向对象技术的强大功能,如二层和三层结构系统。
如果用户能够传递属性,那么就可以在自己的解决方案中使用面向对象的设计方式。
所有面向对象的设计方式无不依靠不同的属性来发挥功能,如果不能传递完整的对象——包括实现和类型
——就会失去设计方式上所提供的优点。

4、安全性:
RMI使用Java内置的安全机制保证下载执行程序时用户系统的安全。
RMI使用专门为保护系统免遭恶意小程序侵害而设计的安全管理程序。
5、便于编写和使用
RMI使得Java远程服务程序和访问这些服务程序的Java客户程序的编写工作变得轻松、简单。
远程接口实际上就是Java接口。
为了实现RMI的功能必须创建远程对象任何可以被远程调用的对象必须实现远程接口。但远程
接口本身并不包含任何方法。因而需要创建一个新的接口来扩展远程接口。
新接口将包含所有可以远程调用的方法。远程对象必须实现这个新接口,由于新的接口扩展了
远程接口,实现了新接口,就满足了远程对象对实现远程接口的要求,所实现的每个对象都将
作为远程对象引用。

个人总结:
    RMI说白了,就是提供了一种远程的方法调用。这种调用简单方便,可以传递复杂java对象。现在流行的j2ee中的EJB的底层实现技术就是RMI,EJB的调用就是经过封装的,更高级的RMI调用。



下面我们就来写一个RMI的程序:

一.创建RMI程序的6个步骤:
1、定义一个远程接口的接口,该接口中的每一个方法必须声明它将产生一个RemoteException异常。
2、定义一个实现该接口的类。
3、使用RMIC程序生成远程实现所需的残根和框架。
4、创建一个服务器,用于发布2中写好的类。
5. 创建一个客户程序进行RMI调用。
6、启动rmiRegistry并运行自己的远程服务器和客户程序。

二. 程序详细说明

1.定义一个远程接口的接口,该接口中的每一个方法必须声明它将产生一个RemoteException异常。

import java.rmi.Remote;
import java.rmi.RemoteException;
public interface I_Hello extends java.rmi.Remote   //需要从Remote继承
{
       public String SayHello() throws RemoteException;   //需要抛出remote异常
}


   上面例子我们定义一个返回字符串的远程方法 SayHello(),这个远程接口 I_Hello必须是public的,它必须从java.rmi.Remote继承而来,接口中的每一个方法都必须抛出远程异常java.rmi.RemoteException。


抛出这个异常的原因
由于任何远程方法调用实际上要进行许多低级网络操作,因此网络错误可能在调用过程中随时发生。
因此,所有的RMI操作都应放到try-catch块中。
  
2、定义一个实现该接口的类。

import java.io.PrintStream;
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;

public class Hello extends UnicastRemoteObject   //必须从UnicastRemoteObject  继承
                   implements I_Hello
{
        public Hello() throws RemoteException     //需要一个抛出Remote异常的默认初始化方法
        {
        }

        public String SayHello()     //这个是实现I_Hello接口的方法
        {
           return "Hello world !!";
        }
}

实现接口的类必须继承UnicastRemoteObject类。
扩展java.rmi.server.UnicastRemoteObject
UnicastRemoteObject顾名思义,是让客户机与服务器对象实例建立一对一的连接。

3、使用RMIC程序生成远程实现所需的残根Stub 和 框架。
   2中的Hello 编译好以后,我们就可以用RMIC命令来生成残根Stub
   在Dos窗口里,到Hello.class 所在目录,运行以下命令:
   rmic Hello
   
   命令执行完以后,将会在当前目录生成一个 Hello_Stub.class 这个就是我们远程调用时需要的类

参考:
在RMI中,客户机上生成的调动调用参数和反调动返回值的代码称为残根。有的书上称这部分代码为“主干”。
服务器上生成的反调动调用参数和进行实际方法调用调动返回值的代码称为框架。
生成残根和框架的工具
Rmic命令行工具(RMI Compiler)
格式:
Rmic classname

4、创建一个服务器,用于发布2中写好的类。

    import java.rmi.*;
public class RMI_Server
{
    public static void main(String[] args)
    {
        try
        {
            Hello hello = new Hello();                //实例化要发布的类
            Naming.rebind("RMI_Hello", hello);      //绑定RMI名称 进行发布
            System.out.println("=== Hello server Ready === ");
        }
        catch(Exception exception)
        {
            exception.printStackTrace();
        }
    }
}

5. 创建一个客户程序进行RMI调用。

import java.rmi.*;
public class RMI_Client {
    public static void main(String[] args) {
        try
        {
           I_Hello hello = (I_Hello) Naming.lookup("RMI_Hello");  //通过RMI名称查找远程对象
            System.out.println(hello.SayHello());                        //调用远程对象的方法
        } catch (Exception e)
        {
          e.printStackTrace();
        }
    }


}


Naming.lookup("RMI_Hello") 其中的参数“RMI_Hello”只是针对本机的RMI查找,如果是异地的RMI调用请参照  rmi://127.0.0.1:1099/RMI_Hello       端口1099是默认的RMI端口,如果你启动 rmiregistry 的时候(见第6点)没有指定特殊的端口号,默认就是1099

到此我们所有的代码编写都完成了,不过不要急着去运行,请跟随第6点去运行,因为rmi 调用还会遇到一些特别的情况,偶花了牛劲,才找到原因的,许多刚用RMI的人,常常被这些问题搞得吐血

6、启动rmiRegistry并运行自己的远程服务器和客户程序。
1)服务器的运行
    先在DOS下运行 rmiregistry     这个命令是开启RMI的注册服务,开启以后我们的server程序才能调用rebing方法发布我们的类

    然后,运行我们的server程序  RMI_Server    这里是最容易出错的,参见下面注意事项。
     注意:
         如果提示找不到Stub类,这个需要用下面的命令来运行
java.exe -Djava.rmi.server.codebase=file:/E:\MIS_Interface\momo\TestEasy\classes/  RMI_Server

蓝字部分指定了stub类的路径。

  有人会问,我已经把stub 通过-classpath 加到类路径里面了,为什么还没有提示这个错误呢?原因是这样的:这里提示的找不到stub类,不是由你写的RMI_Server这个程序引起的,是由rmi注册服务器报告的异常,也就是我们前面启动的 rmiregistry ,因为你写的RMI_Server 要求RMI注册服务器注册一个新的类,自然RMI服务器必须知道你的类放在哪里,所以我们通过  -Djava.rmi.server.codebase 这个运行参数来指定
  你也可以通过修改操作系统的classpath 环境变量来指定stub的位置,只不过太麻烦

2) 客户端的运行
      直接运行RMI_Client  即可  注意 把 Stub 和 接口 I_Hello 加到类路径里
  
    通常第一次运行客户端都会报一个错误:   Access  XXXX 不记得具体的了,反正就是“访问权限限制”,这是因为RMI的服务需要授权,外部程序才能访问,所以我们要改动 jre的安全配置文件,来开放权限,  具体如下:

   打开你的jdk目录下的这个文件 C:\Program Files\Java\jdk1.5.0_04\jre\lib\security\java.policy
在文件最后加入下面代码:
grant {
           permission java.net.SocketPermission "*:1024-65535",
                "connect,accept";
           permission java.net.SocketPermission "*:80","connect";
        };
此代码,开放了端口的connect访问权限

注意 你应该修改服务器那台机子的安全配置文件,也就是你运行 rmiregistry 和 RMI_Server的机子
另外,很多人修改完以后,仍然报这个错误,多数情况是由于你没有修改到正确的jdk 下的文件,而是修改到其他jdk的文件, 我们安装oracle , Weblogic等等软件的时候都会自带一个 jdk,他们会自动在操作系统的环境变量里面加入jdk的路径,所以,你先要确定你运行服务器端程序是用哪个jdk,再修改这个jdk下的配置文件,确定当前jdk的路径很简单  开始 -》运行-》rmiregistry 看看这个DOS窗口标题的路径,就是你当前系统默认jdk的路径了

客户端正常运行以后,就会出现以下结果:
Hello world !!


这些字符是通过RMI调用远程服务器的类返回的结果


posted @ 2007-08-02 09:40 路边的石头-java 阅读(733) | 评论 (0) | 编辑 收藏
 
如何用servlet打开非HTML格式的文档

摘要
Java Servlet 编程可以很方便地将 HTML 文件发送到客户端 Web 浏览器。然而许多站点还允许访问非 HTML 格式的文档,包括 Adobe PDF、Microsoft Word 和 Micorsoft Excel 等。事实上这些非 HTML 格式只要能用 MIME 类型表示,就可以利用 servlet 来发送。本文将以 PDF 和 Microsoft Word 文件为例,向你介绍如何使用 servlet 传送非 HTML 格式文件,以及与防火墙交互的方法。
你只要将文件写到 servlet 的输出流中,就可以利用 servlet 在浏览器中打开一个文件。尽管这看起来非常简单,在打开非 HTML 格式文档(比如二进制数据或多媒体文件)的时候,仍要注意一些要点。
首先从获得 servlet 的输出流开始:

ServletOutputStream out = res.getOutputStream();


互联网上使用 MIME (multipurpos Internet mail extension 多目的互联网邮件扩展协议)来传送混合格式、多媒体和二进制数据文件。如果要在 servlet 的 response 对象中打开某个文档,就必须设置该文档的 MIME 类型。下面这个例子中我们将打开 PDF 文档。

MIME 类型
Web 浏览器使用 MIME 类型来识别非 HTML 文档,并决定如何显示该文档内的数据。将插件 (plug-in) 与 MIME 类型结合使用,则当 Web 浏览器下载 MIME 类型指示的文档时,就能够启动相应插件处理此文档。某些 MIME 类型还可以与外部程序结合使用,浏览器下载文档后会启动相应的外部程序。

MIME 类型非常有用。它们允许 Web 浏览器处理不同格式的文档,却不需要事先嵌入相关知识。Java Servlets 可以使用 MIME 类型来向浏览器传送非 HTML 文件,比如 Adobe PDF 和 Micorsoft Word。使用正确的 MIME 类型能够保证这些非 HTML 文件被正确的插件或外部程序显示。本文末的资料部分提供了一些网址,指向一些已定义 MIME 类型列表和关于 MIME 类型的文章。

PDF 文件的 MIME 类型是 "application/pdf"。要用 servlet 来打开一个 PDF 文档,需要将 response 对象中 header 的 content 类型设置成 "application/pdf":

// MIME type for pdf doc
res.setContentType( "application/pdf" );


若要打开一个 Microsoft Word 文档,你就要将 response 对象的 content 类型设置成 "application/msword":

// MIME type for MSWord doc
res.setContentType( "application/msword" );


如果是一个 Excel 文档,则使用 MIME 类型 "application/vnd.ms-excel"。其中 vnd 表示该应用程序的制造者,必须将它包含在 MIME 类型里才能够打开该类型文档。

有时候浏览器不能识别文档的 MIME 类型。通常这是由于没有安装这些文档需要的插件而导致的。这种情况下,浏览器会弹出一个对话框,询问用户是否需要打开该文件或是将它保存到本地磁盘上。

Content disposition
一种叫做 content-disposition 的 HTTP response header 允许 servlet 指定文档表示的信息。使用这种 header ,你就可以将文档指定成单独打开(而不是在浏览器中打开),还可以根据用户的操作来显示。如果用户要保存文档,你还可以为该文档建议一个文件名。这个建议名称会出现在 Save As 对话框的“文件名”栏中。如果没有指定,则对话框中就会出现 servlet 的名字。更多关于 content-disposition header 的信息,可以参阅资料。

在 servlet 中,你需要将 header 设置成下面这样:

res.setHeader("Content-disposition",
"attachment; filename=" +
"Example.pdf" );
// attachment - since we don´t want to open
// it in the browser, but
// with Adobe Acrobat, and set the
// default file name to use.


如果你要打开的是 Microsoft Word 文件,你可以设成:

res.setHeader("Content-disposition",
"attachment; filename" +
"Example.doc" );


封装非 HTML 文档
完成上述工作后,剩下的就非常简单了。你需要根据待传送文件的名字,创建一个 java.net.URL 对象。交给 URL 构造器的字符串必须是指向该文件的一个有效 URL 地址。在这个例子中,我要打开 Adobe employment 格式的文档:

String fileURL =
"http://www.adobe.com/aboutadobe/careeropp/pdfs/adobeapp.pdf;"


你的 URL 字符串也可以类似于 http://www.gr.com/pub/somefile.doc 或 http://www.gr.com/pub/somefile.xls。但必须确保待传送文件类型与先前在 HTTP response 对象中设置的 MIME 类型一致。

URL url = new URL ( fileURL );


防火墙
如果需要通过防火墙,最后一件要考虑的事情就是你的 URL 链接。首先应当搜集所用代理服务器的相关信息,例如主机名称和端口号等。更多关于如何通过防火墙建立链接的信息,可以参看下面的资料部分。

如果使用的是 Java 2,你应该从 URL 对象类中创建一个 URLConnection 对象,并设置下列系统属性:

URLConnection conn = url.openConnection();

// Use the username and password you use to
// connect to the outside world
// if your proxy server requires authentication.
String authentication = "Basic " + new
sun.misc.BASE64Encoder().encode("username:password".getBytes());

System.getProperties().put("proxySet", "true");

System.getProperties().put("proxyHost", PROXY_HOST); // your proxy host
System.getProperties().put("proxyPort", PROXY_PORT); // your proxy port
conn.setRequestProperty("Proxy-Authorization", authentication);


如果你使用的是 JDK 1.1,则不能设置这些系统属性。这种情况下,你可以根据所用代理服务器的信息创建 java.net.URL 对象:

url = new URL("http", PROXY_HOST,
Integer.parseInt(PROXY_PORT),
fileURL );
// assumes authentication is not required


深入工作
开始阅读你传送的文档之前,首先要从 URLConnection (或 URL) 对象中获得输入流 InputStream。在这个例子中,用 BufferedInputStream 将 InputStream 封装起来。

如果你采用 URLConnection,可以尝试如下代码:

BufferedInputStream bis = new
BufferedInputStream(conn.getInputStream());


如果你使用 URL,则可用下列代码:

BufferedInputStream bis = new
BufferedInputStream(url.openStream());


一旦你完成上述操作,就只要简单地将 InputStream 中的字节,写入到 servlet 的输出流 OutputStream 中:

BufferedOutputStream bos = new
BufferedOutputStream(out);

byte[] buff = new byte[2048];
int bytesRead;

// Simple read/write loop.
while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}


在最后的代码块中,关闭这些流。

这个例子是利用 doPost 来实现的(doPost 是 HttpServlet 子类的一个方法):

public void doPost(HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException
{
ServletOutputStream out =
res.getOutputStream ();

//---------------------------------------------------------------
// Set the output data´s mime type
//---------------------------------------------------------------

res.setContentType( "application/pdf" ); // MIME type for pdf doc

//---------------------------------------------------------------
// create an input stream from fileURL
//---------------------------------------------------------------

String fileURL =
"http://www.adobe.com/aboutadobe/careeropp/pdfs/adobeapp.pdf";

//------------------------------------------------------------
// Content-disposition header - don´t open in browser and
// set the "Save As..." filename.
// *There is reportedly a bug in IE4.0 which ignores this...
//------------------------------------------------------------
res.setHeader("Content-disposition",
"attachment; filename=" +=
"Example.pdf" );

//-----------------------------------------------------------------
// PROXY_HOST and PROXY_PORT should be your proxy host and port
// that will let you go through the firewall without authentication.
// Otherwise set the system properties and use URLConnection.getInputStream().
//-----------------------------------------------------------------
BufferedInputStream bis = null;
BufferedOutputStream bos = null;

try {
URL url = new URL( "http", PROXY_HOST,
Integer.parseInt(PROXY_PORT), fileURL );

// Use Buffered Stream for reading/writing.
bis = new BufferedInputStream(url.openStream());
bos = new BufferedOutputStream(out);

byte[] buff = new byte[2048];
int bytesRead;

// Simple read/write loop.
while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}

} catch(final MalformedURLException e) {
System.out.println ( "MalformedURLException." );
throw e;
} catch(final IOException e) {
System.out.println ( "IOException." );
throw e;
} finally {
if (bis != null)
bis.close();
if (bos != null)
bos.close();
}
}


结论
正如你所读到的,用 servlet 来打开非 html 文档相当简单。即使是要通过防火墙也是如此。只要设置了正确的 MIME 类型,就可以使用同样的代码来打开图片或其他多媒体文件。当今的互联网上包含了大量信息,其中许多数据被存储为非 HTML 格式。使用 servlet 能够克服 HTML 的限制,简单方便地向用户传送这些非 HTML 格式的信息

posted @ 2007-08-02 09:37 路边的石头-java 阅读(234) | 评论 (0) | 编辑 收藏
 
Linux下生成验证图片的问题说明

下面是DLOG4J生成随即验证码的代码:

package dlog4j;

import java.io.IOException;

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

import dlog4j.util.image.RandomImageGenerator;


/**
 * 用于产生注册用户时的随即图片以防止非法攻击
 * @author Liudong
 */
public class RandomImageServlet extends HttpServlet {

    public final static String RANDOM_LOGIN_KEY = "RANDOM_LOGIN_KEY";

 public void init() throws ServletException {
  System.setProperty("java.awt.headless","true");
 }

 
    public static String getRandomLoginKey(HttpServletRequest req) {
        return (String)req.getSession().getAttribute(RANDOM_LOGIN_KEY);
    }
   
    protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
    {
        HttpSession ssn = req.getSession();
        if(ssn!=null) {
            String randomString = RandomImageGenerator.random();
            ssn.setAttribute(RANDOM_LOGIN_KEY,randomString);
            res.setContentType("image/jpeg");
            RandomImageGenerator.render(randomString,res.getOutputStream());
        }
    }
}

这段代码在Linux下工作是没问题的,但是生成图片的时候会抛出类没定义的异常,除非JDK是1.5版本。如果JDK为1.4的话,那只能给应用服务器的启动加上参数-Djava.awt.headless=true,具体每个应用服务器如何加此参数请参照不同服务器的文档。Tomcat可以通过修改startup.sh来添加这个参数。

在网上看过很多对该问题的描述,都没有什么有效的解决办法。


posted @ 2007-08-01 16:28 路边的石头-java 阅读(340) | 评论 (0) | 编辑 收藏
 
Google和百度的两个变态域名

http://www.mamashuojiusuannizhucedeyumingzaichanggoogledounengsousuochulai.cn/  


中文拼音: "妈妈说就算你注册的域名再长GOOGLE 都能搜索出来"

然后百度也跟着注册了个: http://www.mamashuojiusuannizhucedeyumingzaichangbaidudounengsousuochulai.cn/

中文拼音:" 妈妈说就算你注册的域名再长百度都能搜索出来"


posted @ 2007-08-01 09:50 路边的石头-java 阅读(196) | 评论 (0) | 编辑 收藏
 
windows 的两大进程Svchost.exe和Explorer.exe

在这将着重介绍一下Windows系统的Svchost.exe和Explorer.exe两种进程,作为Windows系统中两种重要的进程,下面我们就来看看他们的特点以及在各个操作系统中的应用。

Explorer

在Windows系列的操作系统中,运行时都会启动一个名为Explorer.exe的进程。这个进程主要负责显示系统桌面上的图标以及任务栏,它在不同的系统中有不同的妙用。

Explorer在Windows 9x中的应用

在Windows 9x中,这个进程是运行系统时所必需的。如果用“结束任务”的方法来结束Explorer.exe进程,系统就会刷新桌面,并更新注册表。所以,我们也可以利用此方法来快速更新注册表。方法如下:

按下Ctrl+Alt+Del组合键,出现“结束任务”对话框。在该对话框中选择“Explorer”选项,然后单击“结束任务”按钮,将出现“关闭Windows”对话框。单击“否”按钮,系统过一会儿将出现另一个对话框,告诉你该程序没有响应,询问是否结束任务。单击“结束任务”按钮,则更新注册表并返回Windows 9x系统环境中。这比起烦琐的重新启动过程要方便多了?

Explorer在Windows 2000/XP中的应用

在Windows 2000/XP和其他Windows NT内核的系统中,Explorer.exe进程并不是系统运行时所必需的,所以可以用任务管理器来结束它,并不影响系统的正常工作。打开你需要运行的程序,如记事本。然后右击任务栏,选择“任务管理器”,选中“进程”选项卡,在窗口中选择

Explorer.exe进程,单击“结束进程”按钮,,接下来桌面上除了壁纸(活动桌面Active Desktop的壁纸除外),所有图标和任务栏都消失了。此时你仍可以像平常一样操作一切软件。

如果你想运行其他软件,但此时桌面上空无一物,怎么办?别着急,下面有两种可以巧妙地打开其他软件:

第一种方法:按下Ctrl+Alt+Del组合键,出现“Windows安全”对话框,单击“任务管理器”按钮(或是直接按下Ctrl+Shift+Esc组合键),在任务管理器窗口中选中“应用程序”选项卡,单击“新任务”,在弹出的“创建新任务”的对话框中,输入你想要打开的软件的路径和名称即可。

你还可以在正在运行的软件上,选择“文件→打开”,在“打开”对话框中,点击“文件类型”下拉列表,选择“所有文件”,再浏览到你想打开的软件,右击它,在快捷菜单中选择“打开”命令,就可以启动你需要的软件了。注意,此时不能够通过单击“打开”按钮来打开软件,此种方法适用于大多数软件,Office系列除外。

通过结束Explorer.exe进程,还可以减少4520KB左右的系统已使用内存,无疑会加快系统的运行速度,为资源紧张的用户腾出了宝贵的空间。

Svchost.exe

Svchost.exe是NT核心系统的非常重要的进程,对于2000、XP来说,不可或缺。很多病毒、木马也会调用它。所以,深入了解这个程序,是玩电脑的必修课之一。

大家对Windows操作系统一定不陌生,但你是否注意到系统中“Svchost.exe”这个文件呢?细心的朋友会发现Windows中存在多个 “Svchost”进程(通过“ctrl+alt+del”键打开任务管理器,这里的“进程”标签中就可看到了),为什么会这样呢?下面就来揭开它神秘的面纱。

在基于NT内核的Windows操作系统家族中,不同版本的Windows系统,存在不同数量的“Svchost”进程,用户使用“任务管理器”可查看其进程数目。一般来说,Win 2000有两个Svchost进程,Win XP中则有四个或四个以上的Svchost进程(以后看到系统中有多个这种进程,千万别立即判定系统有病毒了哟),而Win 2003 server中则更多。这些Svchost进程提供很多系统服务,如:rpcss服务(remote procedure call)、dmserver服务(logical disk manager)、dhcp服务(dhcp clieNT)等

如果要了解每个Svchost进程到底提供了多少系统服务,可以在Win 2000的命令提示符窗口中输入“tlist -s”命令来查看,该命令是Win 2000 support tools提供的。在Win XP则使用“tasklist /svc”命令。

Svchost中可以包含多个服务

Windows系统进程分为独立进程和共享进程两种,“Svchost.exe”文件存在于“%systemroot% system32”目录下,它属于共享进程。随着Windows系统服务不断增多,为了节省系统资源,微软把很多服务做成共享方式,交由 Svchost.exe进程来启动。

但Svchost进程只作为服务宿主,并不能实现任何服务功能,即它只能提供条件让其他服务在这里被启动,而它自己却不能给用户提供任何服务。那这些服务是如何实现的呢?

原来这些系统服务是以动态链接库(dll)形式实现的,它们把可执行程序指向 Svchost,由Svchost调用相应服务的动态链接库来启动服务。那Svchost又怎么知道某个系统服务该调用哪个动态链接库呢?这是通过系统服务在注册表中设置的参数来实现。

从启动参数中可见服务是靠Svchost来启动的。

因为Svchost进程启动各种服务,所以病毒、木马也想尽办法来利用它,企图利用它的特性来迷惑用户,达到感染、入侵、破坏的目的(如冲击波变种病毒“w32.welchia.worm”)。但Windows系统存在多个Svchost进程是很正常的,在受感染的机器中到底哪个是病毒进程呢?这里仅举一例来说明。

假设Windows XP系统被“w32.welchia.worm”感染了。正常的Svchost文件存在于“c:\Windows\system32”目录下,如果发现该文件出现在其他目录下就要小心了。“w32.welchia.worm”病毒存在于“c:\Windows\system32Win s”目录中,因此使用进程管理器查看Svchost进程的执行文件路径就很容易发现系统是否感染了病毒。

Windows系统自带的任务管理器不能够查看进程的路径,可以使用第三方进程管理软件,如“Windows优化大师”进程管理器,通过这些工具就可很容易地查看到所有的Svchost进程的执行文件路径,一旦发现其执行路径为不平常的位置就应该马上进行检测和处理。


posted @ 2007-08-01 09:48 路边的石头-java 阅读(291) | 评论 (0) | 编辑 收藏
 
Infosys董事长:印度软件业领先中国20年

        印度软件巨头印孚瑟斯技术公司(Infosys)董事长纳拉亚纳·穆尔蒂日前表示,他认为印度软件业领先中国20年。

  印度报业托拉斯援引穆尔蒂的话说,中国的制造业享誉世界,但软件业落后于印度。但他同时强调,印度软件公司不能低估中国同行的发展潜力。

  在分析印度软件业迅速发展的原因时,穆尔蒂认为,印度软件人才工作勤奋,软件公司更加了解顾客的需求,同时在运营方面更加优秀。

  穆尔蒂指出,印度软件业发展了先进的销售体系、销售流程和销售方法,并且高度重视产品质量。与此同时,他认为印度应该在软件业方面进一步加强其优势。

  印度目前已经成为全球软件研发基地之一和IT服务外包主要目的地。据统计,目前印度公司参与的IT服务合同约占全球IT服务合同总金额的7%。这其中,塔塔咨询公司、印孚瑟斯技术有限公司和维普罗公司等大型企业扮演了重要角色。


posted @ 2007-08-01 09:47 路边的石头-java 阅读(184) | 评论 (0) | 编辑 收藏
 
网站设计必知的65条原则

网站中有哪些关键技巧?有哪些陷阱?在这里,世界上一流的网站设计专家,让你共享他们的秘密,告诉你:使网站赋予情趣的诀窍、应该避免做什么、应使用什么工具软件以及他们喜爱和厌恶的网站。

01明确内容

如果你想成为一个网站设计者,并正想建一个网站的话,首先应该考虑网站的内容,包括网站功能和你的用户需要什么。你的整个设计都应该围绕这些方面来进行。

02抓住用户

如果用户不能够迅速地进入你的网站,或操作不便捷,网站设计就是失败的。不要让用户失望而转向你的对手的网站。Ailiss.com

03优化内容

内容是核心。大约在两年以前,企业网站就像一本广告册子,更槽糕的是,网站使用了大量的图片,似乎要几个世纪才能下载完。Chanels网站(www.channels.co.uk)在设计的某些方面是成功的,但是内容太贪乏,并且要花很长时间才能找到所要的东西,因此不能算是一个成功的网站。

04快速下载

没有什么比要花很长时间下载页面更槽糕的了。作为一条经验,一个标准的网页应不大于60K,通过56K调制解调器加载花30秒的时间。有的设计者说网页加载应在15秒内。

05网站升级

时刻注意网站的运行状况。性能很好的主机随着访问人数的增加,可能会运行缓慢。但是,如果你不想失去访问者的话,一定要仔细计划好你的升级计划。Ailiss.com

06坚持基本原则

即使你不懂HTML语言,你只需购买一个有版权的所见即所得的网页设计工具,如AdobePageMill或MicrosoftFrontPageExpress,就可以创建一个看起来很合理的网站。但是,在设计时,这些软件包虽然不需要HTML,却使网站速度下降。为了成功地设计网站,你必须理解HTML是如何工作的。大多数的网站设计者建议网络新手应从有关HTML的书中去寻找答案,用Notepad制作网页。

07学习HTML

用HTML设计网站,可以控制设计的整个过程。但是,如果你仅仅是网站设计的新手,你应该寻找一个允许修改HTML的软件包。HomeSite4是一个很好的Web设计工具。在设计过程中,HomeSite4能帮助你学习HTML。它还允许你切换到所见即所得的模式,以便你在把网站发送到Web之前,预览你的网站。

08用笔画一个网站的框架

圣人云:笔比剑更强大。在用计算机之前,用笔画一个网站的框架,显示出所有网页的相互关系。计划好你的用户如何以最少的时间浏览你的网站。

09“在计算机上永远也找不到好的方案”。——专家忠告

10网站地图

许多设计者把他们的网站地图放在网站上,这种做法,却是弊大于利。绝大部分的访问者上网是寻找一些特别的信息,他们对于你的网站是如何工作的,并没有兴趣。如果你觉得你的网站需要地图,那很可能是需要改进你的导航和工具条

11“睁大你的眼睛,留意所有的事情。对最不相关的东西的观察可以得到最好的灵感。观察一个站点的结构和设计。理解站点结构的关键元素,确保你的设计是围绕站点浏览进行的。”——专家忠告

12点击规则

听说过3次点击规则吗?对于小型网站,在你的主页上,没有任何一条信息,需要点击次数超过3次的。对于大型网站,使用导航和工具条来改善操作。

13特殊字体的应用

虽然你可以在你的HTML中使用特殊的字体,但是,你不可能预测你的访问者在他们的计算机上将看到什么。在你的计算机里看起来相当好的页面,在另一个不同的平台上看起来可能非常糟糕。一些网站设计员喜欢使用来定义特性,这虽然允许你使用特殊的字体,但是仍需要一些变通的方法,以免你所选择的字体在访问者的计算机上不能显示。级联风格表CSS有助于解决这些问题,但是只有最新版的浏览器才支持CSS。



14“使用切合实际的简便的命名规则。”——专家忠告

15检查错别字

好的拼写是人们一生中重要的技能。但是遗憾的是,许多设计者都缺少这种技能。确保你拼写正确,并且格外注意平常容易误写的错别字。Ailiss.com

16避免长文本页面

在一个站点上有许多只有文本的页面,是令人乏味的,且也浪费Web的潜力。如果你有大量的基于文本的文档,应当以AdobeAcrobat格式的文件形式来放置,以便你的访问者能离线阅读。

17不要使用卷滚条人们厌恶在网上使用卷滚条。Trouble网站(www.Trouble.co.uk)是一个典型的设计很差的网站。它基于一个浮动的架构,为了阅读所有的文本,浏览者不得不使用卷滚条。

18专家最喜爱的Web设计工具

1.AdobePhotoshop

2.MacromediaFlash

3.AdobeIllustrator

4.AdobeImageRead

5.Dreamweaver

6.MacromediaFireworks

7.AllaireHomesites

8.MicrosoftNotepad

9.MacromediaDirector

10.lightwave

11.MacromediaFreehand

12.其它:AdobeAcrobatExchange,AllaireColdFusion,BBEdit,HTMLValidator等。

19网站介绍

你应当有一个很清晰的网站介绍,告诉访问者你的网站能够提供些什么,以便访问者能找到想要的东西。但是,许多设计者都没有这样做。有效的导航条和搜索工具使人们很容易找到有用的信息,这对访问者很重要。告诉访问者你所提供的正是他们想要的信息。

20“网站一旦发布,网站设计的优点和缺陷全都公布于世。没有什么方法使你能够比从自己的错误、倾听其他人的建议和用户反馈意见中学到更多的东西。”——专家忠告

21闪烁让人头痛

通过使用标识可以吸引访问者对你的主页特殊部分的注意,但这也让你的访问者头痛。如果你想使访问者再次光顾你的网站,就少用此方法。

22背景颜色

背景颜色也会产生一些问题,可能会使网页难于阅读。你应当坚持使用白色的背景和黑色的文本,另外还应当坚持使用通用字体。Ailiss.com

23向前和向后按钮

应当避免强迫用户使用向前和向后按钮。你的设计应当使用户能够很快地找到他们所要的东西。绝大多数好的站点在每一页同样的位置上都有相同的导航条,使浏览者能够从每一页上访问网站的任何部分。

24“坚持你的信念。严格遵守各种规则。避免想当然。绝不停止学习。”——专家忠告

25点击记数器

不要轻易考虑在你的网站上放置一个醒目的点击记数器。你设计网站是为了给访问者提供服务,而不是推销你自己认为重要的东西。大多数浏览者认为计数器毫无意义,它们很容易被做假,浏览者也不想看广告。如果你显示你的网站是多么受欢迎,你最好提供一个链接,显示访问日志。

26不要用框架

与记数器一样,框架在网页上越来越流行。在大多数网站上,在屏幕的左边有一个框架。但是设计者立刻就发现,在使用框架时产生了许多的问题。使用框架时如果没有17英寸的显示屏几乎不可能显示整个网站。框架也使得网站内个人主页不能够成为书签。也许更重要的是,搜索引擎常常被框架混淆,从而不能列出你的网站。

27去掉图像

在浏览器中即使去掉了图像功能,也要保证访问者能够在你的网站上获得满意的效果。对于那些使用ISDN连接并且关掉了图像功能的访问者,还能获得好的网页加载性能。可以通过在网页底部提供另外的链接和使用替代文字,而不是图像来满足访问者的需要。

28重复使用图像

一些网站由于使用大量不重复的图像而错过了使用更好的技巧的机会。在创建商标时,在网页上多次使用同样的图像是一个好的方法,并且一旦它们被装入,以后重新载入就会很快。

29避免使用过大的图像

不要使用横跨整个屏幕的图像。避免访问者向右滚动屏幕。占75%的屏幕宽度是一个好的建议。Ailiss.com

30“避免使用炫耀的技巧。”——专家忠告

31选择使用Flash动画

许多使用比较慢的计算机的访问者发现动画图标很容易耗尽系统资源,使网站的操作变得很困难,因此,应该给用户一个跳过使用Flash动画的选择。

32尽量少使用Flash插件

虽然许多Web设计者认为Flash功能很强大,并且Netscape5.0将支持Flash,在使用时不必再下载任何插件。但是,最好还是取消使用Flash做各接口的想法。

33让用户先预览小图像

如果不得不放置大的图像在网站上,就最好使用Thumbnails软件,把图像的缩小版本的预览效果显示出来,这样用户就不必浪费金钱和时间去下载他们根本不想看的大图像。

34动画与内容应有机结合

确保动画和内容有关联。它们应和网页浑然一体,而不是干巴巴的。动画并不只是MacromediaDirector等制作的东西的简单堆积。Ailiss.com

35慎用声音

声音的运用也应得到警惕。内联声音是网页设计者的另一个禁地。因为过多地使用声音会使下载速度很慢,同时并没有带给浏览者多少好处。首次听到鼠标发出声音可能会很有趣,但是多次以后肯定会很烦人。使用声音前,应该仔细考虑声音将会给你带来什么。

36少用Java和AxtiveX

在网页上应尽量少使用Java和AxtiveX。因为并不是每一种浏览器都需要使用它,只有那些Netscape和Explorer的早期版本的使用者才需要它。另外Mac在处理Java时也存在问题,过分地使用Java,会使Mac崩溃。

37设计成功的网站

www.bmw.co.uk——内容和关联性很好 Ailiss.com

www.yugop.com——图形下载很快

www.comicrelief.org.uk——设计简单明了

www.dreamcast-europe.comwww.newsunlimited.co.ukwww.newbeetle.comwww.swoon.comwww.viaduct.co.uk

38慎用插件

在Web设计中,如果依赖于一些特别的插件,会减少网站的吸引力。如果访问者没有所要求的插件,将不得不到其它站点去下载,这样访问者有可能就不会返回了。

39使用著名的插件

如果网站上有声音或视频,要保证使用者通过使用某个知名的插件,能够听到或看到。许多站点使用QuickTime、RealPlay和Shockwave插件。因为,许多访问者并不愿意浪费很多时间和金钱去下载可能仅使用一次的插件。

40使用先进技术

跟上新的技术。Web技术的进步绝不会停止,所以应花一些时间来研究新产品和开发技术。

41自己创建图像和声音

使用你自己创建的或从某个商业网站上下载的图像和声音。在制作商业网站时,应该花足够的资金来创建图形,以增强公司的宣传。Ailiss.com

42“无论是游戏、图像、动画还是电影,想想你喜欢的设计是怎样的,这将激发你的创作灵感,使你创作出新的和更好的网站。”——专家忠告

43平台的兼容性

要为用户着想,必须最少在一台PC和一台Mac机上测试你的网站,看看兼容性如何。

44用软件分析工具找错

使用软件分析工具检查HTML。软件分析工具DoctorHTML能够帮助检查HTML中的任何问题。如果你有许多网页需要检查,可选用软件分析工具。在网址www.weblint.org/validation.html中,你能够找到更多有效的HTML工具。

45避免错误链接

网站中可能与其它一些有用的站点作了链接。但是,如果在你的网页上有链接,一定要经常检查它们,保证链接有效。链接的网站可能很多,但不要链接到与你的内容无关的网站上。

46给观众成熟的东西

如果网站没有完成,就不要发送到Web上。所有好的网站都是在幕后完成之后再发布的。

47在搜索引擎上登记网站

任何一个人发现你的网站的机会都很少,除非你把你的网站在主要的搜索引擎上进行登记。Ailiss.com

48设计一个留言板

浏览者愿意把时间花在好的网站上,所以最好有一个留言本,这能激励访问者再次回到你的网站,还有助于扩充网站内容。

49测试网站

在你的网站正式发布之前,必须进行有用的测试。在设计网站时要使用最新的软件,但是不要忘了人们并不会使用最新的浏览器,所以要照顾到以前的浏览器。在上载网站时还要测试所有的链接和导航工具条。

50“尽你所能反复测试所设计的网站,直到你不能发现新的东西为止。”——专家忠告

51演示即将发布的网站

在网站正式运行之前,让人演示它。演示中人们会告诉你所设计的网站是否容易使用。Ailiss.com

52动画点缀

网页上的动画最多只用一个

53“倾斜的按钮看起来不会太好,最好不要使用。”——专家忠告

54内容组织

在开始创建新的网页前,仔细考虑网站内容的组织。决定好想让访问者浏览的内容,然后设计导航系统。

55“空白万岁”

注意留空白。不要用图像、文本和不必要的动画GIFs来充斥网页,即使有足够的空间,在设计时也应该避免使用。

56“利用空白去吸引注意力。为了吸引眼球,Web设计者使用各种方法,比如:闪烁、旋转等,但是利用空白会吸引更多的注意力。”——专家忠告

57图像压缩

为了保持小的图像,可以使用类似GIF向导的程序,它能自动对图像进行压缩。先声明图像的大小,在图像显示之前最好能详细说明图像大小属性,可以在IMG标签中保存这个属性。这可以使网页显得很流畅,因为浏览器可以在图像被下载之前在屏幕上显示整个网页。

58设计失败的网站

www.boo.com——在它上面找一件T恤衫要花一个小时www.miniheroes.co.uk——不吸引人,主页太雷赘 Ailiss.com

www.saturn.com.——设计太差

www.e13.com.——没有新意

www.song.com.——导航不知所云

59图像大小属性,可以在IMG标签中保存这个属性。这可以使网页显得很流畅,因为浏览器可以在图像被下载之前在屏幕上显示整个网页。Ailiss.com

60用户注册

如果能知道谁浏览了网站以及是怎样浏览网站的,那么就能得到大量有用的信息。但是,要求访问者在浏览网站之前进行注册,这样做是要冒风险的,因为这将赶走一批不愿意注册的人。获得信息的另一种方法是进行有奖竞猜或金钱奖励,让用户能主动填一些信息反馈表。

61使网站具有交互功能

在网站上提供一些回答问题的工具,使得访问者能从网站上获得交互的信息。Ailiss.com

62图片更新

尽可能经常更换网站上的图片,人们更愿意点击的是图片而不是文本。

63在网站上提供游戏

游戏是很好的交互工具,它是使访问者能再次光顾网站的好方法。

64挑选工具软件

仔细选择Web设计工具。保证使用自己最想要的、自我感觉最好的软件。

65使用最新版本的软件

尽量使用Web设计软件的最新版本,还应当能被授权进行免费或便宜的升级。
posted @ 2007-08-01 09:43 路边的石头-java 阅读(259) | 评论 (0) | 编辑 收藏
 
你不知道的网络招聘与求职潜规则

现在中国所有招聘网站都是以人事经理为中心,因为他们是给钱的一方,较少从求职者角度考虑,如果我们从求职者立场或者中立立场来看中国招聘网站的生意模式及运作流程,将这个求职者并不知晓的事情公布出来,你就会更好清醒认识招聘网站,也更好的实际的利用人才网站求职:
1、 人才网站与企业人事经理的生意模式对求职者影响:
      人才网站的行规是企业人事经理支付600元,可以在一个月内发布一定的职位让求职者投递简历,可以搜索查看人才网站简历库的简历,还可以下载一定数量的简历主动与求职者联系。而大企业及知名公司一般都是购买1年的招聘服务。问题就出来了:如果这个职位1到2周企业招到人了,但他购买的是1个月的服务,所以企业的职位还是挂在网上,而且人才网站竞争激烈,一般都会赠送1个月服务。所以一般职位至少1个月挂在人才网站是无效的,是浪费求职者查看与投递简历时间的。
      大公司最不可靠,他们用网络、报纸、现场,1年的大大banner永远挂在人才网站上,他们并不需要人,只是为了广告宣传。
      所以人才网站50%以上的职位都是过期的、无效的、不招人或招满人的,所有求职者抱怨我投了那么多简历为什么反馈率那么低,反馈率低是非常正常的。
      另外51job网站的反馈率是最低的,这也是行业秘密:因为51Job的资源80%是以报纸招聘为主,报纸招聘效率高,但网站上的职位都是在报纸上刊登过后作为免费与补充服务,所以很多HR只会看报纸上来的简历,网站来的简历基本不看,在加上51job简历投递量实在太大,那些懒惰的HR才懒得一封一封的看,只会用搜索关键字来看,如本科+3年工作经验+主管等,其他不符合条件的看都不看一眼。所以你知道为什么一直没有公司找你面试,不是你不行,而是HR都不看你发的简历。下面第二部分告诉你如何被他们搜索到。
      现在你知道网络招聘的反馈率为什么那么低了吧。不信你用自动回复邮件形式发送中国3大招聘网站职位HR的邮箱,看看有多少HR看了你的简历,一个工作论坛的网友说,他试着发了100个HR邮箱简历,可以通过自动回复的反馈率统计,可以看到50%HR不看简历就直接删除,30%根本就不打开邮件,只有20%打开邮箱,还有10%可能已经找到人的。他的分析说即使是中国前3名招聘网站以严格标准来看也只有10%职位是真正要急迫招人的。

二、既然知道一些潜规则,那我们也迎合一些这些规则,告诉你一些网络求职的小秘密
(1)采用行业招聘网站求职。因为行业招聘网站是按行业发布职位信息的,所以专业和工作经历比较对口。比如你要找物业管理类的工作,你到万行工作网www.114job.com.cn的物业管理招聘频道上去注册简历就比较好,因为那里全部都是物业管理类的企业在招聘;如果你要找外贸的工作,你就可以万行工作网的外贸招聘频道去找,肯定有大量的外贸工作机会。其它的就不在列举。在目前的情况下,几乎每个行业的人才在万行工作网上都能找到自己的频道。

(2)简历要与大公司沾边
   当人事经理搜索招聘网站简历库简历时,一般会以关键字“知名企业名称+职位名称”,比如消费品行业可能喜欢可口可乐及宝洁的人,人事经理会这样搜索,例如:“可口可乐+销售经理”,系统会搜索到简历中出现以上关键字的求职者,如果你的简历里出现知名企业名称的字样,就可以被搜索到,例如:“我在xx矿泉水公司工作,成功地令竞争对手——可口可乐旗下的天与地矿泉水在当地的市场份额减少……”:“我在可口可乐的广州白云区经销商工作”等。又提高了人事经理浏览简历的机会!

(3) 经常刷新简历
  当人事经理搜索简历库的简历时,符合条件的简历是按刷新的时间顺序排列,而一般只会看前面一两页。很多求职者其实并不知道刷新简历可以获得更多求职机会。因此每次登陆,最好都刷新简历,刷新以后,就能排在前面,更容易被人事经理找到!

(4) 不要只应聘最近三天的职位
   一般求职者认为刚刚发布的最新的招聘信息肯定是成功率最大的,其实不然。因为很多企业人事经理没有及时的登陆刷新刊登的职位,所以求职者在搜索职位时刚刷新的职位会排在前面,这些职位应聘的人多,竞争大,相反,一些职位已经是半个月甚至两个月的,应聘的人少,成功率反而高。

(5) 让你的邮件永远在最前面
   你要知道每天人事经理看求职者邮箱,他们其实是很懒的,100多页简历邮件他们最多只看前5页!你现在应该知道为什么你的求职简历永远没有回应!
   所以发邮件到企业指定的邮箱时,怎样才能让你的邮件永远排在最前面,让人事经理每次打开邮箱都首先看到你的邮件?只要在发邮件前,把电脑系统的日期改为一个将来的日期,如2008年,因为大多邮箱都是默认把邮件按日期排序,所以你的邮件起码要到2008年以后才会被排在后面! (如果你求职成功,要向我请客耶!)

(6) 新颖的邮件标题
   人事经理每天收到大量的求职电子邮件,求职者一般会按企业要求把邮件题目写成:应聘xx职位,怎样才能吸引人事经理的眼球,让他先打开自己的邮件?可以在邮件题目上做文章。一天人事经理收到几百封邮件,只有标题新颖的才有机会被打开。
   例子:我的一个女性朋友发了100多封邮件求职都没有任何反应,因为应聘做文员的太多了,而我这个朋友做过空姐,我将她的邮件标题改为“空姐来广州找工作”,引起绝大部分男人事经理想入非非,结果三天之内有30多个男人事经理通知面试,3个月找不到工作的她而变成3天找到上十份工作。你现在知道邮件标题的重要性了吧。

(7) 简历最好放靓照
   对于人事经理来说,每天需要浏览大量简历,如果同等的条件,一般会先通知有照片的求职者来面试,因为通过照片,人事经理对应聘者又多了几分了解。如果是美女,被通知的可能性就更大。我作为人事经理,曾经招聘一个人事主管,收到300多封简历,我找出前30份有相片的前5份,通知了最漂亮相片的2个女孩,就定下了其中的一个。对于一般职位如文职人员之类,中国人的传统还是以貌取人,你即使不漂亮,也照一个艺术照,就增多了面试机会(与其等死,还不如放手一搏),毕竟很现实的是,简历的目的就是有面试的机会,其他就要靠实力与运气了。

(8)求职信“骂”对方公司往往会带来意想不到的效果
   一般人认为在求职信中称赞对方公司会引起好感,其实不然。如果先指出这家公司的缺点,往往会引起关注,语不惊人死不休呢,我作为人事经理,我只会对指出我们缺点的求职者有好感,对恭维我们公司的求职者一般会放在一边。即使你不知道对方公司缺点,你随便写一些永远不会错的:“我认为贵司创新不够,市场表现过于常规化;我以消费者心态观察贵司,发现贵司客户服务还有许多待改进的地方;我发现贵司品牌形象还有可能做的更好……”如闻其详,可面谈。可勾引相关公司面试。只要有面试机会,其他再说。(简历有机会面试目的是一切,手段是无所谓的)。

(9)自己要学会让简历与职位匹配
   2个观念都是有效的:一是不要太在乎对方职位要求的描述,很多职位描述只是写写,连经理都不知道要招什么样的人,如果你看到对方职位要求本科,你是专科就不敢投递简历,那就失去机会了。如果你看到对方要求有5年经验,你只有3年经验,你也不敢投,那完全没有必要。因为人事经理们对职位的描述只是例行公事随便谢谢而已,你千万不要当真!
   另外一个匹配观念就是他的职位如何描述,你就改变你的简历换一个说法匹配,如他说要求领导能力强,你的简历也说具有领导才能,他要沟通能力一流,你的简历也说我最擅长沟通。你的简历表面匹配度最高,也可以多增加机会。你可将简历改成为他职位描述完全量身定做的简历。
   其实求职者有更多的面试机会,不但可以增加成功求职机会,还可以增加自己的信心,工资越叫越高还可以积累面试经验。很多优秀的求职者网上发了很多简历没有回应,以为自己不行没有竞争力,只好自动降价,实为可惜! 特别是中国最大的招聘网站51job的简历投递反馈率是同行业最低的,因为它主要资源80%投入报纸,报纸招聘完甚至录取完毕后将职位入库,只是将职位作为一个摆设放到网站。

   要知道现在网络求职的成功率一般2个月是发1000份简历,有8份面试,2份成功,一个是你不想去的,可能一个是你相对满意的。所以网络求职的朋友千万不要对自己失去信心。
posted @ 2007-08-01 09:39 路边的石头-java 阅读(235) | 评论 (0) | 编辑 收藏
 
面试中可能用到的英语

Q: Can you sell yourself in two minutes? Go for it. (你能在两分钟內自我推荐吗?大胆试试吧!)
     A: With my qualifications and experience, I feel I am hardworking,responsible and diligent in any project I undertake. Your organization could benefit from my analytical and interpersonal skills.(依我的资格和经验,我觉得我对所从事的每一个项目都很努力、负责、勤勉。我的分析能力和与人相处的技巧,对贵单位必有价值。)

     Q:Give me a summary of your current job description. (对你目前的工作,能否做个概括的说明。)
     A:I have been working as a computer programmer for five years. To be specific, I do system analysis, trouble shooting and provide software support. (我干了五年的电脑程序员。具体地说,我做系统分析,解决问题以及软件供应方面的支持。)

     Q:Why did you leave your last job?(你为什么离职呢?)
       A: Well, I am hoping to get an offer of a better position. If opportunity knocks, I will take it.(我希望能获得一份更好的工作,如果机会来临,我会抓
住。)
     A:I feel I have reached the "glass ceiling" in my current job. / I feel there is no opportunity for advancement. (我觉得目前的工作,已经达到顶峰,即沒有升迁机会。)

     Q:How do you rate yourself as a professional?(你如何评估自己是位专业人员呢?)
     A: With my strong academic background, I am capable and competent. (凭借我良好的学术背景,我可以胜任自己的工作,而且我认为自己很有竞争力。)
    A:With my teaching experience, I am confident that I can relate to students very well. (依我的教学经验,我相信能与学生相处的很好。)

     Q: What contribution did you make to your current (previous) organization?(你对目前/从前的工作单位有何贡献?)
     A: I have finished three new projects, and I am sure I can apply my experience to this position. (我已经完成三个新项目,我相信我能将我的经验用在这份工作上。)

     Q:What do you think you are worth to us?(你怎么认为你对我们有价值呢?)
     A:I feel I can make some positive contributions to your company in the future. (我觉得我对贵公司能做些积极性的贡献。)

     Q:What make you think you would be a success in this position? (你如何知道你能胜任这份工作?)
    A:My graduate school training combined with my internship should qualify me for this particular job. I am sure I will be successful. (我在研究所的训练,加上实习工作,使我适合这份工作。我相信我能成功。)

     Q:Are you a multi-tasked individual?(你是一位可以同时承担数项工作的人吗?)or Do you work well under stress or pressure?(你能承受工作上的压力吗?)
     A:Yes, I think so.
     A:The trait is needed in my current(or previous) position and I know I can handle it well. (这种特点就是我目前(先前)工作所需要的,我知道我能应付自如。)

     Q:What is your strongest trait(s)?(你个性上最大的特点是什么?)
     A:Helpfulness and caring.(乐于助人和关心他人。)
    A:Adaptability and sense of humor.(适应能力和幽默感。)
    A:Cheerfulness and friendliness.(乐观和友爱。)

    Q: How would your friends or colleagues describe you?(你的朋友或同事怎样形容你?)
    A: (pause a few seconds) (稍等几秒钟再答,表示慎重考虑。)
     They say Mr. Chen is an honest, hardworking and responsible man who deeply cares for his family and friends. (他们说陈先生是位诚实、工作努力,负责任的人,他对家庭和朋友都很关心。)
     A:They say Mr. Chen is a friendly, sensitive, caring and determined person.(他们说陈先生是位很友好、敏感、关心他人和有决心的人。)

     Q:What personality traits do you admire?(你欣赏哪种性格的人?)
     A: (I admire a person who is)honest, flexible and easy-going. (诚实、不死板而且容易相处的人。)
     A: (I like) people who possess the "can do" spirit. (有"实际行动"的人。)

     Q:What leadership qualities did you develop as an administrative personnel?(作为行政人员,你有什么样的领导才能?)
     A:I feel that learning how to motivate people and to work together as a team will be the major goal of my leadership. (我觉得学习如何把人们的积极性调动起来,以及如何配合协同的团队精神,是我行政工作的主要目标。)
     A:I have refined my management style by using an open-door policy. (我以开放式的政策,改进我的行政管理方式。)

     Q:How do you normally handle criticism?(你通常如何处理別人的批评?)
     A:Silence is golden. Just don’t say anything; otherwise the situation could become worse. I do, however, accept constructive criticism. (沈默是金。不必说什么,否则情况更糟,不过我会接受建设性的批评。)
     A:When we cool off, we will discuss it later. (我会等大家冷靜下来再讨论
。)

     Q: What do you find frustrating in a work situation?(在工作中,什么事令你不高兴?)
     A: Sometimes, the narrow-minded people make me frustrated. (胸襟狭窄的人,有时使我泄气。)
     A:Minds that are not receptive to new ideas. (不能接受新思想的那些取。)

     Q:How do you handle your conflict with your colleagues in your work? (你如何处理与同事在工作中的意见不和?)
     A:I will try to present my ideas in a more clear and civilized manner in order to get my points across. (我要以更清楚文明的方式,提出我的看法,使对方了解我的观点。)

     Q:How do you handle your failure?(你怎样对待自己的失敗?)
     A: None of us was born "perfect". I am sure I will be given a second chance to correct my mistake. (我们大家生来都不是十全十美的,我相信我有第二个机会改正我的错误。)

     Q:What provide you with a sense of accomplishment. (什么会让你有成就感?)
    A:Doing my best job for your company. (为贵公司竭力效劳。)
     A:Finishing a project to the best of my ability. (尽我所能,完成一个项目。)

     Q:If you had a lot of money to donate, where would you donate it to?Why?(假如你有很多钱可以捐赠,你会捐给什么单位?为什么?)
     A:I would donate it to the medical research because I want to do something to help others. (我会捐给医药研究,因为我要为他人做点事。)
     A:I prefer to donate it to educational institutions. (我乐意捐给教育机构。)

     Q:What is most important in your life right now?(眼下你生活中最重要的是什么?)
     A:To get a job in my field is most important to me. (对我来说,能在这个领域找到工作是最重要的。)
     A:To secure employment hopefully with your company. (希望能在贵公司任职对我说最重要。)

     Q:What current issues concern you the most?(目前什么事是你最关心的?)
     A:The general state of our economy and the impact of China’ entry to WTO onour industry. (目前中国经济的总体情況以及中国入世对我们行业的影响。)

     Q: How long would you like to stay with this company?(你会在本公司服务多久呢?)
     A: I will stay as long as I can continue to learn and to grow in my field.(只要我能在我的行业力继续学习和长进,我就会留在这里。)

     Q:Could you project what you would like to be doing five years from now?(你能预料五年后你会做什么吗?)
     A:As I have some administrative experience in my last job, I may use my organizational and planning skills in the future. (我在上一个工作中积累了一些行政经验,我将来也许要运用我组织和计划上的经验
和技巧。)
     A:I hope to demonstrate my ability and talents in my field adequately.(我希望能充分展示我在这个行业的能力和智慧。)
     A:Perhaps, an opportunity at a management position would be exciting.(也许有机会,我将会从事管理工作。)
     如果不愿正面回答,也可以说:It would be premature for me to predict this. (现在对此问题的预测,尚嫌过早。)
     甚至还可以打趣的说:Hypothetically speaking, I might be able to do your current job as adirector.(或 CEO 或 president)((说不定,我也能做你现在主任的工作呢!)

     Q: What range of pay-scale are you interested in?(你喜欢那一种薪水层次标准?)
     A: Money is important, but the responsibility that goes along with this job is what interests me the most. (薪水固然重要,但这工作伴随而来的责任更吸引我。)
     A: 假如你有家眷,可以说:
     To be frank and open with you, I like this job, but I have a family to support. (坦白地说,我喜欢这份工作,不过我必须要负担我的家庭。)

     Other Tips (其它建议)
     Know something about the organization you are applying to. (了解一些你申请工作单位的情况)
     Dress properly. Don’t shake hand with the interviewer until he/she extendshis/her hand. (穿着要得体,人家伸手时才握手。)
     Don’t sit down until invited to do so by the interviewer. (人家未请,先別坐下。)
     Make eye-contact with the interviewer during the interview. (面试时,眼睛要看着对方。)Listen actively and stay calm. (注意听,保持冷静。)
     If invited to a meal, be especially careful about your table manners. (被邀吃饭时,要特別注意餐桌礼节。)
     Don’t talk with your mouth full. (嘴里有食物,不可开口说话)
     Don’t make much noise while you eat. (吃东西不要出声音)
     Don’t blow your nose or use the toothpick at table. (不要拧鼻涕或用牙签剔牙)
     Don’t appear to be pushy or overly anxious to get a job.(不必过分表现急着要工作)
    Be honest
     but not too modest.(要诚实,但不必太谦虚)
     Don’t put yourself down or cut yourself up. (不可妄自菲薄或自贬)
     Try to avoid discussing politics or religion with your interviewer. (避免
与面试人谈政治或宗教)
posted @ 2007-08-01 09:37 路边的石头-java 阅读(285) | 评论 (1) | 编辑 收藏
 
仅列出标题
共7页: 上一页 1 2 3 4 5 6 7 下一页 
 
<2025年6月>
日一二三四五六
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

 公告


 导航

  • BlogJava
  • 首页
  • 发新随笔
  • 发新文章
  • 联系
  • 聚合
  • 管理

 统计

  • 随笔: 63
  • 文章: 0
  • 评论: 27
  • 引用: 0

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论

留言簿(2)

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔分类

  • Java技术(2) (rss)
  • Web技术(1) (rss)
  • 专题技术(3) (rss)
  • 业内新闻(6) (rss)
  • 操作系统(3) (rss)
  • 数据库 (rss)
  • 生活娱乐(2) (rss)

随笔档案

  • 2007年8月 (31)
  • 2007年7月 (32)

搜索

  •  

最新评论

  • 1. re: 一张所有XP用户都感吃惊的图片[未登录]
  • 晕,这有什么好惊奇的,容易的很!
  • --无名
  • 2. re: 一张所有XP用户都感吃惊的图片
  • 看下什么目录
  • --xiaoyu211940
  • 3. re: 一张所有XP用户都感吃惊的图片
  • 000
  • --Super·shen BLOG 李禄燊
  • 4. re: 一张所有XP用户都感吃惊的图片
  • czvzxc
  • --ww
  • 5. re: Java实用经验总结--Swing篇
  • 真的不错

    谢谢啦
  • --windrain

阅读排行榜

  • 1. Java实用经验总结--Swing篇(1249)
  • 2. 使用xfire建立webservice (1053)
  • 3. 解决在linux下awt调用错误的问题(926)
  • 4. 机器猫全部剧场版的下载地址(918)
  • 5.  一张所有XP用户都感吃惊的图片(744)
  • 6. java 分布式RMI的简单使用(733)
  • 7. 做猪做狗都不做程序员(571)
  • 8. 当会话超时时重定向(541)
  • 9. 用开源组件jcaptcha做jsp彩色验证码 (511)
  • 10. 使用Spring框架和AOP实现动态路由(480)
  • 11. 北京图盟科技有限公司(Mapabc.com)基础研发部诚聘英才(415)
  • 12. Java实用经验总结--日期、数字篇(383)
  • 13. Web Service在电信行业数据业务中的应用 (376)
  • 14. 写得蛮好的linux学习笔记 (375)
  • 15. 如何编写代码才能使得效率高 (363)
  • 16. RMI使用手记(361)
  • 17. 在 10 分钟之内创建 Ruby Weblog(356)
  • 18. AJAX+jsp无刷新验证码实例(347)
  • 19. Linux下生成验证图片的问题说明(340)
  • 20. 80年代初出生的十大尴尬 (337)

评论排行榜

  • 1.  一张所有XP用户都感吃惊的图片(10)
  • 2. 做猪做狗都不做程序员(4)
  • 3. 机器猫全部剧场版的下载地址(3)
  • 4. AJAX+jsp无刷新验证码实例(1)
  • 5. 北京图盟科技有限公司(Mapabc.com)基础研发部诚聘英才(1)

Powered by: 博客园
模板提供:沪江博客
Copyright ©2025 路边的石头-java