接上一篇我們實現了xml中配置自動完成對象轉json,現在我們直接上controller示例代碼
package com.spring3.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
@Controller
/**
* 類級別的@RequestMapping 指定別名
* 相當於 struts xml中 package標籤中的配置 命名空間namespace
* 熟悉struts的同學肯定知道package的配置
* @author Administrator
*
*/
@RequestMapping ("/logon")
public class Logon {
/**
* @RequestMapping(value="/userLogon",method=RequestMethod.POST)
* 這裏 RequestMapping是方法級別的
* value:屬性的值 相當於 方法的別名
* 相當於struts xml中 action的通配符+action中的方法名
* method:屬性 是數據的傳遞方式 post和get 還有別的方式暫時不需要了解
* post:直接將form表單的內容傳遞過來
* get: 會把form表單內的input標籤以參數的形式拼接在url上 (?userName=xxx&password=xxx)
* 這種方式不能傳遞過多的參數
*
* 特殊說明:
* 個人理解 return類型 爲ModelAndView的方法適合用同步提交的方式來訪問
*
* 下面兩個方法都是同步提交 但是傳遞參數的方式有差別
* @param request
* @param response
* @return
/**
* post方式 我們可以傳遞request作爲參數 直接用getParameter去拿表單上的參數
* @param request
* @param response
* @return
*/
@RequestMapping(value="/userLogon",method=RequestMethod.POST)
public ModelAndView logon(HttpServletRequest request,HttpServletResponse response){
String userName = request.getParameter("userName");//姓名
String password = request.getParameter("password");//密碼
System.out.println("======post方式========");
System.out.println("======姓名:"+userName);
System.out.println("======密碼:"+password);
System.out.println("====================");
ModelAndView mav = new ModelAndView();
mav.setViewName("/index/index");
mav.addObject("userName", userName);
mav.addObject("password",password);
return mav;
}
/**
* get的方式 我們可以用把url中的參數作爲方法中的參數傳遞進來
* @param userName
* @param password
* @return
*/
@RequestMapping(value="/userLogon1",method=RequestMethod.GET)
@ResponseBody
public ModelAndView logon(@RequestParam String userName,@RequestParam String password){
System.out.println("======get方式========");
System.out.println("======姓名:"+userName);
System.out.println("======密碼:"+password);
System.out.println("====================");
ModelAndView mav = new ModelAndView();
mav.setViewName("/index/index");
mav.addObject("userName", userName);
mav.addObject("password",password);
return mav;
}
}
再貼出jsp頁面
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta charset="utf-8">
<title>登錄</title>
<script type="text/javascript">
function createXMLHttpRequest() {
var xmlreq = false;
if (window.ActiveXObject) {
xmlreq = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest) {
xmlreq = new XMLHttpRequest();
}
return xmlreq;
}
function synSubmit(){
debugger;
var xhr = createXMLHttpRequest();//XMLHttpRequest 對象
var userName = document.getElementById("userName").value;
var password = document.getElementById("password").value;
var url = "/myspringmvc1/logon/userLogon1?userName="+userName+"&password="+password;//url
if (xhr != null) {
xhr.open("get", "" + url, true);
xhr.onreadystatechange = function(){
if (4 == xhr.readyState && xhr.status==200) {
debugger;
var test = xhr.responseText;
var result = eval("("+test+")");
alert("userName: "+result.userName+" password: "+result.password);
}
}
xhr.send(null);
}
}
</script>
</head>
<body>
<form id="form0" action="<%=path %>/logon/testLogon" method="post">
<input type="text" id="userName" name="userName" value="${user.userName }"/>
<br>
<input type="password" id="password" name="password" value="${user.password }"/>
<br>
<input type="submit" id="submit" name="submit" value="同步提交"/>
<input type="button" id="button" name="button" value="異步提交" onclick="synSubmit()"/>
</form>
</body>
</html>
controller中有兩個logon方法,第一個是同步提交 post方式;第二個是一步提交 get方式
輸入http://localhost:9090/myspringmvc1/index.jsp,輸入userName和password點擊同步提交,頁面成功跳轉,結果如下:
同樣點擊異步提交走第二個logon方法,但是頁面會報404錯誤
這說明 return類型是ModelAndView的方法適合同步提交,因爲 ModelAndView return的是一個視圖名(也就是結果跳轉頁面)和一個對象(也就是我們組織的數據),既然有頁面的跳轉,那麼正常考慮的話我們就需要用同步提交的方式來正常跳轉頁面,如果我們想用異步訪問的話,我們可以做這樣的修改:
把原有的ModelAndView改爲Map對象,代碼如下:
@RequestMapping(value="/userLogon1",method=RequestMethod.GET)
@ResponseBody
public Map logon(@RequestParam String userName,@RequestParam String password){
System.out.println("======get方式========");
System.out.println("======姓名:"+userName);
System.out.println("======密碼:"+password);
System.out.println("====================");
Map map = new HashMap();
map.put("userName", userName);
map.put("password",password);
return map;
}
然後,我們再次輸入http://localhost:9090/myspringmvc1/index.jsp,輸入userName和password點擊異步提交,結果如下:
同樣,我們還可以改成return List 的logon方法
@RequestMapping(value="/userLogon1",method=RequestMethod.GET)
@ResponseBody
public List logon(@RequestParam String userName,@RequestParam String password){
System.out.println("======get方式========");
System.out.println("======姓名:"+userName);
System.out.println("======密碼:"+password);
System.out.println("====================");
List list = new ArrayList();
list.add(userName);
list.add(password);
return list;
}
這時返回對象是一個List集合,所以我們需要修改一下callback部分的頁面js代碼,如下//alert("userName: "+result.userName+" password: "+result.password);
alert("userName: "+result[0]+" password: "+result[1]);
依然是異步提交,執行結果如下:
現在使用@RequestParam的方式獲得拼接在url上的參數即這種方式
"/myspringmvc1/logon/userLogon1?userName="+userName+"&password="+password;
作爲controller中方法的參數public List logon(@RequestParam String userName,@RequestParam String password){
我們還可以修改傳參的方式:如下
@RequestMapping(value="/userLogon1/{userName}/{password}",method=RequestMethod.GET)
@ResponseBody
public List logon(@PathVariable String userName,@PathVariable String password){
System.out.println("======get方式========");
System.out.println("======姓名:"+userName);
System.out.println("======密碼:"+password);
System.out.println("====================");
List list = new ArrayList();
list.add(userName);
list.add(password);
return list;
}
用@PathVariable獲得拼接在url中的參數值
頁面的url也需要改變,如下所示:
//var url = "/myspringmvc1/logon/userLogon1?userName="+userName+"&password="+password;//url
var url = "/myspringmvc1/logon/userLogon1/"+userName+"/"+password;//url
同樣輸入http://localhost:9090/myspringmvc1/index.jsp,輸入userName和password點擊異步提交,結果如下:
注意:異步提交:我們需要在方法上面添加@ResponseBody,我個人的理解,加上這個標註後,不需要return View ,只需要return組織的數據,刷新當前頁面,就相當於異步的局部刷新的一個標記,所以,在異步請求時,我們要加上這個標記。
同步提交還可以改成return String的形式來完成請求,這裏就不一一列舉了,希望各位大俠,多多指教,相互學習。
如果根據上面的寫法報錯,提示沒有轉換成json,那就看上一篇的內容,裏面有返回數據自動轉換成json。
如果想了解更多內容請加qq 531094362,我們相互學習。