文章目录
- 什么是SpringMVC?
- SpringMVC的核心组件
- SpringMVC的流程?
- SpringMVC的优点
- SpringMVC常用的注解
- SpingMvc中的控制器的注解一般用哪个?有没有别的注解可以替代?
- SpringMvc里面拦截器是怎么写的?
- 注解的原理
- SpringMVC的异常处理
- SpringMvc的控制器是不是单例模式?如果是,有什么问题?怎么解决?
- 如果在拦截请求中,我想拦截get方式提交的方法,怎么配置?
- 怎样在方法里面得到Request,或者Session?
- 如果想在拦截的方法里面得到从前台传入的参数,怎么得到?
- 如果前端传入多个参数,并且参数都是同个对象的,如何快速得到这个对象?
- SpringMvc中函数的返回值是什么?
- SpringMvc用什么对象从后台向前台传递数据的?
- 怎么样把ModelMap里面的数据放入Session里面?
什么是SpringMVC?
SpringMVC是一个基于Java实现了MVC设计模式的请求驱动类型的轻量级Web框架,MVC 是模型(Model)、视图(View)、控制器(Controller)的简写,其核心思想是通过将业务逻辑、数据、显示分离来组织代码,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。
SpringMVC的核心组件
记住了下面这些组件,也就记住了 SpringMVC 的工作原理。
- DispatcherServlet:核心的中央处理器,负责接收请求、分发,并给予客户端响应。
- HandlerMapping:处理器映射器,根据 uri 去匹配查找能处理的
Handler
,并会将请求涉及到的拦截器和Handler
一起封装。- HandlerAdapter:处理器适配器,根据
HandlerMapping
找到的Handler
,适配执行对应的Handler
;- Handler:请求处理器,处理实际请求的处理器。
- ViewResolver:视图解析器,根据
Handler
返回的逻辑视图 / 视图,解析并渲染真正的视图,并传递给DispatcherServlet
响应客户端
SpringMVC的流程?
- 客户端(浏览器)发送请求,
DispatcherServlet
拦截请求。DispatcherServlet
接收到请求之后,调用HandlerMapping
处理器映射器,请求获取Handler
- 处理器映射器根据请求uri找到具体的处理器
Handler
,生成处理器对象及处理器拦截器(如果有则生成),一并返回给DispatcherServlet
DispatcherServlet
调用HandlerAdapter
适配器执行Handler
。HandlerAdapter
经过适配调用 具体处理器进行处理业务逻辑Handler
执行完成返回ModelAndView
HandlerAdapter
将Handler
执行结果ModelAndView
返回给DispatcherServlet
DispatcherServlet
将ModelAndView
传给ViewResolver
视图解析器进行解析ViewResolver
解析后返回具体View
- ``DispatcherServlet
对
View`进行渲染视图(即将模型数据填充至视图中)DispatcherServlet
响应用户
SpringMVC的优点
- 丰富的视图选择:SpringMVC支持多种视图技术,如JSP、Freemarker、Thymeleaf等,可以根据需要选择合适的视图技术。
- 与Spring框架的集成:SpringMVC是Spring框架的一部分,可以无缝地与Spring的其他部分(如SpringIoC、SpringAOP等)进行集成。
- 清晰的角色分配:前端控制器(dispatcherServlet) ,请求到处理器映射(handlerMapping),处理器适配器(HandlerAdapter),视图解析器(ViewResolver)。
- 支持各种请求资源的映射策略。
SpringMVC常用的注解
- @Controller:用于标识一个控制器。
- @RequestMapping:用于映射Web请求到特定的处理器功能或控制器方法。
- @RequestParam:用于将请求参数绑定到方法参数。
- @PathVariable:用于将URL中的模板变量绑定到方法参数。
- @ResponseBody:用于将返回值转换为JSON或XML等格式返回给客户端。
- @RequestBody:用于将HTTP请求正文插入方法中,使用适合的HttpMessageConverter将请求体写入某个对象。
- @ModelAttribute:用于将请求参数绑定到命令对象,或者在Model中暴露值。
- @SessionAttributes:用于将模型属性存储在会话中。
- @ExceptionHandler:用于处理控制器中的异常。
SpingMvc中的控制器的注解一般用哪个?有没有别的注解可以替代?
一般用@Controller注解,也可以使用@RestController,@RestController注解相当于@ResponseBody + @Controller,表示是表现层,除此之外,一般不用别的注解代替。
SpringMvc里面拦截器是怎么写的?
有两种写法,一种是实现HandlerInterceptor接口,另外一种是继承适配器类,接着在接口方法当中,实现处理逻辑;然后在SpringMvc的配置文件中配置拦截器即可:
<!-- 配置SpringMvc的拦截器 -->
<mvc:interceptors>
<!-- 配置一个拦截器的Bean就可以了 默认是对所有请求都拦截 -->
<bean id="myInterceptor" class="com.zwp.action.MyHandlerInterceptor"></bean>
<!-- 只针对部分请求拦截 -->
<mvc:interceptor>
<mvc:mapping path="/modelMap.do" />
<bean class="com.zwp.action.MyHandlerInterceptorAdapter" />
</mvc:interceptor>
</mvc:interceptors>
注解的原理
在Java编程中,注解(Annotation)是一种用于提供元数据的机制。它们是在代码中添加的特殊标记,可以在编译、类加载、运行时被读取,并执行特定的功能。
注解的基本语法是在注解名前加上@符号,例如@Override,@Entity等。
注解有三种类型:
- 标记注解:没有成员的注解,例如@Override。
- 单值注解:只有一个成员的注解,例如@SuppressWarnings(“unchecked”)。
- 完整注解:包含多个成员的注解,例如@RequestMapping(method = RequestMethod.GET, path = “/example”)。
如何自定义注解?
- 创建一个自定义注解:与创建接口类似,但自定义注解需要使用 @interface
- 添加元注解信息,比如 @Target、@Retention、@Document、@Inherited 等
- 创建注解方法,但注解方法不能带有参数
- 注解方法返回值为基本类型、String、Enums、Annotation 或其数组
- 注解可以有默认值
@Target(FIELD) @Retention(RUNTIME) @Documented public @interface CarName { String value() default ""; }
SpringMVC的异常处理
答:可以将异常抛给Spring框架,由Spring框架来处理;我们只需要配置简单的异常处理器,在异常处理器中添视图页面即可。
SpringMvc的控制器是不是单例模式?如果是,有什么问题?怎么解决?
答:是单例模式,在多线程访问的时候有线程安全问题,解决方案是在控制器里面不能写可变状态量,如果需要使用这些可变状态,可以使用ThreadLocal机制解决,为每个线程单独生成一份变量副本,独立操作,互不影响。
如果在拦截请求中,我想拦截get方式提交的方法,怎么配置?
答:可以在@RequestMapping注解里面加上method=RequestMethod.GET。
怎样在方法里面得到Request,或者Session?
答:直接在方法的形参中声明request,SpringMvc就自动把request对象传入。
如果想在拦截的方法里面得到从前台传入的参数,怎么得到?
答:直接在形参里面声明这个参数就可以,但必须名字和传过来的参数一样。
如果前端传入多个参数,并且参数都是同个对象的,如何快速得到这个对象?
答:直接在方法中声明这个对象,SpringMvc就自动会把属性赋值到这个对象里面。
SpringMvc中函数的返回值是什么?
答:返回值可以有很多类型,有String,ModelAndView。ModelAndView类把视图和数据都合并的一起的,但一般用String比较好。
SpringMvc用什么对象从后台向前台传递数据的?
答:通过ModelMap对象,可以在这个对象里面调用put方法,把对象加到里面,前端就可以通过el表达式拿到。
怎么样把ModelMap里面的数据放入Session里面?
答:可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key。