• 1. 第四章 JSP技术基础知识JSP(Java Server Page)是SUN公司开发的一种服务器端的脚本语言,自从1999年推出以来,逐步发展为开发Web应用一项重要技术。JSP可以嵌套在HTML中,而且支持多个操作系统平台,一个用JSP开发的Web应用系统,不用做什么改动就可以在不同的操作系统中运行。在本章接下来的内容中,首先将简单介绍JSP的运行原理和基本语法,然后重点介绍在实际开发过程中技巧和方法。
  • 2. 4.1 JSP简介JSP本质上就是把Java代码嵌套到HTML中,然后经过JSP容器的编译执行,可以根据这些动态代码的运行结果生成对应的HTML代码,从而可以在客户端的浏览器中正常显示。在这个小节中将介绍JSP的运行原理、JSP的优点和其运行环境的搭建。
  • 3. 4.1.1 运行原理如果JSP页面是第一次被请求运行,服务器的JSP编译器会生成JSP页面对应的Java代码,并且编译成类文件。当服务器再次收到对这个JSP页面请求的时候,会判断这个JSP页面是否被修改过,如果被修改过就会重新生成Java代码并且重新编译,而且服务器中的垃圾回收方法会把没用的类文件删除。如果没有被修改,服务器就会直接调用以前已经编译过的类文件。(具体内容请参照书。)
  • 4. 4.1.2 选择JSP的原因在Web应用开发中,可供选择的动态页面语言技术有很多,例如PHP,ASP,JSP等,在这些动态页面语言中,JSP凭借其自身的优点成为开发人员最喜欢的语言之一。下面列出的几条就是开发人员钟爱JSP的重要原因。
  • 5. 4.1.3 环境搭建要运行JSP程序,必需为其提供一个JSP容器,也就是需要一个Web服务器。支持JSP的服务器非常多,Tomcat、Resin、Weblogic、WebSphere等对JSP的支持都非常好,但是由于Weblogic和WebSphere都是功能非常强大的重量级服务器,而且价格昂贵,对计算机的硬件配置要求也比较高,所以在一般情况下,如果只用到JSP的技术,是没有必要选择这两个服务器的。(具体内容请参照书。)
  • 6. 4.2 JSP基本语法本书的重点内容是介绍基于JSP的Web开发技术,对于Java的语法在此不做详细的介绍,这里所涉及JSP语法指的是在JSP中所特有的语法规范,在接下来的章节中将假设读者已经了解Java的基本语法,只介绍JSP的结构、变量声名、表达式、动作、指令等JSP的特有语法。如对Java语法有疑问的读者可以参考相关语法书籍。
  • 7. 4.3 程序结构JSP就是把Java代码嵌套在HTML中,所以JSP程序的结构可以分为两大部分:一部分是静态的HTML代码;另一部分是动态的Java代码和JSP自身的标签和指令;当JSP页面第一次被请求的时候,服务器的JSP编译器会把JSP页面编译成对应的Java代码,根据动态Java代码执行的结果,生成对应的纯HTML的字符串返回给浏览器,这样就可以把动态程序的结果展示给用户。(具体内容请参照书。)
  • 8. 4.4 JSP动作指令在Web程序涉及中经常需要用到JSP的动作指令,例如在使用JavaBean的时候就离不开userBean的指令,JSP的强大功能和它丰富的动作指令标签是分不开的。在接下来的章节中将对这些指令进行详细的介绍,读者可以仔细体会每个动作的示例程序,在示例程序中掌握这些动作指令的基本用法。
  • 9. 4.4.1 include动作指令include动作指令可以在JSP页面中动态包含一个文件,这与include指令不同,前者可以动态包含一个文件,文件的内容可以是静态的文件也可以是动态的脚本,而且当包含的动态文件被修改的时候JSP引擎可以动态对其进行编译更新。而include指令仅仅是把一个文件简单的包含在一个JSP页面中,从而组合成一个文件,仅仅是简答的组合的作用。其功能没有include动作指令强大。(具体内容请参照书。)
  • 10. 4.4.2 forward 动作指令forward动作指令可以用来控制网页的重定向。即从当前页面跳转到另一个页面。 forward动作的使用方法非常简单,具体使用格式如下。
  • 11. 4.4.3 param动作指令在上面forward动作指令中可以用程序控制页面的跳转,如果需要在跳转的时候同时传递参数,这时候就需要用到param动作指令。param动作指令的具体使用方法可以参考下面的示例程序。(具体内容请参照书。)
  • 12. 4.4.4 plugin动作指令元素用于在浏览器中播放或显示一个对象(典型的就是applet和bean),而这种显示需要在浏览器的java插件。当jsp文件被编译,送往浏览器时,元素将会根据浏览器的版本替换成或者元素。
  • 13. 4.4.5 useBean动作指令useBean动作指令可以在JSP中引用JavaBean,这个动作指令在实际开发过程中经常会用到。在第六章JavaBean的讲解过程中将对这个动作指令做详细的介绍。在这里我们仅仅知道其基本用法即可,而且在这里不在用示例程序说明。useBean的使用格式如下。 其中id为所用到的JavaBean的实例对象名称,class是JavaBean对应类的包路径,包括包名和类名。scope是这个JavaBean的有效范围,共有page、request、session、application四个值可以选择。
  • 14. 4.4.6 setProperty动作指令setProperty一般情况下是和JavaBean配合使用的,用来给JavaBean的实例对象进行赋值操作,setProperty的基本方法有以下两种。 上面这种方法是setProperty动作指令最基本的用法,用来给JavaBean实例对象的某一个属性赋值。 上面这种JavaBean的赋值方法也是经常用到的,
  • 15. 4.4.7 getProperty动作指令getProperty一般情况下也是和JavaBean配合使用的,用来取出JavaBean实例对象的属性值。这个动作指令的基本使用方法如下。
  • 16. 4.5 JSP指令JSP的指令虽然没有动作指令那么丰富,但是其作用却是不容忽视的,例如page指令,在设置显示编码、引入类的包路径、设置错误页面等方面都是必不可少的。在接下来的章节中将介绍JSP的两个指令标签。
  • 17. 4.5.1 page指令page指令可以用来定义JSP也面的全局属性。例如编码、错误页面等。page指令的属性很多,下面来具体介绍它的各个属性。(具体内容请参照书。)
  • 18. 4.5.2 include指令include指令可以在当前的JSP页面中包含一个文件,从而和当前页面组成一个整体的文件。这中包含仅仅是静态包含。(具体内容请参照书。)
  • 19. 4.6 JSP内置对象简介JSP内置对象即无需声名就可以直接使用的对象实例,在实际的开发过程中,比较常用的JSP内置对象有reqest、response、session、out、application等,在接下来的章节中将详细介绍这几个JSP内置对象的使用方法。JSP其他的几个内置对象在实际的开发中并不十分常用,在这里不做具体介绍。
  • 20. 4.7 request对象request对象代表这从用户发送过来的请求,从这个对象中间可以取出客户端用户提交的数据或者是参数。这个对象只有接受用户请求的页面才可以访问。
  • 21. 4.7.1 request对象使用场合如果要与用户的互动,必须要知道用户的需求,然后根据这个需求生成用户期望看到的结果。这样才能实现与用户的互动。在Web应用中,用户的需求就抽象成一个request对象,这个对象中间包括用户所有的请求数据,例如通过表单提交的表单数据,或者是通过URL等方式传递的参数,这些就是用户的需求。request正是用来收集类似这些用户的输入数据和参数。同时,request对象中还包括一些服务器的信息,例如端口、真实路径、访问协议等信息,通过request对象可以取得服务器的这些参数。
  • 22. 4.7.2 request对象主要方法request对象的方法非常多,在这里我们只介绍其中最常用的几种方法,其他方法可以参考相关类库的介绍。(具体内容请参照书。)
  • 23. 4.7.3 request对象使用示例1.使用request对象取得表单数据 request获取用户数据的一个主要方式就是获取表单数据,(具体内容请参照书。)
  • 24. 4.8 response对象response对象是服务器端向客户端返回的数据,从这个对象中间可以取出一部分与服务器互动的数据和信息。只有接受这个对象的页面才可以访问这个对象。
  • 25. 4.8.1 response对象使用场合既然用户可以对服务器发出请求,服务器就需要对用户的请求做出反应。这里服务器就可以使用response对象向用户发送数据。response是对应request的一个对象。如果需要获取服务器返回的处理信息,就可以对response进行操作,同时当服务器需要再客户端进行某些操作的时候也需要用到response对象,例如服务器要在客户端生成Cookies,那么这时候response对象就是一个很好的选择。
  • 26. 4.8.2 response对象主要方法response的方法也很多,但是常用的也就其中的几个,下面介绍比较常用的几个方法。1.addCookie(Cookie cookie)这个方法可以添加一个Cookie对象,用来保存客户端的用户信息。 2.containsHeader(String name)这个方法判断指定的头信息是否存在。(具体内容请参照书。)
  • 27. 4.8.3 response对象使用示例response的用法很多,在这里我们用response来实现一个页面的重定向,
  • 28. 4.9 session对象session对象维护着客户端用户和服务器端的状态,从这个对象中间可以取出用户和服务器交互的过程中的数据和信息。这个对象在用户关闭浏览器离开Web应用之前一直有效。
  • 29. 4.9.1 session对象使用场合session对象中保存的内容是用户与服务器整个交互过程中的信息,如果是想在整个交互的过程中都可以访问到的信息,就可以选择存放在session对象中。例如在用户登录的过程中,可以在session中记录用户的登录状态,这样用户就不必在每个页面都重新登录,只要用户没有离开当前的Web应用系统,就可以一直保存登录的状态。
  • 30. 4.9.2 session对象主要方法session所提供的方法并没有前面几个内置对象那么多,但是基本都是非常常用的。
  • 31. 4.9.3 session对象使用示例在这里我们模拟一个简单的用户登录动作,在这个示例程序中,我们不对提交的登录信息做具体的验证,只要用户名和密码都不为空就可以登录系统,这样处理只是为了方便展示session的使用方法,在具体的开发中必须要对登录信息进行验证的。(具体内容请参照书。)
  • 32. 4.10 out对象这个对象是在Web应用开发过程中使用最多的一个对象,其功能就是动态的向JSP页面输出字符流,从而把动态的内容转化成HTML形式来展示。这个对象在任何JSP页面中都可以任意访问。
  • 33. 4.10.1 out对象使用场合out对象的功能就是向JSP页面输出数据信息。所以当有动态信息要展示给用户的时候就要用到out对象。在前面的很多示例中已经多次用到这个对象,读者从中可以很清楚的看到,out对象就是用来输入动态内容信息的。
  • 34. 4.10.2 out对象主要方法在这里只介绍out对象最常用的方法。 1.clear() 这个方法可以清除缓冲区的数据,但是仅仅是清除,并不向用户输出。 2.clearBuffer() 这个方法可以清除缓冲区的数据,同时把这些数据向用户输出。(具体内容请参照书。)
  • 35. 4.10.3 out对象使用示例out对象在前面的示例中已经多次使用到,在这里就不再针对这个对象举例说明。
  • 36. 4.11 application对象application对象保存着整个Web应用运行期间的全局数据和信息,从Web应用开始运行开始,这个对象就会被创建,在整个Web应用运行期间可以在任何JSP页面中访问这个对象。
  • 37. 4.11.1 application对象使用场合application中保存的信息可以在整个应用的任何地方访问,这个session对象类似,但和session对象还是有所区别的。只要Web应用还在正常运行,application对象就可以访问,而session对象在用户离开系统就被注销。
  • 38. 4.11.2 application对象主要方法下面介绍application对象的最常用的主要方法。 1.getAttribute(String name) 2.getServerInfo() 3.removeAttribute(String name) 4.setAttribute(String name,Object o)
  • 39. 4.11.3 application对象使用示例在这里我们要实现一个简单的计数器,这个计数器就是利用application对象来储存计数器的值,用来统计服务器开始运行以来的访问量。
  • 40. 4.12 JSP中文问题完全解决方案对于中文乱码问题’Java中才用的默认编码方式是Unicode,而中文的编码方式一般情况是GB2312,因为编码格式的不同,导致在中文不能正常显示。在不同的JDK版本和不同的应用服务器中的处理方法是不同的。但是其本质上都是一样的,就是把中文字符转化成合适的编码方式,或者是把在显示中文的环境中声名采用GB2312的编码。统一编码方案之后自然可以正常显示。
  • 41. 4.12.1 JSP页面中文乱码在JSP页面中,中文显示乱码有两种情况:一种是HTML中的中文乱码,另一中是在JSP中动态输出的中文乱码。(具体内容请参照书。)
  • 42. 4.12.2 URL传递参数中文乱码在一般情况下,可以用类似http://localhost:8080/chapt4/URLCharset.jsp?param='中文'这种形式来传递参数,而且HTML在处理表单的时候,当表单的method采用get方法的时候,传递参数的形式与URL传递参数的形式基本一样。(具体内容请参照书。)
  • 43. 4.12.3 表单提交中文乱码对于表单中提交的数据,可以使用request.getParameter("")的方法获取。但是当表单中如果出现中文数据的时候就会出现乱码。(具体内容请参照书。)
  • 44. 4.12.4 数据库操作中文乱码在建立数据库的时候,应该选择支持中文的编码格式,最好能和JSP页面的编码格式保持一致,这样就可以尽可能减少数据库操作的中文乱码问题。同时在JDBC连接数据库的时候可以使用类似下面这种形式的URL。jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs;useUnicode=true;characterEncoding=gb2312
  • 45. 4.12.5 Eclipse开发工具中JSP文件中文不能保存在Eclipse中,JSP文件默认的编码格式为ISO-8859-1,所以在JSP代码中间如果出现中文就不能保存,
  • 46. 4.12.6 Eclipse开发工具中中文显示乱码在Eclipse中,由于默认的JSP编码格式为ISO-8859-1,所以当打开由其他编辑器编辑的JSP页面就会出现乱码,(具体内容请参照书。)
  • 47. 4.12.7 JSP下载中文文件名乱码在实现文件下载功能的时候,如果出现中文文件名,如果不进行特殊的处理,下载下来的中文文件名会变成乱码,在下载前,就需要对这个文件名进行处理,然后才能正常显示中文的文件名,
  • 48. 4.13 其他JSP开发技巧(具体内容请参照书。)
  • 49. 4.13.1 自定义错误页面在JSP中,如果出现代码的错误,就会直接在页面上打印类似
  • 50. 4.13.2 在MyEclipse中快速部署项目在Web应用开发的过程中,部署项目往往十分麻烦,虽然在后续章节中介绍的Ant可以非常方便的完成这个任务,但是Ant复杂的操作不适合初学者,在这里我们使用前面推荐的MyEclipse这个集成开发工具来部署项目。MyEclipse的安装在前面第二章中已经详细介绍,在这里直接开始介绍如何发布Web应用项目。要想发布部署一个项目,首要任务就是把MyEclipse和服务器Tomcat联系起来,
  • 51. 4.13.3 测试配置是否成功下面来测试下配置是否成功(具体内容请参照书。)
  • 52. 4.13.3 在MyEclipse中调试Web应用程序在MyEclipse中,对JSP页面进行调试也是非常方便的,如果需要调试JSP页面,只需要在JSP页面源代码的左侧双击鼠标左键,(具体内容请参照书。)
  • 53. 4.13.4 学习使用日志Log4j在JSP Web开发中,有很多方便的日志工具可供选择,利用这些日志工具可以很方便的对系统中的错误信息进行管理,在这里我们选择使用Log4j,Log4j是目前JSP开发中使用最多的日志工具。Log4j按照严重程度给日志风味5个等级:DEBUG(调试)、INFO(提示)、WARN(警告)、ERROR(错误)、FATAL(严重错误)
  • 54. 4.14 小结在本章中,对JSP的基本语法和对象等知识进行了系统的介绍,而且对于其中大部分的知识点都给出了具体示例,这些示例在具体的开发过程中都有很大的参考价值,读者可以在这些示例程序的基础上进行尝试,试着修改其中的功能,只有这样才肯定能对其运行原理有更深入的了解和体会,这就是学习程序语言的最基本最有效的方法。