web 阶段的一些简答题

摘要:
servlet容器如何同时处理多个请求的Java内存模型JMM?JMM主要指定线程和内存之间的一些关系。Servlet依赖于线程池来服务请求。存储在cookie中的数据量是有限的。不同的浏览器具有不同的存储大小,但通常不会超过4KB。

1.jsp 9个隐含对象

2. jsp 4大域对象

3.mybatis 中 #{} %{ } 的区别于联系

4. Servlet容器默认是采用单实例多线程的方式处理多个请求的:

5.Cookie 与Session 的异同

6. 请描述对web 服务器的理解(Tomcat),请列举出tomcat7下的目录以及各个目录的作用

7. 请描述 servlet与struts2的异同

8.请说明jsp的运行原理

9.说明mvc的好处

10.使用缓存的好处,mybatis的缓存级别,什么场景下使用缓存

11. 数据库的索引 Index

12. 事务控制

13.写出md5加密算法的特点

14. mybatis 创建sqlSession()

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的<Connector>设置线程池中线程数目,初始化线程池通过web.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中通过<Connector>元素设置线程池中线程的数目。
注意:服务器可以使用多个实例来处理请求,代替单个实例的请求排队带来的效益问题。服务器创建一个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采用的就是这种方式,但是也可以替换成其他形式。

web 阶段的一些简答题第1张

cookie 存在的缺陷:

      1.cookie 以明文传输 不安全

     2. cookie 存储数据量比较小 默认为4kb

      3. cookie 是可以被禁用的

    4. cookie 不支持中文

        6.请描述对web 服务器的理解(Tomcat),请列举出tomcat7下的目录以及各个目录的作用

                  https://my.oschina.net/jiansin/blog/1788709  转发博主

                Tomcat 是一组规范的实现,用于接收客户端的请求,处理请求并且响应请求 用于与客户端进行交互

                 web 阶段的一些简答题第2张

            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链接,也可以提供向相同协议不同端口的连接。

        

                     web 阶段的一些简答题第3张

      3.   多个 Connector 和一个 Container 就形成了一个 Service,有了 Service 就可以对外提供服务了,但是 Service 还要一个生存的环境,必须要有人能够给她生命、掌握其生死大权,那就非 Server 莫属了。所以整个 Tomcat 的生命周期由 Server 控制。

Tomcat顶层架构小结

  • Tomcat中只有一个Server,一个Server可以有多个Service,一个Service可以有多个Connector和一个Container;
  • Server掌管着整个Tomcat的生死大权;
  • Service 是对外提供服务的;
  • Connector用于接受请求并将请求封装成Request和Response来具体处理;
  • Container用于封装和管理Servlet,以及具体处理request请求; 由上述内容我们大致可以知道一个请求发送到Tomcat之后,首先经过Service然后会交给我们的Connector,Connector用于接收请求并将接收的请求封装为Request和Response来具体处理,Request和Response封装完之后再交由Container进行处理,Container处理完请求之后再返回给Connector,最后在由Connector通过Socket将处理的结果返回给客户端,这样整个请求的就处理完了!

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. 部署快:(分层合作,前台部署前台,后台部署后台)

             缺点: 虽然层层分离但是关联性太强,没有做到独立的重用,针对小型项目会降低开发效率  

  1. 视图与控制器的过程于紧密的连接,
  2. 视图对模型数据库的低效率的访问
  3. 每一层都需要人为参与维护,数据一旦改变联动所有层,每一层都要自己写。
  4. 解决方案:使用了流行框架 vue 

他的模式是  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. 第一步:

<span style="font-size:18px;"><settings>    
   <!--开启二级缓存-->    
    <setting name="cacheEnabled" value="true"/>    
</settings> </span>  

             2. 在需要开启二级缓存的mapper.xml中加入caceh标签

             <cache></cache>

       解决脏读:

           在完成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位固定长度的散列值,用于检验数据传输过程中的完整性。

MD5的优势:

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";

2. InputStream inputStream =  Resources.getResourcesAsStream(resource);

3. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

4. 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 " 

 

 

免责声明:文章转载自《web 阶段的一些简答题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇微信小程序开发——开发者工具无法输入中文的处理中文分词:双向匹配最大算法(BI-MM)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

《深度剖析CPython解释器》25. 解密Python中的多线程(第一部分):初识GIL、以及多个线程之间的调度机制

楔子 这次我们来说一下Python中的多线程,在上篇博客中我们说了Python的线程,我们说Python中的线程是对OS线程进行了一个封装,并提供了一个线程状态(PyThreadState)对象,来记录OS线程的一些状态信息。 那什么是多线程呢?首先线程是操作系统调度cpu工作的最小单元,同理进程则是操作系统资源分配的最小单元,线程是需要依赖于进程的,并且...

[GXYCTF2019]BabysqliV3.0题解

[GXYCTF2019]BabysqliV3.0 常规分析 题目叫babysqli,刚访问的时候会有一个登录页面,于是我用测了测sql注入,毫无收获。 最后发现是弱口令,账号admin,密码password。 登录进去以后是这样的: url末尾是file=的形式,怀疑是文件包含,并且自动在xxx后面加.php。 将file=后面的参数改为php://fi...

PHP curl函数模拟爬虫(操作cookie)

curl函数.操作cookie,模拟爬虫 模拟cookie刷贴实例: 1 <?php 2 $ch = curl_init(); 3 //保存该次请求的cookie内容到文件cookie.txt 4 curl_setopt($ch, CURLOPT_COOKIEJAR, ”E:/cookie.txt”); 5...

Java中System.out.println()为何会影响内存可见性?

我们先来看段代码: 1 class ThreadVolatileDemo extendsThread{ 2 static boolean flag=true;//注意该变量没有被volatile修饰 3 @Override 4 public voidrun() { 5 while(flag){ 6 S...

数据库空间不足造成插入数据库时提示“因为文件组primary已满,未能为数据库XX对象XX分配空间”

        一大早刚进办公室就陆续接到电话说创建某某单据时提示“因为文件组primary已满,未能为数据库XX对象XX分配空间”。自从接手BASIS工作以来第一次遇到这样的问题。真是有点手忙脚乱的。因为是月结期间更是火上浇油了。打开数据库属性看了一下,可用空间为0。看一下数据库文件,三个文件都已经达到了10240M了,因为第一次遇到这样的问题也没敢下结...

docker学习(四)

一、Docker数据管理 在容器中管理数据主要有两种方式:1.数据卷(Data volumes)2.数据卷容器(Data volume containers) 1.数据卷数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:a.数据卷可以在容器之间共享和重用b.对数据卷的修改会立马生效b.对数据卷的更新,不会影响镜像d.卷会...