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/>,否则这种全局异常的方式是不生效的。
网友评论