首页 > 代码库 > Spring MVC返回json数据给Android端

Spring MVC返回json数据给Android端

原先做Android项目时,服务端接口一直是别人写的,自己拿来调用一下,但下个项目,接口也要自己搞定了,我想用Spring MVC框架来提供接口,这两天便抽空浅学了一下该框架以及该框架如何返回json数据。在这里边介绍两种个人觉得比较方便的两种方法(PS:其实是我现在只会这两种)。

 

1.直接PrintWriter输出json数据

使用该方法时,可以自己拼凑json字符串,不过我并不赞同使用该方法,毕竟太容易出错了。所以这里我是先构建jsonobject对象,在将该对象打印出来。首先,我们要导入一个最重要的jar包。

json-lib-2.2.2-jdk15.jar

接下来我们看代码。

 

 1 package sedion.zhr.controller; 2  3 import java.io.PrintWriter; 4  5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.http.HttpServletResponse; 7  8 import net.sf.json.JSONObject; 9 10 import org.springframework.stereotype.Controller;11 import org.springframework.web.bind.annotation.RequestMapping;12 13 @Controller14 @RequestMapping("/test")15 public class TestController 16 {17 /**18      * 直接 PrintWriter输出json 19      * @param req20      * @param rep21      * @throws Exception22      */23     @RequestMapping("/login")24     public void getjson(HttpServletRequest req,HttpServletResponse rep) throws Exception25     {26         String username = req.getParameter("username");27         String pass = req.getParameter("pass");28         29         System.out.println(" 直接 PrintWriter输出json :"+username +"--->" + pass);30 31         PrintWriter writer = rep.getWriter();32         JSONObject object = new JSONObject();33         if(username.equals("zhr") && pass.equals("123"))34         {35             object.put("results", "login success");36         }37         else38         {39             object.put("results", "login fail");40         }        41         42         writer.println(object.toString());43         writer.flush();44         writer.close();45         46     }47 }

 

服务端好了以后,我们简单做个Android端的来测试一下,界面很简单,代码就不给出了。

 

测试代码如下

 1 package com.example.jsontest; 2  3 import org.json.JSONObject; 4 import webservice.Webservice; 5 import android.annotation.SuppressLint; 6 import android.app.Activity; 7 import android.os.Bundle; 8 import android.os.Handler; 9 import android.os.Message;10 import android.view.Menu;11 import android.view.View;12 import android.view.View.OnClickListener;13 import android.widget.Button;14 import android.widget.EditText;15 import android.widget.Toast;16 17 public class MainActivity extends Activity 18 {19 20     private EditText edit_username,edit_pass;21     private Button loginbtn;22     private Handler handler;23     private JSONObject object;24     25     @SuppressLint("HandlerLeak")26     @Override27     protected void onCreate(Bundle savedInstanceState)28     {29         super.onCreate(savedInstanceState);30         setContentView(R.layout.activity_main);31         edit_username = (EditText)findViewById(R.id.username);32         edit_pass = (EditText)findViewById(R.id.pass);33         loginbtn = (Button)findViewById(R.id.login_btn);34         35         handler = new Handler()36         {37             @Override38             public void handleMessage(Message msg) 39             {40                 if(msg.what == 123)41                 Toast.makeText(getApplicationContext(), object.optString("results"), Toast.LENGTH_SHORT).show();;42 43             }44         };45         46         loginbtn.setOnClickListener(new OnClickListener()47         {48             49             @Override50             public void onClick(View arg0) {51                 52                 new Thread(new Runnable()53                 {54                     55                     @Override56                     public void run() 57                     {58                         object = Webservice.login(edit_username.getText().toString(), edit_pass.getText().toString());59                         Message message = new Message();60                         message.what = 123;61                         handler.sendMessage(message);62                         63                     }64                 }).start();65                 66             }67         });68         69         70     }71 }

其中Webservice.login()方法是我自己封装好的数据提交方法,具体细节可以看我的另一篇博客   Android之提交数据到服务端方法简单封装。

我们来测试一下,输入用户名zhr,密码123,可以看到控制台上打印出来了   直接 PrintWriter输出json :zhr--->123 ,说明请求到了,同时手机端上也得到返回的结果

测试成功。

2.使用Spring内置的支持

使用该方法先要在springmvc中添加如下配置

1 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">2  <property name="messageConverters">3   <list>4    <bean5     class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />6   </list>7  </property>8 </bean>

随后引入两个jar包。jackson-mapper-asl-1.8.5.jar和jackson-core-asl-1.8.5.jar。

再将服务端代码改为

/**     * 使用Spring内置的支持     * @param req     * @param rep     * @throws Exception     */    @RequestMapping("/login")    @ResponseBody    public Map<String, String> getjson(HttpServletRequest req,HttpServletResponse rep) throws Exception    {        String username = req.getParameter("username");        String pass = req.getParameter("pass");                System.out.println("使用Spring内置的支持:"+username +"--->" + pass);        Map<String, String> map = new HashMap<String, String>();        if(username.equals("zhr") && pass.equals("123"))        {            map.put("results", "login success");        }        else        {            map.put("results", "login fail");        }                                return map;        

记得加上 @ResponseBody,这样便支持返回复杂对象,Android端不做任何修改,再次测试即可。

 

Spring MVC返回json数据给Android端