SpringMVC常见题
1、什么是Spring MVC ?简单介绍下你对springMVC的理解?
Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。
2.SpringMVC的流程
https://www.cnblogs.com/XiaoYeH/p/16192260.html
3.SpringMVC的优点:
(1) 可以支持各种试图技术,不仅仅局限于JSP
(2)与Spring框架 集成(如IOC容器,AOP等);
(3)清晰的角色分配:前端控制器(DispatcherServlet),请求到处理器映射(handlerMapping),处理器适配器(HandlerAdapter),视图解析器(ViewResolver)。
(4)支持各种请求资源的映射策略
4.Spring MVC的主要组件?
(1)前端控制器 DispatcherServlet(不需要程序员开发)
作用:接收请求、响应结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
(2)处理器映射器HandlerMapping(不需要程序员开发)
作用:根据请求的URL来查找Handler
(3)处理器适配器HandlerAdapter
注意:在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以正确的去执行Handler。
(4)处理器Handler(需要程序员开发)
(5)视图解析器 ViewResolver(不需要程序员开发)
作用:进行视图的解析,根据视图逻辑名解析成真正的视图(view)
(6)视图View(需要程序员开发jsp)
View是一个接口, 它的实现类支持不同的视图类型(jsp,freemarker,pdf等等)
5.SpringMVC怎么样设定重定向和转发的?
(1)转发:在返回值前面加“forward:”,譬如“forward:user.do” name=method4"
(2) 重定向:在返回值前面加“redirect:”,譬如“redirect:http://www.baidu.com”
6.SpringMVC怎么和AJAX相互调用的?
通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象。具体步骤如下 :
(1)加入Jackson.jar
(2)在配置文件中配置json的映射
(3)在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上@ResponseBody注解。
7.Spring MVC的异常处理?
答:可以将异常抛给Spring框架,由Spring框架来处理;我们只需要配置简单的异常处理器,在异常处理器中添视图页面即可
8.SpringMvc的控制器是不是单例模式,如果是,有什么问题,怎么解决?
答:是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能的,解决方案是在控制器里面不能写字段。
https://blog.csdn.net/weixin_42128429/article/details/119936833
1.单例模式的概念
一个对象多次使用,
并且只有方法没有属性,或者有属性,属性不变的,
就可以通过单例模式,私有化对象构造方法,然后通过get对象的方法获取对象。
这样就节省了创建删除对象的性能问题
单例模式要求对象的属性不改变。一般都没有成员属性,就算有也是一个不变的量,比如这个成员变量也是单例模式获得的对象。(SqlSession)
2.默认情况下是单例模式,
3.为什么设计成单例设计模式?
1.性能(不用每次请求都创建对象)
2.不需要多例(不要在控制器中定义成员变量)
4.线程安全问题
在多线程进行访问的时候,有线程安全问题.
解读:为什么递增就不安全,为什么static也递增就可以,因为静态成员变量单例和多例的数据变化形式是一样的
而非静态成员变量每次调用本来应该是不会递增的,结果递增了。
解决方案:
1、不要在controller中定义成员变量。
2、万一必须要定义一个非静态成员变量时候,则通过注解@Scope(“prototype”),将其设置为多例模式
尽量不要在controller里面去定义属性,
如果在特殊情况需要定义属性的时候,
那么就在类上面加上注解@Scope("prototype")改为多例的模式,
以前struts是基于类的属性进行发的,定义属性可以整个类通用,所以默认是多例,
不然多线程访问肯定是共用类里面的属性值的,肯定是不安全的,
但是springmvc是基于方法的开发,都是用形参接收值,一个方法结束参数就销毁了,
多线程访问都会有一块内存空间产生,里面的参数也是不会共用的,
所有springmvc默认使用了单例,所以controller里面不适合在类里面定义属性,
只要controller中不定义属性,那么单例完全是安全的。
springmvc这样设计主要的原因也是为了提高程序的性能和以后程序的维护只针对业务的维护就行,
要是struts的属性定义多了,都不知道哪个方法用了这个属性,对以后程序的维护还是很麻烦的。
9.Spring MVC的异常处理?
可以将异常抛给Spring 框架,由Spring框架来处理;配置异常处理器,在异常处理器中添视图页面
10.SpringMVC的常用的注解有哪些?
@RequestMapping:用于处理请求url映射的注解,可用于类或方法上。
用在类上:请求URL的第一级访问目录
用在方法上:请求URL的第二级访问目录 和类上使用@RequestMapping 标注的一级访问目录一起组成访问虚拟路径
@RequestBody:注解实现接收http请求的json数据,将json转换为java对象
@ResponseBody 注解实现将controller方法返回对象转化为json对象相应给客户
只要你有ResponseBody 它就不会走视图解析器,不会去返回return 一个页面,他会直接返回一个字符串
11.前端控制器,哪些静态资源不用拦截?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通