关于servlet服务端接收客户端发送的List<?>数据的问题

这些天由于任务需要,又研究了一下servlet,因为以前学习过客户端和服务器通过JSON串传输数据,知道可以在servlet中查询数据库,再将数据组装成JSON串发送给客户端,让客户端解析数据。但是这次由于涉及到客户端上传数据,经过servlet处理,然后存入数据库中。这样就不知道怎么处理了。

在实践过程发现,如果在客户端将数据组装成JSON串,在发送给servlet接收,用不了JSON的jar包(目测是需要导包的,因为servlet是在一个java工程中写的,JSON for java的包蛮难找的- - ),想解析就碰到问题了。

因为比较懒^^,所以想如果客户端发送List<?>数据(?号可以表示某个javabean),servlet能接收到,然后通过getXXX()的方法获取数据该多好。。(感觉挺不错的样子)然后就开始找资料了…不知道是不是公司的网络毕竟废,限制很多的原因,貌似没找到啥相关的资料,只看到有个发送List<String> 的例子,和预想中的自定义javabean还是有点差距。好在经过不懈的努力,最后终于成功了.废话了一堆,以下开始写流程:

1. 首先写一个自定义的JavaBean,以UserInfo.java为例,需要实现对象序列化的接口,因为之后输出流对象需要实现输出可序列化的对象。不这样的话,后续时发送时会报异常。

[java] view plaincopy

  1. package xl.java.bean;
  2. import java.io.Serializable;
  3. /**
  4. * 用户信息
  5. * @author xl 2012-9-20
  6. */
  7. public class UserInfo implements Serializable
  8. {
  9. private static final long serialVersionUID = 1L;
  10. /**
  11. * 用户名
  12. */
  13. private String UserName;
  14. /**
  15. * 密码
  16. */
  17. private String Password;
  18. /**
  19. * 昵称
  20. */
  21. private String NickName;
  22. /**
  23. * QQ号
  24. */
  25. private int QQNumber;
  26. /**
  27. * 电话号
  28. */
  29. private String TelNumber;
  30. /**
  31. * 年龄
  32. */
  33. private int Age;
  34. public String getUserName()
  35. {
  36. return UserName;
  37. }
  38. public void setUserName(String userName)
  39. {
  40. UserName = userName;
  41. }
  42. public String getPassword()
  43. {
  44. return Password;
  45. }
  46. public void setPassword(String password)
  47. {
  48. Password = password;
  49. }
  50. public String getNickName()
  51. {
  52. return NickName;
  53. }
  54. public void setNickName(String nickName)
  55. {
  56. NickName = nickName;
  57. }
  58. public int getQQNumber()
  59. {
  60. return QQNumber;
  61. }
  62. public void setQQNumber(int qQNumber)
  63. {
  64. QQNumber = qQNumber;
  65. }
  66. public String getTelNumber()
  67. {
  68. return TelNumber;
  69. }
  70. public void setTelNumber(String telNumber)
  71. {
  72. TelNumber = telNumber;
  73. }
  74. public int getAge()
  75. {
  76. return Age;
  77. }
  78. public void setAge(int age)
  79. {
  80. Age = age;
  81. }
  82. }

1. 为了让客户端引用的JavaBean包名和servlet引用的一致,请右键点击UserInfo.java选择Export----java---JAR file-----选好导出的路径然后点finish,没错,我们这里选择将它打包,这是在LZ纠结了几个小时后,才解决的一个问题。之前servlet端一直提示ClassNotFoundException,找不到这个bean类,由于没仔细看Log,还一直以为是servlet端的引用问题,后来才发现,因为在客户端工程中这个类的路径是xl.java.bean.UserInfo.java,而我的servlet是在另外一个工程中写的,相同的UserInfo.java路径不同,在servlet中接收到的List<UserInfo>一直提示找不到UserInfo这个类,纠结的….打包完全是因为水平不行..

(最新发现,可以不用打包,只要在WEB-INF \classes中建立文件夹xl\java\bean即可,然后将UserInfo放入bean文件夹内,通过javac UserInfo.java将它编译成Class文件就可以了,也就是说,包名一样就行- -)

好吧 让我们跳过乱七八糟的第2步,进行第三步好了。。

3. 编写客户端模拟发送数据的类SendData.java。中间一大段的连接处理,具体解释可参考http://blog.csdn.net/wlzf6296149/article/details/7998641 。

[java] view plaincopy

  1. package xl.java.send;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.ObjectOutputStream;
  5. import java.io.OutputStream;
  6. import java.net.HttpURLConnection;
  7. import java.net.URL;
  8. import java.net.URLConnection;
  9. import java.util.ArrayList;
  10. import java.util.List;
  11. import xl.java.bean.UserInfo;
  12. /**
  13. * 模拟发送数据
  14. * @author xl 2012-9-20
  15. *
  16. */
  17. public class SendData
  18. {
  19. private static final String BASIC_URL_QUEST =
  20. "http://192.168.1.1:8080/test/TestServlet";
  21. public static void main(String[] args)
  22. {
  23. SendData senddata=new SendData();
  24. try
  25. {
  26. senddata.sendDataToServer();
  27. }
  28. catch (IOException e)
  29. {
  30. e.printStackTrace();
  31. }
  32. }
  33. /**
  34. * 上传处理结果
  35. *
  36. * @throws IOException
  37. *
  38. */
  39. private void sendDataToServer() throws IOException
  40. {
  41. //用于servlet判别请求,执行相应方法
  42. String QuestId = "SubmitUserInfoList";
  43. //模拟发送自定义类型的List数据
  44. List<UserInfo> listdata = new ArrayList<UserInfo>();
  45. for (int i = 0; i < 10; i++)
  46. {
  47. UserInfo li = new UserInfo();
  48. li.setUserName("XL" + i);
  49. li.setPassword("00000" + i);
  50. li.setQQNumber(1234567 + i);
  51. li.setTelNumber("15012344321" + i);
  52. li.setNickName("xiaolang" + i);
  53. li.setAge(18 + i);
  54. listdata.add(li);
  55. }
  56. URL url = new URL(BASIC_URL_QUEST);
  57. try
  58. {
  59. URLConnection con = url.openConnection();
  60. HttpURLConnection httpUrlConnection = (HttpURLConnection) con;
  61. httpUrlConnection.setUseCaches(false);
  62. httpUrlConnection.setDoOutput(true);
  63. httpUrlConnection.setDoInput(true);
  64. httpUrlConnection.setRequestProperty("Content-type",
  65. "application/x-java-serialized-object");
  66. //不设置这个默认为Get,服务器会没反应,不知道什么情况,
  67. //纠结了很久,改成Post的话,servlet里的
  68. //doPost方法就有反应了
  69. httpUrlConnection.setRequestMethod("POST");
  70. httpUrlConnection.connect();
  71. OutputStream outStrm = httpUrlConnection.getOutputStream();
  72. ObjectOutputStream oos = new ObjectOutputStream(outStrm);
  73. //输出流第一段数据是QuestId的值
  74. oos.writeObject(QuestId);
  75. //第二段数据是List数据
  76. oos.writeObject(listdata);      oos.flush();
  77. oos.close();
  78. InputStream inStrm = httpUrlConnection.getInputStream();
  79. System.out.println("数据发送成功!");
  80. }
  81. catch (Exception e)
  82. {
  83. e.printStackTrace();
  84. }
  85. }
  86. }

4. 编写TestServlet.java类,并把编写完成的类,放在E:\Tomcat 7.0\webapps\test\WEB-INF\classes路径下,同时打开TestServlet.java类,把包名删了,如下绿色字体部分,防止出现莫名其妙的错误- -然后通过javac编译。

[java] view plaincopy

  1. //package xl.java.servlet;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.ObjectInputStream;
  5. import java.sql.Connection;
  6. import java.sql.DriverManager;
  7. import java.sql.ResultSet;
  8. import java.sql.SQLException;
  9. import java.sql.Statement;
  10. import java.util.List;
  11. import javax.servlet.http.HttpServlet;
  12. import javax.servlet.http.HttpServletRequest;
  13. import javax.servlet.http.HttpServletResponse;
  14. import xl.java.bean.UserInfo;
  15. /**
  16. * @author xl 2012-9-20
  17. *
  18. */
  19. public class TestServlet extends HttpServlet
  20. {
  21. private static final long serialVersionUID = 1L;
  22. private Connection mConnection = null;
  23. private Statement mStatement = null;
  24. private String QuestId = "";
  25. private static final String SUBMIT_USERINFO_LIST = "SubmitUserInfoList";// 客户端提交到用户信息
  26. protected void doPost(HttpServletRequest request,
  27. HttpServletResponse response)
  28. {
  29. System.out.println("________---------doPost--------_____________");
  30. try
  31. {
  32. // 链接数据库
  33. Class.forName("org.gjt.mm.mysql.Driver").newInstance();
  34. mConnection =
  35. DriverManager
  36. .getConnection("jdbc:mysql://localhost/test?user=root&password=123&useUnicode=true&characterEncoding=UTF-8");
  37. mStatement =
  38. mConnection.createStatement(
  39. ResultSet.TYPE_SCROLL_INSENSITIVE,
  40. ResultSet.CONCUR_READ_ONLY);
  41. // 如果不是通过URL的Get形式上传数据时,调用此方法,获取上传的list数据
  42. getListDataByObjectInputStream(request, response);
  43. }
  44. catch (SQLException e)
  45. {
  46. e.printStackTrace();
  47. }
  48. catch (InstantiationException e)
  49. {
  50. e.printStackTrace();
  51. }
  52. catch (IllegalAccessException e)
  53. {
  54. e.printStackTrace();
  55. }
  56. catch (ClassNotFoundException e)
  57. {
  58. e.printStackTrace();
  59. }
  60. catch (IOException e)
  61. {
  62. e.printStackTrace();
  63. }
  64. }
  65. /**
  66. * 获取输入流中的数据
  67. *
  68. * @param request
  69. * @param response
  70. * @throws IOException
  71. * @throws ClassNotFoundException
  72. */
  73. private void getListDataByObjectInputStream(HttpServletRequest request,
  74. HttpServletResponse response) throws IOException,
  75. ClassNotFoundException
  76. {
  77. System.out.println("---------getListDataByObjectInputStream--------");
  78. response.setContentType("text/html");
  79. InputStream inStream = request.getInputStream();
  80. ObjectInputStream objInStream = new ObjectInputStream(inStream);
  81. QuestId = (String) objInStream.readObject();
  82. @SuppressWarnings("unchecked")
  83. List<UserInfo> inList = (List<UserInfo>) objInStream.readObject();
  84. if (QuestId.equals(SUBMIT_USERINFO_LIST))
  85. {
  86. System.out.println("QuestId.equals(SUBMIT_ORDER_LIST)");
  87. submitOrderList(request, response, inList);
  88. }
  89. objInStream.close();
  90. System.out.println("objInStream.close()");
  91. }
  92. /**
  93. * @param request
  94. * @param response
  95. * @param inList
  96. */
  97. private void submitOrderList(HttpServletRequest request,
  98. HttpServletResponse response, List<UserInfo> inList)
  99. {
  100. // 获取数据,插入数据库
  101. for (UserInfo item : inList)
  102. {
  103. System.out.println("UserName=" + item.getUserName());
  104. System.out.println("Password=" + item.getPassword());
  105. System.out.println("NickName=" + item.getNickName());
  106. System.out.println("QQNumber=" + item.getQQNumber());
  107. System.out.println("TelNumber=" + item.getTelNumber());
  108. System.out.println("Age=" + item.getAge() + "\n");
  109. }
  110. /**
  111. * 插入数据库代码可以写在这..
  112. */
  113. }
  114. }

5. 运行SendData.java文件,可看到控制台输出,根据前面的设定我们知道,客户端和服务端已经建立连接,并且数据成功发送给了服务端,然后我们E:\Tomcat 7.0\logs下的stdout_20120920.log(反正目录下最后一个文件),查看Tomcat的打印信息,如下图

最后说明下,不知道以这种形式发送数据的效率怎么样,水平有限,感觉有点用,所以写篇文章记录下,如果大家对如何在android端通过servlet访问MySql有疑问可以看下http://blog.csdn.net/wlzf6296149/article/details/7309971 比较早写的一篇文章,应该能解决一些问题吧=. =

转自:http://blog.csdn.net/wlzf6296149/article/details/8001433

时间: 2024-10-03 17:25:06

关于servlet服务端接收客户端发送的List<?>数据的问题的相关文章

JAVA SOCKET网络编程,服务端接收多个客户端连接的实现

这是基于前面一篇文章的一个简单扩展,当然这不是最好的实现 服务端如果要想接收多个客户端连接,必须死循环去接收新的客户端的连接请求,一个完整的客户端服务端socket连接通过一个线程来维护 package com.tree.demo.socket; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.n

安卓使用Socket发送中文,C语言服务端接收乱码问题解决方案

今天用安卓通过Socket发送数据到电脑上使用C语言写的服务端,发送英文没有问题,可当把数据改变成中文时,服务端接收到的数据确是乱码. 突然想到,VS的预处理使用的是ANSI编码,而安卓网络数据都是UTF8格式的,这样直接使用printf打印出出来的当然是乱码,所以解决方法就是把UFT8格式的数据转换成ANSI! 避免大家遇到类似问题,少走弯路,我现在把自己找的转码函数贴出来! C语言文字编码转换函数: //UTF8转成Unicode wchar_t * UTF8ToUnicode( const

一个关于UDP socket服务端接收长度不正确的问题

最近项目需要实现一个通过UDP协议和远端服务平台通讯的需求,简要描述如下: 本端为嵌入式linux路由器(udp客户端,linux C编码),远端为租用的阿里云服务器(udp服务端,java编码), 通信协议为UDP,本端会定时向远端服务器发送消息. 在实现和调试过程中发现一个问题: 1)将远端服务程序放在实验室pc机上调试没有问题,即"路由器-PC"交互正常. 2)将远端服务程序放至阿里云服务器上运行,结果服务端收到的udp消息会多出4个字节,偶尔还会多出6个,多出的字节是 EF B

WebService或HTTP服务端接收请求转发消息到另一个服务端-实现思路

1.需求结构(WebService) A客户端<->B服务端<->C服务端 说明: a.在B服务端上面添加配置项(1.是否转发消息到C服务端:2.C服务端IP和端口): b.A客户端发消息到B服务端,B服务端收到消息判断是否需要转发,如果是需要转发就将消息转发给C服务端,然后消息再依次返回. 2.现在就是B服务端如何接受A客户端消息并直接转发给C服务端? 目前我找到就一下方案: a.apache camel:基于规则路由和中介引擎,貌似很强大时间紧,木有时间研究.... b.土办法

解决.NET Web API生成的Help无Controller说明&amp;服务端接收不到请求

今天在用.NET Web API写一个接口的时候遇到一个问题.在Controller中新加了一个方法,客户端就不能请求接口了,当时建WEB API项目是用的VS默认设置,在服务端打断点一直没有进去,而APP端一直报服务端响应失败!奇怪的是连生成的Help API说明都没Controller说明. 这样也办法用WebAPITestClient测试,后来用想到了用HttpRequester插件请求一下接口果然出错了. <Error><Message>出现错误.</Message&

Linux c服务端接收图片c/c++语言module

---恢复内容开始--- 由于深度学习任务的需要,要在程序里面嵌入一个module. 这个module 的功能是接收来自ios客户端的图片.并且传送给深度学习分类器进行处理. 于是看了看各种各样的 module 实现方案. 1 先是用IO函数把图片以数组的方式存起来. 再和服务器建立连接,socket传这个数组. 然后服务器接收完数组以后就再运用IO函数 把数组以图片的方式存起来! 还有代码 bool ReadFileToBuffer( CString strFile,string& strBu

Android端接收和发送cookie

流程: 首先android端使用HttpClient的方式发送HTTP请求,此时服务器创立cookie,并发送cookie给android端,android端再将cookie保存起来,在需要发送cookie时随http请求一起发送. 代码如下: public static CookieStore cookieStore;//静态,用来存放cookie //省略一堆代码 DefaultHttpClient httpClient = new DefaultHttpClient(); httpClie

服务端接收不到ajax post请求的参数

问题描述 服务端使用request.getParameter()接收不到post请求的参数,导致业务逻辑抛出空指针异常. 解决途径 tomcat对post请求支持的字节数不受限制的配置发生变化.在tomcat容器在7.0.63版本之前,maxPostSize <= 0 都表示 tomcat对post请求支持的字节数不受限制,从7.0.63版本开始,仅是maxPostSize < 0 表示tomcat对post请求支持的字节数不受限制.将maxPostSize的值由0改为-1,问题得到解决.(m

PHP-Socket服务端客户端发送接收通信实例详解

Socket介绍 什么是socket 所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 在Internet上的主机一般运行了多个服务软件,同时提供几种服务.每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务. Socket连接过程 根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认.