WEB框架强化-长期更新

前言:暂时不准备填充太多内容,仅给个标题梳理脉络

Spring框架相关

SpringMVC

补充:
JavaWeb开发使用jsp还是html做前端页面

Spring MVC的理解

M V C

Spring MVC的优点

基于组件,前端控制器各种角色分配等
任意使用各种视图
易扩展、集成
支持各种请求资源的映射策略(不理解就看下列补充)
补充:SpringMVC3强大的请求映射规则详解

Spring MVC的工作原理或流程

一张各个角色的运行图

程序员主要工作:处理器Handler、视图View
在这里插入图片描述

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

SpingMvc中的控制器的注解一般用那个,有没有别的注解可以替代?

@Controller

怎么样在方法里面得到Request或者Session?

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

在拦截的方法里面得到从前台传入的参数,怎么得到?

直接在形参里面声明这个参数就可以,但必须名字和传过来的参数一样
或者形参前加@Param(“xxx”),xxx和上一层传过来的参数一样

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

直接在方法中声明这个对象,SpringMvc就自动会把属性赋值到这个对象里面
注:可能转换失败

SpringMvc中函数的返回值是什么?

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

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

在返回值String前面加"forward:“就可以让结果转发,
譬如"forward:user.do?name=method4”
在返回值前面加"redirect:"就可以让返回值重定向,
譬如"redirect:http://www.baidu.com

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

除了使用ModelAndView方式外,这个返回值类型。
还可以使用Map,Model和ModelMap来向前台页面传值,都是在方法参数中,指定一个该类型的参数。
Map<String,Object>就是hashMap<>

//ModelAndView是一个类,这个类把视图和数据都合并的一起
public class ModelAndView	extends Object

// Model 就是个接口,里面可以转化为Map
public interface Model {
    Model addAttribute(String var1, @Nullable Object var2);

    Model addAttribute(Object var1);

    Model addAllAttributes(Collection<?> var1);

    Model addAllAttributes(Map<String, ?> var1);

    Model mergeAttributes(Map<String, ?> var1);

    boolean containsAttribute(String var1);

    Map<String, Object> asMap();
}

public class ModelMap extends java.util.LinkedHashMap<String, Object>

怎么样把ModelMap里面的数据放入Session里面?

Controller类里面有方法,方法体里面有Model,添加了键值对
在Controller类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key

@SessionAttributes("xxx")
// 分开写,示意能看懂就行
model.addAttribute("xxx", )

SpringMvc怎么和AJAX相互调用的?

通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象
在接受Ajax方法里面可以直接返回Object,List或Map等,但方法前面要加上@ResponseBody注解
注:
1、一般返回Map<String, Object>方便
2、自定义类,封装状态,如成功与否,成功返回的对象或对象列表,失败返回的错误码或错误信息也可以,但是注意都要转化为json,@ResponseBody注解实现转化功能
3、当一个方法向AJAX返回特殊对象,譬如Object,List等,需要做什么处理?要加上@ResponseBody注解

SpringMvc里面拦截器是怎么写的?

两种方法
1、实现HandlerInterceptor 接口
2、继承适配器类HandlerInterceptorAdapter
两者都是接着在接口方法preHandle当中,实现处理逻辑(判断后选择是否放行,true表示放行);然后在Spring MVC的配置文件中配置拦截器即可

补充:SpringMVC 通过实现HandlerInterceptor接口 实现拦截器功能

// HandlerInterceptor 接口
public interface HandlerInterceptor {
    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }

    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }

    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}

// HandlerInterceptorAdapter类,里面还是实现了HandlerInterceptor 接口
public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {
    public HandlerInterceptorAdapter() {
    }
	// 只有这里返回boolean类型
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
	//在业务处理器处理请求完成之后,生成视图之前执行 ,可以看到形参里面有modelAndView
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }
	// 在DispatcherServlet完全处理完请求之后被调用,可用于清理资源  
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }

    public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    }
}

在这里插入图片描述

Spring

这里面比较全:Spring面试题(2020最新版)

什么是Spring框架?Spring框架有哪些主要模块?

轻量级Java开发框架
解决了开发中基础性的问题(基础架构),简化Java开发,专注于应用程序
不必担心Spring是如何在后台进行工作的

主要模块:核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块

使用Spring框架能带来哪些好处?

方便解耦,简化开发:对象的创建和依赖关系的维护,交给spring容器
AOP
声明式事务
测试
集成

什么是控制反转(IOC)?什么是依赖注入?

背熟:
把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理

核心:对组件对象控制权的转移,从程序代码本身转移到了外部容器

责任:创建,管理(通过依赖注入(DI),装配,配置对象,并且管理对象的整个生命周期

注:
这里的工厂模式需要会写,
如水果Fruit接口,苹果Apple与橘子Orange类实现接口,
工厂类Factory里的静态方法getInstance(String xxx)根据全限定类名,调用反射Class.forName(xxx).newInstance()生成并返回一个实体类的接口引用。

Spring 的 IoC设计支持功能?

有依赖注入,依赖检查、自动装配等

核心:依赖注入,有哪几种注入方式?

理解:依赖注入让bean与bean之间以配置文件组织在一起,而不是以硬编码的方式耦合在一起。至于怎么组织在一起,就要靠逐层往下找依赖关系。

补充:这篇排版不好,但是解释很好什么是依赖注入

请解释下Spring框架中的IoC?

Spring中的 org.springframework.beans 包和 org.springframework.context包构成了Spring框
架IoC容器的基础

BeanFactory 是Spring IoC容器的具体实现,用来包装和管理前面提到的各种bean。
BeanFactory接口是Spring IoC 容器的核心接口。

ApplicationContext主要看几个实现类,如ClassPathXmlApplicationContext,AnnotationConϐigApplicationContext等

IOC:把对象的创建、初始化、销毁交给spring来管理,而不是由开发者控制,实现控制反
转。
在这里插入图片描述

BeanFactory 源码:基本都是根据字符串创建对象,也有根据类对象

package org.springframework.beans.factory;

import org.springframework.beans.BeansException;
import org.springframework.core.ResolvableType;
import org.springframework.lang.Nullable;

public interface BeanFactory {
    String FACTORY_BEAN_PREFIX = "&";

    Object getBean(String var1) throws BeansException;

    <T> T getBean(String var1, Class<T> var2) throws BeansException;

    Object getBean(String var1, Object... var2) throws BeansException;

    <T> T getBean(Class<T> var1) throws BeansException;

    <T> T getBean(Class<T> var1, Object... var2) throws BeansException;

    <T> ObjectProvider<T> getBeanProvider(Class<T> var1);

    <T> ObjectProvider<T> getBeanProvider(ResolvableType var1);

    boolean containsBean(String var1);

    boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;

    boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;

    boolean isTypeMatch(String var1, ResolvableType var2) throws NoSuchBeanDefinitionException;

    boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;

    @Nullable
    Class<?> getType(String var1) throws NoSuchBeanDefinitionException;

    String[] getAliases(String var1);
}

BeanFactory和ApplicationContext有什么区别?

BeanFactroy采用的是延迟加载形式来注入Bean的,不能发现一些存在的Spring的配置问题

ApplicationContext,它是在容器启动时,一次性创建了所有的Bean,容易发现Spring中存在的配置错误

ApplicationContext的优点就是缺点:
相对于基本的BeanFactory,ApplicationContext 唯一的不足是占用内存空间。
当应用程序配置Bean较多时,程序启动较慢。

Spring有几种配置方式?

xml、注解

如何用基于XML配置的方式配置Spring?

beans
bean
class

如何用基于Java配置的方式配置Spring?

@Configuration注解和@Bean注解
注:最好需要开启注解驱动

请解释Spring Bean的生命周期?

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

Mybatis

Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?

Mybatis学习系列(三)动态SQL

目的:在xml映射文件里,以标签形式,完成逻辑判断和动态拼接sql

9种动态sql标签:

if标签

where标签:配合if

set标签:更新时配合if

foreach标签:collection, item,index,open,separator,close(6个)

choose (when, otherwise)标签

trim标签:可以用来实现 where 和 set 的效果

bind标签:没用过

执行原理为:使用OGNL从sql参数对象中计算表达式的值,根据表达式的值,动态拼接
sql

注:
1、OGNL是Object Graphic Navigation Language(对象图导航语言)

2、choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束。
当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的sql,
类似于sql server语句(case when then)

#{}和ͅ{}的区别是什么?

1)#{}是预编译处理,${}是字符串替换。
2)Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋
值;
3)Mybatis在处理 ${}替换成变量的值。
4)使用#{}可以有效的防止SQL注入,提高系统安全性

为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?

手动编写SQL,灵活配置

Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?

仅支持association关联对象和collection关联集合对象的延迟加载

原理:用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法

MyBatis与Hibernate有哪些不同?

门槛低,直接编写原生态sql,可严格控制sql执行性能,写的sql代码多,
但无法做到数据库无关性

MyBatis的好处是什么?

1、sql语句在xml中,从java程序中独立,维护便利

2、封装底层jdbc的api细节,并自动将结果转化为bean对象

3、直接编写SQL,更灵活,比全自动更高的查询效率,复杂查询

简述Mybatis的Xml映射文件和Mybatis内部数据结构之间的映射关系?

ParameterMap对象
ResultMap对象
MappedStatement对象
BoundSql对象

什么是MyBatis的接口绑定,有什么好处?

在MyBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,我们直接调用接口方法就可以

接口绑定有几种实现方式,分别是怎么实现的?

注解绑定
xml绑定

什么情况下用注解绑定?什么情况下用xml绑定?

选择一种就行,按理简单用注解,复杂用xml,但初期就只选择一种

MyBatis实现一对一有几种方式?具体怎么操作的?

联合查询或嵌套子查询

联合查询只查询一次

嵌套查询一般查两次:(感觉这个是注解里复杂查询这么用)
嵌套查询是先查一个表,根据这个表里面的结果的外键id,去再另外一个表里面查询数据,也是通过association配置,但另外一个表的查询通过select属性配置,(类似于又一个id,result)

Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别?

Mybatis关联查询的两种方式

关联对象查询,有两种实现方式。(一对一和一对多均有两种)
1、嵌套查询 的查询语句写起来简单,但是执行的sql语句多,性能要低一点,
2、嵌套结果 的查询语句写起来难一点,而且sql语句只执行一条,性能相对较高

Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?

第一种是使用标签,逐一定义数据库列名和对象属性名之间的映射关系。

第二种是使用 sql 列的别名功能,将列的别名书写为对象属性名。(就是将select语句的返回字段as一次)

有了列名与属性名的映射关系后,Mybatis 通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

模糊查询like语句该怎么写?

模糊查询 like 语句该怎么写?

第一种,在 Java 代码中添加 sql 通配符,sql语句中照常用 like #{ }

第二种,在 sql 语句中拼接通配符,会引起 sql 注入,不推荐

通常一个Xml映射文件,都会写一个Dao接口与之对应, Dao的工作原理,是否可以重载?

不能重载,因为通过Dao寻找Xml对应的sql的时候全限名+方法名的保存和寻找策略。接口
工作原理为jdk动态代理原理,运行时会为dao生成proxy,代理对象会拦截接口方法,去执
行对应的sql返回数据。

Mybatis中如何执行批处理?

BatchExecutor完成批处理

Mybatis都有哪些Executor执行器?它们之间的区别是什么?

Mybatis有三种基本的Executor执行器,SimpleExecutor、ReuseExecutor、BatchExecutor。
1)SimpleExecutor:
每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象

2)ReuseExecutor:
执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map

3)BatchExecutor:完成批处理

如何获取自动生成的(主)键值?

useGeneratedKeys=“true”

在mapper中如何传递多个参数?

1)直接在方法中传递参数,xml文件用#{0} #{1}来获取
2)使用 @param(“xxx”) 注解:这样可以直接在xml文件中通过#{xxx}来获取

resultType resultMap的区别?

resultType 数据库表中的字段名和实体类中的属性完全一致时

ResultMap更强大一点,ResultMap可以实现将查询结果映射为复杂类型的pojo

使用MyBatis的mapper接口调用时有哪些要求?

4)Mapper.xml文件中的namespace即是mapper接口的类路径,全限定类名

1)Mapper接口方法名和mapper.xml中定义的每个sql的id相同

2)Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型
相同

3)Mapper接口方法的返回参数类型和mapper.xml中定义的每个sql的resultType的类型相同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值