原先作Android項目時,服務端接口一直是別人寫的,本身拿來調用一下,但下個項目,接口也要本身搞定了,我想用Spring MVC框架來提供接口,這兩天便抽空淺學了一下該框架以及該框架如何返回json數據。在這裏邊介紹兩種我的以爲比較方便的兩種方法(PS:實際上是我如今只會這兩種)。html
1.直接PrintWriter輸出json數據java
使用該方法時,能夠本身拼湊json字符串,不過我並不贊同使用該方法,畢竟太容易出錯了。因此這裏我是先構建jsonobject對象,在將該對象打印出來。首先,咱們要導入一個最重要的jar包。android
json-lib-2.2.2-jdk15.jarweb
接下來咱們看代碼。spring
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 @Controller 14 @RequestMapping("/test") 15 public class TestController 16 { 17 /** 18 * 直接 PrintWriter輸出json 19 * @param req 20 * @param rep 21 * @throws Exception 22 */ 23 @RequestMapping("/login") 24 public void getjson(HttpServletRequest req,HttpServletResponse rep) throws Exception 25 { 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 else 38 { 39 object.put("results", "login fail"); 40 } 41 42 writer.println(object.toString()); 43 writer.flush(); 44 writer.close(); 45 46 } 47 }
服務端好了之後,咱們簡單作個Android端的來測試一下,界面很簡單,代碼就不給出了。json
測試代碼以下mvc
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 @Override 27 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 @Override 38 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 @Override 50 public void onClick(View arg0) { 51 52 new Thread(new Runnable() 53 { 54 55 @Override 56 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之提交數據到服務端方法簡單封裝。app
咱們來測試一下,輸入用戶名zhr,密碼123,能夠看到控制檯上打印出來了 直接 PrintWriter輸出json :zhr--->123 ,說明請求到了,同時手機端上也獲得返回的結果框架
測試成功。ide
2.使用Spring內置的支持
使用該方法先要在springmvc中添加以下配置
1 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 2 <property name="messageConverters"> 3 <list> 4 <bean 5 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端不作任何修改,再次測試便可。