SpringMVC面试题总结

1、什么是SpringMvc?

SpringMvc是spring的一个模块,基于MVC的一个框架,无需中间整合层来整合。

2、SpringMVC的优点
  • 它是基于组件技术的,全部的应用对象,无论控制器还是视图,还是业务对象之类的都是Java组件。并且和Spring提供的其他基础结构紧密集成;
  • 可以任意使用各种视图技术,而不仅限于JSP;
  • 支持各种请求资源的映射策略;
  • 易于扩展。
3、SpringMVC的工作原理
  • 客户端发送请求到DispatcherServlet;
  • DispatcherServlet收到请求后调用HandlerMapping处理器映射器;
  • 处理器映射器找到具体的处理器(可以根据xm配置、注解进行查找),生成处理器对象以及处理器拦截器(有则生成),然后一并返回给DispatcherServlet。
  • DispatcherServlet调用HandlerAdapter处理器适配器;
  • HandlerAdapter经过适配调用具体的处理器(controller,也叫后端处理器);
  • controller执行完成后返回ModelAndView;
  • HandlerAdapter将controller执行结果ModelAndView返回给DispaterServlet;
  • DispatcherServlet将ModelAndView传给ViewReslover视图解析器;
  • ViewReslover解析后返回具体View;
  • DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中);
  • DispactcherServlet响应用户。
4、SpringMVC的控制器是不是单例模式,如果是,有什么问题,怎么解决?

是单例模式,在多线程访问的时候有线程安全问题,解决方案是在控制器里面不能写可变状态量,如果需要使用这些可变状态,可以使用ThreadLocal机制解决,为每个线程单独生成一份变量副本,独立操作,互不影响。

5、SpringMVC和Struts2的区别?
  • SpringMVC的入口是一个servlet(前端控制器),而struts2入口是一个gilter过滤器;
  • SpringMVC是基于方法开发,即一个url对应一个方法,请求参数传递到方法的形参,可以设计为单例或者多例(建议单例)。而struts2是基于类开发,传递参数是通过类的属性,只能设计为多例;
  • sturts2采用值栈存储请求和响应的数据,通过OGNL存取数据,springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过request域传输至页面。Jsp视图解析器默认使用jstl
6、SpringMVC中的控制器的注解一般用哪个,有什么可以代替的

一般用@Controller注解,也可以使用@RestController,@RestController注解相当于@ResponseBody + @Controller,表示是表现层,除此之外,一般不用别的注解代替

7、@RequestMapping注解用在类上有什么作用?

是一个用来处理处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

8、怎么样把某个特定的请求映射到特定的方法上?

直接在方法上加注解@RequestMapping,并在这个注解里面写上要拦截的路径。

9、在拦截请求时,想拦截get方式提交的方法,怎么配置?

在@RequestMapping注解里面加上method=RequestMethod.GET

10、怎么在方法里得到Request或者Session?

直接在方法的形参中声明request,SpringMVC就自动把request对象传入。

11、在拦截的方法里得到前台传入的参数

直接在方法的形参里声明这个参数就可以,但必须明和传过来的一样。

12、如果前台传入的很多参数都是同一个对象的,怎么快速得到这个对象?

直接在方法中声明这个对象,SpringMVC就会自动把属性赋值到这个对象里。

13、@RequestBody、@RequestParam和@PathVariable的作用
  • @RequestBody:当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接收集合数据而无需使用POJO进行包装;

    <script src="${pageContext.request.contextPath}/js/jquery-3.3.1.js"></script>
        <script>
            var userList = new Array();
            userList.push({username:"zhangsan",age:18});
            userList.push({username:"lisi",age:28});
    
            $.ajax({
                type:"POST",
                url:"${pageContext.request.contextPath}/user/quick15",
                data:JSON.stringify(userList),
                contentType:"application/json;charset=utf-8"
            });
    
        </script>
    
    @RequestMapping(value="/quick15")
        @ResponseBody
        public void save15(@RequestBody List<User> userList) throws IOException {
            System.out.println(userList);
        }
    
  • @RequestParam:当请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定

    <form action="${pageContext.request.contextPath}/quick16" method="post">
        <input type="text" name="name"><br>
        <input type="submit" value="提交"><br>
    </form>
    
    @RequestMapping(value="/quick16")
        @ResponseBody
        public void save16(@RequestParam(value="name",required = false,defaultValue = "itcast") String username) throws IOException {
            System.out.println(username);
        }
    
  • @PathVariable:在SpringMVC中可以使用占位符进行参数绑定。地址/user/1可以写成/user/{id},占位符{id}对应的就是1的值。在业务方法中我们可以使用@PathVariable注解进行占位符的匹配获取工作。

    @RequestMapping(value="/quick17/{name}")
    @ResponseBody
     public void save17(@PathVariable(value="name") String username) throws IOException {
            System.out.println(username);
     }
    
14、SpringMVC中函数的返回值是什么?

返回值可以有很多类型,String、ModelAndView,一般用Stirng比较好。

15、SpringMVC怎么样设定重定向和转发的
  • 在返回值前加“forward”就可以让结果转发;
  • 在返回值前加“redirect”就可以让返回值重定向。
16、SpringMVC用什么对象从后台向前台传递的?

通过ModelMap对象,可以在这个对象里面用put方法,把对象加到里面,前台就可以通过el表达式拿到。

17、SpringMVC中有个类把视图和数据合并在一起的叫什么?

ModelAndView

18、怎么把ModleMap里面的数据放到Session?

可以在类上加@SessionAttributes注解,里边包含的字符串就是要放入session里边的key。

19、SpringMVC怎么和AJAX相互调用

通过jackson框架就可以把Java里面的对象直接转化成Js可以识别的json对象。

具体如下:

  • 加入Jackson.jar;
  • 在配置文件中配置json的映射;
  • 在接收Ajax方法里边直接返回Object、List等,但方法前要加@ResponseBody;
20、SpringMVC的拦截器怎么写

两种写法:一种是实现HandlerInterceptor接口,另一种是继承适配器类,然后再SpringMVC的配置文件中配置拦截器即可。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AE8P48HP-1618106585499)(C:\Users\11065\AppData\Roaming\Typora\typora-user-images\image-20210410171504098.png)]

21、SpringMVC的执行流程

系统启动的时候分局配置文件创建spring的容器,首先是发送http请求到核心控制器DispatherServlet,Spring容器通过映射器去寻找业务控制器,使用适配器找到响应的业务类,再进行业务类时进行数据封装,在封装前可能会涉及到类型转换,执行完业务类后使用ModelAndView进行视图转发,数据放在model中,用map传递数据进行页面显示。

22、如何解决POST请求中文乱码问题,GET的又如何处理呢?
  • 解决post请求乱码问题:在web.xml中配置一个CharacterEncodingFilter过滤器,设置成utf-8;
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
</filter>
 
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
  • get请求中文参数出现乱码解决方法有两个:

①修改tomcat配置文件添加编码与工程编码一致,如下:

<ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

②另外一种方法对参数进行重新编码:

String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")
23、注解原理

注解本质是一个继承了Annotation的特殊接口,其具体实现类是JDK动态代理生成的代理类。我们通过反射获取注解时,返回的也是Java运行时生成的动态代理对象。通过代理对象调用自定义注解的方法,会最终调用AnnotationInvocationHandler的invoke方法,该方法会从memberValues这个Map中查询出对应的值,而memberValues的来源是Java常量池。

24、SpringMVC的异常处理

可以将异常抛给Spring框架,由Spring框架来处理;我们只需要配置简单的异常处理器,在异常处理器中添视图页面即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,它通过将Model,View,Controller分离,将web层进行职责解耦,简化开发,减少出错,方便开发人员之间的配合。\[1\]关于Spring MVC的工作流程,用户发起Web请求后,请求会到达Web容器,然后服务器将请求对象交给前置控制器(DispatcherServlet)。前置控制器是Spring MVC的核心入口,它会拦截匹配的请求并将其分发给相应的控制器进行处理。控制器处理完请求后,会返回一个ModelAndView对象,其中包含了处理结果和要展示的视图页面。最后,前置控制器将ModelAndView对象交给视图解析器进行解析,最终将结果返回给用户。\[3\]关于Spring MVC的控制器是否是单例模式,是的,Spring MVC的控制器默认是单例模式。这可能会引发线程安全的问题,因为多个请求可能会同访问同一个控制器实例。为了解决这个问题,可以在控制器类上添加@Scope("prototype")注解,将其设置为原型模式,这样每次请求都会创建一个新的控制器实例,从而避免线程安全问题。\[2\] #### 引用[.reference_title] - *1* *3* [SpringMVC常见面试题(5个最常见面试题,回答超详细)](https://blog.csdn.net/feng8403000/article/details/122280816)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [SpringMVC常见面试题总结(超详细回答)](https://blog.csdn.net/a745233700/article/details/80963758)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值