资源描述
用JSP脚本元素调用Java代码,用JSP脚本元素调用Java代码,议程,静态和动态文本,动态代码和好的JSP设计,JSP表达式,servlet和JSP页面对类似任务的处理,JSP scriptlet,JSP声明,预定义变量,表达式、scriptlet和声明之间的对比,议程静态和动态文本,不同JSP构造的应用,不同JSP构造的应用,设计策略:限制JSP页面内的Java代码,有两种选择:,将25行Java代码直接放在JSP页面中,将这25行代码放在单独的Java类中,在JSP页面中用一行代码调用它,为什么第二种选择更好?,开发。我们可以在Java开发环境(编辑器或IDE)中编写单独的类,而非在HTML环境中。,调试。如果代码中含有语法错误,在编译时就能够直接看到。简单的打印语句可以直接看到结果。,测试。我们可以编写测试过程,每次更改后都通过循环进行上万次的测试。,重用。多个页面都可以使用同一个类。,设计策略:限制JSP页面内的Java代码有两种选择:,基本语法,HTML文本,Blah,不加更改地传递给客户。实际上是由类似于下面的servlet代码生成:out.print(Blah);,HTML注释,和其他HTMl一样:直接传递给客户,JSP注释,并不发送给客户,要输出%,使用%,基本语法HTML文本,脚本元素的类型,表达式,格式:,求值并插入到servlet的输出中。也就是会产生类似于out.print(expression)的语句,scriptlet,格式:,逐字地插入到servlet的_jspService方法中(由service调用),声明,格式:,逐字地插入到servlet类的定义体中,不在任何方法之内,脚本元素的类型表达式,JSP表达式,格式,结果,表达式被求值,转换成字符串,将按照它在JSP页面中出现的位置插入到HTML页面中。,即,表达式在out.print内放置在That is,expression placed in _jspService inside out.print,示例,当前时间:,您的主机名:,XML兼容的语法,Java Expression,在单个页面中不能混合使用不同的版本。如果使用jsp:expression就必须整个页面都使用XML。,JSP表达式格式,JSP/servlet的对应,原始的JSP,A Random Number,所产生的具有代表性的servlet代码,public void _jspService(HttpServletRequest request,HttpServletResponse response),throws ServletException,IOException,response.setContentType(text/html);,HttpSession session=request.getSession(true);,JspWriter out=response.getWriter();,out.println(A Random Number);,out.println(Math.random();,.,JSP/servlet的对应原始的JSP,JSP表达式:示例,JSP Expressions,Current time:,Server:,Session ID:,The testParam form parameter:,JSP表达式:示例,预定义变量,request,HttpServletRequest(service/doGet的第一个参数),response,HttpServletResponse(service/doGet的第二个参数),out,用来将输出发送到客户程序的Writer(JspWriter带缓冲的版本),session,与请求关联的HttpSession(除非用page指令的session属性将之禁止),application,ServletContext(用于数据共享),可通过getServletContext()获取,预定义变量request,servlet和JSP的比较:读取三个参数(Servlet),public class ThreeParams extends HttpServlet,public void doGet(HttpServletRequest request,HttpServletResponse response),throws ServletException,IOException,out.println(docType+,n+,+title+n+,n+,+title+n+,n+param1:,+request.getParameter(param1)+n+,param2:,+request.getParameter(param2)+n+,param3:,+request.getParameter(param3)+n+,n+);,servlet和JSP的比较:读取三个参数(Servlet),servlet和JSP的比较:读取三个参数(JSP),Reading Three Request Parameters,Reading Three Request Parameters,param1:,param2:,param3:,servlet和JSP的比较:读取三个参数(JSP)!DO,JSP scriptlet,格式,结果,代码被逐字地插入到servlet的_jspService方法中,示例,XML兼容的语法,Java Code,JSP scriptlet格式,JSP/servlet之间的对应关系,原始的JSP,foo,所产生的具有代表性的servlet代码,public void _jspService(HttpServletRequest request,HttpServletResponse response),throws ServletException,IOException,response.setContentType(text/html);,HttpSession session=request.getSession();,JspWriter out=response.getWriter();,out.println(foo);,out.println(bar();,baz();.,JSP/servlet之间的对应关系原始的JSP,JSP scriptlet:示例,假定您希望能够让最终用户定制页面的背景色,下面的代码有什么问题?,无法进行缺失和异常数据的检查,JSP scriptlet:示例假定您希望能够让最终用户定制,JSP scriptlet:示例,Color Testing,Testing a Background of,JSP scriptlet:示例,使用scriptlet将JSP文件的某些部分条件化,要点,scriplet会被严格按照所写的样子插入到servlet中,不需要是完整的Java表达式,但完整的表达式常常更清楚且易于维护,示例,Have a nice day!,Have a lousy day!,具有代表性的结果,if(Math.random()0.5),out.println(Have a nice day!);,else,out.println(Have a lousy day!);,使用scriptlet将JSP文件的某些部分条件化要点,JSP声明,格式,结果,代码被逐字地插入到servlet类的定义中,在任何现有方法以外,示例,设计上的考虑,字段当然有用,但对于方法而言,通常在单独的Java类中定义更好一些。,XML兼容的语法,Java Code,JSP声明格式,JSP/servlet之间的对应关系,原始的JSP,Some Heading,也可以使randomHeading成为单独Java类的静态方法),JSP/servlet之间的对应关系原始的JSP,JSP/servlet之间的对应关系,生成的servlet代码,public class xxxx implements HttpJspPage,private String randomHeading(),return(+Math.random()+);,public void _jspService(HttpServletRequest request,HttpServletResponse response),throws ServletException,IOException,response.setContentType(text/html);,HttpSession session=request.getSession(true);,JspWriter out=response.getWriter();,out.println(Some Heading);,out.println(randomHeading();,.,JSP/servlet之间的对应关系生成的servlet代码,JSP声明:示例,JSP Declarations,JSP Declarations,Accesses to page since server reboot:,JSP声明:示例,JSP声明:jspInit和jspDestroy,JSP页面,如同常规servlet,有时需要用到init和destroy,问题在于:根据JSP页面构建的servlet有可能已经使用了init和destroy,覆盖它们会引发问题。,因此,使用JSP声明来声明init或destroy是不合法的。,解决方案:使用jspInit和jspDestroy。,根据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);,JSP声明:jspInit和jspDestroyJSP页面,,JSP声明和预定义变量,问题,预定义变量(request,response,out,session,等)是_jspService方法中的局部变量。因而,由JSP声明定义的方法或辅助类中的方法都不能使用它们。怎么处理这种情况呢?,解决方案:将它们作为参数传递,例如,要注意:JspWriter的println方法抛出IOException异常,使用println的方法要使用“throws IOException”,JSP声明和预定义变量问题,表达式、scriptlet和声明的对比,任务1,输出由从1到10之间的5个随机整数构成的项目列表。,由于本页的结构固定,并且对于randomInt方法,我们使用单独的辅助类,JSP表达式完全能够胜任。,任务2,生成1到10数据项构成的列表(随机选定),每一项为1到10之间的整数。,由于列表中的数据项是动态的,所以需要JSP scriptlet。,任务3,在首次请求时生成一个随机数,然后向所有的用户展示这个随机数,直到服务器重新启动。,实例变量(字段)是完成这种持续性的自然方式。使用JSP声明来完成这项任务。,表达式、scriptlet和声明的对比任务1,辅助类:RanUtilities,package XXX;/Always use packages!,public class RanUtilities,/*A random int from 1 to range(inclusive).*/,public static int randomInt(int range),return(1+(int)(Math.random()*range);,public
展开阅读全文