Java EE框架开发技术与案例教程
上QQ阅读APP看书,第一时间看更新

2.1 表示层(视图层)技术

在Web应用程序中,视图层的设计技术有HTML、JSP、JSTL和EL表达式等。

(1)HTML:是一组标签,负责网页的基本表现形式。

(2)JavaScript:是在客户端浏览器运行的语言,负责在客户端与用户进行互动。

(3)CSS技术:是一个样式表,起到美化整个页面的作用。

(4)JSP技术:是一种运行在服务器端的脚本语言,用来开发动态网页。

(5)EL(Expression Language):是表达式语言,目前已成为标准规范之一。

2.1.1 HTML技术与应用案例

HTML(Hyper Text Markup Language)即超文本标记语言,是用来编写网页文件的标准,定义了一组标记(tag,也称标签)用来描述Web文档数据。目前HTML已经升级到HTML 5版本。

HTML的主要标签如表2-1所示。在该表中给出了常用标记及其功能说明。在HTML文档设计中,利用表2-1中的有关标签,控制页面的显示内容和显示方式。

表2-1 HTML常用标签与功能说明

在Web应用程序中,使用较多的是表单的设计及表单标签。表2-2给出了表单设计常用的标签。

表2-2 表单设计常用的标签及其作用

例2-1】设计如图2-1所示的学生信息注册网页。

图2-1 学生信息注册页面

【分析】该页面采用表单的方式设计,为了使页面各元素整齐,采用表格的方式控制元素的位置。该例中给出了表单常用的各种元素,请注意它们的使用特点。

【实现代码】

    <body>
        <form action="">
          <table border="0" align="center" width="600">
          <tr><td colspan="3"align="center"height="40">填写注册信息</td></tr>
          <tr> <td align="right">用户名:*</td>
              <td><input type="text" name="userName"/></td>
              <td>用户名由字母开头,后跟字母、数字或下划线!</td> </tr>
          <tr> <td align="right">密码:*</td>
              <td><input type="password" name="userPwd"/></td>
              <td>设置登录密码,至少6位!</td> </tr>
          <tr> <td align="right">确认密码:*</td>
              <td><input type="password" name="userPwd1"/></td>
              <td>请再输入一次你的密码!</td> </tr>
            <tr> <td align="right">性别:*</td>
              <td><input type="radio" name="userSex" value="男" checked/>男
                <input type="radio" name="userSex" value="女"/>女</td>
              <td>请选择你的性别!</td> </tr>
          <tr> <td align="right">邮箱地址:*</td>
              <td><input type="text" name="userEmail" /></td>
              <td>请填写您的常用邮箱,可以用此邮箱找回密码!</td> </tr>
          <tr> <td align="right" valign="top">基本情况:*</td>
              <td colspan="2">
                  <textarea name="userBasicInfo" rows="5" cols="50"></textarea></td> </tr>
          <tr> <td colspan="3" align="center" height="40">
                <input type="checkbox" name="accept" value="yes"/>
                我已经仔细阅读并同意接受用户使用协议</td> </tr>
          <tr><td colspan="3" align="center" height="40">
                <input type="submit" value="确认"/> 
                <input type="reset" value="取消"/></td> </tr>
          </table>
        </form>
    </body>

【运行测试】运行该页面,将出现如图2-1的界面。

这里只给出了一个简单的表单设计,对于其他有关标签的使用,请读者自己按标签格式应用练习。

2.1.2 CSS技术与应用案例

使用CSS可方便、灵活地设置网页中不同元素的外观属性,从而使网页在外观上达到一个更好的效果。使用CSS技术,需要首先定义样式表,然后使用该样式表。

1.CSS样式表的定义

CSS样式表的定义就是定义CSS选择器及CSS的有关属性、属性值,有3种基本定义方式。

(1)标记选择器——通过HTML标签定义样式表

基本语法格式如下。

    引用样式的对象{标签属性:属性值;标签属性:属性值;标签属性:属性值;……}

(2)类别选择器——使用class定义样式表

若要为同一元素创建不同的样式或为不同元素创建相同的样式,可以使用CSS类选择器,CSS类有两种格式,定义时,在各自定义类的名称前面加一个点号。

    格式1:标签名.类名{属性:属性值;属性:属性值;属性:属性值;……}

注意:这种格式的类指明所定义的样式只能用在类名前所指定的标签上。

    格式2:.类名{属性:属性值;属性:属性值;属性:属性值;……}

注意:该格式的类使所有class属性值为该类名的标签都遵守该类所定义的样式。

(3)ID选择器——使用id定义样式表

在HTML页面中,ID选择符用来对某个单一元素定义单独的样式,定义ID选择符要在ID名称前加上一个#号。基本语法如下。

    #id名称{属性:属性值 属性:属性值;属性:属性值;……}

注意:使用该类样式表时,需要将该样式的网页内容前加一个id="id名称"。

2.样式表的使用

在HTML中使用CSS的方法有3种:行内式、内嵌式和链接式。

1)行内式(不需要定义选择器):利用style属性直接为元素设置样式,只对当前的标签起作用。如下面的代码所示。

    <p style="color:#FF0000; font-size:20px; text-decoration:underline; ">正文内容1</p>
    <p style="color:#000000; font-style:italic; ">正文内容2</p>

2)内嵌式:这种方式需要先定义有关的选择器,然后再使用。利用<style></style>标签对,将样式表(选择器)定义在<head></head>标签对之间,内嵌式样式表的作用范围是本HTML文档内。如下面的代码所示。

3)链接式:链接式样式表是将定义好的CSS单独放到一个以.css为扩展名的文件中,再使用<link>标签链接到所需要使用的网页中,在<head>与</head>之间。

<link>标签链接到网页的格式:

    <link href="*.css文件路径" type="text/css" rel="stylesheet">

例如:首先定义一个sheet_x.css文档,其代码如下。

    h2{ color:#0000FF; }
    p{ color:#FF0000; text-decoration:underline; font-weight:bold; font-size:15px; }

其次,在HTML中使用。

3.CSS常用属性

从CSS选择器的定义可看出,CSS美化网页是通过设置网页元素的属性来实现的,主要有字体属性、颜色属性、背景属性和文本段落属性等。

(1)字体属性

字体属性主要有font-family、font-size及font等,具体含义与取值如表2-3所示。

表2-3 字体属性含义与取值

(2)颜色和背景属性

颜色和背景属性主要有color、background-color、background-image和background等,其具体含义与取值如表2-4所示。

表2-4 颜色和背景属性含义与取值

(3)文本段落属性

文本段落的属性包括字符间隔、文字修饰、纵向排列、文本转换、文本排列水平对齐方式、文本缩进和文本行高等。具体含义与取值如表2-5所示。

表2-5 文本段落的属性含义与取值

对于其他的有关属性,若需要可查看有关的书籍,这里不再详细介绍。

例2-2】在【例2-1】已给出了一个页面(见图2-1),该页面没有修饰,不够美观,采用CSS修饰页面,重新设计页面,如图2-2所示。

图2-2 修饰后的注册页面

【分析】该问题需要两步:首先设计CSS文档,在该文档中包含所需要的格式控制,然后引用CSS中的样式,重新设计页面。

【实现】

(1)设计CSS样式表文档

对比图2-1和图2-2可知,在图2-2中,改变了页面所有字体的大小,页面最上面的“填写注册信息”也改变了颜色、字体等,每项输入域后面的提示信息也改变了,根据这些变化,编写CSS文档:ch02_2.css,该文档的代码如下。

    #title{color:red; font-size:20px; font-weight:bod; }
    #i{width:350px; height:15px; color:blue; font-size:12px; }
    table{text-align:left; }
    #t{text-align:right; }

(2)利用CSS对页面实现修饰

引用样式表ch02_2.css,对程序ch02_1.html进行修改,形成新代码文档ch02_2.html。

首先,通过链接式导入样式表,修改的这部分代码如下。

    <head> <link href="ch02_2.css" type="text/css" rel="stylesheet"> </head>

然后,修改页面的<body></body>之间的代码,其部分代码如下。

对于其他行,也采用这样的修改。

【运行测试】通过这样的修改,运行界面如图2-2所示,可以看出页面比较美观。

2.1.3 JavaScript技术与应用案例

JavaScript是一种简单的脚本语言,可以在浏览器中直接运行,是一种在浏览器端实现网页与客户交互的技术。JavaScript代码可以直接嵌套在HTML网页中,它响应一系列的事件,并执行事件处理函数,完成所需要的功能。

1.JavaScript的基本语法

JavaScript脚本语言的基本成分有数据类型、常量变量、运算符、表达式、控制语句和函数等。

1)数据类型:主要数据类型有int、float、string、boolean和null(空类型)。

2)变量:使用命令var声明变量,格式为:var变量名[=值];。

3)运算符:提供了算术运算符、关系运算符、逻辑运算符、字符串运算符、位操作运算符、赋值运算符和条件运算符等运算符。这些运算符与Java语言中支持的运算符及功能相同。

4)控制语句:控制语句有分支语句(if、switch)和循环语句(while、do-while、for),这些语句的语法规则和使用与Java语言中的要求一样。

5)函数:函数声明格式如下。

    function functionName([parameter1, parameter2, …]){ //有关的处理语句;}

2.JavaScript的事件

在浏览器中,网页与客户的交互都是通过“事件”引发的,当一个事件发生时,执行相应的JavaSript脚本或指定的函数。

(1)JavaScript的事件

JavaScript的事件是指用户对网页的一些特定“操作”,表2-6给出了常用的事件、事件处理函数及何时触发事件处理函数。

表2-6 常用的事件和事件处理函数

(2)在HTML中引用(指定)事件处理函数(函数的调用)

在HTML中指定事件处理程序,需要在HTML标记中添加相应的事件处理程序的属性,并在其中指定作为属性值的代码或是函数名称。使用格式如下。

    <标签 各有关属性及其属性值on事件名称="函数名称(参数)">

例2-3】通过input输入标签,引发单击事件,该事件的处理函数名是onClick(),要完成的功能是通过函数test()实现的,而函数test()的功能是显示一个提示窗口(由Windows的alert方法完成),并提示“事件引发一操作,并成功执行了这个操作!”。

这里采用在页面中直接嵌入JavaScript代码的实现方式,其主要代码如下:

    <head>
        <script language="javascript">
          function test(){ window.alert("事件引发一操作,并成功执行了这个操作!"); }
        </script>
    </head>
    <body>
        <form action="">
          <input type="button" value="警告对话框" onclick="test()"><br/>
        </form>
    </body>

该程序的运行界面如图2-3和图2-4所示,当浏览器运行程序ch02_3.html时,首先显示如图2-3所示的页面,但单击“警告对话框”按钮时,出现如图2-4所示的提示对话框,单击“确定”按钮,该提示对话框消失。

图2-3 【例2-3】运行界面

图2-4 提示对话框

3.JavaScript的对象

JavaScript中设有浏览器的文档对象:window、navigator、screen、history、location和document,利用这些对象,可以实现对网页信息的操作和处理加工。

(1)window对象

HTML文档内容在window对象中显示,同时,window对象提供了用于控制浏览器窗口的方法。window对象属性的常用方法如表2-7所示。

表2-7 window对象的常用方法

(2)location对象

location对象实现网页页面的跳转。在JavaScript中,利用location对象实现页面的自动跳转。使用格式如下。

    window.location.href="网页路径";

(3)document对象

每个HTML文档被加载后都会在内存中创建一个document对象,该对象存放整个网页HTML内容,从中可获取页面表单的各种信息,并对这些信息进行操作加工处理。

假设有如下的表单。

获取表单输入域t1对象,代码如下。

    var fObj=document.form1.t1;   //form1为表单的名称,t1为某表单域的name值

获取表单域的值。其中,fObj是表单域对象名,代码如下。

    var v=fObj.value;

例2-4】在【例2-2】中,已经设计了一个注册页面,在本例中,根据图2-2(见【例2-2】)页面所给出的不同信息的输入要求,利用JavaScript进行表单数据有效性验证,当不符合要求时,通过警告框给出提示,并重新输入。

【分析】输入表单的验证就是对表单中输入的数据进行检验,如果表单中输入的数据不符合要求,则禁止提交,并给用户适当的提示信息,以便用户重新输入。只有当所有输入的数据都符合要求后,才允许提交,并进入表单标签的action属性所指定的处理程序,即:<form action="提交后,进入的处理页面">。

(1)由图2-2可知,该注册页面需要验证的表单输入域和要求

● 用户名:用户名是否为空,是否符合规定的格式(用户名由字母开头,后跟字母、数字或下划线!)。

● 密码:密码长度是否超过6位,两次密码输入是否一致。

● 邮箱地址:邮箱地址必须符合邮箱格式。

(2)必须注意提交表单并实现输入验证的方式

一般使用“button类型”按钮提交,“提交”时先执行“响应函数”。提交方式如下。

    <input type="button"  value="提交"  onClick="响应函数">

另外,在验证函数中,当都满足格式后,采用如下格式实现提交。

    document.forms[0].submit();      //forms[0]是指提交页面中的第1个表单

【实现】所谓验证输入,就是编写有关的Javascript函数,去验证表单中各输入域是否符合规定,若不符合规定,给出提示信息。为此,使用JavaScript编写验证函数,并形成文件:ch02_4.js,其代码如下。

    function validate(){
        var name=document.forms[0].userName.value;    //获取表单中userName输入域的值
        var pwd=document.forms[0].userPwd.value;      //获取表单中userPwd输入域的值
        var pwd1=document.forms[0].userPwd1.value;    //获取表单中userPwd1输入域的值
        var email=document.forms[0].userEmail.value;    //获取表单中userEmail输入域的值
        var accept=document.forms[0].accept.checked;    //获取表单中accept是否选中的值
        var regl=/ [a-zA-Z]\w*$ /;
        var reg2= / \w+([-+.']\w+)*@\w+([-.]\w+)*.\w+([-.]\w+)*$ /;
        if(name.length<=0) alert("用户名不能为空!");
        else if(! regl.test(name)) alert("用户名格式不正确!");
        else if(pwd.length<6) alert("密码长度必须大于等于6位!");
        else if(pwd! =pwd1) alert("两次密码不一致!");
        else if(! reg2.test(email)) alert("邮件格式不正确!");
        else if(accept= =false) alert("您需要仔细阅读并同意接受用户使用协议!");
        else document.forms[0].submit();
    }

然后,修改页面ch02_2.html,在标签<head></head>中添加一行,导入js文件。

    <script language="javascript" src=" ch02_4.js"></script>

最后,再将页面的提交按钮输入域修改如下。

    <input type="Button" value="确认" onClick="validate()"/>;

【运行测试】重新运行该页面,当输入项不符合要求时,就给出提示警告。

2.1.4 JSP技术与应用案例

JSP是一种动态网页技术标准,它是在静态网页HTML代码中加入Java程序片段(Scriptlet)和JSP标签(tag),构成JSP网页文件,其扩展名为.jsp。

1.JSP语法

JSP页面是将JSP代码放在<%与%>标签中,然后嵌入到HTML代码中而形成的。在<%与%>标签中定义JSP元素的行为。

(1)JSP变量和方法的声明

在JSP页面中可以声明变量和方法,声明后的变量和方法可以在本JSP页面的任何位置使用,并在JSP页面初始化时被初始化。

    语法格式:<%! 声明变量、方法和类 %>

(2)显示JSP表达式的值

JSP的表达式是由变量和常量组成的算式,它将JSP生成的数值转换成字符串嵌入HTML页面,并直接输出(显示)其值。

    语法格式:<%=表达式%>

(3)JSP代码段

JSP代码段可以包含任意合法的Java语句,该代码段在服务器处理请求时被执行。

    语法格式:<% 符合java语法的代码块 %>

(4)JSP注释

在JSP程序中,为了增加JSP程序的可读性,给出了注释元素。

    语法格式1:<%-- 要添加的文本注释 --%>
    语法格式2:<! --要添加的文本注释-->
    语法格式3:<%//要添加的文本注释%>或<%/*要添加的文本注释*/%>

2.JSP指令元素

JSP指令标记在客户端是不可见的,它是被服务器解释并被执行的。

JSP指令的语法格式如下。

    <%@ 指令名称 属性1="属性值1" 属性2="属性值2"… 属性n="属性值n"%>

(1)page指令

page指令用来定义JSP页面中的全局属性,它描述了与页面相关的一些信息,其作用域为它所在的JSP文件页面及其包含的文件。其属性如表2-8所示。

表2-8 page指令的主要属性

(2)include指令

include指令称为文件加载指令,可以将其他的文件插入JSP网页,被插入的文件必须保证插入后形成的新文件符合JSP页面的语法规则,include指令语法格式如下。

    <%@ include file="filename"%>

其中:include指令只有一个file属性,filename是指被包含的文件的名称(相对路径),被插入的文件必须与当前JSP页面在同一Web服务目录下。

3.JSP动作元素

JSP动作元素是用来控制JSP引擎的行为,JSP标准动作元素均以jsp为前缀,最常使用的有两个。

● <jsp:include>:在页面得到请求时动态包含一个文件。

● <jsp:forward>:引导请求进入新的页面(转向到新页面)。

(1)<jsp:include>动作,语法格式如下。

    <jsp:include page="文件的名称"/>

功能:当前JSP页面动态包含一个文件,即将当前JSP页面和被包含的文件各自独立编译为字节码文件。当执行到该动作标签处,才加载执行被包含文件的字节码。

提示:include动作与include指令所实现的两种包含,程序的执行性质是完全不同的,一个是静态包含,一个是动态包含,对于静态包含不能传递参数,但对于动态包含可以在两个文件之间传递参数。

(2)<jsp:forward>

动作<jsp:forward>用于停止当前页面的执行,转向另一个页面,语法格式如下。

    <jsp:forward page="文件的名称"/>

4.JSP内置对象

在JSP中为了便于数据信息的保存、传递和获取等操作,专门设置了9个内置对象,如表2-9所示。JSP内置对象是指它们是预先设定的,无需创建,每个对象都有自己的属性和方法,在编写JSP代码时可以直接使用。

表2-9 JSP内置对象

(1)request对象的常用方法

request对象的各种方法主要用来处理客户端浏览器提交的请求信息,以便做出相应的处理。主要的方法如表2-10所示,在后面几节中会给出这些方法的使用案例。

表2-10 request对象的主要方法

(2)response对象的常用方法

response对象提供了页面重定向(sendRedirect)方法、设置状态行(setStatus)方法和设置文本类型(setContentType)方法等。主要方法如表2-11所示。

表2-11 response对象的常用方法

(3)session对象的主要方法

session对象的主要作用是存储并获取用户会话信息。其主要方法如表2-12所示。

表2-12 session对象主要方法

例2-5】设计一个网上答题及其自动评测系统。本案例设计一个简单的网上答题与评测系统,其运行界面如图2-5所示。该程序包括两部分,首先是试题页面的设计及解答的提交,其次是当提交解答后,系统自动评阅并给出评阅结果。图2-5a是试题页面,图2-5b是评阅后给出的解答页面。

图2-5 【例2-5】的运行界面

a) 试题页面b) 评阅后给出的解答页面

【分析】该案例的设计需要设计两个JSP页面:一个是提交信息页面,另一个是获取提交信息并进行处理显示结果页面。其设计关键有以下两点。

1)对于互斥的单选框、只允许单选的列表框,只传递一个参数。

2)对于复选框、可多选列表框,需传递多个参数,通过数组保存并获取参数值。

【代码编写】

1)提交信息页面程序:ch02_5_input.jsp,其主要代码如下。

    <body>
      <form action="ch02_5_show.jsp" method="post">
        一、 2+3=? <br>
        <input type="radio" name="r1" value="2" checked="checked">2 
        <input type="radio" name="r1" value="3">3   
        <input type="radio" name="r1" value="4">4  
        <input type="radio" name="r1" value="5">5<br>
        二、下列哪些是偶数?<br>   
        <input type="checkbox" name="c1" value="2">2  
        <input type="checkbox" name="c1" value="3">3  
        <input type="checkbox" name="c1" value="4">4  
        <input type="checkbox" name="c1" value="5">5<br>
        三、下列哪些是动态网页?<br>   
        <select size="4" name="list1" multiple="multiple">
          <option value="asp">ASP</option>
          <option value="php">PHP</option>
          <option value="htm">HTML</option>
          <option value="jsp">JSP</option>
          <option value="xyz" selected="selected">xyz</option>
        </select><br>
        四、下列组件哪个是服务器端的?<br>   
        <select size="1" name="list5">
          <option value="jsp">JSP</option>
          <option value="servlet">SERVLET</option>
          <option value="java">JAVA</option>
          <option value="jdbc">JDBC</option>
        </select><br>
        五、在服务器端用来接受用户请求的对象是:
        <input type="text" size="20" name="text1"><br>
        <div align="left">
          <input type="submit" value="提交" name="button1">
          <input type="reset" value="重置" name="button2">
        </div>
      </form>
    </body>

2)获取提交信息并进行处理页面:ch02_5_show.jsp,其主要代码如下。

    <body>
      <% String s1 = request.getParameter("r1");
        if (s1 ! = null) {
            out.println("一、解答为:2+3="+s1+"   ");
            if (s1.equals("5")) out.println("正确!" + "<br>");
        else out.println("错误!" + "<br>");
        } else out.println("一、没有解答!");
        out.println("---------------------------<br>");
        String[] s21 = request.getParameterValues("c1");
        if (s21 ! = null) {
          out.println("二、解答为:偶数有:");
          for(int i=0; i<s21.length; ++i){out.println(s21[i]+"   "); }
          if (s21.length = = 2 && s21[0].equals("2") && s21[1].equals("4"))
              { out.println("正确!" + "<br>"); }else{out.println("错误!" + "<br>"); }
        } else{out.println("二、没有解答!"); }
        out.println("---------------------------<br>");
        String[] s31 = request.getParameterValues("list1");
        if (s31 ! = null) {
          out.println("三、解答为:动态网页有:");
          for(int i=0; i<s31.length; ++i){out.println(s31[i]+"   "); }
          if (s31.length = = 3 && s31[0].equals("asp") && s31[1].equals("php")
                && s31[2].equals("jsp"))
                {out.println("正确!" + "<br>"); }else{out.println("错误!" + "<br>"); }
        } else out.println("三、没有解答!");
        out.println("---------------------------<br>");
        String s4 = request.getParameter("list5");
        if (s4 ! = null) {
            out.println("四、解答为:服务器端的组件是有:"); out.println(s4+"   ");
            if(s4! =null&&s4.equals("servlet"))  out.println("正确!"+"<br>");
            else  out.println("错误!"+"<br>");
        }else  ut.println("四、没有解答!");
        out.println("---------------------------<br>");
        String s5 = request.getParameter("text1");
        if (s5 ! = null) {
            out.println("五、解答为:"); out.println(s5+"   ");
            if (s5 ! = null && s5.equals("request")) out.println("正确!" + "<br>");
            else out.println("错误!" + "<br>");
          } else out.println("五、没有解答!");
          out.println("---------------------------<br>");
      %>
    </body>

【运行测试】运行页面程序ch02_5_input.jsp,当提交后,给出结果显示。

思考:基于该题目的设计思想,设计5套真实网上考试试题,并都给出评测及其评判结果。

2.1.5 EL表达式与应用案例

在Web程序设计中,利用EL表达式,可以直接计算并显示表达式的值,简化了JSP网页的设计。

1.EL的语法形式

所有的EL都是以“${”开始,以“}”结尾的,语法格式如下。

    ${expression}

功能:在页面上显示表达式expression的值。

2.存取运算符

在EL中,对数据值的存取是通过“[]”或“.”实现的。其格式如下。

    ${name.property}   或  ${name["property"]}  或   ${name[property]}

说明:

1)“[]”主要用来访问数组、列表或其他集合对象的属性。

2)“.”主要用于访问对象的属性。

3.EL运算符

EL支持的运算符和Java语言运算符类似,主要有算术运算符、关系运算符和逻辑运算符等,如表2-13所示。

表2-13 EL中的运算符

4.EL内部对象

EL提供了11个可直接使用的内部对象,如表2-14所示。

表2-14 EL内部对象

例2-6】设计两个JSP页面,实现如图2-6所示的显示结果。其中,form.jsp是提交信息的页面,在doSubmit.jsp页面中通过param和paramValues对象获取form.jsp页面提交的信息并显示。

图2-6 【例2-6】显示结果

a) 提交信息页面b) 显示提交信息页面

1)提交信息页面:form.jsp,其主要代码如下。

    <body>
        <form action="doSubmit.jsp" method="post">
          姓名 <input type="text"name="name"><br/>
          性别 <input type="text"name="sex"><br/>
          语言 <input type="text"name="lang"><br/>
          电话 <input type="text"name="regTelephone"><br/>
          邮件 <input type="text"name="email"><br/>
          简介<textarea rows="2" cols="30" name="intro"></textarea><br/><br>
          爱好:音乐<input type="checkbox" name="aihao" value="音乐"/>
                篮球<input type="checkbox" name="aihao" value="篮球"/>
                足球<input type="checkbox" name="aihao" value="足球"/><br/><br>
          <input type="submit" value="提交"/>  <input type="reset" value="重置"/>
      </form>
    </body>

2)获取表单信息并显示信息页面:doSubmit.jsp,其主要代码如下。

    <body>
        <h2>您提交的内容如下:</h2>
        <% request.setCharacterEncoding("utf-8"); %>
          姓名:${param.name}<br/>   性别:${param.sex}<br/>
          外语:${param.lang}<br/>    电话:${param.regTelephone}<br/>
          email:${param.email}<br/>  个人简介:${param.intro}<br/>
          爱好:${paramValues.aihao[0]} ${paramValues.aihao[1]} ${paramValues.aihao[2]}
    </body>

3)运行form.jsp,按照图2-6a中所示输入数据并提交,显示如图2-6b所示的结果。