Spring MVC框架面试题

news2024/9/21 22:33:51

目录

一、什么是SpringMVC?简单介绍下你对SpringMVC的理解?

二、SpringMVC的流程?

三、SpringMVC的优点

四、SpringMVC的主要组件

五、SpringMVC怎么样设重定向和转发的?

六、SpringMVC怎么和Ajax相互调用的?

七、如何解决 Post 请求中文乱码问题,Get 的又如何处理呢?

八、SpringMVC的异常处理?

九、SpringMVC的控制器是不是单例模式,如果有,有什么问题,怎么解决?

十、SpringMVC常用的注解有哪些?

十一、SpringMVC种的控制器的注解一般用哪个,有没有别的注解可以替代?

十二、怎样在方法里面得到 Request, 或者 session ?

十三、如果想在拦截的方法里面得到从前台传入的参数,怎么得到?

十四、如果前台有很多个参数传入,并且这些参数都是一个对 象的,那么怎么样快速得到这个对象?

十五、SpringMVC 里面拦截器是怎么写的?

十六、注解原理


一、什么是SpringMVC?简单介绍下你对SpringMVC的理解?

SpringMVC 是一个基于 Java 的实现了 MVC 设计模式的请求驱动类型的轻量级 web 框架,通过把 Model , View , Controller 分离,将 web 层进行职责解耦,把复杂的 web 应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。

二、SpringMVC的流程?

( 1 )用户发送请求至前端控制器 DispatcherServlet ;

( 2 ) DispatcherServlet 收到请求后,调用 HandlerMapping 处理器映射器,请求获取 Handle

( 3 )处理器映射器根据请求 url 找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet ;

( 4 ) DispatcherServlet 调用 HandlerAdapter 处理器适配器

( 5 ) HandlerAdapter 经过适配调用具体处理器 (Handler ,也叫后端控制器);

( 6 ) Handler 执行完成返回 ModelAndView

( 7 ) HandlerAdapter 将 Handler 执行结果 ModelAndView 返回给DispatcherServIet

( 8 ) DispatcherServlet 将 ModelAndView 传给 ViewResolver 视图解析器进行解析;

( 9 ) ViewResolver 解析后返回具体 View ;

( 10 ) DispatcherServlet 对 View 进行渲染视图(即将模型数据填充至视图中)

( 11 ) DispatcherServlet 响应用户。

三、SpringMVC的优点

( 1 )可以支持各种视图技术,而不仅仅局限于 JSP ;

( 2 )与 Spring 框架集成(如 IoC 容器 .AOP 等);

( 3 )清晰的角色分配·前端控制器 (dispatcherServlet) ,请求到处理器映射( handlerMapping), 处理器适配器( HandlerAdapter), 视图解析器( ViewResolver )

( 4 )支持各种请求资源的映射策略。

四、SpringMVC的主要组件

( 1 )前端控制器 DispatcherServlet (不需要程序员开发)

作用:接收请求.响应结果,相当于转发器,有了 DispatcherServlet 就减少了其它组件之间的耦合度。

( 2 )处理器映射器 HandlerMapping (不需要程序员开发)

作用:根据请求的 URL 来查找 Handler

( 3 )处理器适配器 HandlerAdapter

注意:在编写 Handler 的时候要按照 HandlerAdapter 要求的规则去编写这样适配器 HandlerAdapter 才可以正确的去执行 Handlero。

4 )处理器 Handler (需要程序员开发)

( 5 )视图解析器 ViewResolver (不需要程序员开发)

作用·进行视图的解析,根据视图逻辑名解析成真正的视图( view )

( 6 )视图 View (需要程序员开发 jsp )

View 是一个接口,它的实现类支持不同的视图类型 (jsp , freemarker ,pdf 等等)

五、SpringMVC怎么样设重定向和转发的?

( 1 )转发:在返回值前面加 "forward:"',譬如"forward:user.do?name=method4"

( 2 )重定向:在返回值前面加 "redirect:"譬如"redirect:百度一下,你就知道"

六、SpringMVC怎么和Ajax相互调用的?

通过 Jackson 框架就可以把 Java 里面的对象直接转化成 Js 可以识别的 Json对象。具体步骤如下:

( 1 )加入 Jackson.jar

( 2 )在配置文件中配置 json 的映射

( 3 )在接受 AJax 方法里面可以直接返回 Object,List 等,但方法前面要加上@ResponseBody 注解。

@RestController
@RequestMapping("/your-endpoint")
public class YourController {

    @PostMapping
    public ResponseEntity<String> handleAjaxRequest(@RequestBody YourRequestData data) {
        // 处理请求
        String result = processData(data);
        
        // 返回响应
        return new ResponseEntity<>(result, HttpStatus.OK);
    }
    
    private String processData(YourRequestData data) {
        // 处理逻辑
        return "处理结果";
    }
}

七、如何解决 Post 请求中文乱码问题,Get 的又如何处理呢?

( 1 )解决 post 请求乱码问题:

在 web.xml 中配置一个 CharacterEncodingFilter 过滤器,设置成 utf-8;

( 2 ) get 请求中文参数出现乱码解决方法有两个·:

修改 tomcat 配置文件添加编码与工程编码一致,如下:<ConnectorURIEncoding="utf-8" connectionTimeout="20000" port=" 8080 " pr0tocoI="HTTP/1.1" redirectPort= " 8443 "/>

另外一种方法对参数进行重新编码String userName= new String(request.getParamter("userName").getBytes("IS08859-1"),"utf-8")

IS08859 -1 是 tomcat 默认编码,需要将 tomcat 编码后的内容按 utf-8 编码。

八、SpringMVC的异常处理?

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

九、SpringMVC的控制器是不是单例模式,如果有,有什么问题,怎么解决?

答:是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能的,解决方案是在控制器里面不能写字段。

十、SpringMVC常用的注解有哪些?

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

@RequestBody :注解实现接收 http 请求的 json 数据,将 json 转换为 java 对象。注解实现将 controller 方法返回对象转化为 json 对象相应给客户。

十一、SpringMVC种的控制器的注解一般用哪个,有没有别的注解可以替代?

一般用@Controller 注解,表示是表现层,不能用别的注解代替。

十二、怎样在方法里面得到 Request, 或者 session ?

在 Spring MVC 中,你可以在控制器的方法参数中直接声明 HttpServletRequestHttpSession 来获取它们。Spring 框架会自动将它们注入到方法中。以下是如何操作的示例:

获取 HttpServletRequest

import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MyController {

    @GetMapping("/example")
    public String handleRequest(HttpServletRequest request) {
        // 使用 request 对象
        String parameter = request.getParameter("paramName");
        
        // ... 你的逻辑代码 ...
        
        return "viewName"; // 返回视图名称
    }
}

获取 HttpSession

import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MyController {

    @GetMapping("/example")
    public String handleSession(HttpSession session) {
        // 使用 session 对象
        Object value = session.getAttribute("attributeName");
        
        // ... 你的逻辑代码 ...
        
        return "viewName"; // 返回视图名称
    }
}

十三、如果想在拦截的方法里面得到从前台传入的参数,怎么得到?

通过HttpServletRequest对象

import javax.servlet.http.HttpServletRequest;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String parameter = request.getParameter("paramName"); // 获取参数名为paramName的参数值
        // ... do something with the parameter
        return true; // 如果返回true则继续流程,返回false则中断
    }

    // ... implement other methods if needed
}

十四、如果前台有很多个参数传入,并且这些参数都是一个对 象的,那么怎么样快速得到这个对象?

在控制器中使用@RequestBody注解

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/myEndpoint")
public class MyController {

    @PostMapping("/submitData")
    public ResponseEntity<String> submitData(@RequestBody MyObject myObject) {
        // myObject 现在包含了前台传来的所有参数
        // 处理业务逻辑
        return ResponseEntity.ok("Data received");
    }
}

十五、SpringMVC 里面拦截器是怎么写的?

步骤 1: 创建拦截器类

首先,创建一个类实现HandlerInterceptor接口,并重写其中的方法。

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class MyInterceptor implements HandlerInterceptor {

    // 请求处理之前进行调用(Controller方法调用之前)
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 你的代码逻辑,例如:权限校验、日志记录等
        // 如果返回true则继续流程,返回false则中断
        return true;
    }

    // 请求处理之后进行调用,但在视图被渲染之前(Controller方法调用之后)
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 你的代码逻辑,可以对ModelAndView进行操作
    }

    // 在整个请求结束之后调用,也就是在DispatcherServlet渲染了对应的视图之后执行(主要是用于进行资源清理工作)
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 你的代码逻辑,例如:清理资源、记录日志等
    }
}

步骤 2: 注册拦截器

然后,你需要在Spring MVC的配置中注册这个拦截器。这可以通过XML配置或者Java配置完成。

XML配置方式

在Spring的配置文件中(如springmvc.xml),添加以下配置:

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/> <!-- 指定拦截器拦截的路径 -->
        <bean id="myInterceptor" class="com.example.MyInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

Java配置方式

如果你使用Java配置,可以在一个配置类中添加以下内容:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**"); // 指定拦截器拦截的路径
    }
}

注意事项

  • preHandle方法返回true时,后续的拦截器和目标Controller才会被执行;返回false时,后续的拦截器和目标Controller不会被执行。
  • postHandle方法在preHandle方法返回true时执行。
  • afterCompletion方法无论preHandle方法返回什么都会执行,通常用于清理资源。

十六、注解原理

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1977229.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python酷库之旅-第三方库Pandas(064)

目录 一、用法精讲 251、pandas.Series.tz_localize方法 251-1、语法 251-2、参数 251-3、功能 251-4、返回值 251-5、说明 251-6、用法 251-6-1、数据准备 251-6-2、代码示例 251-6-3、结果输出 252、pandas.Series.at_time方法 252-1、语法 252-2、参数 252-3…

【java】单行注释(//)与多选注释(/* */)

文章目录 单行注释多行注释注意事项 在Java中&#xff0c;注释是用来给代码添加说明的&#xff0c;它不会被编译器执行。Java提供了两种主要的注释方式&#xff1a;单行注释和多行注释&#xff08;有时也称为块注释或块级注释&#xff09;。 单行注释 单行注释以两个正斜杠&…

爬小红book--自定义获取

免责声明:本文仅做分享!!! from DrissionPage import ChromiumPage import time pa str(input("输入关键词&#xff1a;")) pl str(input("输入评论内容&#xff1a;")) page ChromiumPage() page.get(https://www.xiaohongshu.com/search_result?keyw…

php生成xml文件的封装类文件-可生成带缩进格式化的xml文件及关于opcache缓存的操作小工具cachetool的使用

一、php生成xml文件的封装类文件-可生成带缩进格式化的xml文件 最近因为有需要&#xff0c;对生成xml文件进行了一些处理&#xff0c;很早之前使用过SimpleXML加载接口返回的xml数据并处理&#xff0c;这次的使用偏向于XML文件的生成。有一个需求&#xff0c;生成的xml文件格式…

【保姆级讲解下AI绘画自动生成器有哪些?】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

CICD流水线

一、CICD流水线简介 CICD概念 CI/CD流水线是现代软件开发的一个核心概念&#xff0c;它涉及自动化和管理软件从开发到部署的整个生命周期 概念定义 具体有三点&#xff1a;持续集成、持续交付、持续部署 流水线组成为&#xff1a;代码提交、测试、构建、部署、结果通知 二…

营销型豆浆机料理机网站模板/EyouCMS营销型类企业模板

营销型豆浆机料理机网站模板&#xff0c;EyouCMS营销型类企业模板。模板自带eyoucms内核&#xff0c;无需再下载eyou系统&#xff0c;原创设计、手工书写DIVCSS&#xff0c;完美兼容IE7、Firefox、Chrome、360浏览器等&#xff1b;主流浏览器&#xff1b;结构容易优化&#xff…

雨量气象站:实时、准确地监测并记录降水情况

在自然界的水循环中&#xff0c;雨&#xff0c;作为天空与大地的信使&#xff0c;不仅滋养了万物&#xff0c;也影响着人类社会的方方面面。为了更准确地监测和预测降水情况&#xff0c;雨量气象站应运而生&#xff0c;成为了现代气象观测体系中重要的一环。 雨量气象站&#x…

FFmpeg源码:av_reduce函数分析

AVRational结构体和其相关的函数分析&#xff1a; FFmpeg有理数相关的源码&#xff1a;AVRational结构体和其相关的函数分析 FFmpeg源码&#xff1a;av_reduce函数分析 一、av_reduce函数的声明 av_reduce函数声明在FFmpeg源码&#xff08;本文演示用的FFmpeg源码版本为7.0…

P10477 题解

题目传送门 题目传送门&#xff08;洛谷&#xff09; Step1 理解题意 一共有 T T T 组数据有一个地铁&#xff0c;有一个中心车站&#xff08;即为根&#xff09;&#xff0c;有一个人从中心车站出发。对于每组数据&#xff0c;给定两个同样长度的01串 s 1 s_1 s1​ , s …

五、MYSQL企业常用架构与调优经验理论篇

&#x1f33b;&#x1f33b; 目录 一、选择 PerconaServer、MariaDB 还是 MYSQL二、常用的 MYSQL 调优策略三、MYSOL 常见的应用架构分享四、MYSOL 经典应用架构 注&#xff1a;全是理论干货&#xff0c;没有实战&#xff0c;想看实战的绕路哦&#xff01;&#xff01;&#xf…

ScriptEcho:AI赋能的前端代码生成神器

ScriptEcho&#xff1a;AI赋能的前端代码生成神器 在前端开发中&#xff0c;如果你总是觉得写代码太费时费力&#xff0c;那么 ScriptEcho 将成为你的救星。这个 AI 代码生成平台不仅能帮你省下大量时间&#xff0c;还能让你轻松愉快地写出生产级代码。本文将带你了解 ScriptEc…

Java中spring boot validation 自定义注解使用

创建一个注解 Target({ElementType.FIELD})//需要写注解的三三个要素 Retention(RUNTIME) Documented Constraint(validatedBy {IsSystemYesNoVaildation.class})//绑定 在这里会报错 你需要去实现 public interface IsSystemYesNo {String message() default "数据字典&…

【Python实战】如何优雅地实现文字 二维码检测?

前几篇&#xff0c;和大家分享了如何通过 Python 和相关库&#xff0c;自动化处理 PDF 文档&#xff0c;提高办公效率。 【Python实战】自动化处理 PDF 文档&#xff0c;完美实现 WPS 会员功能【Python实战】如何优雅地实现 PDF 去水印&#xff1f;【Python实战】一键生成 PDF…

自媒体新闻资讯类网站模板/EyouCMS自媒体资讯类网站模板

自媒体新闻资讯类网站模板&#xff0c;EyouCMS自媒体资讯类网站模板。模板自带eyoucms内核&#xff0c;无需再下载eyou系统&#xff0c;原创设计、手工书写DIVCSS&#xff0c;完美兼容IE7、Firefox、Chrome、360浏览器等&#xff1b;主流浏览器&#xff1b;结构容易优化&#x…

U460909 [BCSP小高2024T4]先序遍历/小羊的晚餐 题解

Part.1 有关本题 本蒟蒻想起这道巧妙 又毒瘤 的题&#xff0c;到处搜寻提交窗口。好不容易找到窗口&#xff0c;有花了 3 h 3h 3h 的时间调题。 本蒟蒻为了悲剧不再发生&#xff0c;于是出了这道题&#xff0c;有写下了这篇题解以供后人。 以下的题解默认以阅读过原题。 P…

数学建模--禁忌搜索

目录 算法基本原理 关键要素 应用实例 实现细节 python代码示例 总结 禁忌搜索算法在解决哪些具体类型的组合优化问题中最有效&#xff1f; 禁忌搜索算法的邻域结构设计有哪些最佳实践或案例研究&#xff1f; 如何动态更新禁忌表以提高禁忌搜索算法的效率和性能&#…

FPGA开发——数码管数字时钟的设计

一、概述 数码管数字时钟的基本原理是通过内部的计时电路&#xff08;如晶振、分频器、计数器等&#xff09;产生一个稳定的时钟信号&#xff0c;该信号经过处理后被转换为小时、分钟和秒的时间信息。这些信息随后被发送到数码管显示模块&#xff0c;通过控制数码管中不同LED段…

Android读取拨号记录功能

Android读取拨号记录功能 Android读取拨号记录功能 首先会检测应用是否有读取拨号记录的权限 MainActivity.java public class MainActivity extends AppCompatActivity {private ListView listCalls;private List<Map<String, Object>> mapList;private static f…

有界,可积,存在原函数和连续的关系

目录 1.可积和有界的关系 2.连续和可积的关系 3.连续和存在原函数的关系 4.可积和存在原函数没有关系 1.可积和有界的关系 可积必有界&#xff0c;有界不一定可积&#xff0c;反例可以举狄利克雷函数 2.连续和可积的关系 f(x)连续&#xff0c;则一定可积&#xff0c;可积不…