1、用用JSPJSP脚本元素调用脚本元素调用JavaJava代码代码议程议程静态和动态文本静态和动态文本动态代码和好的动态代码和好的JSPJSP设计设计JSPJSP表达式表达式servletservlet和和JSPJSP页面对类似任务的处理页面对类似任务的处理JSP JSP scriptletscriptletJSPJSP声明声明预定义变量预定义变量表达式、表达式、scriptletscriptlet和声明之间的对比和声明之间的对比不同不同JSP构造的应用构造的应用设计策略:限制设计策略:限制JSP页面内的页面内的Java代码代码有两种选择:有两种选择:u将将25行行Java代码直接放在代码直接放
2、在JSP页面中页面中u将这将这25行代码放在单独的行代码放在单独的Java类中,在类中,在JSP页面中用一页面中用一行代码调用它行代码调用它为什么第二种选择更好?为什么第二种选择更好?u开发。我们可以在开发。我们可以在Java开发环境(编辑器或开发环境(编辑器或IDE)中编)中编写单独的类,而非在写单独的类,而非在HTML环境中。环境中。u调试。如果代码中含有语法错误,在编译时就能够直调试。如果代码中含有语法错误,在编译时就能够直接看到。简单的打印语句可以直接看到结果。接看到。简单的打印语句可以直接看到结果。u测试。我们可以编写测试过程,每次更改后都通过循测试。我们可以编写测试过程,每次更改后
3、都通过循环进行上万次的测试。环进行上万次的测试。u重用。多个页面都可以使用同一个类。重用。多个页面都可以使用同一个类。基本语法基本语法HTML文本文本uBlahu不加更改地传递给客户。实际上是由类似于下面的不加更改地传递给客户。实际上是由类似于下面的servlet代码生成:代码生成:out.print(Blah);HTML注释注释uu和其他和其他HTMl一样:直接传递给客户一样:直接传递给客户JSP注释注释uu并不发送给客户并不发送给客户要输出要输出%,使用,使用%脚本元素的类型脚本元素的类型表达式表达式u格式:格式:u求值并插入到求值并插入到servlet的输出中。也就是会产生类似于的输出中
4、。也就是会产生类似于out.print(expression)的语句的语句scriptletu格式:格式:u逐字地插入到逐字地插入到servlet的的_jspService方法中方法中(由由service调调用用)声明声明u格式:格式:u逐字地插入到逐字地插入到servlet类的定义体中,不在任何方法之类的定义体中,不在任何方法之内内JSPJSP表达式表达式格式格式结果结果u表达式被求值,转换成字符串,将按照它在表达式被求值,转换成字符串,将按照它在JSP页面中页面中出现的位置插入到出现的位置插入到HTML页面中。页面中。u即,表达式在即,表达式在out.print内放置在内放置在That i
5、s,expression placed in _jspService inside out.print示例示例u当前时间:当前时间:u您的主机名:您的主机名:XML兼容的语法兼容的语法uJava Expressionu在单个页面中不能混合使用不同的版本。如果使用在单个页面中不能混合使用不同的版本。如果使用jsp:expression就必须整个页面都使用就必须整个页面都使用XML。JSP/servletJSP/servlet的对应的对应 原始的原始的JSPA Random Number 所产生的具有代表性的所产生的具有代表性的servlet代码代码public void _jspService(
6、HttpServletRequest request,HttpServletResponse response)throws ServletException,IOExceptionresponse.setContentType(text/html);HttpSession session=request.getSession(true);JspWriter out=response.getWriter();out.println(A Random Number);out.println(Math.random();.JSPJSP表达式:示例表达式:示例JSP ExpressionsCurre
7、nt time:Server:Session ID:The testParam form parameter:预定义变量预定义变量 requestuHttpServletRequest(service/doGet的第一个参数)的第一个参数)responseuHttpServletResponse(service/doGet的第二个参数)的第二个参数)outu用来将输出发送到客户程序的用来将输出发送到客户程序的Writer(JspWriter带缓带缓冲的版本)冲的版本)sessionu与请求关联的与请求关联的HttpSession(除非用(除非用page指令的指令的session属属性将之禁止)
8、性将之禁止)applicationuServletContext(用于数据共享),可通过(用于数据共享),可通过getServletContext()获取获取servletservlet和和JSPJSP的比较:读取三个参数的比较:读取三个参数(ServletServlet)public class ThreeParams extends HttpServlet public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException out.prin
9、tln(docType+n+title+n+n+title+n+n+param1:+request.getParameter(param1)+n+param2:+request.getParameter(param2)+n+param3:+request.getParameter(param3)+n+n+);servletservlet和和JSPJSP的比较:读取三个参数(的比较:读取三个参数(JSPJSP)Reading Three Request ParametersReading Three Request Parametersparam1:param2:param3:JSP scrip
10、tletJSP scriptlet格式格式u结果结果u代码被逐字地插入到代码被逐字地插入到servlet的的_jspService方法中方法中示例示例uuXML兼容的语法兼容的语法uJava CodeJSP/servletJSP/servlet之间的对应关系之间的对应关系 原始的原始的JSPfoo 所产生的具有代表性的所产生的具有代表性的servlet代码代码public void _jspService(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOExceptionresp
11、onse.setContentType(text/html);HttpSession session=request.getSession();JspWriter out=response.getWriter();out.println(foo);out.println(bar();baz();.JSP scriptletJSP scriptlet:示例:示例假定您希望能够让最终用户定制页面的背景色假定您希望能够让最终用户定制页面的背景色u下面的代码有什么问题下面的代码有什么问题?BODY BGCOLOR=无法进行缺失和异常数据的检查无法进行缺失和异常数据的检查JSP scriptletJSP
12、 scriptlet:示例:示例 Color Testing BODY BGCOLOR=Testing a Background of 使用使用scriptletscriptlet将将JSPJSP文件的某些部分条件化文件的某些部分条件化要点要点uscriplet会被严格按照所写的样子插入到会被严格按照所写的样子插入到servlet中中u不需要是完整的不需要是完整的Java表达式表达式u但完整的表达式常常更清楚且易于维护但完整的表达式常常更清楚且易于维护示例示例%if(Math.random()Have a nice day!Have a lousy day!具有代表性的结果具有代表性的结果if
13、(Math.random()0.5)out.println(Have a nice day!);else out.println(Have a lousy day!);JSPJSP声明声明格式格式u结果结果u代码被逐字地插入到代码被逐字地插入到servlet类的定义中,在任何现有类的定义中,在任何现有方法以外方法以外示例示例uu设计上的考虑设计上的考虑u字段当然有用,但对于方法而言,通常在单独的字段当然有用,但对于方法而言,通常在单独的Java类中定义更好一些。类中定义更好一些。XML兼容的语法兼容的语法uJava CodeJSP/servletJSP/servlet之间的对应关系之间的对应关
14、系原始的原始的JSPSome Heading%!private String randomHeading()return(+Math.random()+);%也可以使也可以使randomHeading成为单独成为单独Java类的静态类的静态方法)方法)JSP/servletJSP/servlet之间的对应关系之间的对应关系 生成的生成的servlet代码代码public class xxxx implements HttpJspPageprivate String randomHeading()return(+Math.random()+);public void _jspService(Ht
15、tpServletRequest request,HttpServletResponse response)throws ServletException,IOExceptionresponse.setContentType(text/html);HttpSession session=request.getSession(true);JspWriter out=response.getWriter();out.println(Some Heading);out.println(randomHeading();.JSPJSP声明:示例声明:示例JSP DeclarationsJSP Decla
16、rationsAccesses to page since server reboot:JSPJSP声明:声明:jspInitjspInit和和jspDestroyjspDestroy JSP页面,如同常规页面,如同常规servlet,有时需要用到,有时需要用到init和和destroy 问题在于:根据问题在于:根据JSP页面构建的页面构建的servlet有可能已经使用了有可能已经使用了init和和destroyu覆盖它们会引发问题。覆盖它们会引发问题。u因此,使用因此,使用JSP声明来声明声明来声明init或或destroy是不合法的。是不合法的。解决方案:使用解决方案:使用jspInit和
17、和jspDestroy。u 根据根据JSP页面生成的页面生成的servlet一定会一定会init和和destroy中调用这些方法,中调用这些方法,而标准版的而标准版的jspInit和和jspDestroy是空的(仅为占位符,由用户覆盖。是空的(仅为占位符,由用户覆盖。public void jspInit()System.out.println(this is jspInit in +this);public void jspDestroy()System.out.println(this is jspDestroy in +this);JSPJSP声明和预定义变量声明和预定义变量 问题问题u
18、预定义变量预定义变量(request,response,out,session,等等)是是_jspService方法方法中的局部变量。因而,由中的局部变量。因而,由JSP声明定义的方法或辅助类中的方法声明定义的方法或辅助类中的方法都不能使用它们。怎么处理这种情况呢?都不能使用它们。怎么处理这种情况呢?解决方案:将它们作为参数传递,例如解决方案:将它们作为参数传递,例如 要注意:要注意:JspWriter的的println方法抛出方法抛出IOException异常异常u使用使用println的方法要使用的方法要使用“throws IOException”表达式、表达式、scriptletscri
19、ptlet和声明的对比和声明的对比 任务任务1u输出由从输出由从1到到10之间的之间的5个随机整数构成的项目列表。个随机整数构成的项目列表。由于本页的结构固定,并且对于由于本页的结构固定,并且对于randomInt方法,我们使用单独的辅方法,我们使用单独的辅助类,助类,JSP表达式完全能够胜任。表达式完全能够胜任。任务任务2u生成生成1到到10数据项构成的列表(随机选定),每一项为数据项构成的列表(随机选定),每一项为1到到10之间之间的整数。的整数。由于列表中的数据项是动态的,所以需要由于列表中的数据项是动态的,所以需要JSP scriptlet。任务任务3u在首次请求时生成一个随机数,然后
20、向所有的用户展示这个随机在首次请求时生成一个随机数,然后向所有的用户展示这个随机数,直到服务器重新启动。数,直到服务器重新启动。实例变量(字段)是完成这种持续性的自然方式。使用实例变量(字段)是完成这种持续性的自然方式。使用JSP声明来完声明来完成这项任务。成这项任务。辅助类:辅助类:RanUtilitiesRanUtilitiespackage XXX;/Always use packages!public class RanUtilities/*A random int from 1 to range(inclusive).*/public static int randomInt(int
21、 range)return(1+(int)(Math.random()*range);public static void main(String args)int range=10;try range=Integer.parseInt(args0);catch(Exception e)/Array index or number format/Do nothing:range already has default value.for(int i=0;i100;i+)System.out.println(randomInt(range);任务任务1 1:JSPJSP表达式(代码)表达式(代码
22、)Random NumbersRandom Numbers任务任务2 2:JSP scriptletJSP scriptlet(代码:版本(代码:版本1 1)Random List(Version 1)Random List(Version 1)%int numEntries=XXX.RanUtilities.randomInt(10);for(int i=0;inumEntries;i+)out.println(+XXX.RanUtilities.randomInt(10);%任务任务2 2:JSP scriptletJSP scriptlet(代码:版本(代码:版本2 2)Random L
23、ist(Version 2)Random List(Version 2)%int numEntries=XXX.RanUtilities.randomInt(10);for(int i=0;i任务任务3 3:JSPJSP声明(代码)声明(代码)Semi-Random NumberSemi-Random Number:小结小结 JSP表达式表达式u格式:格式:u封装到封装到out.print中,并插入到中,并插入到_jspService JSP scriptletu格式:格式:u逐字地插入到逐字地插入到servlet的的_jspService方法中方法中 JSP声明声明u格式:格式:u逐字地插入到逐字地插入到servlet类的定义体中类的定义体中 预定义变量预定义变量urequest,response,out,session,application 限制直接放在页面中的限制直接放在页面中的Java代码代码u考虑使用辅助类、考虑使用辅助类、bean、servlet/JSP的组合的组合(MVC)、JSP表达式语表达式语言、定制标签。言、定制标签。
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。