码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-08-27 18:37:14      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:

这些天由于任务需要,又研究了一下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.   
  3. import java.io.Serializable;  
  4.   
  5. /** 
  6.  * 用户信息 
  7.  * @author xl 2012-9-20 
  8.  */  
  9. public class UserInfo implements Serializable  
  10. {  
  11.   
  12.     private static final long serialVersionUID = 1L;  
  13.   
  14.     /** 
  15.      * 用户名 
  16.      */  
  17.     private String UserName;  
  18.   
  19.     /** 
  20.      * 密码 
  21.      */  
  22.     private String Password;  
  23.   
  24.     /** 
  25.      * 昵称 
  26.      */  
  27.     private String NickName;  
  28.   
  29.     /** 
  30.      * QQ号 
  31.      */  
  32.     private int QQNumber;  
  33.   
  34.     /** 
  35.      * 电话号 
  36.      */  
  37.     private String TelNumber;  
  38.   
  39.     /** 
  40.      * 年龄 
  41.      */  
  42.     private int Age;  
  43.   
  44.     public String getUserName()  
  45.     {  
  46.         return UserName;  
  47.     }  
  48.   
  49.     public void setUserName(String userName)  
  50.     {  
  51.         UserName = userName;  
  52.     }  
  53.   
  54.     public String getPassword()  
  55.     {  
  56.         return Password;  
  57.     }  
  58.   
  59.     public void setPassword(String password)  
  60.     {  
  61.         Password = password;  
  62.     }  
  63.   
  64.     public String getNickName()  
  65.     {  
  66.         return NickName;  
  67.     }  
  68.   
  69.     public void setNickName(String nickName)  
  70.     {  
  71.         NickName = nickName;  
  72.     }  
  73.   
  74.     public int getQQNumber()  
  75.     {  
  76.         return QQNumber;  
  77.     }  
  78.   
  79.     public void setQQNumber(int qQNumber)  
  80.     {  
  81.         QQNumber = qQNumber;  
  82.     }  
  83.   
  84.     public String getTelNumber()  
  85.     {  
  86.         return TelNumber;  
  87.     }  
  88.   
  89.     public void setTelNumber(String telNumber)  
  90.     {  
  91.         TelNumber = telNumber;  
  92.     }  
  93.   
  94.     public int getAge()  
  95.     {  
  96.         return Age;  
  97.     }  
  98.   
  99.     public void setAge(int age)  
  100.     {  
  101.         Age = age;  
  102.     }  
  103. }  



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



 

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

技术分享

 

 

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



 

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

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

标签:

原文地址:http://www.cnblogs.com/leo04551/p/4763966.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!