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 服务端传递到客户端使用@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