接上一篇我们实现了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,我们相互学习。