Spring MVC返回json数据给Android端


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

1.直接PrintWriter输出json数据

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

json-lib-2.2.2-jdk15.jar

接下来我们看代码。

package sedion.zhr.controller;

import java.io.PrintWriter;

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

import net.sf.json.JSONObject;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/test")
public class TestController
{
/**
    * 直接 PrintWriter输出json
    * @param req
    * @param rep
    * @throws Exception
    */
    @RequestMapping("/login")
    public void getjson(HttpServletRequest req,HttpServletResponse rep) throws Exception
    {
        String username = req.getParameter("username");
        String pass = req.getParameter("pass");
       
        System.out.println(" 直接 PrintWriter输出json :"+username +"--->" + pass);

        PrintWriter writer = rep.getWriter();
        JSONObject object = new JSONObject();
        if(username.equals("zhr") && pass.equals("123"))
        {
            object.put("results", "login success");
        }
        else
        {
            object.put("results", "login fail");
        }       
       
        writer.println(object.toString());
        writer.flush();
        writer.close();
       
    }
}

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

测试代码如下

package com.example.jsontest;

import org.json.JSONObject;
import webservice.Webservice;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity
{

    private EditText edit_username,edit_pass;
    private Button loginbtn;
    private Handler handler;
    private JSONObject object;
   
    @SuppressLint("HandlerLeak")
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        edit_username = (EditText)findViewById(R.id.username);
        edit_pass = (EditText)findViewById(R.id.pass);
        loginbtn = (Button)findViewById(R.id.login_btn);
       
        handler = new Handler()
        {
            @Override
            public void handleMessage(Message msg)
            {
                if(msg.what == 123)
                Toast.makeText(getApplicationContext(), object.optString("results"), Toast.LENGTH_SHORT).show();;

            }
        };
       
        loginbtn.setOnClickListener(new OnClickListener()
        {
           
            @Override
            public void onClick(View arg0) {
               
                new Thread(new Runnable()
                {
                   
                    @Override
                    public void run()
                    {
                        object = Webservice.login(edit_username.getText().toString(), edit_pass.getText().toString());
                        Message message = new Message();
                        message.what = 123;
                        handler.sendMessage(message);
                       
                    }
                }).start();
               
            }
        });
       
       
    }
}

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

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

测试成功。

2.使用Spring内置的支持

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

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
 <property name="messageConverters">
  <list>
  <bean
    class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
  </list>
 </property>
</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+Spring3+Hibernate4开发环境搭建

Spring MVC整合Freemarker基于注解方式

基于注解的Spring MVC简单介绍

Spring MVC 框架搭建及详解

Spring MVC使用Cron表达式的定时器

简单的Spring MVC经典案例

本文永久更新链接地址

相关内容