SSM面试题(尚硅谷第一季)

1、Spring Bean的作用域之间有什么区别

在Spring中,可以在<bean>元素的scope属性里设置bean的作用域,以决定这个bean是单实例的还是多实例的。

默认情况下,Spring只为每个IOC容器里声明的bean创建唯一个实例,整个IOC容器范围内都能共享该实例:所有后续的getBean()调用和bean引用都将返回这个唯一的bean实例。该作用域被称为singleton,它是所有bean的默认作用域。

类别说明
singleton在SpringIOC容器中仅存在一个Bean实例,Bean以单实例的方式存在
prototype每次调用getBean()时都会返回一个新的实例
request每次Http请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境
session同一个Http Session共享一个Bean,不同的HTTP Session使用不同的Bean。该作用域仅适用于WebApplicationContext环境。

2、请简单介绍Spring支持的常用数据库事务传播属性和事务隔离级别

2.1 事务的传播行为

当事务被另一个事务方法调用时,必须指定事务该如何传播。即一个方法运行在了一个开启了事务的方法中时,当前方法是使用原来的事务还是开启一个新的事务。

事务传播属性可以在@Transactional注解的propagation属性中定义。

传播属性描述
REQUIRED(默认)如果有事务在运行当前的方法就在这个事务内运行,否则,就启动一个新的事务,并在自己的事务内运行。
REQUIRES_NEW当前方法必须启动新事务,并在它自己的事务内运行,如果有事务正在运行,应该将它挂起。
SUPPORTS如果有事务在运行,当前的方法就在这个事务内运行,否则它可以不运行在事务内。
NOT_SUPPORTED当前方法不应该运行在事务中,如果有运行的事务,将它挂起。
MANDATORY当前的方法必须运行在事务内部,如果没有运行的事务,就抛出异常。
NEVER当前方法不应该运行在事务中,如果有运行的事务,就抛出异常。
NESTED如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行,否则就启动一个新的事务,并在它自己的事务内运行。
2.2 事务的隔离级别
2.2.1 数据库事务并发问题
  • 脏读:当前事务读取到了其他事务尚未提交(最后回滚了)的值。
  • 不可重复读:当前事务读取了A值,其他的事务将A值修改了,当前事务再次读取A值与前一次读取的值不同(针对update和delete)
  • 幻读:当前事务根据某条件读取了A表的部分数据,另一事务修改了另外的部分数据使之符合了该条件,或添加了多条符合该条件的数据,使当前事务再次根据该条件读取时发现多了数据(针对insert)
2.2.2 隔离级别

隔离级别:一个事务与其他事务隔离的程度

  1. 读未提交:READ UNCOMMITTED

    允许Transaction01读取Transaction02未提交的修改。

  2. 读已提交:READ COMMITTED

    允许Transaction01读取Transaction02已提交的修改。

  3. 可重复度:REPEATABLE READ

    确保Transaction01可以多次从一个字段中读取到相同的值,即Transaction01执行期间禁止其他事务对这个字段进行更新。

  4. 串行化:SERIALIZABLE

    确保Transaction01可以多次从一个表中读取到相同的行,在Transaction01执行期间,禁止其他事务对这个表进行添加、更新、删除操作。可以避免发生任何并发问题,但性能十分低下。

Oracle只支持读已提交(默认)和串行化,Mysql全支持,默认为可重复读。

隔离级别可以在@Transactional的isolation属性来设置。

3、SpringMVC中如何解决GET/POST请求中文乱码问题

3.1解决POST请求乱码
3.1.1 第一种方法:web.xml配置
<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>
    <init-param>
    	<param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
	<filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
3.1.2 第二种方法:创建filter类
public class EncoidingFilter implements Filter {

    private String encoding="";
    @Override
    public void destroy() { }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest request=(HttpServletRequest)servletRequest;
        HttpServletResponse response=(HttpServletResponse)servletResponse;
        request.setCharacterEncoding(encoding);
        response.setCharacterEncoding(encoding);
        chain.doFilter(request, response);
    }
    @Override
    public void init(FilterConfig config) throws ServletException {
        this.encoding = config.getInitParameter("encoding");//读取web.xml
    }
}
<filter>
    <filter-name>EncoidingFilter</filter-name>
    <filter-class>com.example.filter.EncoidingFilter</filter-class>
	<init-param>
		<param-name>encoding</param-name>
		<param-value>utf-8</param-value>
	</init-param>
</filter>
<filter-mapping>
	<filter-name>EncoidingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
3.2 解决GET请求乱码(tomcat8.0之后都默认设置了)

在tomcat服务器的server.xml中,找到第一个Connector标签,添加属性URIEncoding="UTF-8"保存。

4、简单谈一下SpringMVC的工作流程

4.1 处理模型数据的方式
  1. 将返回值设置为ModelAndView

    • 注解@RequestMaping(/test)

    • 创建ModelAndView对象ModelAndView mav = new ModelAndView();

    • 设置模型参数mav.addObject("user","admin");

    • 设置视图mav.setViewName("success");

    • 返回该对象return mav;

  2. 方法的返回值仍时String类型,在方法的入参中传入Map、Model或ModelMap

两种方法,SpringMVC都会转换成为一个ModelAndView对象

4.2 运行流程

在这里插入图片描述

  1. 前端发送请求至SpringMVC,由前端控制器DispatcherServlet(中央控制器)来拦截该请求
  2. DispatcherServlet会调用HandlerMapping(处理器映射器)去找到处理器
  3. 处理器映射器找到具体的处理器,会生成一个HandlerExecutionChain对象(包含Handlerintercepter处理器拦截器、Handler处理器对象)返回给DispatcherServlet
  4. DispatcherServlet调用HandlerAdapter处理器适配器(通过处理器适配器调用具体的处理器)
  5. HandlerAdapter经过适配调用具体的Handler处理器(Controller,也叫后端控制器)
  6. Controller执行完成返回ModelAndView
  7. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet(无论是否存在异常,其中包含了模型数据和视图)
  8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器(InternalResourceViewResolver)
  9. ViewReslover解析后返回具体View
  10. DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)
  11. DispatcherServlet响应用户

几个组件:

  • 前端控制器(DispatcherServlet):接收请求,响应结果

  • 处理器映射器(HandlerMapping):根据URL去查找处理器

  • 处理器适配器(HandlerAdapter):会把处理器包装成适配器,这样就可以支持多种类型的处理器

  • 处理器(Handler):(即Controller需要程序员去写代码处理逻辑的)

  • 视图解析器(ViewResovler):进行视图解析,多返回的字符串,进行处理,可以解析成对应的页面

5、 MyBatis中实体类的属性名和表中的字段名不一致怎么办
5.1 写sql语句的时候起别名
5.2 在Mybatis的全局配置文件中开启驼峰命名规则
<settings>
    <setting name="mapUpdaterscoreToCamelCase" value="true"/>
</settings>
5.3 Mapper映射文件中使用resultMap来自定义映射规则
<!-- 自定义映射 -->
<!-- type为你的实体类,id为唯一标识 -->
<resultMap type="com.example.mybatis.entities.User" id="userMap">
    <!-- 映射主键 -->
    <id column="id" property="id"/>
    <!-- 映射其他列 -->
    <result column="user_name" property="userName"/>
</resultMap>

<select id="getUserById" resultMap="userMap">
	select * from user where id = #{id}
</select>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅梦曾倾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值