SpringMVC = 基础面试题

(1) 什么是SpringMVC 作用是什么?

一,首先是一个MVC框架。

在web模型中,MVC是一种很流行的框架,通过把Model,View,Controller分离,把较为复杂的web应用分成逻辑清晰的几部分,是为了简化开发,减少出错。还是为了组内开发人员之间的配合。总之就是一种分层工作的办法。

二,springMVC,是spring的一个子框架,当然拥有spring的特性,如依赖注入。

Spring下的子项目:Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。

它用在基于MVC的表现层开发,类似于struts2框架

SpringMVC是一种Web层mvc框架,用于替代servlet,主要用于处理和响应请求,获取表单参数,表单校验等。

(2)为什么要用SpringMVC“”

SpringMVC框架的作用就是用来简化编程的,相对于servlet来说,获取表单参数,响应请求等变得更简单了

(3)说一说SpringMVC底层执行流程(工作原理)?

(4)说说SpringMVC中常用注解有哪些?分别什么作用?

@Controller
标识这个类是一个控制器

@RequestMapping
给控制器方法绑定一个uri

@ResponseBody
将Java对象转成Json,并且发送给客户端

@RequestBody
将客户端请求过来的Json转成Java对象

@RequestParam
当表单参数和方法形参名字不一致时,做一个名字映射

@PathVarible
用于获取uri中的参数,比如user/1中1的值

RESTful 风格的新API:

@RestController
@Controller+ @ResponseBody
@GetMapping
@DeleteMapping
@PostMapping
@PutMapping

其他注解

@SessionAttribute
声明将什么模型数据存入session

@CookieValue
获取cookie值

@ModelAttribute
将方法返回值存入model中

@HeaderValue
获取请求头中的值

(5)SpringMVC和Strus2的区别?

(1)入口不同
SpringMVC入口是servlet,Struts2入口是filter。

(2)生命周期不同
SpringMVC Controller是单例的,所以效率更高,但是不能使用成员变量获取参数。
Struts2 Action是多例的,可以使用成员变量获取参数,导致效率比较低。

(6)如何在SpringMVC实现RESTful 服务?

(1)导入jackson2包
(2)开启注解驱动<mvc:annotation-driven/>
(3)Json交互=@RequestBody @ResponseBody

(7)什么是拦截器?有什么用?SpringMVC如何定义拦截器?

拦截器类似于filter的一个对象,用于预处理以及后处理处理器(控制器)。

新建一个class,实现HandlerInterceptor接口,重写三个方法preHandler、postHandler、afterCompletion,最后在springmvc.xml中配置拦截器。

 

(8)SpringMVC中如何做表单数据校验?

(1)springmvc.xml中配置一个validator
(2)<mvc:annotation-driven validator="validator"/>;
(3)给Entity添加校验规则
@NotEmpty
@Length
...
(4)用BindingResult 紧接着entity之后来接收错误信息

(9)说说自己对于 Spring MVC 了解?

谈到这个问题,我们不得不提提之前 Model1 和 Model2 这两个没有 Spring MVC 的时代。

Model1 时代 : 很多学 Java 后端比较晚的朋友可能并没有接触过 Model1 模式下的 JavaWeb 应用开发。在 Model1 模式下,整个 Web 应用几乎全部用 JSP 页面组成,只用少量的 JavaBean 来处理数据库连接、访问等操作。这个模式下 JSP 即是控制层又是表现层。显而易见,这种模式存在很多问题。比如:
(1)将控制逻辑和表现逻辑混杂在一起,导致代码重用率极低;
(2)前端和后端相互依赖,难以进行测试并且开发效率极低;

Model2 时代 :学过 Servlet 并做过相关 Demo 的朋友应该了解“Java Bean(Model)+ JSP(View)+Servlet(Controller) ”这种开发模式,这就是早期的 JavaWeb MVC 开发模式。Model是系统涉及的数据,也就是 dao 和 bean。View展示模型中的数据,只是用来展示。Controller用来处理用户请求都发送给 ,返回数据给 JSP 并展示给用户。

Model2 模式下还存在很多问题,Model2的抽象和封装程度还远远不够,使用Model2进行开发时不可避免地会重复造轮子,这就大大降低了程序的可维护性和复用性。于是很多JavaWeb开发相关的 MVC 框架营运而生,比如Struts2,但是 Struts2 比较笨重。随着 Spring 轻量级开发框架的流行,Spring 生态圈出现了 Spring MVC 框架, Spring MVC 是当前最优秀的 MVC 框架。相比于 Struts2 , Spring MVC 使用更加简单和方便,开发效率更高,并且 Spring MVC 运行速度更快。

MVC 是一种设计模式,Spring MVC 是一款很优秀的 MVC 框架。Spring MVC 可以帮助我们进行更简洁的Web层的开发,并且它天生与 Spring 框架集成。Spring MVC 下我们一般把后端项目分为 Service层(处理业务)、Dao层(数据库操作)、Entity层(实体类)、Controller层(控制层,返回数据给前台页面)。

Spring MVC 的简单原理图如下:

 

(10)SpringMVC 工作原理了解吗?

原理如下图所示:

SpringMVC运行原理

Spring MVC 的入口函数也就是前端控制器 DispatcherServlet 的作用是接收请求,响应结果。

流程说明(重要):

(1)客户端(浏览器)发送请求,直接请求到 DispatcherServlet。

(2)DispatcherServlet 根据请求信息调用 HandlerMapping,解析请求对应的 Handler。

(3)解析到对应的 Handler(也就是我们平常说的 Controller 控制器)后,开始由 HandlerAdapter 适配器处理。

(4)HandlerAdapter 会根据 Handler来调用真正的处理器开处理请求,并处理相应的业务逻辑。

(5)处理器处理完业务后,会返回一个 ModelAndView 对象,Model 是返回的数据对象,View 是个逻辑上的 View。

(6)ViewResolver 会根据逻辑 View 查找实际的 View。

(7)DispaterServlet 把返回的 Model 传给 View(视图渲染)。

(8)把 View 返回给请求者(浏览器)

 

 

(11)什么是Servlet

servlet是一个Java编写的程序,此程序是基于http协议的,在服务器端(如Tomcat)运行的,是按照servlet规范编写的一个Java类。
客户端发送请求至服务器端,服务器端将请求发送至servlet,servlet生成响应内容并将其传给服务器
即,我们在浏览器点击链接和按钮产生的消息不是发送给servlet的,而是发送给web容器(如Tomcat、jetty)的,web容器接受消息后不知道怎么处理,转交给我们编写的servlet处理,那么web容器怎么和servlet交流呢,于是就有了servlet接口(因为接口是定义一种规范的良好表达形式)。我们只需要编写Java类符合servlet规范,那么就能被web容器识别,并被容器管理。
Servlet = Server + Applet

 

(12)servlet的作用:

处理客户端的请求并将其结果发送到客户端

 

(13)servlet的生命周期

servlet的生命周期由servlet容器来控制,分为三个阶段:

初始化阶段:

1、servlet容器加载servlet类,把servlet类的.class文件中的数据读到内存中。
2、servlet容器创建一个servletConfig对象。servletConfig对象包含了servlet的初始化配置信息。
3、servlet容器创建一个servlet对象。
4、servlet容器调用servlet对象的init方法进行初始化。

运行阶段:

1、servlet容器接收到一个请求时,servlet容器会针对这个请求创建servletRequest和servletResponse对象。
2、然后调用service方法。并将这两个参数传递给service方法。service方法通过servletRequest对象获得请求的信息。并处理该请求。
3、再通过servletResponse对象生成这个请求的响应结果。然后销毁servletRequest和servletResponse对象。不管这个请求时post提交的还是get提交的,这一种这个请求都会由service方法来处理。
销毁阶段:
当web应用被终止时,servlet容器会先调用servlet对象的destroy方法,然后在销毁servlet对象,同时也会销毁与servlet对象相关联的servletConfig对象。我们可以在destroy方法的实现中,释放servlet所占用的资源,如关闭数据库连接,关闭文件输入输出流等。

 

(14)servlet怎么处理一个请求?

当用户从浏览器向服务器发起一个请求,通常会包含如下信息:http://hostname: port /contextpath/servletpath,hostname 和 port 是用来与服务器建立 TCP 连接,而后面的 URL 才是用来选择服务器中那个子容器服务用户的请求。那服务器是如何根据这个 URL 来达到正确的 Servlet 容器中的呢?
Tomcat中这件事很容易解决,因为这种映射工作有专门的一个类来完成,这个类保存了Tomcat的container容器中所有子容器的信息。当 Request 进入 Container 容器之前,它要访问那个子容器这时就已经确定了。
当用户发送一个请求到某个servlet的时候,servlet容器会创建一个servletRequest和servletResponse对象。在servletRequest对象中封装了用户的请求信息,然后servlet容器把servletRequest和servletResponse对象传递给用户所请求的servlet,servlet把处理好的结果卸载servletResponse中,然后servlet容器把响应结果传给用户。

 

(15)servlet和jsp的区别

1、jsp经编译后就是servlet。
2、jsp更擅长页面表现,servlet更擅长逻辑编辑
3、jsp位于MVC设计模式的视图层,而servlet位于控制层

(16)servlet里的过滤器

过滤器的作用

1、任何系统或网站都要判断用户是否登录。
2、网络聊天系统或论坛,功能是过滤非法文字
3、统一解决编码

怎么创建一个过滤器:

1、生成一个普通的class类,实现Filter借口(javax.servlet.Filter)
2、重写接口里面的三个方法:init,doFilter和destroy
3、然后在web.xml配置过滤器

servlet中的监听器

对Request的监听,对session的监听,对application的监听

 

(17)SpringMVC如何有效的防止XSS注入?

SpringMVC如何有效的防止XSS注入?

答案如下:

首先明确xss的解决方式是输入过滤,输出编码。SpringMVC Web程序通过控制器获取参数,在view层输出。在view层解决的话,基本的方法是html实体编码,编码特殊字符如()<>/,例如> 编成> <编成< 这样显示起来没有问题,也不会导致用户输入的js语句被插入到输出页面而被执行,即所谓的xss。

向页面输出request接收的内容时,转义"<"和">","("和")"即可。js脚本没有小括号,则无法在html中调用,没有尖括号,则无法在页面中插入<script>标签。

需要注意一点:springmvc注解@RequestParam不是通过HttpServletRequest.java的getParameter(String name)方法得到的参数值,而是通过getParameterValues得到的,所以,新增一个XSSHttpServletRequestWrapper来重写request对象的getParameter方法,过滤参数中的容易引起xss漏洞的字符,但实际并不起作用呢

 

(18)是否需要在类路径中使用spring-mvc.jar,或者是spring-core的一部分?

spring-mvc.jar不是spring-core的一部分,如果要在Java项目中使用Spring MVC框架,则必须在应用程序的类路径中包含spring-mvc.jar。在Java Web应用程序中,spring-mvc.jar通常放在/ WEB-INF / lib文件夹中。

 

(19)什么是DispatcherServlet以及它用于什么?

DispatcherServlet是Front Controller设计模式的一个实现,它处理对Spring MVC应用程序的所有传入Web请求。前端控制器模式是Web应用程序中的常见模式,其作用是接收所有请求并将其路由到应用程序的不同组件以进行实际处理。

在Spring MVC的情况下,DispatcherServlet将Web请求路由到Spring MVC控制器。

在Spring MVC中,DispatcherServlet用于查找正确的Controler以处理请求,它在处理程序映射的帮助下执行,例如@RequestMapping注解。

它还负责将逻辑视图名称委派给ViewResolver,然后将呈现的响应发送到客户端。

 

(20)DispatcherServlet如何通过应用程序上下文实例化?

DispatcherServlet由Tomcat或Jetty等Servlet容器实例化。必须将DispatcherServlet定义到web.xml文件中,如下所示。

可以看到load-on-startup标记为1,当Spring MVC应用程序部署到Tomcat或任何其他Servlet容器时,将实例化DispatcherServlet。在实例化期间,它会查找文件servlet-name-context.xml,然后初始化此文件中定义的bean。

 

(21)Spring MVC中的root应用程序上下文是什么?怎么装载的?

在Spring MVC中,使用ContextLoaderListener加载的上下文称为“root”应用程序上下文,它属于整个应用程序,而使用DispatcherServlet初始化的应用程序上下文实际上是特定于该servlet。

从技术上讲,Spring MVC允许在Spring MVC Web应用程序中使用多个DispatcherServlet ,因此可能存在多个这样的上下文,每个上下文都针对相应的servlet,但是具有相同的根上下文。

(22)@Controller注释的用途?如何在没有注释的情况下创建控制器?

@Controller是用来定义Controller的Spring MVC注释,但实际上它只是一个原型注释。甚至可以在没有@Controller的情况下通过使用@Component注释Spring MVC控制器类来创建控制器。请求映射到处理程序方法的实际工作是使用@RequestMapping注释来完成的

(23)什么是ContextLoaderListener,它的作用是什么?

ContextLoaderListener是一个监听器,这有助于引导Spring MVC的。顾名思义它加载并创建ApplicationContext,因此不必编写显式代码来创建它。应用程序上下文是Spring bean离开的地方。对于Web应用程序,有一个名为WebAppliationContext的子类。

ContextLoaderListener还将ApplicationContext的生命周期与ServletContext的生命周期联系起来。可以使用getServletContext()方法从WebApplicationContext获取ServletContext。

ContextLoaderListener是在web.xml中配置为监听器的,可以将它放在一个标记中,如下所示:

 

(24)传入请求如何映射到控制器和方法?

有时也会问这个问题DispatcherServlet如何知道哪个Controller应该处理请求?

Spring使用处理程序映射将控制器与请求相关联,两个常用的处理程序映射是BeanNameUrlHandlerMapping和SimpleUrlHandlerMapping。

在BeanNameUrlHandlerMapping中,当请求url与bean的名称匹配时,bean定义中的类是将处理请求的控制器。

另一方面,在SimpleUrlHandlerMapping中,映射更明确。可以指定URL的数量,并且每个URL可以与控制器显式关联。

顺便说一句,如果你使用注释来配置Spring MVC,那么应该使用@RequestMapping注释将传入请求映射到控制器和处理程序方法。

还可以通过URI路径,查询参数,请求的HTTP方法以及请求中存在的HTTP标头配置@RequestMapping批注。

 

(25)@RequestParam用于什么?

@RequestParam是一个Spring MVC注释,其被用于提取从URL中控制器的处理程序方法请求参数或查询参数,如下所示:

@RequestParam注释也支持数据类型转换,例如这里可以看到一个String被自动转换为long,但它也可能导致一个异常,如果查询参数不存在或类型不匹配的情况下 还可以使用requried = false使参数成为可选参数,例如@RequestParam(value ="id",required = false)

 

(26)控制器方法的一些有效返回类型是什么?


Spring MVC中的控制器方法有许多可用的返回类型,这些方法由控制器内部的@RequestMapping注释。其中一些流行的是:

(1)String
(2)void
(3)View
(4)ModelAndView (Class)
(5)Model (Interface)
(6)Map
(7)HttpEntity<?> or ResponseEntity<?>
(8)HttpHeaders

每种返回类型都有其特定用途。例如,如果使用的是String,则表示Controller只返回View Name,此视图名称将由ViewResolver解析。

如果不想返回任何视图名称,请提回返回类型void。如果要设置视图名称以及想要发送一些对象,请使用ModelAndView作为返回类型。

 

(27)什么是模型?

Model再次是封装数据或输出以进行渲染的引用。始终创建模型并将其传递给Spring MVC中的视图。如果映射的控制器方法将Model作为方法参数,则Spring框架会自动将模型实例注入该方法。

注入模型上设置的任何属性都将保留并传递给View。以下是在Spring MVC中使用Model的示例:

(28)InternalResourceViewResolver有什么作用?

在Spring MVC中,ViewResolveer返回View以处理基于逻辑视图名称(由控制器提供)和语言环境输出呈现。这种方式控制器没有耦合到特定的视图技术,例如JSP或FreeMarker,它只返回逻辑视图名称。

InternalResourceViewResolver是在Spring MVC和DispatcherServlet中配置的默认View解析器用它来找到正确的视图。InternalResourceViewResolver用于呈现JSP(JstlView)。

它将前缀和后缀配置为逻辑视图名称,然后生成特定JSP的路径,如下所示:

    <bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name = "prefix" value = "/WEB-INF/" /> 
    <property name = "suffix" value = ".jsp" /> 
    </bean >

因此,如果Controller返回"hello"作为逻辑视图名称,则InternalViewResolver将返回/WEB-INF/hello。

 

学习资源:

https://javadoop.com/

http://www.springmvc.cn/archives/54.html

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章