4. Servlet容器默认是采用单实例多线程的方式处理多个请求的:
6. 请描述对web 服务器的理解(Tomcat),请列举出tomcat7下的目录以及各个目录的作用
10.使用缓存的好处,mybatis的缓存级别,什么场景下使用缓存
15.写出Servlet* 中的三大作用域及各自的生命周期***
1. jsp 9个隐含对象
1 request:HttpServletRequest 的一个实例,代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)作用域为一次请求
2 response:HttpServletResponse的一个实例,代表是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端
3 session:HttpSession的一个实例,是由服务器自动创建的与用户请求相关的对象,作用域为一次会话(浏览器打开直到关闭称为一次会话)
4 application:ServletContext的一个实例(表示当前web应用),开始于服务器启动,直到服务器关闭,作用域为当前web应用
5 out:jspWriter的一个实例(用于浏览器输出数据)
6 pagecontext:作用是取得任何范围的参数(页面的上下文)作用域为当前 JSP 页面
7 config:ServletConfig 的一个实例(主要作用是取得服务器的配置信息)
8 page:page 对象代表JSP本身,只有在JSP页面内才是合法的
9 exception:显示异常信息
2. jsp 4大域对象
1 page域: 只能在当前jsp页面中使用(当前页面)
2 request域: 只能在同一个请求中使用(转发)
3 session域: 只能在同一个会话(session对象)中使用(私有的)
4 context域: 只能在同一个web应用中使用。(全局的)
2. mybatis 中 #{} %{ } 的区别于联系
1 1.#{}将传入的数据都当成一个字符串,它的作用类似于一个占位符,会对自动传入的数据加一个双引号,防止sql注入
2 2.${}将传入的数据直接显示生成在sql中,无法防止Sql注入。
3 3. #{}在mybatis中使用Preparestatement语句来安全的设置值一次编译多次执行,${}在mybatis中使用tatement语句来安全的设置值,每使用一次就编译一次
3. Servlet容器默认是采用单实例多线程的方式处理多个请求的:
从上面可以看出:
Servlet容器默认是采用单实例多线程的方式处理多个请求的:
1.当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并实例化(只存在一个Servlet实例);
2.容器初始化化Servlet主要就是读取配置文件(例如tomcat,可以通过servlet.xml的
3.当请求到达时,Servlet容器通过调度线程(Dispatchaer Thread) 调度它管理下线程池中等待执行的线程(Worker Thread)给请求者;
4.线程执行Servlet的service方法;
5.请求结束,放回线程池,等待被调用;
(注意:避免使用实例变量(成员变量),因为如果存在成员变量,可能发生多线程同时访问该资源时,都来操作它,照成数据的不一致,因此产生线程安全问题)
从上面可以看出:
第一:Servlet单实例,减少了产生servlet的开销;
第二:通过线程池来响应多个请求,提高了请求的响应时间;
第三:Servlet容器并不关心到达的Servlet请求访问的是否是同一个Servlet还是另一个Servlet,直接分配给它一个新的线程;如果是同一个Servlet的多个请求,那么Servlet的service方法将在多线程中并发的执行;
第四:每一个请求由ServletRequest对象来接受请求,由ServletResponse对象来响应该请求。
Servlet容器如何同时来处理多个请求
Java的内存模型JMM(Java Memory Model) ,JMM主要是为了规定了线程和内存之间的一些关系。根据JMM的设计,系统存在一个主内存(Main Memory),Java中所有实例变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Working Memory),工作内存由缓存和堆栈两部分组成,缓存中保存的是主存中变量的拷贝,缓存可能并不总和主存同步,也就是缓存中变量的修改可能没有立刻写到主存中;堆栈中保存的是线程的局部变量,线程之间无法相互直接访问堆栈中的变量。
Servlet采用多线程来处理多个请求同时访问。servlet依赖于一个线程池来服务请求。线程池实际上是一系列的工作者线程集合。Servlet使用一个调度线程来管理工作者线程。
当容器收到一个Servlet请求,调度线程从线程池中选出一个工作者线程,将请求传递给该工作者线程,然后由该线程来执行Servlet的service方法。当这个线程正在执行的时候,容器收到另外一个请求,调度线程同样从线程池中选出另一个工作者线程来服务新的请求,容器并不关心这个请求是否访问的是同一个Servlet.当容器同时收到对同一个Servlet的多个请求的时候,那么这个Servlet的service()方法将在多线程中并发执行。
Servlet容器默认采用单实例多线程的方式来处理请求,这样减少产生Servlet实例的开销,提升了对请求的响应时间,对于Tomcat可以在server.xml中通过
注意:服务器可以使用多个实例来处理请求,代替单个实例的请求排队带来的效益问题。服务器创建一个Servlet类的多个Servlet实例组成的实例池,对于每个请求分配Servlet实例进行响应处理,之后放回到实例池中等待下此请求。这样就造成并发访问的问题。
此时,局部变量(字段)也是安全的,但对于全局变量和共享数据是不安全的,需要进行同步处理。而对于这样多实例的情况SingleThreadModel接口并不能解决并发访问问题。 SingleThreadModel接口在servlet规范中已经被废弃了
5. Cookie 与Session 的异同
http请求是无状态的,不会记录登录状态 ,cookie的出现就是为了解决这个问题,第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上 次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB。因此使用cookie只能存储 一些小量的数据
相同点:session和cookie的作用有点类似,都是为了存储用户相关的信息。
不同点:cookie是存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,
1、存储在服务端:通过cookie存储一个session_id,然后具体的数据则是保存在session中。如果用户已经登录,则服务器会在cookie中保存一个session_id,下次再次请求的时候,会把该session_id携带上来,服务器根据session_id在session库中获取用户的session数据。就能知道该用户到底是谁,以及之前保存的一些状态信息。这种专业术语叫做 server side session。
2、将session数据加密,然后存储在cookie中。这种专业术语叫做client side session。flask采用的就是这种方式,但是也可以替换成其他形式。
cookie 存在的缺陷:
1.cookie 以明文传输 不安全
2. cookie 存储数据量比较小 默认为4kb
3. cookie 是可以被禁用的
4. cookie 不支持中文
6.请描述对web 服务器的理解(Tomcat),请列举出tomcat7下的目录以及各个目录的作用
**https://my.oschina.net/jiansin/blog/1788709** 转发博主
Tomcat 是一组规范的实现,用于接收客户端的请求,处理请求并且响应请求 用于与客户端进行交互
1. Tomcat中最顶层的容器是Server,代表着整个服务器一个Server可以包含至少一个Service,用于具体提供服务。 Service主要包含两个部分:Connector和Container。
Connector用于处理链接相关的事情,并提供Socket与Request和Response相关的转化;
Container用于封装和管理Servlet,以及具体处理Request请求;
2. 一个Tomcat中只有一个Server,一个Server可以包含多个Service,一个Service只有一个Container,但是可以有多个Connectors,这是因为一个服务可以有多个连接,如同时提 供 http和https链接,也可以提供向相同协议不同端口的连接。
3. 多个 Connector 和一个 Container 就形成了一个 Service,有了 Service 就可以对外提供服务了,但是 Service 还要一个生存的环境,必须要有人能够给她生命、掌握其生死大权,那就非 Server 莫属了。所以整个 Tomcat 的生命周期由 Server 控制。
Connector最底层使用的是Socket来进行连接的,Request和Response是按照HTTP协议来封装的,所以Connector同时需要实现TCP/IP协议和HTTP协议!
bin : 该目录下存放的是二进制可执行文件,启动服务器的命令
conf : 启动服务器的配置文件
webapp : 存放一些模板文件
temp : 存放临时文件
logs : 存放Tomcat运行时候的日志文件
work : 存放jsp 编译成java文件和class文件
lib : 存放在Tomcat文件运行时需要的ar包
7. 请描述 servlet与struts2的异同
Struts2 充当了mvc中的c 替换了 servlet 底层封装了 Servlet相关的api 但它不是Servlet
Strtus2不是Servlet,是使用了Filter过滤器来作为控制器,使用了拦截器,组成拦截器栈,是对Filter的改善,封装,简化
Servlet 是单利模式
struts2是多例模式
8.请说明jsp的运行原理
1. jsp 页面的执行顺序:
java - jsp - js - html 标签
java 是在服务器端运行的代码 jsp 是在服务器的Servlet里运行 js /html 是在浏览器端执行的
2. jsp页面实质上是一个Servlet tomcat本身 会把 jsp页面对应的URL映射到 某个特定的xml文件中,而非项目中WEB-INF 下的web.xml
jsp页面编译后会形成 .class文件 和.java文件 el 表达式就是java代码 所以当 jsp 页面编译的开始就已经被解析 直接运行 然后才返回浏览器进行解析显示视图。
注意:el表达式优先于 jsp标签执行。
3. 在jsp中声明变量,方法时, 在生成class 文件中会作为全局变量、方法存在
9. 说明mvc的好处
m(model) : (模型)表示应用程序核心(比如数据库记录列表)。 是应用程序中用于处理应用程序数据逻辑的部分。
通常模型对象负责在数据库中存取数据。
v(view): View(视图)显示数据(数据库记录)。是应用程序中处理数据显示的部分。
通常视图是依据模型数据创建的。
c(controller): (控制器)处理输入(写入数据库记录)。是应用程序中处理用户交互的部分。
通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
1. 解耦合,提高系统的可维护性和可扩展性 (视图层和业务层分离)
2. 代码分层有利于形成一套标准
3. 可以用新的实现代替旧的实现
4. 降低了维护成本
5. 重用性高
6. 部署快:(分层合作,前台部署前台,后台部署后台)
缺点: 虽然层层分离但是关联性太强,没有做到独立的重用,针对小型项目会降低开发效率
他的模式是 MVVM 数据双向绑定
——model (数据)
——View (html 页面)
——ViewModel
数据(model)与视图(view)的绑定 做到前后端的分离
10.使用缓存的好处,mybatis的缓存级别,什么场景下使用缓存
1. 用户频繁的与数据库进行会话,系统的运行效率降低从而用户的体验度就降低了
2. 缓存主要解决了 应用系统与数据库 频繁创建 销毁连接 大大解决了系统的运行效率,
3.其只要针对的是查询优化 当用户访问量增加占用了大量的IO资源从而影响我们的系统运行效率
4. 加入缓存机制当用户端进行查询时会将查询到的数据放入
到缓冲区找那个一份当再次查询当前数据时直接从缓存区中取出
注意: 缓存占用的是内存资源,而内存的成本比较高,在选用缓存的时候需要从时间和成本上考虑
mybatis: 有两级缓存
一级缓存:sqlSession 级别缓存
二级缓存:(全局缓存)mapper级别 也是sqlSessionFactory
二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。
mapper都有一个二级缓存区域,两个mapper的namespace如果相同,这两个mapper执行sql查询到数据将存在相同的二级缓存区域中。
开启二级缓存:
1. 第一步:
2. 在需要开启二级缓存的mapper.xml中加入caceh标签
解决脏读:
在完成crud 后 提交书屋可以清空缓存
注意:在完成每一次查询之后 必须要关闭sqlSession 只有关闭了sqlSession 才会将数据放入缓存(全局缓存)
缓存的执行效率
优先执行二级缓存 -----》一级缓存 -----》 数据库
11. 数据库的索引 Index
1. 索引就相当于字典的目录 提高查询效率
2. 创建索引 create index 索引名 on 表名(字段名) //针对字段创建
将当前含有索引的字段作为where 的查询判断条件 oracle数据库会自动使用索引
使用索引针对大数据量,索引取决于表里数据量的对少(主键本身就带有索引)
注意: 索引会占用系统的内存空间 不是所有的时候都需要索引当表中数据达到千万级别 如果查询的数据占总数据的30%以下使用索引的效率是
最明显的。(优化sql语句的其中一种手段就是使用索引)
12. 事务控制
1. 事务是数据库中的最小执行单元 由1-n 条sql命令组成 组成一个事务的一组sql 是不可能分割的原子操作,要么一起成功要么一起失败
2. 事务的边界
begin: 从书写第一条sql 语句开始
end:
提交: 1.显示提交 在执行完sql 之后 给出指令commit 2. 隐式提交 :正常退出客户端
回滚: 显示回滚 手动给出回滚 rollback。
3. 事务的原理:
数据库服务器,会针对每一个连接上来的客户端开辟一小块内存空间(回滚段)
隐式回滚 : 非正常退出客户端 比如 海啸,地震,断电
事务特性:
ACID :
A: 原子性 一组事务的一组sql是不可分割的原子操作,要么成功要么失败
C: 一致性: 事务前与事务后的数据要保持一致
I: 在并发场景下,一个事务与另外一个事务的隔离级别
D: 事务结束对数据库的影响必须是持久的
13.写出md5加密算法的特点: (https://blog.csdn.net/weixin_38035852/article/details/81667160 详细请参看)
(1)md5加密不可逆,所以它的安全度比较高
(2)不管多大的字符串,它都能生成32位字符串
常见加密方式介绍:
单向加密:只提供单向加密不能解密,不可逆的过程。
双向加密:又分为对称性加密算法和非对称性加密算法。对称性加密算法,发送和接收端双方都知道秘钥和加密算法且秘钥都是相同的,之后便是对数据的加密和解密过程。非对称加密算法 :发送之前A B事先生成一对秘钥,A将秘钥发送给B,B将秘钥发送给 A,A先用B的秘钥加密密文在发送B,B解密,同理
md5 加密方式:属于Hash算法一代,是一种单向加密算法,可以将输入的信息加密转换为128位固定长度的散列值,用于检验数据传输过程中的完整性。
1.防止被篡改,在传输过程中一旦被串改,那么计算出的MD5值一定不同。
2.计算速度快。加密速度快,不需要秘钥。
3.检查文件的完整性,一旦文件被更改,MD5值也是不同的。
4.防止看到明文,公司存放密码存放的是MD5值。
5.防止抵赖,用于数字签名,一旦用户的文件被第三方MD5加密,若以后A说这个文件不是他写的,那么当用文件MD5后获得的签名一致,可以确认。
MD5的缺点:
1. 作为一种散列算法,虽然很难发生散列碰撞,但是经过证实,仍然存在两种不同数据会发生碰撞。
2. MD5的安全性:将用户的密码直接MD5后存储在数据库是不安全的。
第一,用户普遍习惯用容易记忆的密码,生日,手机号等,黑客容易破译此类密码。这也是加盐值的一个原因。
第二,直接MD5存入数据库,若数据库被破解,通过MD5反查会查到密码,需要随机盐值的配合。
考虑到多数人所使用的密码为常见的组合,攻击者可以将所有密码的常见组合进行单向哈希,得到一个摘要组合,然后与数据库中的摘要进行比对即可获得对应的密码。这个摘要组合也被称为rainbow table。
14. mybatis 创建sqlSession()
1. String resources = "mybatis-config.xml";
InputStream inputStream = Resources.getResourcesAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSqlSession();
15.写出Servlet 中的三大作用域及各自的生命周期
HttpServletRequest
作用域: 一次请求.多个转发过程中的servlet都可以共享
生命周期:一次请求
HttpSession:
作用域:一次会话内有效,所有的servlet都可以获取到
生命周期:一次会话
主动销毁: invalidate()
被动销毁: 30分钟不操作销毁
服务器非正常关闭(断电,强制关机)session会销毁
ServletContext:(ApplicationContext)
作用域:整个web应用,整个项目下的所有servlet都可以共享(公共的)
生命周期:从项目开始运行到服务器关闭
16.写出Struts2接收请求参数的机制
struts2是通过定义成员变量的方式收集客户端参数,将成员变量的名字与客户端提交数据的name 属性值保持一致,并且提供相应的set/get方法 ----收集零散数据
如果是对象属性,那么就利用了反射机制前台页面需要制定实体类以及属性 类似于:name = " user.id "
手机扫一扫
移动阅读更方便
你可能感兴趣的文章