zoukankan      html  css  js  c++  java
  • Jsp与Servlet

    一、jsp有哪些内置对象作用分别是什么 
      答:JSP共有以下9种基本内置组件(可与ASP的6种内部组件相对应): 

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

    二、jsp有哪些动作作用分别是什么 
      答:JSP共有以下6种基本动作 

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

    三、JSP中动态INCLUDE与静态INCLUDE的区别? 
      答:动态INCLUDE用<jsp:include/>动作实现,静态INCLUDE用<%@include/>
      动态INCLUDE在使用的时候,会先解析所要包含的页面,解析后在和主页面放到一起显示 动态包含只有在执行到它的时候才加载; 
      静态INCLUDE在使用的时候,不会解析所要包含的页面,包含的jsp页面与被包含的jsp页面共用一个request内置对象。静态的包含是将两个jsp文件二合一。 
      jsp:include是先编译一下included.jsp文件,然后再包含 
      先编译,后包含 
      @ include是先把文件包含就来,然后统一编译 
      先包含,后编译

    四、 Servlet生命周期 
      Servlet生命周期包括三部分: 

    1. 初始化:Web容器加载servlet,调用init()方法 
    2. 处理请求:当请求到达时,运行其service()方法。service()自动派遣运行与请求相对应的doXXX(doGet或者doPost)方法。 
    3. 销毁:服务结束,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 页面描述 
      page:是代表与一个页面相关的对象和属性。一个页面由一个编译好的 Java servlet 类(可以带有任何的 include 指令,但是没有 include 动作)表示。这既包括   servlet 又包括被编译成 servlet 的 JSP 页面 
      request:是是代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件(由于 forward 指令和 include 动作的关系) 
      session:是是代表与用于某个 Web 客户机的一个用户体验相关的对象和属性。一个 Web 会话可以也经常会跨越多个客户机请求 
      application:是是代表与整个 Web 应用程序相关的对象和属性。这实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域 
      page:当前页面,也就是只要跳到别的页面就失效了 
      request:一次会话,简单的理解就是一次请求范围内有效 
      session:浏览器进程,只要当前页面没有被关闭(没有被程序强制清除),不管怎么跳转都是有效的 
      application:服务器,只要服务器没有重启(没有被程序强制清除),数据就有效

    十、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的线程安全性?

      避免使用实例变量
      避免使用非线程安全的集合
      在多个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 内存模型中,方法中的临时变量是在栈上分配空间,而且每个线程都有自己私有的栈空间,所以它们不会影响线程的安全。

  • 相关阅读:
    complete完成量——实例分析
    worker线程的创建与使用
    SDIO接口
    Linux中V4L2分析
    Linux系统调用分析
    ppm图片显示
    应用层与内核层错误打印函数总结
    高通Sensor驱动学习笔记
    linux中新增一个shell命令的方法
    RTC测试程序
  • 原文地址:https://www.cnblogs.com/huangjinyong/p/9529269.html
Copyright © 2011-2022 走看看