学习JSP,我们应该懂的

   学习JSP都半年多了,今天就自己的认识说说学习JSP应该懂的知识点。一来是为了学习中知识的沉淀;二来是为了和大家分享一下学习心得,希望对JSP初学者在学习和理解过程中起到一点点的作用。

一、 我也说说学习JSP


     以下仅是个人的胡言乱语,如有说错还请指出,我不是一个谦虚的人,只是自己JAVA道行尚浅,不敢充高手,要不说多自然露馅。
     JSP是JAVA学习的延伸,如果你对java知识掌握的比较牢固了,学习起JSP就小菜一碟了。碰到问题,一般来说,查阅一下J2EE 的API就能解决。所以,同志们,如果你觉得学习JSP很难上手,很多知识点理解不了,那肯定是你的java的地基打得不够深,最多只能做5层楼高,如想做10层甚至更高,还是回去看看java吧。但话又说回来了,是不是得把java学个通透了才开始学JSP呢?当然不是,我想也没人会这样做,我之所以有上一说,是想和JSP初学者说:学JSP的过程中,还要多点回去看看想想java的知识点。如:
          1. String s = " Hello World!"; 这句话我们都声明了什么?
          2. JAVA程序的内存管理,程序运行中是如何分配内存的?
          3. Java中是传值还是传引用?
          4. ………………..
     这样的知识点太多啦,如抽象类和接口的区别,如果都深入理解,我相信还是需要一定的时间和精力的。此外,学习java一定要注重理解OO思想,这是面向对象程序编程的根本。
你如果选择了JSP,这也代表你选择进入J2EE的体系。JSP只是J2EE体系里的一小块,之后你还要学习Servlet、javabean、JDBC、MVC、JNDI等等,单是这名词要你记住都需花一定的时间,更别说学习、理解了。除此之外,还有那些乱七八糟的框架,什么struts、spring、hibernate等等。是不是觉得要学的东西太多了,是不是有点想打退堂鼓了。其实上面的都不难学,前提是你的java基础打得好,哈哈。我现在对SSH框架也仅限于了解,对于在项目中加入框架的明显好处还感觉不到,对于这些框架的设计思想还不了解,我也和你们一样努力ing。J2EE框架多如牛毛的弊端也是高手们经常讨论的,当然,这不是今天讨论的范围,我还不是高手呢。我说这么多只是想JSP初学者提个醒:JAVA基础很重要,仅此无它。

二、 JSP中的四种属性范围及九个内置对象


     JSP中有四种属性范围,属性范围从小到大依次是:page、request、session、application。
     page属性范围是在一个页面内;
     request属性范围是在一个请求之内;
     session属性范围是在一次会话之内,主要验证用户是否登录之类;
     application属性范围是在应用服务器之内,主要用于在线人数统计;
     你看了上面这样的描述,是不是还觉得一头雾。你别急,且听我慢慢道来,为了更好的表达这四种范围,先看看九个内置对象先,它们分别是:

     1. request     主要作用是取得客户端数据,数据流动方向是:客户端---服务器端
     2. response    主要作用是返回数据到客户端,数据流动方向是:服务器---客户端
     3. session     主要作用是保存用户的各种信息
     4. application 保存信息,全部用户间共享
     5. pageContext
     6. out         输出缓冲流,向客户端输出数据,最好别用,用<%=%>代替
     7. config       取得服务器端的初始化配置
     8. page        表示JSP页面Servlet的一个实例,相当java中的this
     9. exception    表示未捕获的异常与错误

     如何快速学习这九个内置对象呢?立刻打开IDE(我是赞成初学者直接用Eclipse等IDE的,至于理由不说,它不是今天的主题)写JSP代码,碰到问题怎么办,查阅J2EE API。譬如说,你想编写个显示用户IP地址的功能,你想想看,IP地址肯定是存在客户端,你应该去哪个对象中找读取IP地址这个方法呢?同志们,Think,数据是从客户端流行服务端的,当然是request对象啦,然后查阅:javax.servlet.http.HttpServletRequest接口,看看是否提供了这功能,查啊查,查啊查,你会发现javax.servlet.http.HttpServletRequest接口没有这个方法,看看该接口是否有父接口,有,是:javax.servlet.ServletRequest接口,打开父接口继续查啊查,有了:
String getRemoteAddr();
它的描述是这样的:Returns the Internet Protocol (IP) address of the client or last proxy that sent the request.

      恭喜你,你找到。至于之后如何用,相信你也知道了。我在这里就只举一个例子,碰到问题都是如此这般解决。看到这里,大家主要是掌握其中解决问题的方法,而不是记住读取客户端IP地址的方法在javax.servlet.ServletRequest中(如能记住更好,呵呵)。看到这里也许有人会问,每次都这样找那不是很麻烦吗?头一两次的确挺麻烦的,不过你用多了自然记住了,曾经看过这样一句话:“学技术,无他,唯熟能生巧”,且不论它是不是百分百正确,但它的确说明了多写对学编程技术来说很好很重要。到这里,大家又有一个疑问:你怎么知道request对象是javax.servlet.http.HttpServletRequest的实例化呢?见下图:

 

上图中斜字体的是接口,正字体的是类。
     这九个内置对象就写到这里。是时候说回那四种属性范围了。再看看上图,在属性范围这一列你能看出点什么啊,你会发现request、session、application都只出现一次,其他的都是page属性范围,说出这点是为了记住各内置对象的属性范围。该如何说明四种属性范围呢?你多用void setAttribute(String name, Object o)和Object getAttribute(String name)这两个函数试试看。其中必须得说的是:page属性范围该这样用:
   pageContext. setAttribute (String name, Object o);
   pageContext. getAttribute (String name);
   request属性范围的如下:
   request. setAttribute (String name, Object o);
   request. getAttribute (String name);
session和application的属性范围也如此用就可以啦。你多用几次就自然明白四种属性范围啦。技术就是这样,懂的人和不懂的人看同样的几句话,懂的人很自然知道说什么,不懂的人只能从中文去理解这几句话的意思,仅仅盯着这几句话看想更深入的了解很难,只有立刻编写,运行看看,才是最快的掌握途径。

编写JSP文件有以下几点需注意的:
   1. 尽量使用表达式输出代替out.println();
   2. 属性范围如能使用page就不使用request,如能使用request就不使用session,如能使用session就 不使用application
   3. 出于安全考虑,JSP页面一般都不引入java.sql包
   4. JSP中尽量只做显示的工作,其他的如控制就交给Servlet。

三、 JSP中七种标签(动作)指令


     1. <jsp:include page=" " />将一个页面动态包含到JSP文件中,第五点有介绍;
     2. <jsp:forward page=" " />服务器端跳转,第四点有介绍;
     3. <jsp:useBean id=" " class=" " scope=" " />主要是通过JavaBeans来扩充JSP的功能;
     4. <jsp:setProperty name=" " property=" "/>用于向javabean的属性赋值;PS:此处name的属性和 <jsp:useBean />中的id相对应;
     5. <jsp:getProperty name=" " property=" "/>取得javabean中的某个属性;PS:此处name的属性和<jsp:useBean />中的id相对应;
     6. <jsp:param name=" " value=" " />通常被包含在<jsp:include />、<jsp:forward />、<jsp:plugin />中,用来传递参数,第五点有一个例子说明;
     7. <jsp:plugin />它提供了一种在JSP文件种嵌入客户端运行的JAVA(如:Applet)程序,该功能很少用。


   这七种动作指令没什么好解释的,如有不解,照着书本的例子试一次就可以啦。

四、 JSP中两种跳转的区别


   JSP中有两种跳转,一种是客户端跳转,其形式为:response.sendRedirect("URL "),与之
相对应的另一种是服务器端跳转,其形式为:<jsp: forward page=" "/>。其区别如下几点:
   1. 客户端跳转,浏览器地址栏变化跳转,服务器跳转不变化跳转;
   2. 服务器端跳转是无条件跳转,在此之后的代码不再执行便跳转,客户端跳转执行完全部代码才跳转;
   3. 服务端跳转还是属于一次请求范围内,也就是保持request属性,客户端跳转属下一次请求,当然不能保持request属性;
   4. 客户端跳转传递参数通过重写URL地址,服务器端跳转通过<jsp:param name=" " value=" " />传递参数。

五、 JSP中两种包含的区别


     JSP中有两种文件包含方式,一种是静态包含,其形式为:<% @include file="URL " %>,与之相对应的另一种是动态包含,其形式为:<jsp:include page="URL " />。其区别主要有以下两点:
          1. 静态包含的处理方式:先包含后处理。举例说吧,假如B文件(可以为任何文件,如:txt、html等,当然也可以是JSP)被包含在A文件(JSP)中,当运行到A文件的时候,服务器先将B文件的所有内容copy到A文件中,再处理A文件。

            动态包含的处理方式:先处理后包含。还用上面的例子吧,假如B文件(可以为任何文件,如:txt、html等,当然也可以是JSP)被包含在A文件(JSP)中,如果B文件为txt、html等静态文件,其处理与静态包含无异;如果B文件为JSP等动态文件,服务器先处理了B文件,然后将B文件的处理结果包含到A文件中。

          2. 动态包含的处理方式还可以传递参数,其形式为:
               < jsp:include page = “URL”>
                <jsp:param name ="parameter1" value = "value1 "/>
                 <jsp:param name ="parameter2" value = " value2"/>
                 ……….
               </ jsp:include >
          假如B文件被包含在A文件(JSP)中,A文件通过加入以上代码可以传递值到B文件,当然啦,这要求B文件也要求是动态文件,否则传了B也接收不了。

           一般而言,用动态包含就足够,而且动态包含比较好用。

六、 JSP与Servlet之间的联系与区别


     在网上,看到很多人在讨论JSP和Servlet之间的联系与区别,我也用我自己的语言表达一下。在技术发展上,是先有了Servlet后才出现JSP的:

     为了使得java语言也能开发B/S结构的WEB应用程序,SUN公司首先提出了Servlet技术体系,随着Servlet的技术推广开来,人们发现Servlet不善于显示页面效果,而且编写显示过于繁琐。鉴于此,SUN公司推出了JSP(也就是Servlet1.1),据说,SUN公司推出JSP的第一版本的时候,不但希望JSP更容易美工,还希望JSP能从根本上取代Servlet。但事实告诉SUN,JSP取代不了Servlet,因为仅仅存有JSP会使得JSP中有大量的服务端代码(美工人员大部分是看不懂的),这给美工人员带来麻烦,减低了工作效率。与此同时也减低了服务端代码编写人员的工作效率,也不利于程序的维护。这就有JSP的后续版本,SUN公司推荐大家使MVC模式设计WEB程序:用Servlet控制逻辑(C-control),用JSP实现显示(V-view)。看了这俩技术的发展史,大家是不是对Servlet和JSP有了一个感性的认识了,是不是觉得Servlet和JSP差别很大,是不是觉得它们不是一回事了。错,他们是同一回事,请继续往下看,希望能给你们一个理性的认识:

     JSP中有九个内置对象,之所以称之为内置对象,是因为这九个对象不用实例化就可以直接用的,在JAVA语言中有这样一个规定:一个对象必须先实例化才能使用。为什么那九个内置对象不用呢?其实不是这九个内置对象没有实例化,而是我们的程序运行容器(Tomcat等)事前对他们实例化啦。扯远啦,回正题,拿request内置对象说说JSP和Servlet为什么就是一回事吧。我们都知道,request内置对象是javax.servlet.http.HttpServletRequest的接口的实例化,它的父类接口是:javax.servlet.ServletRequest,你看看你以前写的Servlet程序,是不是在里面也经常导入javax.servlet.http包中的类和接口啊。也就说:request内置对象其实就在Servlet体系下。其实从JSP刚开始发布的另一个名字也可以说明问题:JSP第一版又名Servlet1.1;还有一个我们必须要知道的:JSP文件第一次被调用是编译成Servlet。

     我的理解是这样的:JSP和Servlet都是瓶子,我们将JSP这个瓶子的腰弄小一点,使其身材为线条型,以之为花瓶,Servlet就普通瓶子一个。从远处看,它们很不一样,走进一点,你会发现:哦,它们都是瓶子。

     关于JSP和Servlet之间的联系与区别就写到这里,相信各位对JSP和Servlet间的关系都有个了解,希望对你们有帮助。

七、 写在最后


     这几天每天都抽几十分钟写写,终于写完了。洋洋几千字,还是那句:希望对初学者有个帮助,我是不是很伟大啊,哈哈。其实我写有一个很重要的目的就是为以后用到JSP时的复习,与此同时,还锻炼一下自己的文笔,快到大学毕业啦,才感到语文的重要,Wish me good luck!


                                       完成于2008-3-19凌晨

***************************************************************************
* 不是我说的深奥,只是听的人有觉悟了 ,自然觉得深奥。*
***************************************************************************

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值