关于spring MVC的面试题

混江龙づ霸主 提交于 2020-03-27 07:30:26

MVC设计模式

M model 模型

model包括service处理业务逻辑,entity实体类封装数据,dao操作数据库,utils工具类

service层主要用来处理业务逻辑,service层的一些公共处理可以使用spring框架的AOP来完成,比如,日志信息,事物的处理

Spring是一个框架,结合了java中多种优秀设计模式形成的一个企业级解决方案

IOC :控制反转,将对象的创建与属性的赋值交给Spring框架完成,将控制权由程序员交给Spring框架这就是控制反转,IOC主要运用的是Java中的工厂设计模式,将要创建对象的类交给Spring工厂,需要时直接去工厂中取

DI:DI和IOC本质相同说法不同,DI依赖注入,通过属性的set方法或者类的构造方法为属性赋值

AOP:面向切面编程,是对OOP面向对象编程的一种补充,主要运用的是Java中代理设计模式,代理设计模式又分为静态代理和动态代理

静态代理和动态代理的区别:静态代理在代码编译时代理类就产生了,动态代理是在代码运行期才会产生代理类,在运行期JDK底层会动态的生成代理类,并创建代理对象

Spring的事务处理:事务处理由Spring框架的声明式事务处理完成

Spring框架创建对象的创建次数

Bean标签的scope属性可以设置对象的创建次数,为singleton时这个对象时单例的只会创建一次,为prototype时对象时多实例的每次使用Spring工厂都会重新创建一个新的对象。

Spring框架创建对象的生命周期

生命周期:一个对象从创建到销毁的过程,当scope属性为singleton是当Spring工厂启动时就会创建对象,如果Scope属性为prototype时,当每一次需要使用的时候都会创建一个新的对象,不会再Spring工厂启动时创建对象。再对象被创建的时候会自动调用Bean标签中的init-method属性中指定的方法,对象在被Spring工厂销毁时就会调用destroy-method属性中指定的方法,如果是多实例的对象将不由Spring框架销毁,会由JDK的垃圾回收机制销毁不会调用destroy-method中的方法

Dao层:做数据映射,操作数据库,DataAccessObject数据库存储对象

JDBC jdbc是java提供的一套规范,一套接口,具体的实现由数据库厂商负责

开发JDBC的步骤,1.加载驱动,2.创建链接,3.写Sql语句,4.创建对象,5.执行,6.释放资源

setAutoCommit设置事务是否自动提交,commit提交事务,rollback回滚事务

Mybatis框架

MyBatis是一个持久层框架,ORM框架,是一个半自动ORM框架,可以完成对数据库的增删改查操作,封装了JDBC,MyBatis消除了几乎所有的JDBC代码,解决了JDBC操作数据库时的冗余问题

ORM框架,ORM object relation mapping,对象数据库映射,将数据库的查询结果储存给Java的实体类对象,这就是数据映射

SqlSession对象相当于JDBC的Connetcion对象,即获取一个数据库链接 ,Sqlsesion对象可以帮我们完成整个数据库操作任务,SqlSession是Java与数据库之间的会话操作,HttpSession是浏览器与服务器之间的会话

当数据库中的字段名和实体类中的属性名不一致时,Mybatis映射数据就会产生问题,JDBC技术则会不产生这种问题

可以同过对数据库的查询结果起别名来解决,

可以使用resultMap标签做数据映射

使用association标签给实体类中对象类型的属性赋值 多对一

使用collection标签来对实体类中list集合类型的属性赋值 一对多

动态Sql

where If 标签 条件判断,多条件查询

foreach标签循环拼接sql语句,用于批量删除

item 变量名 随便写

collection循环对象的数据类型,List集合 为list        数组类型为array 如果使用了@Param注解,则以注解中的名字为主open 再循环之前拼接的内容,separator 每循环一次中间拼接的内容,close 循环结束之后拼接的内容数据库 Dao层主要用来操作数据库

数据库的分类

网格型,层次性,关系型,主流的数据库都是关系型数据库:MySql,Oracle,SqlServer,sybase。Nosql 非关系型数据库:Mongodb,redis,这些都是数据库管理系统,每一个数据库管理系统,可以又很多个数据库

Oracle 数据库

Oracle数据库,MySql数据库,Java计算机语言都属于Oracle公司

链接Oracle数据库

需要安装数据库客户端工具,并且保证Oracle数据库正常运行

Sql脚本

Sql不是数据库,Sql是一种结构化语言,他是操作数据库的一种语言

Oracle中使用|| 拼接字符串

dual哑表

sysdateOracle中获取当前系统时间

Oracle中的函数

类似于java中的方法,传入一些实参,运行完该函数返回一些结果

单行函数 每行数据运行完都会返回一个结果

length()返回实参这个字符串的长度

mod() 求余数

to_date()把一个字符串转换为日期类型

to_char()把其他类型的数据转换为字符串

组函数:数据被分到几个组里面,查询结果就会有几行数据,一般组函数,是和分组查询一块使用,当使用组函数时,没有对表中的数据进行分组,表示将表中的数据分到一个组里面

max最大值min最小值avg平均值sum总和count总行数

使用组函数时select后面不能跟其他字段,使用组函数时,统计时会自动排除值为null的数据

Oracle中每个表都有伪列 Rownum 和RowId

链接查询 当你的查询结果需要多张表里的数据,这时候form后面可以跟多张表,这样的查询就时链接查询

左链接 left join 以左表为主表右链接 right join 以右表位主表完整链接 【outer】join 两张表都是主表内链接 inner join 两张表都是从表自连接 自己链接自己 ,两张表都是同一张表Oracle中字段的类型Varchar2() 可变长的字符串Char()定长字符串number(m,n)m表示数字的总长度,n表示小数点后几位integer double类型 不建议使用Date存储日期 日期类型Clob 大文本类型Blob 存储二进制文件

约束

主键约束 primary key   主键是一行数据的唯一biao'ji   每个表都要有主键 主键的值是不能重复的

一个表中只能有一个主键    主键是伴随整个实体的生命周期的,整个生命周期中是不可以改变的    主键的值不可以为null

唯一约束 unipue     唯一约束字段的值不能重复     主键约束是一种特殊的唯一约束

他的值是可以改变的    值可以为null

非空约束 not null

非空的字段值不能为null

外键约束 references

自顶义约束 check(约束条件)

删除表和修改表结构

删除表 drop table 表名

修改表结构 alter table 表名 modify 字段名 字段类型

给表增加一个字段 alter table add 字段名 字段类型 约束

删除表中的约束 alter table 表名 drop constraints 约束名

Sql 脚本的分类

dql 数据库查询语言

ddl 数据库定义语言

dml 数据库操作语言

tcl 事务控制语言

序列 sequence

当表中的数据很多时,我们不清楚主键到几了,为了更好的控制主键的生成方式,我们可以使用序列

create sequence 序列名 start with 开始值

视图 view

平时我们会经常使用一些复杂的sql脚本,这些脚本比较长,写起来不方便。我们要基于这些脚本的结果进行再次处理。这是我们可以吧这个sql语句建成视图,方便我们以后的操作。

create view 视图名 as sql语句

视图不能提高运行效率

索引 index

当数据库里的数据量很大时,检索数据的效率会受到影响,这是索引就可以提高检索数据的效率

原理:类似于字典的目录,能够快速的根据目录定位相应的文字。索引是独立于表的一个数据库对象

索引会提高数据检索效率,而降低了增删改效率

create index 索引名 on 表明(字段名)

MySql 数据库

MySql 数据库是一个关系型数据库,和Oracle数据库都属于Oracle公司

Mysql 和Oracle 的区别

Oracle是一个大型数据库,产品免费,服务收费,Oracle不支持批量添加,支持序列,sql支持||拼接,Oracle的存储结构特别复杂

Mysql是一个小型数据库,是开源免费的,支持批量添加,Mysql支持自增长,可以通过Mysql提供的函数凭借sql

Redis 数据库

RDB 关系型数据库 Oracle Mysql

NoSql 非关系型数据库 Redis

Nosql 的特点:

弱化结构

基于内存,在内存中存储数据,支持自动持久化

弱化事务

基于集群环境

没有复杂的链接查询

支持脚本语言 js

Redis是基于内存,以key-value 的形式存储数据,支持网络传输,支持自动持久化,是一个非关系型数据库

Jedis是redis提供的一个Java链接Redis数据库的一个工具

Entity 实体类

实体类的作用主要用来储存数据

V view 视图

主要用来展示数据,接受用户输入的数据,将数据提交到后台 吗

HTML超文本标记语言,用来展示静态页面,不能实现动态页面

CSS可以美化HTML页面,HTML负责内容,CSS负责样式

JSP

JSP是一个特殊的Servlet,用于实现动态页面

Jsp的执行流程

当浏览器客户端第一次访问一个jsp页面时,服务器会将这个jsp翻译为一个javaServlet类,再将这个类编译为.class文件,执行的是这个class文件,整个过程jsp再接受第一次请求的时候执行了一次,后续的请求,tomcat会自动去执行class文件,而不再进行翻译和编译

Jsp的九个内置对象

request

response

out

session

application ServletContext是对整个web.xml的封装

config ServletConfig 该对象是对一个servlet配置项的封装

Exception 异常信息对象。如果当前页面是一个错误页面的话,可以使用该内置对象。通过该内置对象可以获取异常信息

page该对象就是this对象

pageContext 是一个作用域,这个作用域对应一个页面,用的非常少,可以通过该对象获取其他8个内置对象,可以操作其他作用域

Jsp的作用域

pageScope,requestScope,sessionScope,applicationScope

EL表达式

表达式语言,可以获取作用域里面的数据,el表达式得到的变量可以做一些运算

${作用域.key}

EL表达式可以直接获取Cookie里面储存的数据

EL表达式可以通过param获取到请求传递过来的参数

JSTL El表达式虽然强大,但是不能做到流程的控制。JSTL可以和El表达式结合使用,来弥补这个缺陷

JSTL jsp标准标签库,可以做到流程的控制,和EL表达式结合使用

JavaScript 一种脚本语言、

前端编程语言,和HTML,CSS类似都是由浏览器解释执行,JavaScript主要用来实现动态页面

JavaScript是一种弱类型语言 ,变量没有类型,值有类型

事件

浏览器中的交互效果都是由事件驱动的. 事件都是由浏览器内置的,当用户操作浏览器的时候就可能触发已经内置的事件. 当浏览器监听到用户触发了某一个事件的时候,就会调用开发者(程序员)提前编写好的函数.

点击事件 onClick

鼠标移入事件 onmouseover

鼠标移出事件 onmouseout

输入框获取焦点事件 onfocus

输入框失去焦点事件 onblur

表单提交事件 onsubmit

内容被改变事件       onchange

页面加载完成事件     onload

DOM 操作

当网页被加载的时候,浏览器会创建页面的文档对象模型document object model

BOM操作

JQuery

jQuery是一个JavaScript库、jQuery极大地简化了JavaScript编程。jQuery设计的宗旨是“writeLess,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。jQuery兼容各种主流浏览器。

AJAX

无刷新请求,不刷新页面,接收请求,并接收后台响应的内容

AJAX的核心编程语言是JavaScript,AJAX会用到DOM技术和CSS,AJAX通过字符串,JSON,xml做数据传输

AJAX的执行流程

创建XMLHttpRequest对象,根据不同的浏览器创建的方式也不同

建立链接,通过open方法建立链接

发送请求,通过send方法发送请求

监控XMLhttpRequest对象的状态,当就绪状态时是4,响应状态码200时,获取后台响应的内容

EasyUI

EasyUI 可以做页面效果,可以通过ajax和后台做交互,自动解析后台响应回来的内容,是再JQuery的基础上封装形成的一个前端框架

EasyUI控件三要素

属性 特征用来控制控件的效果

方法 行为,功能体,再需要某一个功能时,调用对应的放法

事件 需要绑定一个函数,当达到事件的触发时机时调用函数

C controller 控制器

Servlet

我们把html放入到tomcat后,可以通过浏览器访问这些页面。但是这些页面都是静态不会变化的内容。任何人,任何时间看到的内容都是一样的。

Servlet能够使html源码动态的产生。Servlet是一个特殊java类,他运行在服务器。

Servlet类应该继承HttpServlet这个类

每一个Servlet类都需要在web.xml文件中通过servlet标签进行配置

HttpServletRequest 对请求信息的封装

HttpServletResponse 对响应信息的封装

Servlet的生命周期 一个对象创建到销毁的过程,当客户端第一次发送请求访问一个servlet时,服务器会创建一个servlet对象,并且调用init方法,servlet是单例的只会创建一次,每一次请求这个servlet都会执型service方法,当服务器停止时,servlet对象会被销毁掉,销毁前会执行destroy方法

servlet的请求方法1.url地址访问2.超链接方法3.form表单提交

Servlet和HTML页面的区别

Servlet是要实现动态的页面效果,html是要实现静态的页面效果。

动态的页面效果就是:不同的人在不同的时间访问的页面是不一样。

静态的页面效果是:所有的人在所有的时间访问的页面效果是一样的。

转发

当运行完一个servlet后需要去请求其他资源文件,这时候可以使用转发

转发:两个资源文件对应一个请求一个响应。转发是服务器端起的效果。浏览器端是感觉不到的,浏览器的地址拦不会改变

Request作用域

当请求从一个action转发到一个jsp的时候,如果jsp中要使用action类中的变量,那么我们需要将action中的变量放入到request作用域中传给jsp。那么jsp中就可以通过request作用域获取到该变量

Request作用域的特点

放数据的servlet和取数据的servlet必须保证使用的是同一个request对象。一旦request对象改变了,那么,request作用域里面的值就会失效。

Form表单的Method属性

get方式的提交,表单元素对应的值会以?key=value&key=value的方式显示在地址栏里面。Post方式不会。Post要相对安全一些。因为get方式要把数据显示在地址栏里面,所以他可以传递的数据量是有限制的。Post的大小是没有限制的。

重定向

重定向和转发实现的效果都是一样的。

重定向的过程中会有两次的请求和响应。RegistAction运行结束后,会给浏览器响应一个重定向的指令。浏览器接收到这个重定向指令后,会自动发出请求。不用用户做任何操作。

转发和重定向的区别

转发的代码request和重定向的代码response。转发的参数是url-pattern。重定向的参数是/appName/url-pattern

转发的过程中只有一次请求和响应。重定向的过程中会产生两次请求和响应。

转发的地址栏显示的是转发前资源的路径。重定向的地址栏显示的是重定向后的资源的路径。

因为重定向会产生两个request对象,所以重定向的时候使用request作用域会没有效果。

重定向刷新后,不会造成数据库数据的异常。

会话跟踪技术

在服务器端有一些资源文件,需要判断请求的状态,看该请求是否有权利访问资源文件,如果有就让该请求访问,否则就不让该请求访问。要实现该功能需要使用到会话跟踪技术。

Cookie

cookie是服务端创建出来的,保存再客户端

浏览器一旦有了cookie信息,那么浏览器请求项目的所有资源时,都会自动携带该项目的cookie信息

cookie的特点

cookie是保持再浏览器的字符串,一个cookie是由标记和值组成,标记和值都是由字符串组成,不能是中文

浏览器请求项目资源时,会自动携带跟项目相关的cookie

cookie会再浏览器关闭时自动清除掉,如果想控制cookie的有效期,创建出cookie对象后会掉用setMaxAge()来设置cookie的生命时长,单位秒

cookie的数据不安全,重要的数据不存在cookie中

Session

session是服务端为每个浏览器创建出来的私人存储空间

HttpSessionsession=request.getSession();//获取session对象,当浏览器第一次访问服务器,调用了该方法后,该方法的含义是创建出session对象。当浏览器不是第一次访问服务器,调用该代码后,该代码的含义是获取到该浏览器对应的session

Session的生命周期

默认情况下session会存活30分钟 ,可以通过web.xml配置来决定session的存活时间

当浏览器请求服务器后,关闭了浏览器。这时候再打开浏览器后,访问服务器,得到的session跟关闭前得到的session不是同一个了。服务器端到30分钟后就把之前的session销毁掉。

session 的特点

session跟浏览器一一对应。

Session是保存在服务器端。

Session存储的是任意数据类型。

Session作用域里面是不能随意放数据

Cookie和session的区别

都是会话跟踪技术,都和浏览器相关

保存的位置不一样,cookie保存再浏览器端,session保存再服务器端,重要的数据保存再session中

保存的数据不一样,cookie保存的是字符串,session保存任意类型

Session 的实现原理

当浏览器第一次访问服务器时,服务器会创建一个session对象,并创建一个cookie对象,将JSESSIONID和session的id放入cookie中,响应给客户端,浏览器下次访问,会携带这与项目相关的cookie,服务器会通过JSESSIONID去找对应的session对象,如果浏览器禁用了cookie,则会对url地址进行URL重写,将JSESSIONID以参数的方法提交给服务器

ServletContext

ServletContext可以获取配置文件中的内容,是对web.xml对象的封装,一个项目中只有一个web.xml所以ServletContext对象只有一个

Request作用域的范围最小,对应一次请求。

Session作用域的范围要大一些。对应一次会话。只要浏览器不关就是一个session。

Application(ServletContext)作用域的范围最大。对应一个应用程序。不管有多少个浏览器,只要访问的是同一个项目,那么他们对应的就是一个application对象。

Application对象跟一个项目相关,他会在tomcat启动的时候被创建,tomcat关闭的时候被销毁。

监听器

可以监听一些事件的发生。ServletContext监听器可以监听tomcat的启动和关闭。

过滤器

Filter是运行web项目中的一个组件,当请求过来时,过滤器会先运行里面的代码,然后再把请求分发给真正要请求的资源。

Struts2框架

struts2框架封装了Servlet技术,用于接收页面传递过来的参数,通过内部处理,将结果返回

struts2框架的执行过程

浏览器向服务器发送请求,经过核心过滤器处理,获取到,namespace和method,再struts.xml配置文件中匹配对应的方法,执行方法中的内容,获取一个返回值,再去struts.xml文件中找对应的result标签,按照指定的方式请求资源文件

跳转方式

dispatcher 默认值。转发到jsp页面。

redirect 重定向到一个jsp页面。

redirectAction重定向到一个action。

chain 转发到一个action。

Auction类中获取session

HttpServletRequest request=ServletActionContext.getRequest();

HttpSession session=request.getSession();

struts2的数据处理机制

action把处理的数据放入到值栈里面。值栈是存放数据的空间。到视图里面可以到值栈里面获取数据。

视图可以通过ognl表达式到值栈里面获取数据。需要流程控制时,可以通过struts2的标签。

OGNL表达式

对象图导航语言。他是一个表达式语言类似于之前的el表达式。这个ognl是独立于struts2框架的。

Ognl的数据源有两个。1.Root区域。2.contextMap区域。

拦截器

Struts2的拦截器是struts2框架中最为重要的核心组件。Struts2的很多核心功能都是通过拦截器实现的。

当客户端请求struts的拦截器时,请求会先进入到struts的拦截器里面。拦截器先运行,拦截器可以对请求放行,放行后请求运行action方法。Action方法运行完后,会去运行拦截器为执行完的代码。

过滤器和拦截器的区别

过滤器属于servlet相关技术,拦截器是struts2的组件技术。

过滤器可以过滤所有的资源,包括jsp,servlet,图片,css,js。拦截器只拦截struts2中的action。

在struts2项目中如果使用了自定义的拦截器,struts2框架自带的拦截器就会失效,需要在action引用拦截器的配置上面增加系统拦截器defaultStack。

拦截器栈

一个拦截器栈里面可以存储多个拦截器。Action引用的时候可以直接引用拦截器栈

使用默认拦截器

<default-interceptor-ref name=”拦截器名”/>

Default-action-ref

当用户请求了一个不存在的actionName时,这时候请求会进进入到default-action-ref指定的action类中。

Global-results

配置为全局的result

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!