使用httpClient在客户端和服务器端传输对象参数

昨天把httpClient的源代码下载来看了一下。 稍微跟踪了一下,最终还是使用java.net包的东西.不过封装的实在是漂亮.写程序方便多了。不过还是建议最好先熟悉net包下的东西.为了测试写了个在客户端和服务器段传对象的代码. 简单的传递了一个字符串. 如果复杂点可以传其他的对象,在参数里给出class name之类的信息.服务器端就可以使用反射来做一些实用的操作了。


客户端:

import java.io.IOException;
import java.io.Serializable;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
import org.apache.commons.httpclient.methods.PostMethod;

import org.apache.commons.httpclient.methods.RequestEntity;

public class MyTest
{

    /**
     * @param args
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public static void main(String[] args) throws IOException, ClassNotFoundException
    {
        String url = "http://localhost:8084/system/linantest";

        String queryString = "test=hello";

        String inputObj = " boy!";

        Serializable s = getObjFromServer(url, queryString, inputObj);

        System.out.println(s.toString());
    }

    /**
     * @param url
     * @param queryString 类似a=b&c=d 形式的参数
     * 
     * @param inputObj   发送到服务器的对象。
     *     
     * @return 服务器返回到客户端的对象。
     * @throws IOException
     */
    public static Serializable getObjFromServer(String url, String queryString, Serializable inputObj) throws IOException
    {
        HttpClient client = new HttpClient();

        PostMethod post = new PostMethod(url);

        post.setQueryString(queryString);

        post.setRequestHeader("Content-Type", "application/octet-stream");

        java.io.ByteArrayOutputStream bOut = new java.io.ByteArrayOutputStream(1024);
        java.io.ByteArrayInputStream bInput = null;
        java.io.ObjectOutputStream out = null;
        Serializable returnObj = null;
        try
        {
            out = new java.io.ObjectOutputStream(bOut);

            out.writeObject(inputObj);

            out.flush();
            out.close();

            out = null;

            bInput = new java.io.ByteArrayInputStream(bOut.toByteArray());

            RequestEntity re = new InputStreamRequestEntity(bInput);
            post.setRequestEntity(re);

            client.executeMethod(post);

            java.io.InputStream in = post.getResponseBodyAsStream();
            java.io.ObjectInputStream oInput = new java.io.ObjectInputStream(in);
            returnObj = (Serializable) oInput.readObject();
            oInput.close();
            oInput = null;
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (ClassNotFoundException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally
        {
            if (out != null)
            {
                out.close();
                out = null;

            }

            if (bInput != null)
            {
                bInput.close();
                bInput = null;

            }
            //释放连接
            post.releaseConnection();
        }

        return returnObj;

    }

}


服务器端的servlet

package test.li;

import java.io.IOException;

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

import org.openjweb.eai.adapter.TimerDBAdapter;

public class TestServlet extends HttpServlet
{

    public TestServlet()
    {
        super();
    }

    /**
     * Destruction of the servlet. 
*/ public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here } /** * The doGet method of the servlet.
* * 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 Exception */ public void doGet(HttpServletRequest request, HttpServletResponse response) { String test = request.getParameter("test"); java.io.ObjectInputStream oi = null; java.io.ObjectOutputStream ot = null; try { oi = new java.io.ObjectInputStream(request.getInputStream()); Object o = oi.readObject(); oi.close(); oi = null; String outObj = test + o.toString(); ot = new java.io.ObjectOutputStream(response.getOutputStream()); ot.writeObject(outObj); ot.flush(); ot.close(); ot = null; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { if (oi != null) { oi.close(); oi = null; } if (ot != null) { ot.close(); ot = null; } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * The doPost method of the servlet.
* * 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 { doGet(request, response); } /** * Initialization of the servlet.
* * @throws ServletException * if an error occure */ public void init() throws ServletException { // Put your code here } }


你可能感兴趣的:(Java,Web)