当前位置:  编程技术>java/j2ee

JSP学习心得

    来源: 互联网  发布时间:2014-10-14

    本文导语:   作者:徐春金下面是本人在学习JSP时的一些心得: 一、JSP工作原理在一个JSP文件第一次被请求时,JSP引擎把该JSP文件转换成为一个servlet。而这个引擎本身也是一个servlet,在JSWDK或WEBLOGIC中,它就是JspServlet。 JSP引擎先把该JSP...

 

作者:徐春金

下面是本人在学习JSP时的一些心得:

一、JSP工作原理

在一个JSP文件第一次被请求时,JSP引擎把该JSP文件转换成为一个servlet。而这个引擎本身也是一个servlet,在JSWDK或WEBLOGIC中,它就是JspServlet。 JSP引擎先把该JSP文件转换成一个Java源文件,在转换时如果发现jsp文件有任何语法错误,转换过程将中断,并向服务端和客户端输出出错信息;如果转换成功, JSP引擎用javac把该Java源文件编译成相应的class文件。然后创建一个该SERVLET的实例,该SERVLET的jspInit()方法被执行,jspInit()方法在servlet的生命周期中只被执行一次。然后jspService()方法被调用来处理客户端的请求。对每一个请求,JSP引擎创建一个新的线程来处理该请求。如果有多个客户端同时请求该JSP文件,则JSP引擎会创建多个线程。每个客户端请求对应一个线程。以多线程方式执行可大大降低对系统的资源需求,提高系统的并发量及响应时间.但应该注意多线程的编程限制,由于该servlet始终驻于内存,所以响应是非常快的。 如果.jsp文件被修改了,服务器将根据设置决定是否对该文件重新编译,如果需要重新编译,则将编译结果取代内存中的servlet,并继续上述处理过程。 虽然JSP效率很高,但在第一次调用时由于需要转换和编译而有一些轻微的延迟。 此外,如果在任何时候如果由于系统资源不足的原因,JSP引擎将以某种不确定的方式将servlet从内存中移去。当这种情况发生时jspDestroy()方法首先被调用, 然后servlet实例便被标记加入"垃圾收集"处理。 jspInit()及jspDestory()格式如下:可在jspInit()中进行一些初始化工作,如建立与数据库的连接,或建立网络连接,从配置文件中取一些参数等,在jspDestory()中释放相应的资源。




二、服务端的输出缓冲区

缺省情况下:服务端要输出到客户端的内容,不直接写到客户端,而是先写到一个输出缓冲区中.只有在下面三中情况下,才会把该缓冲区的内容输出到客户端上:

  • 该JSP网页已完成信息的输出
  • 输出缓冲区已满
  • JSP中调用了out.flush()或response.flushbuffer()
  • 输出缓冲区的大小可以用:或response.setBufferSize()设置,如下:
  • 设置输出缓冲区的大小为1KB。或response.setBufferSize(1);
  • 设置输出缓冲区的大小为0,即不缓冲。或response.setBufferSize(0);
  • 用response.getBufferSize()或out.getBufferSize()可取的输出缓冲区的大小,单位为字节. 用response.isCommitted()可检查看服务端是否已将数据输出到客户端. 如果返回值是TRUE则已将数据输出到客户端,是FALSE则还没有.

    三、服务端输出重定向

    有以下3种方法可以做到输出重定向:

  • RESPONSE.SETREDERECT("URL") 该方法通过修改HTTP协议的HEADER部分,对浏览器下达重定向指令的,使浏览器显示重定向网页的内容. response.sendRedirect("http://localhost:7001/index.html");
  • 下面的方法也能改变HTTP HEADER属性,它的原理和 1 是一样的.
  • 采用 该方法是利用服务器端先将数据输出到缓冲区的机制,在把缓冲区的内容发送到客户端之前,原来的不发送,改为发送该页面的内容,如果在之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用,这一点应该特别注意. 如下面的例子中(1)会输出index.html的内容,2 不会输出index.html的内容,而是输出out.println("@@@@@@@@@@@@@@@@@"); 中的内容,并且在服务端会抛出:java.lang.IllegalStateException: Response already committed 异常,但客户端没有任何错误输出。
  • (1)


    五、JSP的调试

    JSP的调试比较麻烦,特别是当bean是在一个session中存在时,更加困难。得从好几个页面开始往里面走才行。通常是用out.println()或System.out.print()来打一大堆的信息来查问题。如果是用jbuilder做开发,它能直接调试JSP.不过更重要的是知道错误产生的原因及解决方法。下面对一些JSP编程常见错误进行分析。

    (1).java.lang.NullPointerException异常
    一般是对一个为NULL值的变量进行操作引起的.如下面的操作就会抛出
    java.lang.NullPointerException
    String a = null;
    a.substring(0,1);

    为避免这种异常最好在对变量操作之前检查看它是否为NULL值.如:

    (2).JSP是用JAVA写的,所以它是大小写敏感的,用过其他编程语言的人最容易犯这个错误。另外在浏览器的地址栏中输入的访问JSP的地址也是区分大小写的.如http://localhost:7001/demo/t.jsp与http://localhost:7001/Demo/t.jsp是不一样的

    (3).在jsp中判断字符串要使用compareTo方法,不要用==,因为在java中String变量不是一个简单的变量而是一个类实例,不同的方法会得到 不同的结果,如下所示:

      

  •   String str1="ABCD";
      String str2="ABCD"; (或 String str2="AB"+"CD"; )
      if (str1==str2)
       out.print("yes");
      else
       out.print("no");
      结果是"yes"。
     

  •   String str1,str2,str3;
      str1="ABCD";
      str2="AB";
      str3=str2+"CD";
      if (str1==str3)
       out.print("yes");
      else
       out.print("no");
      结果是"no"。

  • String str1=new String("ABCD");
      String str2=new String("ABCD");
      if (str1==str2)
       out.print("yes");
      else
       out.print("no");
      结果是"no"。

  • String str1=new String("ABCD");
      String str2=new String("ABCD");
      if (str1.compareTo(str2)==0)
       out.print("yes");
      else
       out.print("no");
      结果是"yes"。
  • (4)防止JSP或SERVLET中的输出被浏览器保存在缓冲区中:
    浏览器在默认情况下会把浏览过的网页保存在缓冲区中,在调试时,一般不希望这样.把下面的脚本加入程序中,就可防止JSP或SERVLET中的输出被浏览器保存在缓冲区中

    在IE中也可通过设置实现:把/工具/INTERNET选项/常规/设置/的检察所存页面的较新版本,设为每次访问该页时都检查.

    六、COOKIE

    HTTP COOKIE实质是服务端与在客户端之间传送的普通HTTP头,可保存也可不保存在客户的硬盘上.如果保存,每一个文件大小不超过4K的文本文件.多个COOKIE可保存到同一个文件中. 如果从编程角度来看,在JSP中COOKIE就是JAVA提供的一个类.常用的方法如下所表示,因为客户端可能不接受COOKIE,所以建议不用它,改用SESSION等其他方式。

    public class cookie
    {
    public String getDomain() //返回该COOKIE的有效域
    public int getMaxAge() //返回该COOKIE的有效期,单位为秒
    public String getName() //返回该COOKIE的名称
    public String getPath() //返回该COOKIE的有效路径
    public boolean getSecure() //返回该COOKIE的安全设置
    public String getValue() //返回该COOKIE的值
    public void setDomain(java.lang.String pattern) //设置该COOKIE的有效域
    public void setMaxAge(int expiry) //设置该COOKIE的有效期,单位为秒
    public void setPath(java.lang.String uri) //设置该COOKIE的有效路径
    public void setSecure(boolean flag) //设置该COOKIE的安全设置
    public void setValue(java.lang.String newValue) //设置该COOKIE的值
    }
    一个COOKIE包含以下五部分:
  • NAME/VALUE对,设置该COOKIE的名字及它保存的值
  • COOKIE通常和服务器相关,如果将域设为JAVA.SUN.COM,那么该COOKIE就和这个域相关,只对该网址起作用,当浏览该网址时,浏览器将把该COOKIE的内容发送给服务端,COOKIE是作为HTTP HEADER的一部分被发送的,如果没有设置域,那么COOKIE就只和创建该COOKIE的服务器相关.
  • 路径用于指定服务器上可以使用该COOKIE的文件所在的路径,它只对该网址下的该路径下的应用起作用."/"表示服务器上所有目录都可以使用该COOKIE.
  • COOKIE都有一个有效期,有效期默认值为-1,这表示没有保存该COOKIE,当该浏览器退出时,该COOKIE立即失效.
  • 安全选项true/false,如果设置为true,那么在服务端与在客户端之间传送该COOKIE的内容时,采用HTTPS协议.
  • 如何检查一个客户端是否支持COOKIE的方法:
    用下面的方法写一个COOKIE到客户端,并确认成功
    try
    {
    Cookie c = new Cookie("mycookie","COOKIE TEST");
    response.addCookie(c);
    }
    catch(Exception e)
    {
          System.out.println(e);
    }

    然后在一个新的JSP文件中:用下面的方法取客户端的COOKIE到cookies中, 如果cookies.length ==0,说明该客户端的浏览器不支持COOKIE
    try
    {
    Cookie[] cookies = request.getCookies();
    if(cookies.length ==0)
    {
          System.out.println("not support cookie");
    }
    }
    catch(Exception e)
    {
          System.out.println(e);
    }

    七、JSP和SERVLET的区别:

    SUN首先发展出SERVLET,其功能比较强劲,体系设计也很先进,只是,它输出HTML语句还是采用了老的CGI方式,是一句一句输出,所以,编写和修改HTML非常不方便。 后来SUN推出了类似于ASP的JSP,把JAVA代码嵌套到HTML语句中,这样,就大大简化和方便了网页的设计和修改。ASP,PHP,JSP都是嵌套型的SCRIPT语言。 一个分布式系统应分为三层:表示层,业务逻辑层,数据存取层,在J2EE体系结构中,SERVLET用来写业务逻辑层是很强大的,但是对于写表示层就很不方便。JSP则主要是为了方便写表示层而设计的。ENTITY BEAN实现数据存取层,SESSION BEAN实现业务逻辑层。如果是简单的应用系统,可采用JSP+BEANS的结构进行设计,JSP中应该仅仅存放与表示层有关的东西,也就是说,只放输出HTML网页的部份。而所有的数据计算,数据分析,数据库联结处理,统统是属于业务逻辑层,应该放在JAVA BEANS中。通过JSP调用JAVA BEANS,实现两层的整合。 实际上,微软的DNA技术,简单说,就是ASP+COM/DCOM技术。与JSP+BEANS完全类似,所有的表示层由ASP完成,所有的业务逻辑由COM/DCOM完成。 为什么要采用这些组件技术呢?因为单纯的ASP/JSP语言是非常低效率执行的,如果出现大量用户点击,纯SCRIPT语言很快就到达了他的功能上限,而组件技术就能大幅度提高功能上限,加快执行速度。另外一方面,纯SCRIPT语言将表示层和业务逻辑层混在一起,造成修改不方便,并且代码不能重复利用,采用组件技术就只改组件就可以了。 对于复杂的应用,应该采用ENTITY BEAN实现数据存取层,SESSION BEAN实现业务逻辑层,用JSP来调用SESSION BEAN,由SESSION BEAN调用ENTITY BEAN。即采用JSP+EJB来构建一个复杂的分布式系统。它比JSP+BEAN具有更高的吞吐量,可靠性,安全性。综上所述,对简单应用,可采用JSP+BAEN,对复杂的应用系统,应采用JSP+EJB,SERVLET变的无足轻重。用JSP完全可替代它。


        
     
     

    您可能感兴趣的文章:

  • 初学jsp心得
  • jsp JFreeChart使用心得与例子
  • 学习JSP编程的话,JAVA学到什么样的程度可以开始JSP的学习呢?
  • 谁有Jsp站点设计指南或Jsp高级编程电子书!(主要想学习里面的关于Struts的用法)
  • 学习JSP,用什么开发工具好?JBuilder可以吗?听说它对JSP支持不够!
  • 学习jsp和servlet的问题(相互关系,学习顺序,推荐书籍)。请大家指教。谢谢!
  • 我该怎么学习JSP?
  • 学习jsp
  • 学习jsp应该看什么书
  • 请问学习jsp需要知道哪些知识???
  • 400分寻求有较好学习价值的JSP源代码!
  • JBuilder学习JSP求助
  • 请问,winXP没有了内建的java虚拟机,是不是就意味着winXP下面不可以浏览JSP网页了???请知道的告诉我,谢谢,我在想还有没有必要学习JSP.......
  • 请问各位大虾,什么地方有Jsp学习资料?
  • 我也想学习JSP,好学吗?有分
  • 由于本人刚开始学习JSP,请各位高手指点
  • 怎样学习Jsp能速成???帮忙指点,多谢!!!!
  • 学习jsp比较好的站点、文章、论坛、免费jsp空间,请大家跟贴!!!!!!!!!!!!!!!!
  • java只懂最基本的语法,可以学习Jsp吗?
  • 请高手指点,怎样学习JSP标签库,一定给分,不够在加!
  • 大家推荐自己认为最好的一个jsp学习网站,好么?100分相求~~~~~~
  • 学习jsp+bean,使用jsp:get/setProperty 方法出现错误,请指教
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • JSP中清空cookie代码参考
  • 现有1.jsp、2.jsp、3.jsp三个文件,我怎么在3.jsp文件中得到1.jsp中输入的值?
  • 一个框界网爷包含上下两个网页a1.jsp和a2.jsp,怎么实现a1.jsp自身不变且提交数据到下面的a2.jsp呢?不胜感激,急..
  • 操作系统 iis7站长之家
  • 请问<%@include file="abc.jsp"%>与<jsp:include page="abc.jsp"/>之间的差别
  • response.sendRedirect("index.jsp") 和 <jsp:forward page="index.jsp"/>的区别?
  • 想把一个jsp转到另一个jsp页面,要穿参数,中文的(jsp变量)。谁教教我?!
  • aaa.jsp有如下链接,当单击该链接时将id值传递给bbb.jsp,怎样在bbb.jsp中引用这个id值?
  • jsp+bean还是jsp+ejb还是jsp+servlet还是asp+activex好?
  • 谁能告诉我,怎么调试jsp程序呀!我在jsp中调用java,但是Tomcat这家伙只会给我报jsp文件出错。这可怎么办呀?
  • jsp中如何获得当前jsp文件所在的目录,用request.getServletPath()得到的路径含有jsp文件名,有没有办法得到目录(不含文件名)?
  • 初学jsp,一个html调用一个jsp,这个jsp调用一个javaBean,已编译成类,最后如何部署(用j2sdkee)?
  • 我要学jsp,已经下载了j2ee1.4,需要一个支持jsp引擎的WEB服务器或jsp引擎!!(急,马上给分)
  • jsp中相对路径怎么表示?例如当前目录下的jsp目录里的文件。
  • 我已经在输出前包含了<jsp:include page="2.jsp"/>,
  • 欲学JSP,请教JSP资料,最好电子版。
  • jsp中文乱码 jsp mysql 乱码的解决方法
  • jsp+JavaBean vs jsp+Servlet+JavaBean
  • JSP/html 编辑器 Bravo JSP editor
  • JSP开发入门(五)--JSP其他相关资源
  • <jsp:include page="SystemLeft.jsp?TypeId=<%= itTypeId.toString() %>" flush="true" />


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3