回撥函式及返回Json的三種方法
阿新 • • 發佈:2018-12-30
回撥函式及返回Json的三種方法
1.回撥函式:
onreadystatechange 事件
當請求被髮送到伺服器時,我們需要執行一些基於響應的任務。
每當 readyState 改變時,就會觸發 onreadystatechange 事件。
readyState 屬性存有 XMLHttpRequest 的狀態資訊。
下面是 XMLHttpRequest 物件的三個重要的屬性:
屬性 |
描述 |
onreadystatechange |
儲存函式(或函式名),每當 readyState 屬性改變時,就會呼叫該函式。 |
readyState |
存有 XMLHttpRequest 的狀態。從 0 到 4 發生變化。 · 0: 請求未初始化(沒有呼叫send方法) · 1: 伺服器連線已建立(socket已連線) · 2: 請求已接收(獲取到了引數,沒有執行action方法) · 3: 請求處理中(已經在執行action方法,未執行完) · 4: 請求已完成,且響應已就緒(已經響應並且能獲取到最終的資料) |
status |
200: "OK"(響應的狀態) 404: 未找到頁面(未找到頁面) |
在 onreadystatechange 事件中,我們規定當伺服器響應已做好被處理的準備時所執行的任務。
當 readyState 等於 4 且狀態為 200 時,表示響應已就緒:
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
2.返回Json的三種方法
第一種:
@Autowired MyFoodDaoImpl mdi; /** * 原始的輸出json方式 * OutPutStream os; * os.write(通過第三方json-lib轉換json字串.getByte()) * @param foodname * @param out * @return * @throws IOException */ @RequestMapping(value="/queryFood",method={RequestMethod.GET,RequestMethod.POST}) public String queryFood(String foodname,OutputStream out) throws IOException{ List<Map<String, Object>> list=mdi.queryAllFood(foodname); JSONArray arry=JSONArray.fromObject(list); String jsonStr=arry.toString(); out.write(jsonStr.getBytes("UTF-8")); return null; }
第二種:
/**
* 直接返回 字元陣列 +必須寫@ResponseBody
* 減少流的輸出動作程式碼
* out.write(jsonStr.getBytes("UTF-8"));
* @param foodname
* @return
* @throws IOException
*/
@ResponseBody
@RequestMapping(value="/queryFoodReturn",method={RequestMethod.GET})
public byte[] queryFoodReturn(String foodname) throws IOException{
List<Map<String, Object>> list=mdi.queryAllFood(foodname);
JSONArray arry=JSONArray.fromObject(list);
String jsonStr=arry.toString();
System.out.println(jsonStr.getBytes("UTF-8"));
return jsonStr.getBytes("UTF-8");
}
第三種:
@ResponseBody
@RequestMapping(value="/queryFoodList",method={RequestMethod.GET})
public List<Map<String, Object>> queryFoodList(String foodname) throws IOException{
List<Map<String, Object>> list=mdi.queryAllFood(foodname);
return list;
}
配置訊息轉換器
<mvc:annotation-driven validator="localValidatorFactoryBean">
<mvc:message-converters>
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html</value>
<value>application/x-www-form-urlencoded</value>
</list>
</property>
</bean>
<!-- 配置返回對應解析成json的訊息轉換器 -->
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html</value>
<value>application/x-www-form-urlencoded</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!-- 新增jacson的json解析庫 配置訊息轉換器 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.9.12</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.12</version>
</dependency>