简述对SpringMVC的理解
SptingMVC是基于过滤器对servlet进行了封装的一个框架,我们使用的时候就是在web.xml文件中配置DispatcherServlet类;springMVC工作时主要是通过DispatcherServlet管理接收到的请求并进行处理。
SpringMVC工程流程描述
- 客户端请求提交到DispatcherServlet
- 由DispatcherServlet查询(一个或多个)HandlerMapping,找到处理请求的Controller
- DispatcherServlet将请求提交到Controller
- Controller调用业务逻辑处理后,返回ModelAndView
- DispatcherServlet查询(一个或多个)视图解析器,找到ModelAndView指定的视图
- 视图负责将结果显示到客户端
SpringMVC和struts的区别
区别1:
Struts2 的核心是基于一个Filter即StrutsPreparedAndExcuteFilter
SpringMvc的核心是基于一个Servlet即DispatcherServlet(前端控制器)
区别2:
Struts2是基于类开发的,传递的参数是通过类的属性传递(属性驱动和模型驱动),所以只能设计成多例prototype
SpringMvc是基于类中的方法开发的,也就是一个url对应一个方法,传递参数是传到方法的形参上面,所以既可以是单例模式也可以是多例模式singiton
区别3:
Struts2采用的是值栈存储请求以及响应数据,OGNL存取数据
SpringMvc采用request来解析请求内容,然后由其内部的getParameter给方法中形参赋值,再把后台处理过的数据通过ModelAndView对象存储,Model存储数据,View存储返回的页面,再把对象通过request传输到页面去。
mybatis工作原理
mybatis应用程序根据XML配置文件创建SqlSessionFactory, SqlSessionFactory在根据配置,配置来源于两个地方,一处是配置文件,一处是java代码的注解,获取一个SqlSession。SqlSession包含了执行sql所需要的所有方法,可以通过SqlSession实例直接运行映射的sql语句,完成对数据的增删改查和事物提交等,用完之后关闭 Sqlsession。
mybatis中的#和$的区别
相当于对数据 加上 双引号,$相当于直接显示数据
可以很好地防止sql注入 $无法防止sql注入
-
将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id.
-
方式能够很大程度防止sql注入。
$方式无法防止Sql注入。
$方式一般用于传入数据库对象,例如传入表名.
-
一般能用#的就别用$.
IOC
通常也被称为DI:依赖注入(Dependecy Injection)和控制反转(Inversion of Control)是同一个概念,具体的讲:当某个角色
需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在spring中创建被调用者的工作不再由调用者来完成,因此称为控制反转。创建被调用者的工作由spring来完成,然后注入调用者
IOC
通常也被称为DI:依赖注入(Dependecy Injection)和控制反转(Inversion of Control)是同一个概念,具体的讲:当某个角色
需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在spring中创建被调用者的工作不再由调用者来完成,因此称为控制反转。创建被调用者的工作由spring来完成,然后注入调用者
AOP
面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring中主要表现为两个方面
1.面向切面编程提供声明式事务管理
2.spring支持用户自定义的切面
面向切面编程(aop)是对面向对象编程(oop)的补充,
面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。
AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象,
是对应用执行过程中的步骤进行抽象,,从而获得步骤之间的逻辑划分。
因此也称为依赖注入。
Spring中的事务的作用?
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用hibernate进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为HibernateTransactionManager。
S****pring****作用域
可以通过<bean>定义的scope属性指定bean对象的作用域
-
默认的bean对象的作用域为singleton
Spring事物有几种管理方式
Spring事务有两种方式
1.编程式事务:(代码中镶嵌)
2.声明式事务:(注解,xml)
Struts2的工作原理?
1.ActionServlet核心控制器会拦截所有*.do请求
2.从struts-config.xml中找到用户请求的Action
3.通过struts-config.xml中的配置再去找这个Action对应的ActionForm,并实例化
4.把用户填写的数据自动填充到ActionForm中(调用ActionForm的setXX()方法填充)
5.同时把ActionForm放入到指定的范围中(request,session)
6.然后把请求转发给Action
7.Action获取ActionForm中的值然后调用业务逻辑层实现功能
8.再通过ActionMapping查找Actionforward实现转发
Bean生命周期
1.实例化bean对象
2.设置对象属性
3.将bean实例传递给bean的前置处理器
4.调用bean的初始化方法
5.将bean实例传递给bean的后置处理器
6.使用bean
7.容器关闭之前销毁
1.实例化bean对象(通过构造方法或者工厂方法)
2.设置对象属性(setter等)(依赖注入)
3.如果Bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean的ID。(和下面的一条均属于检查Aware接口)
4.如果Bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身
5.将Bean实例传递给Bean的前置处理器的postProcessBeforeInitialization(Object bean, String beanname)方法
6.调用Bean的初始化方法
7.将Bean实例传递给Bean的后置处理器的postProcessAfterInitialization(Object bean, String beanname)方法
8.使用Bean
9.容器关闭之前,调用Bean的销毁方法
对ssm框架的理解
Spring是一个bean容器 springMVC在项目中拦截用户请求 mybatis是对jdbc的封装,他让数据库底层操作变得透明
Spring
Spring就像是整个项目中装配bean的大工厂,在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象。
Spring的核心思想是IoC(控制反转),即不再需要程序员去显式地new
一个对象,而是让Spring框架帮你来完成这一切。
SpringMVC
SpringMVC在项目中拦截用户请求,它的核心Servlet即DispatcherServlet承担中介或是前台这样的职责,将用户请求通过HandlerMapping去匹配Controller,Controller就是具体对应请求所执行的操作。SpringMVC相当于SSH框架中struts。
mybatis
mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令
Spring的作用
a.简化开发:spring对常用的API都做了一些简化和封装(比如,用spring jdbc访问数据库,就不用考虑如何获取连接和关闭连接)。
b.解耦:spring帮我们管理对象的依赖关系,这样对象间的耦合度低,方便维护。
c.集成其他框架:spring可以将其他的框架集成进来。(比如可以将Mybatis等框架集成进来)
项目中分了几层?
答:三层 数据访问层 业务逻辑层 表示层
MVC设计模式,M为Model 即业务逻辑层,所有的业务逻辑的代码都在Model层中,在servlet中或Struts中的action里new model类产生对象进行业务逻辑运算
V为view即表示层,用于显示界面,主要是用servlet和JSP产生可以看到的JSP页面,来显示信息
C为control即控制层,控制每个业务逻辑运算完毕后的跳转方向,是配置文件
数据库优化
1.创建索引 增加搜索效率
2.分库分区分表 缓解数据库压力
3.数据库引擎 innodb myisam
4.读写分离 在数据库并发压力大的情况下 增加机器,以提高抗并发能力而且兼有数据备份功能;
如何优化sql语句
(1)选择最有效率的表名顺序
(2)WHERE子句中的连接顺序
(3)SELECT子句中避免使用‘ * ‘
(4)减少访问数据库的次数
(5)在SQLPlus , SQLForms和Pro*C中重新设置ARRAYSIZE参数, 可以增加,每次数据库访问的检索数据量 ,建议值为200
(6)使用DECODE函数来减少处理时间
(7)整合简单,无关联的数据库访问
(8)删除重复记录
(9)用TRUNCATE替代DELETE
(10)尽量多使用COMMIT
什么是SQL注入式攻击?
所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令
如何防止客户端表单的重复提交?
1.禁掉提交按钮
2.post/Redirect/get模式
3.在session中存放一个特殊标志。
4.在数据库中添加约束
Jquery
jQuery 是一个 JavaScript 库,极大地简化了 JavaScript 编程。
jQuery是一个快速、简洁的JavaScript框架
Ajax
AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术
Ajax传输方式
1.纯文本传输
2.(最流行的)Json传输
3.Xml传输
get和post的区别?
GET方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交,无法在地址栏看到。
GET方式提交的数据最多只能有1024个字节,而POST则没有此限制。
GET一般用作小数据量的请求,POST一般用作大数据量的请求。
什么是反射
Java中的反射机制是在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制
单例模式
单例模式一个类只能构建一个对象,而且构造器是私有化的,不能随便的使用new操作
创建线程的方式
1.继承thread类创建线程类
2.通过实现runnable接口创建线程类
3.实现callable接口
4.使用线程池;例如executor框架
SpringBoot工作原理
Servlet生命周期
有三个生命周期函数,初始化方法init(),处理客户请求的方法service(),终止方法destroy()
init方法
在一个Servlet的生命周期中,init方法只会被执行一次,之后无论用户执行多少次请求,都不会在调用该方法。
关于init方法的执行时机,有两种方式可选,一般的是在服务器启动后第一个用户请求改Servlet是调用,你也可以设置该Servlet在服务器启动后自动执行。
init方法负责简单的创建或者加载一些数据,这些数据将用于该Servlet的整个生命周期中。
service方法
当一个客户请求改Servlet时,实际的处理工作全部有service方法来完成,service方法用来处理客户端的请求,并生成格式化数据返回给客户端。
每一次请求服务器都会开启一个新的线程并执行一次service方法,service根据客户端的请求类型,调用doGet、doPost等方法。
service是由web容器来调用的,我们无需对service具体内容做任何处理,service会自动的根据客户端的请求类型去调用doGet、doPost等方法,所以我们只需要做好doGet、doPost方法的实现就可以了。
destroy方法
该方法在整个生命周期中,也是只会被调用一次,在Servlet对象被销毁是调用,在servlet中,我们可以做一些资源的释放等操作,执行destory方法之后的servlet对象,会等待jvm虚拟机的垃圾回收机制择时回收。
doGet、doPost方法
实际的业务处理流程,service根据客户端的请求类型来自动匹配需要执行那个方法。
什么是序列化
常用的css选择器
a)id选择器
b)类选择器
c)属性选择器
d)标签选择器