1、是什么
- springMvc是一个基于java的mvc设计模式的web框架
- 通过把model、view、controller分离,将web层进行职责解耦,简化开发,减少出错
2、spring工作流程
- 用户发送请求到前端控制器dispatcherServlet
- DispatcherServlet收到请求后,调用handlerMappering处理器映射器
- handlerMapping根据URL请求找到具体的处理器handler,生成处理器对象及处理器拦截器(如果有)一并返回给DispatcherServlet
- DispatcherServlet调用HandlerAdapter处理器适配器
- 执行处理器controller
- controller执行完返回modelAndview
- handlerAdapter将modelandview返回dispatcherServlet
- dispatcherServlet将modelAndview传给viewReslover视图解析器
- viewResolver解析后返回具体的view
- dispatcherServlet对view进行渲染视图
- dispatcherSErvlet响应用户
3、Springmvc三大组件
- handlerMappering、handlerAdapter、viewResolver
4、springmvc的重定向和转发
- 通过给controller方法的形参httpRequest和httpRespond设定forward和sendRedirect
- 在return前加forward是转发 return “forward:/index.jsp” 加redirect是重定向 return “redirect:/index.jsp”
5、常用注解
- @requestmapping:用于处理URL映射
- @controller:处理dispatcherServlet分发的请求,封装model对象,调用业务方法
- @requestParam:把请求中指定的参数名称给控制器参数赋值,用value指定名称
- @requestBody:接受http请求的json数据,将json转成java对象
- @responseBody: 将controller方法返回的对象转化成json对象给响应给客户
- @Pathvariable:主要用于url上变量映射到处理方法的参数上
- @restController=@controller+@responseBody
6、springmvc与struts2区别
- springmvc的入口是dispatcherServlet,而struts2入口是filter过滤器
- springmvc是基于方法开发的,请求参数传到方法的形参可以设计成单例或者多例的,structs2是基于类开发的,传递参数是根据类的属性,只能设计成多例
- structs2参数栈存储请求和响应的数据,springmvc通过参数解析器将数据和视图封装成modelAndView对象
7、post和get乱码
- post乱码,在web.xml配置characterEncodingFilter过滤器,把encoding属性设为utf-8
- get:修改tomcat的配置文件
8、springmvc拦截器
- 定义一个类实现HandlerInterceptor接口,然后在springmvc.xml中配置拦截器
9、注解原理
- 注解本质是一个继承了Annotation的特殊接口,其具体实现类是一个jdk动态代理生成的代理类,我们通过反射获得注解时,返回的也是java运行时生成的代理对象。通过代理对象调用自定义的代理方法,会最终调用AnnocationInvocationHandler的invoke()方法,该方法会采用mermberValues这个map中查询出对应的值,mermberValues来源是java常量池
10、mvc和ajax相互调用
- 通过jackson.jar可以把java对象转化成js可以识别的json对象
- 在配置文件中配置json的映射
- 在接收ajax的方法前加@responseBody注解,直接返回Object、list等
11、tips
- springmvc控制器是单例模式的,在多线程访问的时候会有安全问题,可以用ThreadLocal(做数据隔离)为每个线程单独生成一份变量拷贝副本,独立操作互不影响
- get请求:request:method=requestMethod.Get
- 直接在方法的形参中传request,springmvc自动将request对象传入
- 将形参的名字设成和前端传来的一样就能得到前端传入的参数
- 直接在方法中声明这个对象,springmvc会自动把属性值赋值到这个对象中
- 返回值类型有String,modelAndView(视图和数据)
- 从后台向前端传数据:通过modelMap对象,调用put方法把对象放里面,前端通过el表达式获取
- 把Model的数据放入Session里面:在类上加@sessionAttributes注解,里面的字符串就是session里面的key