吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1101|回复: 3
收起左侧

[学习记录] springmvc的一些面试题

[复制链接]
zhouwaiwai121 发表于 2022-3-16 21:33
# 1. SpringMVC工作机制?

(1)用户发送请求至前端控制器DispatcherServlet;
(2) DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle;
(3)处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;
(4)DispatcherServlet 调用 HandlerAdapter处理器适配器;
(5)HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器);
(6)Handler执行完成返回ModelAndView;
(7)HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;
(8)DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;
(9)ViewResolver解析后返回具体View;
(10)DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)

(11)DispatcherServlet响应用户。



# 2.  SpringMVC 常用注解都有哪些?

@requestMapping 用于请求 url 映射。

@RequestBody 注解实现接收 http 请求的 json 数据,将 json 数据转换为 java 对象。

@ResponseBody 注解实现将controller 方法返回对象转化为 json 响应给客户

# 3. 如何开启注解处理器和适配器?

我们在项目中一般会在  springmvc.xml  中通过开启   `<mvc:annotation-driven>`来实现注解处理器和适配器的开启。

# 5. Springmvc的优点:

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

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

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

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



# 6. 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等等)

# 7. SpringMVC怎么样设定重定向和转发的?

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

(2)重定向:在返回值前面加"redirect:",譬如"redirect:http://www.baidu.com"

# 8、SpringMvc怎么和AJAX相互调用的?

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

(1)加入fastjson的pom

(2)在<mvc:annotation-driven >中配置fastsjon的转换

(3) 直接返回Java对象会自动解析对象的JSON字符串,方法注解必须加上@ResponseBody

```xml
<!--    处理映射器和适配器-->
    <mvc:annotation-driven >
        <mvc:message-converters>
            <ref bean="fastjsonBean"/>
        </mvc:message-converters>
    </mvc:annotation-driven>

    <!--使用fastjson-->
    <bean id="fastjsonBean" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>text/html;charset=UTF-8</value>
                <value>application/json;charset=UTF-8</value>
            </list>
        </property>
        <property name="fastJsonConfig">
            <bean class="com.alibaba.fastjson.support.config.FastJsonConfig">
                <property name="features">
                    <list>
                        <value>AllowArbitraryCommas</value>
                        <value>AllowUnQuotedFieldNames</value>
                        <value>DisableCircularReferenceDetect</value>
                    </list>
                </property>
                <property name="dateFormat" value="yyyy-MM-dd HH:mm:sss"/>
            </bean>

        </property>
    </bean>
```

# 9. SpringMvc的控制器是不是单例模式,如果是,有什么问题,怎么解决?

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



# 10.  springmvc 全局异常处理

# 11. springmvc 全局异常处理的二种方法

- 有三种实现方式
  - 直接在配置中,配置SimpleMappingExceptionResolve
  - 通过@ExceptionHandler

## 11.1. 第一种 通过SimpleMappingExceptionResolver类来定义,springmvc.xml内容

```html
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <!--         遇到异常时默认跳转的视图   error其实是error.jsp是视图-->
    <property name="defaultErrorView" value="error"/>
    <!--         抛出异常后在页面可用 ${errMsg.message}  读出异常信息 -->
    <property name="exceptionAttribute" value="errMsg"/>
    <!--         自定义的异常转向页面可自定义多个而实现不同异常转向不同页面 -->
    <property name="exceptionMappings">
        <props>
            <prop key="com.samrtian.exception.CustomException">error1</prop>
        </props>
    </property>
</bean>
```

## 11.3. 第二种使用@ExceptionHandler 注解定义

这个更简单了直接在控制器里加入方法,但是必须跟抛异常的方法在同一个控制器里

```java
@ControllerAdvice
public class LoginAction {
   
    @ExceptionHandler(CustomException.class)
    public String catchException(CustomException e, HttpServletRequest request) {
        System.out.println("进来了");
        request.setAttribute("errMsg", "注解的异常");
        return "error";
    }
}
```

# 12 如果在拦截请求中,我想拦截get方式提交的方法,怎么配置?

可以在@RequestMapping注解里面加上method=RequestMethod.GET或者@GetMapping的 注解

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

分为三种情况

- 普通值(基本数据类型和字符串)
  - 参数设置成普通值对应类型
  - 参数前可以加上@RequestParam(请求名与参数名不一致),也可以不加上@RequestPram(请求名与参数名一致)
  - 可以有多个普通参数
- 一组值
  - 参数设置成数组类型或集合类型
  - 参数前必须加上@RequestParam
  - 可以有多个普通参数
- 对象中的属性
  - 参数设置成类的类型
  - 参数前不能加上@RequestParam
  - 一般只有一个

# 14. **SpringMvc中函数的返回值是什么?**

返回值可以有很多类型,有String, ModelAndView。ModelAndView类把视图和数据都合并的一起的,但一般用String比较好。

# 15. SpringMvc用什么对象从后台向前台传递数据的?

- ModelAndView
- HttpServletRequest
- Map

```java
@RequestMapping("/hello")
protected ModelAndView handleRequestInternal() {
    ModelAndView mv = new ModelAndView();
    System.out.println("hello world");
    mv.addObject("currentUser","admin");
    mv.setViewName("hello");
    return mv;
}
@RequestMapping("/hello2")
protected String hello2(HttpServletRequest request) {
    request.setAttribute("currentUser","admin");
    return "hello";
}
@RequestMapping("/hello3")
    protected String hello3(Map<String,String> map) {
        map.put("currentUser","admin");
        //重定向需要在返回值前在redirect:后面跟是控制器路径(因为jsp在WEB-INF下),不是视图名
        return "redirect:hello";
    }
```

# 16. 注解原理:

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


免费评分

参与人数 2吾爱币 +1 热心值 +2 收起 理由
fxyfxyfxy + 1 我很赞同!
千翼 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

lemonrains 发表于 2022-3-16 22:39
这个感觉已经有点过时了,现在面试问SpringMVC的不多了
bobxie 发表于 2022-3-16 23:12
chengxuyuan01 发表于 2022-3-17 14:40
把springmvc 的流程图看懂了这些基本就不用担心了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 16:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表