@Controller
@RequestMapping("/view/")
public class IndexController {
private static final String success = "success";
/**
* 1、@RequestMapping除了修饰方法还可以修饰类
* 2、分别表示根路径和根路径下的子路径。
* 3、类上面没有RequestMapping的时候,方法上面的路径表示根路径。
* @return
*/
@RequestMapping("index.html")
public String index() {
System.out.println("12314");
return success;
}
}
Param | Desc |
---|---|
value |
定义处理方法的请求的 URL 地址。 |
method |
定义处理方法的 http method 类型,如 GET、POST 等。 |
params |
定义请求的 URL 中必须包含的参数。 |
headers |
定义请求中 Request Headers 必须包含的参数。 |
常用值:RequestMethod.POST - RequestMethod.GET;
同样的映射路径,通过不同的请求方式执行不同的控制方法。
当不进行指定的时候,不能有相同的映射路径,控制器通过请求方式自动指定。
@RequestMapping(value="/post.html",method=RequestMethod.POST)
public String testMethod_post() {
System.out.println("post.html");
return success;
}
@RequestMapping(value="/post.html",method=RequestMethod.GET)
public String testMethod_get() {
System.out.println("get.html");
return success;
}
@RequestMapping(value="params.html",params= {"username","age!=0","!sex"})
public String test_Params_headers() {
return success;
}
params表示请求参数还支持简单的表达式;headers设置请求头符合的一些规范;
username
必须包含usernameage!=0
请求参数不能有age = 0!sex
表示不能有sex属性
- ? :匹配URL中的一个字符
- * :匹配URL中的任意字符
- ** :匹配URL的多层路径
@RequestMapping(value="ant/nihao*/ant.html")
// 比如:ant/nihao21423/ant.html
public String test_Ant() {
return success;
}
**作用:**实现URL的占位符绑定到目标方法参数中;
{占位符}
**注意:**占位符的名字和注解的值必须一致;@PathVariable值可以省略,如果省略形参名必须和URL参数名一致
@RequestMapping(value="path.html/{id}")
public String test_PathVariable(@PathVariable("id") Integer userId) {
System.out.println("===========>"+userId);
return success;
}
新增:/order
POST
直接跳转新增页面
修改:/order/1PUT
== update?id=1
获取:/order/1GET
== find?id=1
删除:/order/1DELETE
== delete?id=1如何发送PUT请求和DELETE请求呢?
- 需要配置 HiddenHttpMethodFilter过滤器。
- 需要发送 POST请求。
- 需要在发送 POST请求时携带一个 name="_method" 的隐藏域,值为PUT | DELETE。
Tomcat8、JDK8需要注意
可能出现问题:
405:SPs only permit GET POST or HEAD
1、需要在过滤器添加中央控制器的servlet-name
2、在使用DELETE | PUT方法的类上添加@ResponseBody
@RequestMapping(value="rest_test/{id}",method=RequestMethod.GET)
public String Rest_get(@PathVariable Integer id) {
System.out.println("Test Rest_Get "+id);
return success;
}
@RequestMapping(value="rest_test",method=RequestMethod.POST)
public String Rest_post() {
System.out.println("Test Rest_Post ");
return success;
}
@ResponseBody
@RequestMapping(value="rest_test/{id}",method=RequestMethod.PUT)
public String Rest_put(@PathVariable Integer id) {
System.out.println("Test Rest_Put "+id);
return success;
}
@ResponseBody
@RequestMapping(value="rest_test/{id}",method=RequestMethod.DELETE)
public String Rest_delete(@PathVariable Integer id) {
System.out.println("Test Rest_DELETE "+id);
return success;
}
属性 | 说明 | |
---|---|---|
value |
表示请求参数的参数名称 | |
name |
value的别名,意义相同; | |
required |
该参数是否为必须,默认为true | |
defaultValue |
设置请求参数的默认值 |
使用方法:标注在方法的参数前面,请求的参数名必须和注解的
value
一致。当然不使用此注解都可以传参,只要请求的数据名和参数名一致即可。
@RequestMapping("requestParams.html")
public String test_Param(@RequestParam(name="name",required=false)String username,
@RequestParam(name="pass",required=true,defaultValue="123456")
Integer password) {
System.out.println("username============>"+username);
System.out.println("password============>"+password);
return success;
}
/**
* 使用实体对象入参,支持级联属性。
* 在页面只需要填写对象的属性,无需添加对象.属性的方式;
* 比如:uesrName | userPass | address.cityName | address.province
* 错误:user.userName | user.address.cityName
*/
@RequestMapping("param_Entity.html")
public String test_Entity(User user) {
System.out.println("test Entity============>"+user);
return success;
}
/**
* 了解即可:@RequestHeader - 获取请求中的请求头信息
* 同@RequestParam 的作用一致
*/
@RequestMapping("requestHeader.html")
public String test_Header(@RequestHeader("Accept")String info0) {
System.out.println("header============>"+info0);
return success;
}
/**
* 了解即可:@CookieValue - 获取请求中的Cookie值
* 同@RequestParam 的作用一致
*/
@RequestMapping("requestCookie.html")
public String test_Cookie(@CookieValue("JSESSIONID")String info0) {
System.out.println("cookie============>"+info0);
return success;
}
说明: SpringMVC可以使用原生的API作为入参 、获取请求参数,和响应结果;具体使用自己扩展即可,学会举一反三;示例就这么简单,警告自己,我们只要知道用法,而不是知道固定的死套路、思维。
具体支持类型有:
- HttpServletRequest、HttpServletResponse、HttpSession
- java.security.Principal、Locale
- InputStream 、OutputStream
- Reader、Writer
@RequestMapping("test_servletAPI.html")
public void test_ServletAPI(HttpServletRequest request, HttpServletResponse response, Writer writer)
throws IOException {
System.out.println("test_ServletAPI request -----" + request);
System.out.println("test_ServletAPI response ------ " + response);
writer.write("hello");
writer.flush();
writer.close();
}
**作用:**目标方法返回值可以返回
ModelAndView
对象;其中包含视图还有模型信息;SpringMVC 会把
ModelAndView
中的数据放入到request
域中我们也可以不设置逻辑视图名,万变不离其宗,所有返回的逻辑视图名为String类型;
@RequestMapping("test_ModelAndView.html")
public ModelAndView test_ServletAPI() {
// 设置视图和添加返回的数据。
ModelAndView mv = new ModelAndView("success");
// mv.setViewName("success");
mv.addObject("time",new Date());
System.out.println(mv);
return mv;
}
// 在JSP中取值
requset time:${requestScope.time}
1、将值存入 request 域中:
- Model 和 ModelMap 还有 ModelAndView 都属于Map结构;
- 我们可以在方法使用这些对象作为方法参数传入,相当于传入了一个
HttpServletRequest
对象,但是更为推荐的是使用Map、Model、ModelMap对象;并且ModelAndView不推荐作为入参传递,更推荐主动在方法内实例化。- SpringMVC 会在方法执行的时候自动为我们实例化对象。
2、相同点:
- 结构都为Map;
- 数据都储存在Request域中。(重点)
3、将值存入Session域中:
在类上添加@SessionAttribute(names= {“user”},types=String.class)注解
此注解不能添加到方法上,只能添加到类上。并且通过此注解:
- 在方法内添加到map、model、modelandView中的对象,同时也能存入session中。
- 通过names、types属性指定,names表示key,types表示存入的类型。
@Controller
@RequestMapping("/view/")
@SessionAttributes(names= {"user"},types=String.class)
public class A5_ModelAndView_Controller {
@RequestMapping("test_Model.html")
public String test_ServletAPI(Model md) {
User user = new User(1,"linux","1234pasd","[email protected]",null);
md.addAttribute("user", user);
md.addAttribute("str","hello 可以通过types设置放入session域中的类型");
return success;
}
}
1、标注在方法上:被标注 @ModelAtrribute 的方法会在此 Controller 其他方法执行前,因此对于一个controller映射多个URL的用法来说,要谨慎使用。
2、标注在参数前: 被标注在方法前用于取出存储在Model中的值,说白了就是存储在Request中的值,如果被标注在@SessionAttributes中则会取出Session中的值。
/**
* 标记为@ModelAttribute的方法,会在每个目标方法执行之前执行。
* 这个注解也可以修饰 Entity 对象类型的入参,然后我们将值储存在Model中。
*/
@ModelAttribute("user") // == model.addAttribute("user",user);
public User getUser(@RequestParam(name="userId",required=false) Integer id) {
System.out.println("test ModelAttribute Id:"+id);
User user = new User(1,"linux","a12345","[email protected]",null);
System.out.println(user);
return user;
}
/**
* 运行流程:
* 1. 执行@ModelAtrribute 注解修饰的方法:从数据库中取出对象,把对象放到了Map中,键为:user
* 2. SpringMVC 从Map中取出了User对象,并把表单的请求参数赋给User对象属性。
* 3. SpringMVC 把上述对象传入目标方法的参数。
*
* 注意通过:实际都是存在request中,如果标注为@SessionAtrribute的方法那么存在session中
*/
@RequestMapping("test_modelAtrribute.html") // 方法前标注其实也可以省略。
public String test_ModelAtrribute(@ModelAttribute("user") User user,ModelMap map) {
System.out.println("修改 :"+user);
return success;
}