1.@Controller
@Controller用于标注处理器类,拥有这个注解的类,会在被容器扫描到后,自动实例化并注入到容器中。
2.@RequestingMapping
1. value属性
@RequestingMapping用value属性指定请求路径,当只有一个参数时,默认该值赋给value属性。
@AliasFor("path")
String[] value() default {};
A.@RequestingMapping置于方法上
package com.zzt.Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class MyController {
@RequestMapping("/some.do")
public ModelAndView doSome(){
ModelAndView modelAndView = new ModelAndView();
// 存放数据 框架会自动将数据放到request作用域
modelAndView.addObject("msg","hello-word");
// 指定视图的路径 框架会自动通过forward进行请求转发 request.getRequestDispatcher("/show.jsp").forward(..)
modelAndView.setViewName("show");
return modelAndView;
}
}
此时,如果请求想调用该控制器对象的doSome方法,则请求路径需要为some.do。
<a href="some.do">发起请求</a>
B.@RequestingMapping置于类上
package com.zzt.Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping("/Test")
public class MyController {
@RequestMapping("/some.do")
public ModelAndView doSome(){
ModelAndView modelAndView = new ModelAndView();
// 存放数据 框架会自动将数据放到request作用域
modelAndView.addObject("msg","hello-word");
// 指定视图的路径 框架会自动通过forward进行请求转发 request.getRequestDispatcher("/show.jsp").forward(..)
modelAndView.setViewName("show");
return modelAndView;
}
}
此时,如果请求想调用该控制器对象的doSome方法,则请求路径需要为/Test/some.do。
<a href="/Test/some.do">发起请求</a>
C.value属性指定多条映射
value是一个数组,可以存储多个路径映射;也就是说我们可以有多条请求路径映射到同一个方法。为了不让编译器误会这是两个属性的赋值,我们用{ }指明将值赋值给value[ ]。
<a href="some.do">发起第一个请求</a>
<a href="other.do">发起第二个请求</a>
package com.zzt.Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class MyController {
@RequestMapping(value = {"/some.do","/other.do"} )
public ModelAndView doSome(){
ModelAndView modelAndView = new ModelAndView();
// 存放数据 框架会自动将数据放到request作用域
modelAndView.addObject("msg","hello-word");
// 指定视图的路径 框架会自动通过forward进行请求转发 request.getRequestDispatcher("/show.jsp").forward(..)
modelAndView.setViewName("show");
return modelAndView;
}
}
2. method
method用于指定标注的方法需要相应的请求类型,常用get、post;若不指定,表示不限制请求类型。
在web中我们应该学过,get请求是不安全的,它会将传递的参数追加在url中,但是这并不代表get没有优势,实际上post请求,在回退的时候,需要重新提交表单,而get则不需要,在对于一些没有安全性要求的场合,用get足以。
package com.zzt.Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping(value = "/test")
public class MyController {
@RequestMapping(value = "/some.do" , method = RequestMethod.GET)
public ModelAndView doSome(){
ModelAndView modelAndView = new ModelAndView();
// 存放数据 框架会自动将数据放到request作用域
modelAndView.addObject("msg","hello-get");
modelAndView.setViewName("show");
return modelAndView;
}
@RequestMapping(value = "/other.do", method = RequestMethod.POST)
public ModelAndView doOther(){
ModelAndView modelAndView = new ModelAndView();
// 存放数据 框架会自动将数据放到request作用域
modelAndView.addObject("msg","hello-post");
modelAndView.setViewName("show");
return modelAndView;
}
@RequestMapping(value = "/noLimit.do")
public ModelAndView doNoLimit(){
ModelAndView modelAndView = new ModelAndView();
// 存放数据 框架会自动将数据放到request作用域
modelAndView.addObject("msg","hello-nolimit");
modelAndView.setViewName("show");
return modelAndView;
}
}
<p>第一个项目</p>
<a href="test/other.do">发起some.do请求</a>
<br>
<form action="test/some.do" method="post">
<input type="submit" value="post请求提交">
</form>
<a href="test/noLimit.do">noLimit.do-get方式</a>
<form action="test/noLimit.do" method="post">
<input type="submit" value="post提交noLimit">
</form>
1
现在我们修改一下请求方式:
<p>第一个项目</p>
<a href="test/other.do">发起some.do请求</a>
<br>
<form action="test/some.do" method="post">
<input type="submit" value="post请求提交">
</form>
可以看到,如果我们使用了指定之外的请求方式,则会因为不支持而无法正常访问。
3. @RequestParam
@RequestParam用于指定哪一个参数的值应该赋给当前指定的属性,用法同Mybatis里的@Param;仅能用在处理器方法上,当使用对象接收时,框架会根据实体类需要的属性查找请求参数。
A. value 用于指定请求中的参数名称
<p>提交参数</p>
<form action="test/receiveProperty.do" method="post">
姓名:<input type="text" name="rname"><br>
年龄:<input type="text" name="rage"><br>
<input type="submit" value="提交参数">
</form>
@RequestMapping(value = "/receiveProperty.do")
public ModelAndView doReceiveProperty(@RequestParam(value = "rname") String name,@RequestParam(value = "rage") Integer age){
ModelAndView modelAndView = new ModelAndView();
System.out.println("age = " + age);
modelAndView.addObject("name",name);
modelAndView.addObject("age",age);
modelAndView.setViewName("showProperty");
return modelAndView;
}
B. required 用于指定该参数是否一定要存在
required默认值为true,表示请求中一定要有该参数,若不存在,则会发生错误。这样做的好处避免当我们知道请求路径时,不通过正常提交参数的流程直接访问:http://localhost:8080/SpringMVC_01/test/receiveProperty.do。
如上图,即使知道了请求路径,由于没有正常提交参数,服务器也不会正常响应。