springmvc 實現 controllor 方法

接上一篇我們實現了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,我們相互學習。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章