~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~准备工作~~~~~~~~~~~~~~~~~~~~~~~

。tomcat编译servlet要用到servlet.api.jar包,需要存放于C:\ProgramFiles\Java\jdk1.6.0_07\jre\lib\ext中或者配置classpath。

二。操作MySql需要下载驱动mm.mysql,mysql-connector-java-3.1.14-bin.jar存放于项目的web-inf/lib目录及tomcat的lib目录下。

三。android程序访问网络需要在AndroidManifest.xml中声明权限

<uses-permissionandroid:name="android.permission.INTERNET"></uses-permission>

四。3.0以上系统需要在onCreat方法中写下以下语句,否则会出现android.os.NetworkOnMainThreadException异常。

   StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder()                            .detectDiskReads().detectDiskWrites().detectNetwork()                                         .penaltyLog().build());                             StrictMode.setVmPolicy(newStrictMode.VmPolicy.Builder()                                                   .detectLeakedSqlLiteObjects().detectLeakedClosableObjects()                                .penaltyLog().penaltyDeath().build());        


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~OK,可以开始了~~~~~~~~~~~~~~~~~~~

一。接收端android简易程序

public class Abc_clientActivity extendsActivity {       /**Called when the activity is first created. */       Button mButton;       TextView mTextView;       String content;       @Override       public void onCreate(Bundle savedInstanceState) {              super.onCreate(savedInstanceState);              setContentView(R.layout.main);              mButton= (Button) findViewById(R.id.button1);              mTextView= (TextView) findViewById(R.id.textView1);              a();              mButton.setOnClickListener(new Button.OnClickListener() {                     @Override                     public void onClick(View arg0) {                            try{                                   content= Connecting(); //获取返回值                            }catch (IOException e) {                                   e.printStackTrace();                            }                            mTextView.setText(content);   //在TextView中显示                     }              });       }       private void a() {              StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()                            .detectDiskReads().detectDiskWrites().detectNetwork()                                        .penaltyLog().build());                                           StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()                                                    .detectLeakedSqlLiteObjects().detectLeakedClosableObjects()                              .penaltyLog().penaltyDeath().build());                              }       protected String Connecting() throws ParseException, IOException {//这个路径最后会详细说明              String url1 ="http://10.81.36.187:8080/orderdishes/orderdishes_servlet";                 String url2 = "username=" + "a";              String url = url1 + "?" + url2;       //即相当于http://10.81.36.187:8080/orderdishes/orderdishes_servlet?username="a",其中的//username对应"a",后面会用到              String result = "";              System.out.println("1");              HttpGet request = new HttpGet(url);     //调用servlet的doget方法              System.out.println("2");               //在这里执行请求,访问url,并获取响应              HttpResponse response = new DefaultHttpClient().execute(request);               System.out.println("3");//获取返回码,等于200即表示连接成功,并获得响应              if(response.getStatusLine().getStatusCode() == 200) {                     System.out.println("4");                     result= EntityUtils.toString(response.getEntity());  //获取响应中的数据                     System.out.println("result"+ result);              }else {                     System.out.println("连接失败");              }              return result;}}

二、servlet类(不是在一个工程中写的,所以没有包名,这里的文件名是orderdishes_servlet.java)

import java.io.IOException;import java.io.PrintWriter;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement; import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse; public class orderdishes_servlet extends HttpServlet {       private static final long serialVersionUID = 1L;       /**        * @see HttpServlet#HttpServlet()        */       protected void doGet(HttpServletRequest request,             //只使用doGet方法       HttpServletResponse response)  {             String name = null;try {//获取请求url中携带的参数,及之前的username所对应的"a"name = newString(request.getParameter("username").getBytes(                            "ISO-8859-1"),"UTF-8");   //mm.mysql的class名为org.gjt.mm.mysql.Driver,登记时必须写成如下格式       Class.forName("org.gjt.mm.mysql.Driver").newInstance();//其中db为MySql数据库的名字,root为数据库的账号,password为密码,同时使用//useUnicode,characterEncoding,能解决数据库输出时的中文问题       Connection C = DriverManager.getConnection("jdbc:mysql://localhost/db?user=root&password=123&useUnicode=true&characterEncoding=8859_1");//代码中使用了absolute,ResultSet.TYPE_SCROOL_SENSITIVE等的目的是为了测试//mm.mysql是否符合jdbc 2.0的规范,虽然我也不懂具体用意       Statement state= C.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);//将查询的结果放在result中,test为表名       ResultSet result=state.executeQuery("select * from test wherename="+"\""+name+"\"");       if(result!=null){          response.setContentType("text/html;charset=UTF-8");//这句必须放在PrintWriter//out=response.getWriter();前面,不然输出中文依然为乱码。          PrintWriter out = response.getWriter();          while(result.next()){          out.print("用户名:"+name+"的账号密码为:"+result.getString("name")+""+result.getString("password"));          }       }else{          PrintWriter out = response.getWriter();          out.print("用户名不存在");      //这个是响应之后返回的数据       }                } catch (InstantiationException e) {       e.printStackTrace();} catch (IllegalAccessException e) {       e.printStackTrace();} catch (ClassNotFoundException e) {       e.printStackTrace();} catch (IOException e) {      e.printStackTrace();} catch (SQLException e) {       e.printStackTrace();}       }

三。tomcat中的配置

1.在tomcat根目录下建立以下文件夹

E:\Tomcat 7.0\webapps\orderdishes

2.在orderdishes中建立WEB-INF文件夹,里面建个classes文件夹

3.将之前的orderdishes_servlet.java通过javac命令编译成orderdishes_servlet.class放在classes文件夹中

4.然后我们需要定义web.xml文件,这个可以在E:\Tomcat 7.0\webapps\ROOT\WEB-INF下copy一个,然后加入以下语句

<servlet>

<servlet-name>orderdishes_servlet</servlet-name> //servlet名称

<servlet-class>orderdishes_servlet</servlet-class> //servlet指向的类文件

</servlet>

<servlet-mapping>

<servlet-name>orderdishes_servlet</servlet-name>

<url-pattern>/orderdishes_servlet</url-pattern> //这个是定义web访问时servlet的相对路径

如此,我们之前定义的url格式就是http://10.81.36.187:8080/orderdishes/orderdishes_servlet,orderdishes是指servlet所在的文件夹名字,/orderdishes_servlet 就是上面定义的相对路径。

如果写成

<url-pattern>servlet/orderdishes_servlet</url-pattern>

我们之前定义的url格式就要变成http://10.81.36.187:8080/orderdishes/servlet/orderdishes_servlet了

四。在MySQL中新建数据库db,表名为test(MySQl的密码为123 -- 就是启动MySQL时需要输入的密码,这个是安装时就需要设置的)

name password

a 123

b 234

因为之前我们的查询语句是select * from test where name="+"\""+name+"\",name="a"所以TextView中会显示

用户名:a 的账号密码为:a 123

--------------------------------以上我们只获取了单条数据,下面是多条的方法------------------------

复习了昨天学习的内容,然后开始修改源程序,目前进度是修改获取分类列表数据 ,发现一个问题,就是昨天在例子中返回的只是一条数据,可以正常显示,然后今天是返回多条数据,会出现以下情况:

据测试, servlet中执行以下语句

PrintWriter out = response.getWriter();

out.print(“a ”);

out.print(“b”);

在返回的数据中通过

String result = EntityUtils.toString(response.getEntity());

获得的结果是 result=”a b” ,这个结果是一次性的,意思就是执行一次就获得了这个结果,说明数据不是一条 一条发送过来的

猜测的结果是: servlet中是执行完所有out.print(“”);将数据组装完,放在response中然后在发送回去的。

所以这样我们就不能实现返回所有分类列表数据,想到的一种可能是在客户端,通过String[] Accept = result.split(",");分割的方法获得数据,不过这样感觉不好。

后来发现使用JSON可能是个不错的选择,然后就开始学习JSON的使用,经过试验,最后成功了. 我们的 方法就是在servlet类中,通过以下语句

StringBuilder responseResult=new StringBuilder();ResultSet result=state.executeQuery("select  * from test");response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();responseResult.append("[");while(result.next()){  responseResult.append("{"+"\"SortName\":"+result.getString("sortname")+"}"+",");  //重点,下有解释}responseResult.deleteCharAt(responseResult.length()-1);//删除最后的”,”号responseResult.append("]");out.print(responseResult.toString());

也就是说,通过以上语句,将查询出的结果,组装成JSONArray类型,然后以String字符串型返回。

接着在客户端进行解析就可以(其中的result即是在数据请求时,通过以下语句获得的String字符串

        result= EntityUtils.toString(response.getEntity());  //获取响应中的数据),在这里我们先将此字符串转换成JSON数组,然后通过解析,获取对应的每条数据。方法如下:

List<DishInfo> mListDataForSort=new ArrayList<DishInfo>();        mJsonArray = new JSONArray(result);          for(int i=0;i<mJsonArray.length();i++){           JSONObject  mJsonObject=(JSONObject)mJsonArray.opt(i);           String sortname=mJsonObject.getString("SortName");           DishInfo item=new DishInfo();           item.setDishSort(sortname);           mListDataForSort.add(item);        }


当然这只是一种简单的JSON的使用,后续会加入图片的处理以及混合的JSONObject和JSONArray的数据解析。

注意:

responseResult.append("{"+"\"SortName\":"+result.getString("sortname")+"}"+",");

如果要封装的数据是其他类型,比如byte[]和http://...... 类的,一定要这么写

responseResult.append("{"+"\"SortName\":"+"\""+byte[]+"\""+"}"+",");

没错,需要加转义字符,为数据两边 加上 双引号" ",这样就不会出现 解析的时候提示 非法字符的错误了。

好吧,这只是篇备注文章,JSON具体的使用方法可以 百度= =


更多相关文章

  1. Android中Message的基本使用
  2. Android(安卓)如何删除list中的某一项item
  3. 关于android监听H5发送的事件实现方法。
  4. Android(安卓)Studio 绑定下拉框数据(网络JSON数据)
  5. Android(安卓)adb启动任意app的几种方式
  6. Android——httpPost方式网络互通信
  7. Android——SharedPreferences数据存储
  8. Android(安卓)studio 百度地图开发(5)查询周边服务(加油站)
  9. Android使用HttpURLConnection进行POST请求,向服务器上传数据

随机推荐

  1. Windows下mysql community server 8.0.16
  2. java连不上mysql8.0问题的解决方法
  3. mysql server 5.5连接不上的解决方法
  4. MySQL如何实现负载均衡功能
  5. MySQL表中添加时间戳的几种方法
  6. MySQL创建数据表并建立主外键关系详解
  7. mysql语句查询用户权限过程详解
  8. 基于python的mysql复制工具详解
  9. 为什么说MySQL单表数据不要超过500万行
  10. MySQL5.7.23解压版安装教程图文详解