springMVC知识点

springMVC运行原理:

1.客户端请求提交到DispatcherServlet;
2.由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller;
3.DispatcherServlet将请求提交到Controller;
4.Controller调用业务逻辑处理后,返回ModelAndView;
5.DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图;
6.视图负责将结果显示到客户端。

1、DispatcherServlet

springMVC的核心控制器,配置在web.xml文件中,用于拦截匹配的请求并根据请求分发到不同的controller来处理。

2、springMVC注解

@Controller: 用来标注一个类为controller类,负责客户端请求的的处理,标注为Contoller的类会被扫描器发现并注入到spring容器中。
@RequestMapping: 声明控制器可以处理那些请求。RequestMapping可以标注在类上也可以标注在方法上,标注在类上表示该类中所有方法都可以处理这些请求,标注在方法上表示该方法可以处理对应的请求。

@RequestBody: 用于读取Request请求内容,在对应方法中的参数前进行标注。
@ResponseBody:该注解标注在方法上,用于返回一个对象类型。
@RequestBody和@ResponseBody一般用于json数据的传递

@RequestParam:标注在方法入参之前,用于把客户端参数传递给对应的方法。


  
  


// @RequestParam中的value属性值需要对应前台的name属性值
@RequestMapping("/login")
public String login(@RequestParam(value="username") String user, @RequestParam(value="password") String pass){
  System.out.println("username = "+user);
  System.out.println("password = "+pass);
}
//当我们的前台属性值和需要设置入参的值相同时,还可以简写@RequestParam或直接省略。
@RequestMapping("/login")
public String login(@RequestParam String username, @RequestParam String password){
  System.out.println("username = "+user);
  System.out.println("password = "+pass);
}
OR
@RequestMapping("/login")
public String login(String username, String password){
  System.out.println("username = "+user);
  System.out.println("password = "+pass);
}

@ModelAttribute:标注在方法前,表示在执行目标方法之前先执行该方法。
@PathVariable:绑定url占位符到入参

@RequestMapping("/test/{name}")
//这里的name其实就相当于一个参数被传递进来了,但是他并不是用一般的set请求的样式传递的。
public String testPathVariable(@PathVariable("name") String name)
{
    System.out.println(name);
    return "success";
}

@ExceptionHandler:标注在方法上,当一个controller的类方法被标注@ExceptionHandler时,他就会成为一个异常处理方法,当其他没有标注@ExceptionHandler注解的方法抛出没有捕获的异常时,就会转向异常处理方法进行异常处理。
@ControllerAdvice:控制器增强。标注在类方法上,当他标注在类方法上时,就会将该类中所有标注了@ExceptionHandler,@InitBinder,@ModelAttribute的方法应用到所有注解了@RequestMapping方法上。

3、模型对象Model

springMVC中有一个模型对象,他本身是一个Map,Model可以作为一个参数传入方法之中,并在方法体中添加元素,这些元素可以在前台页面上用EL表达式【${name}】取出。

@RequestMapping("/")
public String test(Model model){
  model.addAttribute("测试String","测试Object");
  return "success";
}

//前台提取数据
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  //引入jstl库
......

4、转发和重定向

springMVC中的转发和重定向只需要在返回值中添加"redirect:"或"forword:"即可。

@RequestMapping("/")
public String test(){
  return "redirect:success";  //重定向到success页面
  return "forword:success";  //转发到success页面
}
5、文件上传

springMVC拥有自己的文件上传模块,使用该模块需要引入两个包:commons-fileupload和commons-io。


    
        
    
....................................................................................
   
 
.................................................................................... @RequestMapping("/") public String testUpload(@RequestParam("file") MultipartFile file, Model model){ if(!file.isEmpty()){ String contentType = file.getComtentType();//获取文件类型 String name = file.getName();//获取表单中文件name属性的值 String originFileName = file.getOriginalFilename();//获得文件名 String extension = originFileName.substring(originFileName.lastIndexOf('.'));//获得文件拓展名 long site = file.getSize();//获取文件大小,单位字节 try { file.transferTo(new File("location")); //保存文件 } catch (Exception e) { System.out.println(e); } } }
6、springMVC+ajax

springMVC与前台页面ajax交互一般都会用到json数据格式的信息传递,我们需要引入jackson-annotation.jar+jackson-core.jar+jackson-databind.jar三个jar包来进行json数据的处理。
ajax提交数据:

$.ajax({
   url : "location",
   type : "POST/GET",
   dataType : "json/xml/html..."
   data : {
      key1 : value1,
      key2 : value2
   },
   success : function(data){
      ...
   },
   error : function (XMLHttpRequest, textStatus, errorThrown){
      ...
   }
});

Controller接收处理出数据:

@RequestMapping("/")
@ResponseBody
public Object testJson(@RequestParam String key1, @RequestParam String key2){
   Object bject = new Object();
   ....
   return object;
}
7、异常处理

1、使用@ExceptionHandler注解处理局部异常

@Controller
@RequestMapping("/")
public class LoginController {

    private LoginDao loginDao;
    @Autowired
    public LoginController(LoginDao loginDao){
        this.loginDao = loginDao;
    }

    @RequestMapping(value = "login", method = RequestMethod.POST)
    public String login(User user, Model model){
        System.out.println(1/0);
       return "login";
    }

    @ExceptionHandler(value = Exception.class)  //异常处理类
    public String loginHandler(Exception e){
        System.out.println("异常处理!!");
        return "redirect:login.jsp";
    }
}

2、使用@ExceptionHandler注解和@ControllerAdvice组合实现全局异常的处理。

@ExecptionHandler注解表示该方法为异常处理方法,@ControllerAdvice注解表示该类中所有的标注@ExecptionHandler、@InitBinder,@ModelAttribute的方法都可以被应用到所有标注了@RequestMapping注解的方法中。

首先定义一个异常类,标注为@ControllerAdvice,类中的异常处理方法标注为@ExceptionHandler。

@ControllerAdvice
public class MyExceptionHandler
    @ExceptionHandler(Exception.class) //标注该方法处理哪种异常
    @ResponseBody
    public Object loginHandler(Exception e){
        System.out.println(e);
        return null;
    }
}

那么controller方法正常写业务逻辑就ok

@Controller
@RequestMapping("/")
public class LoginController {

    private LoginDao loginDao;
    @Autowired
    public LoginController(LoginDao loginDao){
        this.loginDao = loginDao;
    }

    @RequestMapping(value = "login", method = RequestMethod.POST)
    public String login(User user, Model model){
        System.out.println(1/0);
       return "login";
    }
}

使用这种方式在springmvc-servlet.xml中一定要声明,否则这种全局异常的方式是不生效的。

8、表单验证、国际化
9、Spring+SpringMVC搭建项目时,controller层的bean实例应由SpringMVC容器注册,其他层的bean实例应由Spring容器注册,这是利用了spring父子容器的原理,springMVC属于子容器,他可以访问到父容器中service和repository层的bean实例,但是父容器层的实例对象无法访问controller层的bean实例。

你可能感兴趣的:(springMVC知识点)