1请求与响应
1.1@RequestMapping注解
作用:将请求和处理请求的控制器方法关联起来 建立映射关系
注解的位置:
标识一个类:设置映射请求的请求路径的初始信息
标识一个方法:设置请求路径的具体信息
eg:
@RestController @RequestMapping("/www") public class HelloController { //对应请求路径为:/www/hello @RequestMapping("/hello") public String hello(){ return "hello";
method属性:
作用:通过注解的请求方式来匹配请求 一般表单提交是post
在requestMapping注解的基础上 结合请求方式 产生了派生注解
@GetMapping
@PostMapping
@DeleteMapping
@PutMapping
param属性:
@RequestMapping的param属性是一个字符串类型的数组
有四种表达式设置请求参数与请求映射的匹配关系:
1"param":请求映射必须携带param请求参数 2 "!param":请求映射不必须携带param请求参数
3"param!=value":请求映射必须携带param请求参数且param!=value
4"param=value":请求映射必须携带param请求参数且param=value
eg:
@RequestMapping(value="/hello",method=RequestMethod.Post,params={"username","!password"})
springMvc支持路径使用占位符
原来的模式:/hello?id=1
rest方式:/hello/1
<a href="/hello/1"></a>
@RestController
@RequestMapping("/www")public class HelloController {
//对应请求路径为:/www/hello
@RequestMapping("/hello/{id}")
public String hello(@PathVariable("id") String id){
return "hello";
}
}
springMvc获取请求参数
1普通形式传参
2采取POJO形式
3通过servletApl(使用request获取)
4其他方式
普通形式传参:
@RequestMapping("/hello")
public String Hello(String username,String password){
//这里的username password要与前面传来的参数名字相同
return "hello"
}
通过@RequestParam进行
三个属性:value:设置和形参绑定的请求参数的名字
required:设置是否必须传输value所对应的请求参数
defaultValue:设置默认value的值
@RequestMapping("/ww") public String hh(@RequestParam(value = "username",required = true,defaultValue = "hh")){ System.out.println("jhh"); return "success"; }
采取POJO形式
(当获取对象太多时候 采用一个类 来使用)
要保证每一个参数的名字与类里面的名字相同
@GetMapping("/phonePage") public PhonePageVo selectPhone( PhonePageDto phonePage){ Phone phone=new Phone(); phone.setPhoneNumber(2); phone.setModelNumber(phonePage.getModelNumber()); List<Phone> phones=new ArrayList<>(); phones.add(phone); PhonePageVo pageVo=new PhonePageVo(); pageVo.setPageNumber(phonePage.getPagenumber()); pageVo.setPagesize(phonePage.getPagesize()); pageVo.setPhoneList(phones); System.out.println(pageVo); return pageVo; } }
PhonePageDto类中有
public class PhonePageDto { private int pagesize; private int pagenumber; private int modelNumber;
如果用postman去测试的时候 传入的名字要相同 如 pagesize=1 pagenumber=2 modelNumber=2要一一对应
通过servletApl(使用request获取)
@RequestMapping(value = "/login",method = RequestMethod.POST) public String UserLogin(HttpServletRequest request){ String userid= request.getParameter("userid"); String password= request.getParameter("password"); if (userid.equals("001")&&password.equals("system")){ request.setAttribute("userid",userid); request.setAttribute("password",password); return "success"; } return "false"; }
其他方式
除了以上的传参方式 还可以传入数组 list集合
//list集合 @RequestMapping(value = {"/hello","a"}, method = RequestMethod.GET ) public String a(List<PhonePageDto > phone){ for(PhonePageDto ph::phone){ System.out.println(ph); } System.out.println("hhh"); return "success"; }//数组
@RequestMapping(value = {"/hello","a"}, method = RequestMethod.GET )
public String a(String[] hh)
{
System.out.println("hhh"+Arrays.toString(hh));
return "success";
}
@Requestbody
作用:将请求体中的内容和控制器方法的形参进销绑定
使用@Requestbody 注解将json格式的请求转换为Java对象
@RequestBody @RequestParam
-
RequestParam 用于接收URL地址传参或表单传参
-
RequestBody 用于接收JSON数据
-
public ResponseEntity<String> createStudent(@RequestBody Student student) {
students.add(student);
return ResponseEntity.status(HttpStatus.CREATED).build();
}
@DateTimeFormat
声明一个对象属性或者方法参数会被格式化为日期或时间 与@RequestParam
注解结合使用
spring会调用FormattingConversionService.convert(Object,TypeDescriptor,TypeDescriptor)将日期时间字符转换为时间日期类型
@RequestMapping("/data")
@ResponseBody
public String dataParam(Date date, @DateTimeFormat(pattern="yyyy-MM-dd") Date d,
@DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date d2){
System.out.println(" date ==> "+date);
System.out.println(" date1(yyyy-MM-dd) ==> "+d1);
System.out.println(" date2(yyyy/MM/dd HH:mm:ss) ==> "+d2);
return DATE;
}
springmvc三种请求域共享数据
Modeandview 实现网页之间共享数据 和页面跳转
public class TestScopeController { //使用modelandview @RequestMapping("/test/mav") public ModelAndView TestMav() { ModelAndView mav = new ModelAndView(); //mode:是向请求域贡献数据 //view设置逻辑试图实现页面跳转 mav.addObject("testScopeController", "12"); //设置逻辑试图 mav.setViewName("success"); return mav; }
Model ModelMap map实现共享数据
@RequestMapping("/test/model") public String testModel(Model model){ model.addAttribute("hhh","hello model"); return "hh"; }@RequestMapping("/test/modelMap")
public String testModel(ModelMap model){
model.addAttribute("hhh","hello ModelMap ");
return "hh";
}
@RequestMapping("/test/map")
public String testModel(Map<String,Object> map){
map.put("testMap","hello map");
return "hh";
}
通过会话域进行保存数据(session application)
@RequestMapping("/session") public String testSeesion(HttpSession session){ session.setAttribute("hh","hello session"); return "hh" }
@RequestMapping("/application") public String testApplication(HttpSession session){ ServletContext S=session.getServletContext(); S.setAttribute("hh","hello application"); return "hh"; }
springMvC拦截器(重点)
类似Servlet里面的过滤器 用来处理器进行预处理和后处理
将拦截器按照一定的顺序形成一条拦截器链 拦截器按照定义好的顺序被调用 也是Aop思想的表现形式
public class TestLanjieqi implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return HandlerInterceptor.super.preHandle(request, response, handler);
}@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
如上图 拦截器有三种方法 :1 preHandle:boolean 类型 返回为false时 说明请求结束 后续的方法不会再执行 返回true 将会继续调用下一个Interceptor的preHandle方法
2postHandle:前提是preHandle返回为true时 而且他会在DispatcherServlet进行视图返回渲染时候被调用 我们可以这个方法中对Controller处理后的ModeAndView对象进行操作
3afterCompletion:前提是preHandle返回为true时 整个请求结束的时候执行