web 阶段的一些简答题

时间:2019-10-18
本文章向大家介绍web 阶段的一些简答题,主要包括web 阶段的一些简答题使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1.jsp 9个隐含对象

2. jsp 4大域对象

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

4. 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规范中已经被废弃了


              

原文地址:https://www.cnblogs.com/zhulina-917/p/11696764.html