JSP程序设计与案例实战(慕课版)
上QQ阅读APP看书,第一时间看更新

3.1 JSP脚本元素

3.1.1 JSP脚本元素概念及组成

JSP脚本元素概念及组成

在JSP中嵌入的服务端(即Web后端)运行的小程序,称为脚本。而JSP支持的服务端脚本语言为Java,所以这些脚本其实就是Java程序。这些脚本程序可以是变量的声明、方法的声明、完成指定功能的代码块以及方法的调用等,除了类声明之外的所有形式的Java代码都可以作为脚本程序嵌入在JSP页面中,从而完成业务逻辑(用户登录验证、用户信息的增删改查等)、后台数据库操作(创建数据库连接、执行SQL等)等相关服务端(即Web后端)的功能。

其实,JSP脚本元素就是嵌入在JSP页面中的Java程序,这些Java程序将出现在由当前JSP页面生成的Servlet中。按照不同的嵌入方式和不同的作用,脚本元素可分为3种:表达式、Scriptlet、声明,如图3-1所示。

图3-1 脚本元素组成

3.1.2 表达式

表达式

1.表达式的作用

表达式是计算Java表达式的值,得到的结果转换成字符串,并在JSP页面中表达式所在位置进行显示。Java表达式是指由操作数和运算符组成的,且符合Java语法规则的公式。其中,操作数可以是变量、常量、方法等,运算符包括算术运算符、逻辑运算符、比较运算符、移位运算符等。此部分知识点的详细介绍可以参见 Java编程语言相关教程资料。

表达式的计算在运行时进行(即JSP页面被请求时),因此在表达式中可以访问与请求有关的全部信息,其中,请求相关的信息都封装在request隐式对象中。

2.表达式的语法格式

<%=Java表达式 %>

具体说明如下。

“<%=”和“%>”是一个完整的符号,符号中间不可有空格。

不可以插入语句。

表达式必须能求值。

3.实例:JSP表达式应用

在JSP页面中嵌入5个JSP表达式,分别如下。

计算两个整数常量累加的值并在页面进行显示。

比较两个整数常量的大小并将结果在页面进行显示。

获取的值,并在页面进行显示。

获取−0.23的绝对值,并在页面进行显示。

从请求中获取用户名信息,并在页面进行显示。

具体源代码如下所示(代码详见\jspdemopro\WebRoot\ch3\scriptDemo01.jsp)。

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

 <head>

  <title>My JSP 'scriptDemo01.jsp' starting page</title></head>

   <body>

    <h1>JSP表达式的案例演示</h1>

    <%=3+3 %><br>

    <%=3>4 %><br>

    <%=Math.PI %><br>

    <%=Math.abs(-0.23) %>

    <%=request.getParameter(“userName”)%>

   </body>

</html>

页面运行后(在浏览器中输入请求url为:http://localhost:8080/jspdemopro/ch3/scriptDemo01.jsp? userName=zhangsan),显示结果如图3-2所示。

图3-2 JSP表达式案例运行结果

3.1.3 Scriptlet

Scriptlet

1.Scriptlet的作用

Scriptlet就是在JSP页面中嵌入一段有效的Java程序段,此程序段可以是变量的声明、方法的调用。例如,根据从客户端传递过来的用户名和密码信息判断该用户的合法性,从数据库获取用户信息,再传递到客户端进行展示输出等这些业务逻辑功能,均可以通过Java程序段(也称脚本代码段)实现。

2.Scriptlet的语法格式

<%Java代码 %>

具体说明如下。

“<%”和“%>”是一个完整的符号,符号中间不可有空格。

<% %>中除了不能定义类和方法、不能用import引入类外,可以包含任何有效的Java代码、可以定义变量、调用方法和进行各种表达式运算。

在Scriptlet中定义的变量在当前的整个页面内都有效,但不会被其他的线程共享。

3.实例:JSP Scriptlet应用

(1)实例一:在JSP页面中,以直角三角形的形式显示数字(代码详见:\jspdemopro\WebRoot\ch3\scriptDemo02.jsp)。

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

 <head>

  <title>My JSP 'scriptDemo02.jsp' starting page</title>

</head>

 <body>

  <h1>以直角三角形的形式显示数字</h1>

  <%

    for(int i=1;i<10;i++) {

     for(int j=1;j<=i;j++) {

  %>

     <%=j%>

  <%

     }

  %>

     <%="</br>" %>

  <%

    }

  %>

 </body>

</html>

页面运行后的结果如图3-3所示。

图3-3 数字直角三角形案例运行结果

(2)实例二:在 JSP 页面中显示当前系统时间和变量 name 的值(代码详见:\jspdemopro\WebRoot\ch3\scriptDemo02.jsp)。

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

 <head>

  <title>My JSP 'scriptDemo02.jsp' starting page</title>

</head>

  <body>

     <h1>显示当前系统时间和变量name的值</h1>

   <%

     Date now = new Date();

   %>

   <%=now.toLocaleString() %>

   <%

     String name = "tony";

   %>

   <%=name %>

  </body>

</html>

页面运行后的结果如图3-4所示。

图3-4 当前系统时间显示案例运行结果

4.综合实例

利用 JSP 完成登录功能。当用户单击“登录”按钮时,校验程序需要对用户名和密码进行检验(假设用户名和密码分别为zhangsan和123时合法,否则不合法),校验通过则显示“登录成功+用户名”,否则显示“登录失败+用户名”。登录界面如图3-5所示。

登录处理概要图如图3-6所示。

源代码如下。

login.jsp(省略,详见源代码包)。

图3-5 登录界面

图3-6 登录处理概要图

loginAction.jsp部分代码如下。

<body>

  <%

   String staffId = request.getParameter("staffId");

   String password = request.getParameter("password");

   If("zhangsan".equals(staffId)&& "123".equals(password)){

    %>

   <%="登录成功!"%>

   <%

    }else{

   %>

   <%="登录失败!"%>

   <%

    }

   %>

  <%=staffId%>

   </body>

案例总结如下。

使用JSP Scriptlet完成业务逻辑处理(用户名的校验)。

使用JSP 表达式获取用户名信息,并在页面展示输出。

3.1.4 声明

声明

1.声明的作用

声明就是在JSP页面中声明Java方法或变量等,用于定义JSP代表的Servlet类的成员变量和方法。

2.JSP声明的语法格式

<%! Java代码 %>

具体说明如下。

“<%!”和“%>”是一个完整的符号,符号中间不可有空格。

声明的语法与在Java语言中声明变量和方法是一样的。

在页面中声明的变量和方法,在整个页面内都有效,它们将成为JSP页面转换为Servlet类后的属性和方法,而且它们会被多个线程所共享。

3.实例:JSP声明应用

(1)实例一:声明一个变量,变量名为numTimes,为该变量赋值为3;声明一个方法,方法名为sayHello。

在页面中利用JSP表达式显示变量numTimes的值,调用sayHello方法,并显示方法的返回值信息(代码详见:\jspdemopro\WebRoot\ch3\scriptDemo03_1.jsp)。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

 <head>

  <title>My JSP 'scriptDemo03_1.jsp' starting page</title>

 </head>

  <%!

   int numTimes = 3;

   public String sayHello(String name){

    return "Hello, " + name + "!";

   }

  %>

 <body>

  <%=numTimes %><br>

  <%= sayHello("Tony") %>

 </body>

 </html>

页面运行后的结果如图3-7所示。

图3-7 JSP声明实例一的运行结果

(2)实例二:JSP 声明和JSP Scriptlet区别。

用不同的方式定义两个变量,分别为count1和count2,通过JSP 表达式在页面上显示输出count1和count2自加的值,多次刷新该JSP页面,观察count1和count2值的变化,并思考原因(代码详见:\jspdemopro\WebRoot\ch3\scriptDemo03_2.jsp)。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

 <head>

  <title>My JSP 'scriptDemo03_2.jsp' starting page</title>

 </head>

 <body>

  <%!

    int count1 = 1;

   %>

   <%

    int count2 = 1;

    %>

    count1==<%=count1++%><br>

    count2==<%=count2++%>

 </body>

</html>

根据页面显示效果得知count1的值,每次刷新进行累加,而count2的值始终为1。原因是count1是Java类的成员变量,被多个线程所共享;count2是方法的局部变量,不能被线程共享。

(3)实例三:JSP声明、JSP Scriptlet和JSP声明综合应用(代码详见:\jspdemopro\WebRoot\ch3\scriptDemo04.jsp)。

某系统计算的金额中有两种形式:一种是带有两位小数的,另一种是整数。现在要求在 JSP 页面将不带小数的金额转换为带两位小数的金额。

实现步骤如下。

利用JSP声明,声明一个方法,将整数转换为两位小数。

利用JSP Scriptlet 调用声明的方法,转换金额。

在JSP页面利用表达式将转换后的金额显示出来。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

 <head>

  <title>My JSP 'scriptDemo04.jsp' starting page</title>

</head>

 <body>

 <%!

  //声明一个常量

  final String SEPARATOR =".";

  //声明一个方法

  public String covertAmountWithSeparator(String money){

   int index = money.indexOf(SEPARATOR);

   String str =money;

   if(index==-1)

    str = money+".00";

   return str;

  }

%>

<%

 String m1 = covertAmountWithSeparator("12");

 String m2 = covertAmountWithSeparator("34.00");

%>

<%=m1%><br>

<%=m2 %><br>

<%=SEPARATOR%>

 </body>

</html>

页面运行后的结果如图3-8所示。

图3-8 金额转换实例运行结果