Jsp与Servlet面试题

一、jsp有哪些内置对象作用分别是什么   

    答:JSP共有以下9种基本内置组件(可与ASP的6种内部组件相对应): 

request  用户端请求,此请求会包含来自GET/POST请求的参数 
response  网页传回服务器端的回应 
pageContext  网页的属性是在这里管理 
session  与请求有关的会话期 
application  服务器启动时创建,服务器关闭时停止,为多个应用程序保存信息 
out  用来传送回应的输出 
config  servlet的构架部件 
page  JSP网页本身
exception  针对错误网页,未捕捉的例外


    

二、jsp有哪些动作作用分别是什么 

  答:JSP共有以下6种基本动作 

jsp:useBean 寻找或者实例化一个JavaBean
jsp:setProperty 设置JavaBean的属性
jsp:getProperty 输出某个JavaBean的属性
jsp:forward 把请求转到一个新的页面
jsp:plugin 根据浏览器类型为Java插件生成OBJECT或EMBED标记
jsp:include   在页面被请求的时候引入一个文件

 

三、JSP中动态INCLUDE与静态INCLUDE的区别? 

  答:动态include用jsp:include动作实现 ,它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数 。
    静态include用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面。

四、 Servlet生命周期 

  Servlet生命周期包括三部分: 
    初始化:Web容器加载servlet,调用init()方法 。
    处理请求:当请求到达时,运行其service()方法。service()自动派遣运行与请求相对应的doXXX(doGet或者doPost)方法。 
    销毁:服务结束,web容器会调用servlet的distroy()方法销毁servlet。

五、get提交和post提交有何区别 

  (1)get一般用于从服务器上获取数据,post一般用于向服务器传送数据 
  (2)请求的时候参数的位置有区别,get的参数是拼接在url后面,用户在浏览器地址栏可以看到。post是放在http包的包体中。 
      比如说用户注册,你不能把用户提交的注册信息用get的方式吧,那不是说把用户的注册信息都显示在Url上了吗,是不安全的。 
  (3)能提交的数据有区别,get方式能提交的数据只能是文本,且大小不超过1024个字节,而post不仅可以提交文本还有二进制文件。 所以说想上传文件的话,那我们就需要使用post请求方式 。
  (4)servlet在处理请求的时候分别对应使用doGet和doPost方式进行处理请求

六、JSP与Servlet有什么区别 

  Servlet是服务器端的程序,动态生成html页面发送到客户端,但是这样程序里会有很多out.println(),Java与html语言混在一起很乱,所以后来sun公司推出了JSP.其实JSP就是Servlet,每次运行的时候JSP都首先被编译成servlet文件,然后再被编译成.class文件运行。有了jsp,在MVC项目中servlet不再负责动态生成页面,转而去负责控制程序逻辑的作用,控制jsp与javabean之间的流转。

七、doGet与doPost方法的两个参数是什么 

  HttpServletRequest:封装了与请求相关的信息 
  HttpServletResponse:封装了与响应相关的信息

八、request.getAttribute()和request.getParameter 

  (1)有setAttribute,没有setParameter方法 。
  (2)getParameter获取到的值只能是字符串,不可以是对象,而getAttribute获取到的值是Object类型的。 
  (3)通过form表单或者url来向另一个页面或者servlet传递参数的时候需要用getParameter获取值;getAttribute只能获取setAttribute的值 。
  (4)setAttribute是应用服务器把这个对象放到该页面所对应的一块内存当中,当你的页面服务器重定向到另一个页面的时候,应用服务器 。会把这块内存拷贝到另一个页面对应的内存当中。通过getAttribute可以取得你存下的值,当然这种方法可以用来传对象。 用session也是一样的道理,这是说request和session的生命周期不一样而已。

九、四种会话跟踪技术 

  会话作用域ServletsJSP 页面描述 :

十、forward和redirect的区别 

  转发与重定向 :
    (1)从地址栏显示来说 
        forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL。
    (2)从数据共享来说 
        forward:转发页面和转发到的页面可以共享request里面的数据. 
        redirect:不能共享数据. 
    (3)从运用地方来说 
        forward:一般用于用户登陆的时候,根据角色转发到相应的模块. 
        redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等. 
    (4)从效率来说 
        forward:高. 
        redirect:低.

十一、Servlet的线程安全问题: 

  实例变量不正确的使用是造成Servlet线程不安全的主要原因。

  从Servlet的调用过程可以看出,当客户端第一次请求Servlet的时候,tomcat会根据web.xml配置文件实例化servlet 。
  当又有一个客户端访问该servlet的时候,不会再实例化该servlet,也就是多个线程在使用这个实例。

  JSP/Servlet容器默认是采用单实例多线程(这是造成线程安全的主因)方式处理多个请求的,这种默认以多线程方式执行的设计可大大降低对系统的资源需求,提高系统的并发量及响应时间。

  Servlet本身是无状态的,一个无状态的Servlet是绝对线程安全的,无状态对象设计也是解决线程安全问题的一种有效手段。

  所以,servlet是否线程安全是由它的实现来决定的,如果它内部的属性或方法会被多个线程改变,它就是线程不安全的,反之,就是线程安全的。

  如何控制Servlet的线程安全性?

    1.避免使用实例变量 
      避免使用非线程安全的集合,在多个Servlet中对某个外部对象(例如文件)的修改是务必加锁(Synchronized,或者ReentrantLock),互斥访问。 属性的线程安全:ServletContext、HttpSession是线程安全的;ServletRequest是非线程安全的。

    设计线程安全的Servlet

      1.实现 SingleThreadModel 接口 
        该接口指定了系统如何处理对同一个Servlet的调用。如果一个Servlet被这个接口指定,那么在这个Servlet中的service方法将不会有两个线程被同时执行,当然也就不存在线程安全的问题。但是,如果一个Servlet实现了SingleThreadModel接口,Servlet引擎将为每个新的请求创建一个单独的Servlet实例,这将引起大量的系统开销,在现在的Servlet开发中基本看不到SingleThreadModel的使用,这种方式了解即可,尽量避免使用。

      2.同步对共享数据的操作 
        使用synchronized 关键字能保证一次只有一个线程可以访问被保护的区段,可以通过同步块操作来保证Servlet的线程安全。如果在程序中使用同步来保护要使用的共享的数据,也会使系统的性能大大下降。这是因为被同步的代码块在同一时刻只能有一个线程执行它,使得其同时处理客户请求的吞吐量降低,而且很多客户处于阻塞状态。另外为保证主存内容和线程的工作内存中的数据的一致性,要频繁地刷新缓存,这也会大大地影响系统的性能。所以在实际的开发中也应避免或最小化Servlet 中的同步代码。

      3.避免使用实例变量 
        线程安全问题很大部分是由实例变量造成的,只要在Servlet里面的任何方法里面都不使用实例变量,那么该Servlet就是线程安全的。在Servlet中避免使用实例变量是保证Servlet线程安全的最佳选择。Java 内存模型中,方法中的临时变量是在栈上分配空间,而且每个线程都有自己私有的栈空间,所以它们不会影响线程的安全。

原文地址:https://www.cnblogs.com/whx20100101/p/9862225.html