美文网首页
springMVC知识点

springMVC知识点

作者: 游牧族人 | 来源:发表于2018-05-05 23:16 被阅读158次
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:标注在方法入参之前,用于把客户端参数传递给对应的方法。

<from method="post" action="login">
  <input type="text" name="username"/>
  <input type="password" name="password"/>
</from>

// @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<String,Object>,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库
......
<c:out value="${测试String}"></c:out>
4、转发和重定向

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

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

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

<!--配置文件上传解析器(id 必须为multipartResolver)-->
    <bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="102400000"></property>
    </bean>
....................................................................................
<!--表单界面-->   
 <form method="post" action="login" enctype="multipart/form-data">
        <input type="file" name="file"/>
        <input type="submit" value="提交"/>
    </form>
....................................................................................
    @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中一定要声明<mvc:annotation-drivern/>,否则这种全局异常的方式是不生效的。

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

相关文章

网友评论

      本文标题:springMVC知识点

      本文链接:https://www.haomeiwen.com/subject/rjzerftx.html