ssm 客户端传递到服务端

1.两个注解

第一个注解@Controller表示将本类定义为一个控制器类,这个类无须再实现Controller接口。

第二个注解@RequestMapping("/hello.do")表示定义一种“请求/响应”的映射关系,即如果客户端浏览器发出“/hello.do”的URL请求,则由该注解下面的doHello()方法来响应,即浏览器通过URL路径+"/hello.do"就可访问到本方法,URL请求能够直接映射到控制器类的方法级别。这样一个简单的注解,就轻松地取代了之前的处理器映射器和Bean的配置,大大减少了配置工作量

第三个注解@RequestMapping注解该注解可以用于类上(在所有请求上继续添加),也可用于方法上。结论:当类和方法上都有@RequestMapping注解时,最终的URL请求必须是两者的结合体。例如,类上的@RequestMapping 注解为@RequestMapping("/user"),方法上的@RequestMapping 注解为@RequestMapping("/login.do"),则最终的URL请求为/user/login.do,单独用方法上注解的/login.do请求将无法被识别,必须先加上类上的注解/user才能构成完整的请求路径。类上的注解是上一级路径,方法上的注解是下一级路径。

2.请求提交的方式

get:

@RequestMapping(value="/login.do",method=RequestMethod.GET)

post:

@RequestMapping(value="/login.do",method=RequestMethod.POST)

@RequestMapping 在默认情况下两种方式都支持,如果不想限制 GET 或 POST 方式,则删除@RequestMapping注解中的method=RequestMethod.GET或method=RequestMethod.POST即可。

3.路径通配符

/user/*/login.do:表示在login.do的资源名称前面,限定只能有两级路径,第一级路径必须是/user,而第二级路径随意。这称为路径级数的精确匹配。

4.请求携带参数

@RequestMapping中params属性定义了请求中必须携带的参数的要求。以下是几种情况的说明。
(1)@RequestMapping(value="/login.do",params={"name","pwd"}):要求请求中必须携带请求参数name与pwd。
(2)@RequestMapping(value="/login.do",params={"!name","pwd"}):要求请求中必须携带请求参数pwd,但必须不能携带参数name。
(3)@RequestMapping(value="/login.do",params={"name=john","pwd=123456"}):要求请求中必须携带请求参数name,且其值必须为john;必须携带参数pwd,且其值必须为123456。
(4)@RequestMapping(value="/login.do",params="name!= john"):要求请求中必须携带请求参数name,且其值必须不能为joh

5.当传入的是基本数据类型

即请求参数与方法形参要完全相同,这些参数由系统在调用时直接赋值,程序员可在方法内直接使用

 @RequestMapping(value="/dologin.html")
   public String CheckLogin( String userCode, String userPassword) { 
	   System.out.println(userPassword);
	   if (userCode.equals("admin") && userPassword.equals("123456")) {
		   return "frame";
	}else {
		return "login";
	}
	}

当我传不同名字的参数进来要怎么办

如果表单的name属性与方法的参数名称不一致,也有办法,就是用@RequestParam()校正参数名,做法是在接收方法的形参前加个@RequestParam("表单的name属性"),示例如下。

 @RequestMapping(value="/dologin.html")
   public String CheckLogin(@RequestParam("userCode") String uname, @RequestParam("userPassword") String pwd) { 
	   System.out.println(userPassword);
	   if (userCode.equals("admin") && userPassword.equals("123456")) {
		   return "frame";
	}else {
		return "login";
	}
	}

@RequestParam("userCode"),表示先接收到表单name属性为username的值,再传给uname。

6.当传入的是一个bean

也可只用一个实体类作形式参数,前提是这个实体类的各个属性要与前台表单的各个

当传递的数据仅仅只是对象属性的某一部分

还是可以传递成功。

(只要传入的字段能跟对象的属性匹配即可)

@RequestMapping(value="/dologin.html")
   public String CheckLogin(User user) { 
	   System.out.println(userPassword);
	   if (userCode.equals("admin") && userPassword.equals("123456")) {
		   return "frame";
	}else {
		return "login";
	}
	}

7.当传入的是路径变量

例如 URL 路径http://localhost:8080/springmvc10/zhangsan/1/user.do里面含有zhangsan,显然对应的是用户名的信息,里面含有1,对应的是用户编号id,这些信息通过@RequestMapping注解配合方法参数名称,一样能接收到。

@RequestMapping("/{username}/{id}/user.do")
public String CheckLogin(@PathVariable String username @PathVariable int id ) { 

}

使用注解@PathVariable

8.HttpServletRequest 、HttpServletSession

HttpServletRequest 可接收请求参数。doLogin()方法修改如下,同样可以接收到请求参数,实现登录,这种方法类似传统的 JSP+Servlet 的方式。

@RequestMapping("value="/dologin.html"")
public String CheckLogin(HttpServletRequest reuqest,HttpServletSession session ) { 
  	   request.getParameter("userCode");
}

9.传递的是一个数组

SSM的客户端<-->服务端_数据

ssm 服务端传递到客户端

使用@Controller注解的控制器下面的方法,其返回值有以下4种类型:ModelAndView、String、无返回值 void、返回自定义类型对象。

若控制器方法处理完后,需要跳转到其他资源,同时又要往跳转的资源传递数据,此时控制器方法返回ModelAndView比较合适。这种情况下在控制器方法里面需要定义一个ModelAndView对象,并调用 ModelAndView 对象的 addObject()方法添加Model数据,用于传递到目标 View页面,调用setViewName()方法设置目标View页面。这在上面的案例中已多次用到。

若该控制器方法只跳转,而不传数据,或只传数据,而不向任何资源跳转(如页面的Ajax异步响应),此时若返回ModelAndView,都不太合适,要么Model多余,要么View多余。可以考虑用其他3种返回值类型。

1.返回String参数

@RequestMapping(value="/dologin.html")
   public String CheckLogin( String userCode, String userPassword) { 
	   System.out.println(userPassword);
	   if (userCode.equals("admin") && userPassword.equals("123456")) {
		  return "frame";
	}else {
		return "login";
	}
	}

2.使用model参数

Model与HttpServletRequest、HttpSession三者均可以携带数据从后台到前台
@RequestMapping(value="/dologin.html")
   public String CheckLogin( String userCode, String userPassword,Model model) { 
	   System.out.println(userPassword);
	   if (userCode.equals("admin") && userPassword.equals("123456")) {
		  return "frame";
	}else {
		return "login";
	}
	}

3.使用HttpServletRequest 、HttpServletSession

4.返回void

void表示没有返回值,没有返回值要解决两个问题:一是如何跳转,二是数据如何传回前台。
具体来说,可在方法参数中放入HttpServletRequest或HttpSession,使方法可以直接将数据放入request、session的域中,也可通过 request.getServletContext()获取到 ServletContext,从而将数据放入 application 的域中。
方法参数中放入 HttpServletRequest 或 HttpServletResponse,可以完成请求转发与重定向,但需要注意,重定向是无法访问/WEB-INF/下资源的。
request.getRequestDispatcher("目标页面").forward(request,response);
重定向代码:
response.sendRedirect("目标页面");

@RequestMapping(value="/dologin.html")
   public void CheckLogin( HttpServletRequest reuqest,HttpServletResponse response) { 
	    request.getRequestDispatcher("目标页面").forward(request,response);
        response.sendRedirect("目标页面");
	}
    
    

5.modeandview

 //静态资源没有
   @RequestMapping("/login")
   public ModelAndView Login() { 
	   ModelAndView modelAndView=new ModelAndView();
	   modelAndView.addObject("test", "你好");
	   modelAndView.setViewName("login");
	   return modelAndView;
   }

6.ssm的ajax请求

$(function(){
	//点击触发	
	$("#bin").onclick(function(){
		$.ajax({
			url:"/login",
			data:{username:"damin",password:"123456"},
			success:function(data){
				alert("后端返回的是字符串,将它转换成json对象");
				var jsonobject=JSON.parse(data);
			}
			
			
		})
		
		
	})	
	
})

当返回类型是void时需要如此,但是当返回类型是对象等会自动封装

//静态资源没有
   @RequestMapping("/login")
    public  void Login(“参数同名即可”) { 
    Map<String,String> map=new HashMap<String,String>();
    map.put("username", user.getUsername());
    map.put("password", user.getPassword());
    //把map对象转换为JSONObject对象
    JSONObject jsonObject=JSONObject.fromObject(map);
    //把JSONObject对象转换为JSON格式的字符串
     String jsonStr=jsonObject.toString();
     response.setCharacterEncoding("utf-8");
    //因为返回的是login
     PrintWriter out=response.getWriter();
     out.print(jsonStr);
     out.close();
   }

7.传出object对象

@ResponseBody指将JSON字符串作为响应处理。
加上responsebody的注解以后将不会经过视图解析器。

//静态资源没有

   @RequestMapping("/login")

   @ResponseBody

public ModelAndView Login(“参数同名即可”) { 
	   ModelAndView modelAndView=new ModelAndView();
	   modelAndView.addObject("test", "你好");
	   modelAndView.setViewName("login");
	   return modelAndView;
   }

8.接收post

//添加的Ajax方法如下:
$("#btn10").click(function(){
var jsonObj={username:"张三", password:"123"  };//定义一个JSON对象
var jsonStr=JSON.stringify(jsonObj);//将JSON对象转化为字符串
$.ajax({
url:"user/doajax10.do",
data: jsonStr,
type:"post",
contentType:"application/json;charset=UTF-8",
success:function(data){
alert("用户名:"+data.username+"密码:"+data.password);
}
});
});
//【注意】要用post方式发送字符串,contentType:"application/json;charset=UTF-8"表示告诉服务器发送请求的数据格式为JSON。
//(2)在控制器中添加方法doAjax10如下:
@RequestMapping("/doajax10.do")
@ResponseBody
public User doAjax10(@RequestBody User user){
return user;
}
这表示将前端请求体中的JSON格式数据绑定到对应的形式参数上。

@RequestBody就是将前端传递过来的参数作为一个整体赋值给user