SpringMVC
MVC的概念:
M:model,模型层, 一种javabean,是数据库中的表的实体类型的映射
V:view,视图层,jsp页面,和用户交互的一个界面
C:controller,控制层,接受请求,调用业务逻辑,返回结果,调用结果视图
1. JavaEE体系结构包括四层,从上到下分别是应用层、Web层、业务层、持久层。Struts和SpringMVC是Web层的框架,Spring是业务层的框架,Hibernate和MyBatis是持久层的框架。
2.简介: Spring MVC是Spring提供的一个强大而灵活的web框架,将Web层进行解耦
3.组成: DispatcherServlet( 前端控制器)、 HandlerMapping(处理器映射)、处理器(控制器)、 ViewResolver(视图解析器)、视图
4.SpringMVC的运行原理
1) Http请求:客户端请求提交到DispatcherServlet。
2) 寻找处理器:由DispatcherServlet控制器查询一个或多个HandlerMapping(处理器映射),通过处理器映射找到处理请求的Controller(处理器)。
3) 调用处理器:DispatcherServlet将请求提交到Controller。
4) 调用业务处理和返回结果:Controller调用业务逻辑处理后,返回ModelAndView。
5) 处理视图映射并返回模型: DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图。
6) Http响应:视图负责将结果显示到客户端。
5.SpringMVC接口的解释
1)DispacherServlet接口:
Spring提供的前端控制器所有的请求都有经过它来统一分发。在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping定位到具体的Controller。
DispacherServlet它是SpringMVC的核心 负责接收HTTP请求组织协调Spring MVC的各个组成部分
1) 截获符合特定格式的URL请求
2) 初始化DispatcherServlet上下文对应WebApplicationContext,并将其与业务层、持久化层的WebApplicationContext建立关联
3) 初始化Spring MVC的各个组成组件,并装配到DispatcherServlet中。
2)HandlerMapping接口:将客户的请求找到指定的collection
3) Controller接口: 处理用户的请求,一旦collection处理完用户请求,则返回 ModelAndView对象给DispacheServlet前端控制器;
从宏观角度考虑:DispacheServlet是整个Web应用的控制器
从微观角度考虑:Collection是一次Http请求过程中的控制器
4) ViewResolver接口: Spring提供的视图解析器(ViewResolver)在Web应用中查找View对象,从而将相应结果渲染给客户。
6.SpringMVC中的常用注解
⇒ @RequestMapping: 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求
@Controller
//设置想要跳转的父路径
@RequestMapping(value="/car")
public class CarController {
@Autowired
private CarService carServcie;
// 设置方法下的子路经
@RequestMapping(value="/goshopping",method=RequestMethod.POST)
public String goshopping(
@RequestParam("count") int [] count,
@RequestParam("pid") Long [] pid,
HttpServletRequest request
)
参数:1.value 和 path :他们的作用是相同的,相当于请求的路径,可以加在类上或者方法上
2.method: 主要用来定义接收浏览器发来的何种请求 (method=RequestMethod.POS/RequestMethod.GET)
如果不明确指定method参数,那么可以接收任何类型的请求
如果明确指定,请求方式和接收方式不匹配,那么会出现 405 错误
⇒ @RequestParam: 传递请求参数
@RequestMapping(value="/do_login", method= RequestMethod.POST)
public String doLogin(
@RequestParam(value="username",defaultValue="user") String username,
@RequestParam("password") String password,
@RequestParam(value="code",required=true) String code){
参数:value:请求的参数名。
required: 是否必须,默认是true,表示请求中一定要有相应的参数,否则将报404错误码;当请求的参数没有code时,就会报404,如果将required=flase,表示参数可传递,可不传递,不会报错。
defaultValue:默认值,表示如果请求中没有同名参数时的默认值。
⇒ @PathVariable :路径传参
@RequestMapping(value="/users/{userId}/topics/{topicId}")
public String test( @PathVariable(value="userId") int userId, @PathVariable(value="topicId") int topicId)
⇒ @ResponseBody: 后端向前端传递json数据返回去
注解表示该方法的返回的结果直接写入 HTTP 响应正文, 一般在异步获取数据时使用,通常是在使用 @RequestMapping 后,返回值通常解析为跳转路径,加上 @Responsebod后返回结果不会被解析为跳转路径,而是直接返回Json数据写入HTTP 响应正文中。
function login() {
var datas = '{"username":"' + $('#username').val() + '","userid":"' + $('#userid').val() + '","status":"' + $('#status').val() + '"}';
$.ajax({
type : 'POST',
contentType : 'application/json',
url : "${pageContext.request.contextPath}/user/login",
processData : false,
dataType : 'json',
data : datas,
success : function(data) {
alert("userid: " + data.userid + "username: " + data.username + "status: "+ data.status);
},
error : function(XMLHttpRequest, textStatus, errorThrown) {
alert("出现异常,异常信息:"+textStatus,"error");
}
});
};
@RequestMapping(value = "user/login")
@ResponseBody
// 将ajax(datas)发出的请求写入 User 对象中,返回json对象响应回去
public User login(User user) {
User user = new User();
user .setUserid(1);
user .setUsername("MrF");
user .setStatus("1");
return user ;
}
⇒ @RequestBody :主要用来接收前端传递给后端的json字符串中的数据
1. 将 HTTP 请求正文插入方法中,该注解用于读取body部分数据,然后绑定到返回的json对象上,再把对象数据绑定到 controller中的方法的参数上
@RequestMapping(value = "user/login")
@ResponseBody
// 将ajax(datas)发出的请求写入 User 对象中
public User login(@RequestBody User user) {
// 这样就不会再被解析为跳转路径,而是直接将user对象写入 HTTP 响应正文中
return user;
}
2.@RequestBody 与@RequestParam()的区别
1).@RequestBody 与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个.
2).@RequestParam注解接收的参数是来自于requestHeader中,即请求头,也就是在url中,格式为xxx?username=123&password=456;@RequestBody注解接收的参数则是来自于requestBody中,即请求体中。
3). 如果为get请求时,后台接收参数的注解应该为@RequestParam,如果为post请求时,则后台接收参数的注解就是为@RequestBody
3.注意点::
1).直接通过浏览器输入url时,@RequestBody获取不到json对象,需要用java编程或者基于ajax的方法请求,将Content-Type设置为application/json
2). multipart/form-data,上传文件form表中的属性值enctype 则@requestBody不能处理
<form method="post"action="http://w.sohu.com/t2/upload.do" enctype=”multipart/form-data”>
<inputtype="text" name="desc">
<inputtype="file" name="pic">
</form>
⇒ @Resource和@Autowired: 注入bean
@Resource:名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,
@Autowired: 类型进行自动装配的。如果当Spring上下文中存在不止一个IUservice类型的bean时,就会抛出BeanCreationException异常;如果Spring上下文中不存在UserDao类型的bean,也会抛出BeanCreationException异常。我们可以使用@Qualifier配合@Autowired来解决这些问题
1. @Autowired
2. @Qualifier("userServiceImpl")
3. public IUserService userService;