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="异步提交" οnclick="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,我们相互学习。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值