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端不做任何修改,再次测试即可。