JSP页面
添加时间:2013-6-4 点击量:
1. JSP页面的根蒂根基布局
在传统的HTML页面中参加Java法度片和JSP标签,就构成了一个JSP页面。一个JSP页面可由5种元素组合而成:(1)通俗的HTML标识表记标帜符;(2)JSP标识表记标帜,如指令标识表记标帜、动作标识表记标帜;(3)成员变量和办法;(4)Java法度片;(5)Java表达式。
【例2-1】
<%@ page contentType=text/html;charset=UTF-8 %> <!--JSP指令标识表记标帜-->
<%@ page import=java.util.Date %> <!--JSP指令标识表记标帜-->
<%! Date date; //数据声明
int sum;
public int add(int m,int n){ //办法声明
return m+n;
}
%>
<HTML><BODY bgcolor=cyan> <!--HTML标识表记标帜-->
<FONT size=4><P>法度片创建Date对象:
<% date=new Date(); //Java法度片
out.println(<BR>+date);
sum=add(12,34);
%>
<BR>鄙人一行输出和:<BR>
<%= sum+100 %> <!--Java表达式-->
</FONT></BODY></HTML>
2. JSP的运行道理
当Tomcat办事器上的一个JSP页面第一次被恳求履行时,Tomcat办事器将启动一个线程。该线程的任务是,起首将JSP页面文件转移成一个Java文件,再将这个Java文件编译成一个字节码文件,并将该字节码文件加载到内存中,然后履行字节码文件响应客户的恳求,该线程完成任务后,线程进入灭亡状况。这个字节码的功能如下:
(1)把JSP页面中通俗的HTML标识表记标帜符号,交给客户的浏览器履行显示。
(2)JSP标识表记标帜、数据和办法声明、Java法度片由Tomcat办事器负责履行,将须要显示的成果发送给客户的浏览器。
(3)Java表达式由Tomcat办事器负责策画,将成果转化为字符串,交给客户的浏览器负责显示。
被加载到内存中的字节码将常驻内存,当这个JSP页面再次被恳求履行时,Tomcat办事器将再启动一个线程,直接履行常驻内存的字节码文件来响应客户。这也是JSP比ASP速度快的一个原因。而JSP页面的初次履行往往由办事器经管者来进行。
当多个客户恳求一个JSP页面时,Tomcat办事器为每个客户启动一个线程,该线程负责履行常驻内存的字节码文件来响应响应客户的恳求。这些线程由Tomcat办事器来经管,将CPU的应用权在各线程之间快速切换,以包管每个线程都有机会履行字节码文件,这与传统的CGI为每个用户启动一个过程相斗劲,效力要高得多。
注:若是对JSP页面进行了批改、保存,那么Tomcat办事器会生成新的字节码。
下面是Tomcat办事器生成的example2_1.jsp的Java文件,我们把Tomcat办事器交给客户端浏览器显示的内容作了注释(&)。在Tomcat办事器下的目次work\Catalina\localhost\chapter2\org\apache\jsp中,可以找到Tomcat办事器生成的JSP页面对应的Java文件和编译Java文件获得的字节码文件。
/
Generated by the Jasper component of Apache Tomcat
Version: Apache Tomcat/7.0.29
Generated at: 2013-05-07 13:29:20 UTC
Note: The last modified time of this file was set to
the last modified time of the source file after
generation to assist with modification tracking.
/
package org.apache.jsp;
import javax.servlet.;
import javax.servlet.http.;
import javax.servlet.jsp.;
import java.util.Date;
public final class example2_005f1_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
Date date; //数据声明
int sum;
public int add(int m,int n){ //办法声明
return m+n;
}
private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory();
private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
private javax.el.ExpressionFactory _el_expressionfactory;
private org.apache.tomcat.InstanceManager _js p_instancemanager;
public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
}
public void _jspInit() {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
_js p_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
public void _jspDestroy() {
}
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
response.setContentType(text/html;charset=UTF-8);
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write( <!--JSP指令标识表记标帜-->\r\n); (&)
out.write( <!--JSP指令标识表记标帜-->\r\n); (&)
out.write(\r\n); (&)
out.write(<HTML><BODY bgcolor=cyan> <!--HTML标识表记标帜-->\r\n); (&)
out.write(<FONT size=4><P>法度片创建Date对象:\r\n); (&)
date=new Date(); //Java法度片
out.println(<BR>+date);
sum=add(12,34);
out.write(\r\n); (&)
out.write(<BR>鄙人一行输出和:<BR>\r\n); (&)
out.print( sum+100 ); (&)
out.write( <!--Java表达式-->\r\n); (&)
out.write(</FONT></BODY></HTML> ); (&)
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try { out.clearBuffer(); } catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
3. JSP页面的成员变量和办法
JSP页面可包含HTML标识表记标帜、JSP指令标识表记标帜、成员变量和办法、Java法度片和Java表达式。
JSP页面在标识表记标帜符“<%!”和“%>”之间声明他的成员变量和办法。
(1)声明变量
可以在JSP页面的标识表记标帜符“<%!”和“%>”之间声明变量,即在“<%!”和“%>”之间放置Java的变量声明语句,变量的类型可所以Java说话容许的任何数据类型。
标识表记标帜符“<%!”和“%>”之间声明的变量称为JSP页面的成员变量。例如:
<%! Int x,y=100;
Date date;
%>
“<%!”和“%>”之间声明的变量在全部JSP页面内有效,因为Tomcat办事器将JSP页面转译成Java文件时,将这些变量作为类的成员变量,这些变量的内存空间直到办事器封闭才开释。当多个客户恳求一个JSP页面时,Tomcat办事器为每个客户启动一个线程,这些用户线程将共享JSP页面的成员变量。这些用户线程由Tomcat办事器来经管,Tomcat办事器将CPU的应用权在各个线程间快速切换,以包管每个线程轮流履行JSP页面(对应的字节码),是以任何一个线程对JSP页面成员变量操纵的成果,都邑影响到其他线程。
【例2】哄骗成员变量被所有效户共享这一性质,实现一个简单的计数器。
Example2_2.jsp
<%@ page contentType=text/html;charset=UTF-8 %>
<HTML><BODY bgcolor=pink><FONT size=4>
<%! int i=0;
%>
<% i++;
%>
<P>您是第<%=i%>个接见本站的客户。
</BODY></HTML>
结果如图所示:
(2)声明办法
JSP在“<%!”和“%>”之间定义若干个办法,这些办法可以在Java法度片中被调用履行。在例3中,我们在“<%!”和“%>”之间定义了两个办法:add(int x,int y)和sub(int x,int y),然后在法度片中调用这两个办法。
【例3】
Example2_3.jsp
<%@ page contentType=text/html;Charset=UTF-8 %>
<HTML><BODY bgcolor=yellow>
<%! int add(int x,int y){
return x+y;
}
int sub(int x,int y){
return x-y;
}
%>
<% out.println(<BR>调用add办法策画200与123之和:);
int a=add(200,123);
out.println(a);
out.println(<BR>调用sub办法策画200与123之差:);
int b=sub(200,123);
out.println(b);
%>
</BODY></HTML>
结果如图所示:
4. JSP页面中的Java法度片
可以在“<%”和“%>”之间插入Java法度片。一个JSP页面可以有很多法度片,这些法度片按次序履行。在一个法度片中声明的变量称为JSP页面的局部变量。该局部变量在JSP页面后继的所有法度片及表达式内都有效。这是因为,Tomcat办事器将JSP页面转译成Java文件时,将法度片中声明的变量作为类中某个办法的变量(即局部变量)应用。
当多个客户恳求一个JSP页面时,Tomcat为每个客户启动一个线程,然后该线程履行JSP页面,那么Java法度片将被履行多次,分别在不合的线程中履行。
Java法度片的履行具有如下特点:
(1)操纵JSP页面的成员变量
Java法度片中操纵的成员变量是各线程共享的变量,任何一个线程对JSP成员变量操纵的成果,都邑影响到其他线程。
(2)调用JSP页面的办法
Java法度片中可以呈现办法调用语句,该办法必须是JSP页面的办法。
(3)声明操纵局部变量
当一个线程享用CPU资料时,Tomcat让该线程履行法度片。这时,法度片中的局部变量被分派内存空间,当轮到另一个线程享用CPU资料时,Tomcat让该线程再次履行Java法度片,那么,法度片中的局部变量会再次分派内存空间。也就是说,法度片已经被履行了两次,分别运行在不合的线程中,即运行在不合的时候片内。运行在不合线程中的法度片内的局部变量互不干扰,即一个用户改变法度片中的局部变量不会影响其他用户的法度片中的局部变量。
当一个线程的法度片履行完毕,运行在该线程中的局部变量开释所占的内存。
【例4】策画1-100的连气儿和。
Example2_4.jsp
<%@ page contentType=text/html;charset=UTF-8 %>
<HTML><BODY bgcolor=cyan><FONT size=6>
<%! int continueSum(int n){
int sum=0;
for(int i=1;i<=n;i++){
sum=sum+i;
}
return sum;
}
%>
<P>1-100的连气儿和:<BR>
<% long sum;
sum=continueSum(100);
out.print(sum);
%>
</BODY></HTML>
当多个客户同时恳求一个JSP页面时,JSP页面的法度片就会被多次调用运行,分别运行在不合的线程中。重视,一个线程在履行法度片时代可以调用JSP页面的办法操纵JSP页面的成员变量,而这些成员变量是被所有的用户共享的。在编写JSP页面时,对这种景象应多加重视。例如,若是一个用户在履行法度片时调用JSP页面的办法操纵JSP页面的成员变量时,可能不其他用户也调用该办法操纵成员变量,一面对其产生晦气的影响,就应当将操纵成员变量的办法用synchronized关键字润饰。当一个线程在履行法度片时代调用synchronized办法时,其他线程想在法度片中调用该synchronized办法时就必须守候,知道调用synchronized办法的线程调用履行完该办法。
【例5】经由过程一个synchronized办法操纵成员变量来实现一个简单的计数器。
Example2_5.jsp
<%@ page contentType=text/html;charset=UTF-8 %>
<HTML><BODY>
<%! int count=0;
synchronized void setCount(){
count++;
}
%>
<% setCount();
out.println(您是第+count+个接见本站的客户);
%>
</BODY></HTML>
有时按照须要,可以将法度片分成几个小的法度片,一边插入JSP标识表记标帜或HTML 标识表记标帜。
【例6】在几个法度片之间插入HTML标识表记标帜
Example2_6.jsp
<%@ page contentType=text/html;charset=UTF-8 %>
<HTML><BODY bgcolor=cyan>
<% int sum=0,i,j;
for(i=1;i<=6;i++){
%> <Font size=<%=i%>>
<b>大师好!</b>
</Font>
<% sum=sum+i;
}
if(sum%2==0){
out.print(<BR><b>+sum+</b>);
%> <b>是偶数。</b>
<% }
else{
out.print(<BR><b>+sum+</b>);
%> <b>是奇数。</b>
<% }
%>
</BODY></HTML>
5. JSP页面中的Java表达式
“<%=”和“%>”之间可所以一个Java表达式(重视:“<%=”是一个完全的符号,“<%”和“=”之间不要有空格),这个表达时必须能求值。表达式的值由办事器负责策画,并将策画成果用字符串情势发送到客户端显示。
【例7】策画表达式的值
Example2_7.jsp
<%@ page contentType=text/html;charset=UTF-8 %>
<HTML><BODY bgcolor=cyan><FONT size=4>
<P>Sin(0.9)除以3便是
<%=Math.sin(0.90)/3%>
<p>3的是:
<%=Math.pow(3,2)%>
<P>12345679 乘72便是
<%=1234567972%>
<P>5的根便是
<%=Math.sqrt(5)%>
<P>99大于100吗?答复:
<%=99>100%>
</BODY></HTML>
2.6 JSP中的注释
注释可以加强JSP文件的可读性,便于JSP文件的保护。常见的JSP中的注释有两种。
(1)HTML注释
在标识表记标帜符号“<!--”和“-->”之间参加注释内容:
<!--注释内容-->
JSP引擎把HTML注释交给客户机,客户机经由过程浏览器查看JSP的源文件时,可以或许看到HTML注释。
(2)JSP注释
在标识表记标帜符号“<%--”和“--%>”之间参加注释的内容:
<%--注释内容--%>
JSP引擎忽视JSP注释,即在编译JSP页面时忽视JSP注释。客户经由过程浏览器查看JSP的源文件时,不克不及看到JSP注释。
【例8】应用注释
Example2-8.jsp
<%@ page contentType=text/html;charset=UTF-8 %>
<HTML><BODY>
<!-- 以下是题目1 -->
<H1>大师要重视了,成员变量是大师共享的 </H1>
<%-- 下面是变量和办法的声明,哄骗共享的sum和n策画连气儿和 --%>
<%! long sum=0,n=1;
void computer(){
sum=sum+n;
n=n+1;
}
%>
<%-- 下面是法度片,调用办法获得成果 --%>
<% computer();
out.println(当前连气儿和是:+sum);
%>
</BODY></HTML>
2.7 在JSP页面中应用HTML标识表记标帜
JSP页面可以含有HTML标识表记标帜,当客户经由过程浏览器恳求一个JSP页面时,Tomcat办事器将该JSP页面中的HTML标识表记标帜直接发送给客户机的浏览器,由客户机的浏览器负责履行这些HTML标识表记标帜。而JSP页面中的变量声明、法度片及表达式由Tomcat处理惩罚后,再将有关的成果用文本的体式格式发送给客户机的浏览器。
JSP页面中的HTML标识表记标帜是页面中的静态项目组,即不须要办事器做任何处理惩罚,直接发送给客户机的信息。经由过程应用HTML标识表记标帜,JSP页面可认为用户供给一个友爱的界面,即数据默示层。而JSP页面中的变量声明、法度片和表达式为动态项目组,须要办事器作出处理惩罚后,再将有关处理惩罚后的成果发送给客户。
编写一个结实的Web应用法度,倡导将数据的默示和处理惩罚分别。若是将数据默示和处理惩罚混淆在一个JSP页面中,将导致代码杂沓,晦气于Web应用的拓展和保护。进修JSP,有须要懂得和把握在JSP页面中如何应用Java法度片来处理惩罚数据,因为JSP页面在须要时可以应用少量的Java法度片,而在早期的很多Web应用法度中JSP页面中有多量的Java法度片,这些项目可能须要保护或批改。
HTML是HyperText Marked Language的缩写,即超文本标识表记标帜说话。用HTML编写的文件扩大名为.html(或.htm),称为超文本文档。JSP页面中可以应用HTML标识表记标帜来显示数据,如“<br>你好</br>”将在一个新行中显示“你好”,“<H1>你好</H1>”将用黑体1号字显示“你好”。今朝的HTML大约有100多个标识表记标帜,这些标识表记标帜可以描述数据的显示格局。
1. 表单标识表记标帜
表单的一般格局如下:
<FORM method=get|post action=”提交信息的目标地页面” name=”表单的名字”>
数据提交手段项目组
</FORM>
此中,<FORM>是表单标识表记标帜,method取值get或post。Get办法与post办法的首要差别是:get办法提交的信息会在提交的过程中显示在浏览器的地址栏中,而post办法提交的信息不会显示在地址栏中。提交手段包含:经由过程文本框、经由过程列表、经由过程文本区等。例如:
<FORM action=”tom.jsp” method=”post”>
<Input type=”text” name=”game” value=”ok”>
<Input type=”submit” value=”送出” name=”submit”>
</FORM>
一个表单的数据提交手段项目组经常包含如下子标识表记标帜符号:
<Input,,,>
<Select...> <//Select>
<Option...> </Option>
<TextArea...> </TextArea>
2. <Input>标识表记标帜
在表单中,用Input标识表记标帜来指定表单中数据的输入体式格式以及表单的提交键。Input标识表记标帜中的type属性可以指定输入体式格式的GUI对象,name属性用来指定这个GUI对象的名称。其根蒂根基格局如下:
<Input type=”输入对象的GUI类型” name=”名字”>
办事器经由过程属性name指定的名字来获取“输入对象的GUI类型”中提交的数据。“输入对象的GUI类型”可所以text(文本框)、checkbox(复选框)、submit(提交键)、hidden(隐蔽)等。
(1)Text
当输入对象的GUI类型是text时,除了用name为text指定名字外,还可认为text指定其他的一些值。例如:
<Input type=”text” name=”me” value=”hi” size=”12” algin=”left” maxlength=”30”>
此中,value的值是text的初始值,size是text对象的长度(单位是字符),algin是text在浏览器窗体中的对齐体式格式,maxlength指定text可输入字符的最大长度。
(2)radio
当输入对象的GUI类型是radio时,除了用name为radio指定名字外,还可认为radio指定其他一些值。例如:
<Input type=”radio” name=”rad” value=”red” algin=”top” checked=”Java”>
此中,value指定radio的值;algin是radio在浏览器窗体中的对齐体式格式;若是几个单选钮的name取值雷同,那么同一时刻只能有一个被选中;办事器经由过程name指定的名字来获取被选中的radio提交的由value指定的值;checked若是取值是一个非空的字符串,那么该单选框的初始状况就是选中状况。
(3)Checkbox
当输入对象的GUI类型是Checkbox时,除了用name为checkbox指定名字外,还可认为checkbox指定其他值。例如:
<Input type=”checkbox” name=”ch” value=”pink” algin=”top” checked=”Java”>
此中,value指定checkbox的值。复选框与单选钮的差别就是复选框可以多选。办事器经由过程name指定的名字来获取被选中的checkbox提交的由value指定的值;checked若是取值是一个非空的字符串,那么该复选框的初始状况就是选中状况。
(4)Password
Password是输进口令用的特别文本框,输入的信息用“”回显,防止他人偷看。例如:
<Input type=”password” name=”me” size=”12” maxlength=”30”>
办事器经由过程name指定的字符串获取password提交的值,在口令框中输入“12345”,那么“12345”将被提交给办事器。口令框仅仅起着不让别人偷看的感化,不供给加密保护办法。
(5)Hidden
当<Input>属性中的type值是hidden时,<Input>没有可见的输入界面,表单直接将<Input>属性中value的值提交给办事器。例如:
<Input type=”hidden” name=”h” value=”123”>
办事器经由过程name指定的名字来获取由value指定的值。
(6)Submit
为了能把表单的数据提交给办事器,一个表单至少要包含一个提交键。例如:
<Input type=”submit” name=”me” value=”ok” size=”12”>
单击【提交】按钮后,办事器就可以获取表单提交的各数据。当然,办事器也可以获取提交键的值,办事器经由过程name指定的名字来获取由提交键提交的value指定的值。
(7)Reset
重置键将表单中输入的数据清空,以便从头输入数据。例如:
<Input type=”reset”>
【例2-9】 JSP页面input.jsp用表单向receive.jsp页面提交数据,input.jsp和receive.jsp均保存在Web办事目次chapter2中。
Input.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<HTML><BODY bgcolor=cyan><FONT size=3>
<FORM action=receive.jsp method=post name=form>
<P>请输入下列信息:
<BR>输入您的姓名:<Input type=text name=name value=张三></BR>
<BR>选择性别:<Input type=radio name=R value=男 checked=default>男
<Input type=radio name=R value=女>女
</BR>
<BR>选择您喜好的歌手:
<Input type=checkbox name=superstar value=张歌手>张歌手
<Input type=checkbox name=superstar value=李歌手>李歌手
<Input type=checkbox name=superstar value=刘歌手>刘歌手
<Input type=checkbox name=superstar value=王歌手>王歌手
</BR>
<Input type=hidden value=这里是隐蔽信息 name=secret>
<Input type=submit value=提交 name=submit>
</FORM>
</FONT></BODY></HTML>
Receive.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<HTML>
<BODY bgcolor=cyan>
<FONT size=3>
<% String yourName=request.getParameter(name);
String yourSex=request.getParameter(R);
String secretMess=request.getParameter(secret);
String personName[]=request.getParameterValues(superstar);
out.println(<P>您的姓名:+yourName+</P>);
out.println(<P>您的性别:+yourSex+</P>);
out.println(<P>您最喜好的歌手:);
if(personName==null){
out.println(一个都不喜好);
}
else{
for(int k=0;k<personName.length;k++){
out.println(+personName[k]);
}
}
out.println(<P>hidden提交的值:+secretMess);
%>
</FONT>
</BODY>
</HTML>
结果如图所示:
(表问我为何乱码,我也布吉岛)
重视:上方的例子中要希罕重视“<%@ page contentType=”text/html;Charset=GB2312” %>”中呈现的“Charset”的大小写拼写,不要写成“charset”,不然轻易呈现中文乱码。
3.<Select>、<Option>标识表记标帜
在表单中,可以应用下拉列表或迁移转变列表来选择要提交的数据。下拉列表和迁移转变列表经由过程在<Select>标识表记标帜中应用若干个<Option>子标识表记标帜来定义。其根蒂根基格局如下:
<Select name=”下拉列表的名字”>
<Option value=”cat”>文本信息
<Option value=”dog”>文本信息
……
<Option value=”600”>文本信息
</Select>
办事器经由过程name的值获取被选中的Option的值(参数value指定的值)。
在Select标识表记标帜中增长size属性,就变成了迁移转变列表。Size的值断定迁移转变列表中选项的可见数量。迁移转变列表的根蒂根基格局如下:
<Select name=”下拉列表的名字” size=”一个正整数”>
<Option value=”cat”>文本信息
<Option value=”dog”>文本信息
……
<Option value=”600”>文本信息
</Select>
办事器经由过程属性name的值获取被选中的Option的值(参数value指定的值)。
4.<TextArea>标识表记标帜
<TextArea>是一个能输入或显示多行文本的文本区。在表单中,应用<Textarea>作为子标识表记标帜,能应用户提交多行文本给办事器。其根蒂根基格局如下:
<TextArea name=”名字” Rows=”文本可见行数” Cols=”文本可见列数”>
</TextArea>
5.表格标识表记标帜<Table>
表格由<Table>、</Table>标识表记标帜定义,一般格局如下:
<TABLE>
<TR width=”该行的宽度”>
<TH width=”单位格的宽度”>单位格中的数据</TH>
……
<TD width=”单位格的宽度”>单位格中的数据</TD>
</TR>
</TABLE>
此中,<TR>……</TR>定义表格的行,行标识表记标帜经由过程应用<TH>或<TD>来定义该行的单位格,<TH>定义标识表记标帜的单位格中的数据加粗显示,<TD>不加粗显示。在<TABLE>中增长border属性,可指定该表格所带边框的宽度,如<TABLE border=2>。
【例2-10】 用一个3行的表格显示数据。
Example2_10.jsp
<%@ page contentType=text/html;charset=UTF-8 %>
<HTML>
<BODY bgcolor=yellow>
<TABLE align=Center border=1>
<TR width=400>
<TD align=Center>welcome</TD>
<TD align=Right>to</TD>
<TD align=Left>Beijing</TD>
</TR>
<TR>
<TH valign=Top>We</TH>
<TD valign=Bottom>Love</TD>
<TD valign=Bottom align=Center>JSP</TD>
</TR>
<TR>
<TD valign=Top>你好</TD>
<TD valign=Bottom>Hello</TD>
<TD valign=Bottom align=Center>how are you</TD>
</TR>
</TABLE>
</BODY>
</HTML>
结果如图所示:
6.图像标识表记标帜<IMG>
应用图像标识表记标帜可以显示一幅图像,<IMG>标识表记标帜的根蒂根基格局如下:
<IMG src=”图像文件的URL”>描述文字</IMG>
若是图像文件和当前页面在同一Web办事目次中,图像文件的地址就是该图像文件的名字,若是图像文件在当前Web办事目次的子目次中,如image子目次,那么“图像文件的URL”就是“image/图像文件的名字”。
<IMG>标识表记标帜中可以应用width和height属性来指定被显示图像的宽和高。若是省略width和height属性,<IMG>标识表记标帜将遵守图像的原始宽度和高度来显示图像。
7.多媒体标识表记标帜<EMBED>
应用<EMBED>标识表记标帜可以播放音乐和视频,当浏览器履行到该标识表记标帜时,会把浏览器地点机械中的默认播放器嵌入到浏览器中,以便播放音乐和视频文件。其根蒂根基格局如下:
<EMBED src=”音乐或视频文件的URL”>描述文字</EMBED>
若是音乐或视频文件在当前Web应用目次中,音乐或视频文件的地址就是该文件的名字。
<EMBED>标识表记标帜中经常应用的属性及取值如下:
Autostart——取值true或false,用来指定音乐或视频文件传送完毕后是否立即播放,默认值是false。
Loop——取值为正整数,用来指定音乐或视频文件轮回播放的次数。
Width,height——取值均为正整数,用width和height指定播放器的宽和高,若是省略width和height属性,将应用默认值。
【例2-11】应用标识表记标帜<IMG>和<EMBED>。用户经由过程.jsp页面中的下拉列表选择一幅图像的名字,经由过程迁移转变列表选择一个视频或音乐文件的名字,单击【提交】按钮,将数据提交给show.jsp页面,该页面应用<IMG>标识表记标帜显示图像、应用<EMBED>标识表记标帜播放音乐或视频。
.jsp
<%@ page contentType=text/html;charset=UTF-8 %>
<HTML>
<BODY bgcolor=cyan>
<FONT size=3>
<FORM action=show.jsp method=post name=form>
<BR>选择一幅图像:
<Select name=image>
<Option Selected value=img1.jsp>人物
<Option value=img2.jpg>景物
<Option value=img3.jpg>动物
</Select>
<BR>选择视频或音乐:
<Select name=video size=3>
<Option value=a.wmv>茉莉花
<Option value=b.wmv>动画片
<Option value=c.avi>飞舞的鸽子
</Select>
<BR><Input TYPE=submit value=提交你的选择 name=submit>
</FORM>
</FONT></BODY></HTML>
Show.jsp
<%@ page contentType=text/html;charset=GB2312 %>
<HTML>
<BODY bgcolor=cyan>
<FONT size=3>
<% String s1=request.getParameter(image);
String s2=request.getParameter(video);
if(s1==null){s1=img1.jpg;}
if(s2==null){s2=a.avi;}
%>
<IMG src=<%=s1 %> width=120 height=120>图像</IMG>
<EMBED src=<%=s2 %> width=150 height=120>视频</EMBED>
</FONT></BODY></HTML>
Show.jsp
<%@ page contentType=text/html;charset=GB2312 %>
<HTML>
<BODY bgcolor=cyan>
<FONT size=3>
<% String s1=request.getParameter(image);
String s2=request.getParameter(video);
if(s1==null){s1=img1.jpg;}
if(s2==null){s2=a.avi;}
%>
<IMG src=<%=s1 %> width=120 height=120>图像</IMG>
<EMBED src=<%=s2 %> width=150 height=120>视频</EMBED>
</FONT></BODY></HTML>
小结
1.“<%!”和“%>”之间声明的变量与“<%”和“%>”之间声明的变量有何不合?
答:前者是成员变量,后者是局部变量。
2. 若是有两个用户接见一个JSP页面,该页面中的Java法度片将被履行几次?
答:2次。
3. 假设有两个用户接见下列JSP页面test.jsp,第一个接见和第二个接见test.jsp页面的用户看到的页面的结果有何不合?
<%@ page contentType=text/html;charset=UTF-8 %>
<HTML>
<BODY>
<%! String str=new String(你好);
synchronized void f(String s){
str=str+s;
}
%>
<% String s=abcd;
f(s);
%>
<%=str%>
</BODY>
</HTML>
答:第一个接见的用户看到的是你好abcd,第二个接见的用户看到的是你好abcdabcd。
4.请编写一个简单的JSP页面,策画出100以内的素数。
答:
<%@ page contentType=text/html; charset=GBK %>
<html>
<head>
<title>
Text
</title>
</head>
<body bgcolor=#ffffff>
<%
int i,j;
for (i = 1; i <= 100; i++) {
for (j = 2; j < i; j++)
{
if (i % j == 0) break;
}
if (j >= i)
{
%>
<%=i %>
<%
}
}
%>
</body>
</html>
5.编写两个JSP页面a.jsp和b.jsp。a.jsp页面应用表单提交数据给b.jsp,请求a.jsp经由过程text体式格式提交一个字符串给b.jsp,b.jsp页面获取a.jsp提交的字符串,并应用Java表达式显示这个字符串及其长度(所含字符的个数)。
答:
a.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<HTML><BODY bgcolor=cyan><FONT size=3>
<FORM action=b.jsp method=post name=form>
<Input type=text name=name value=helloworld>
<Input type=submit value=提交 name=submit>
</FORM>
</FONT></BODY></HTML>
b.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<HTML>
<BODY bgcolor=cyan>
<FONT size=3>
<%!
public static int getStrLen(String str){
if (str==null || str.equals())return 0;
int j=0;
for(int i=0;i<str.length();i++)
{
if(((int)(str.charAt(i)))>255)j+=2;
else j++;
}
return j;
}
%>
<% String yourName=request.getParameter(name);
out.println(<P>您提交的字符串:+yourName+</P>);
out.println(<P>字符串的长度:+getStrLen(yourName));
%>
</FONT>
</BODY>
</HTML>
6. 编写页面inputNumber.jsp和getNumber.jsp。inputNumber.jsp页面应用表单提交数据给getNumber.jsp页面,请求inputNumber.jsp经由过程text体式格式提交一个数字给getNumber.jsp。getNumber.jsp策画并显示这个数的和立方。
答:
inputNumber.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<HTML><BODY bgcolor=cyan><FONT size=3>
<FORM action=getNumber.jsp method=post name=form>
<Input type=text name=number value=5>
<Input type=submit value=提交 name=submit>
</FORM>
</FONT></BODY></HTML>
getNumber.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<HTML>
<BODY bgcolor=cyan>
<FONT size=3>
<% String s=request.getParameter(number);
try{
double d=Double.parseDouble(s);
out.println(dd);
out.println(<BR>+ddd);
}
catch(NumberFormatException exp){
out.println(<BR>+exp);
}
%>
</FONT>
</BODY>
</HTML>
所有随风而逝的都属于昨天的,所有历经风雨留下来的才是面向未来的。—— 玛格丽特·米切尔 《飘》
1. JSP页面的根蒂根基布局
在传统的HTML页面中参加Java法度片和JSP标签,就构成了一个JSP页面。一个JSP页面可由5种元素组合而成:(1)通俗的HTML标识表记标帜符;(2)JSP标识表记标帜,如指令标识表记标帜、动作标识表记标帜;(3)成员变量和办法;(4)Java法度片;(5)Java表达式。
【例2-1】
<%@ page contentType=text/html;charset=UTF-8 %> <!--JSP指令标识表记标帜-->
<%@ page import=java.util.Date %> <!--JSP指令标识表记标帜-->
<%! Date date; //数据声明
int sum;
public int add(int m,int n){ //办法声明
return m+n;
}
%>
<HTML><BODY bgcolor=cyan> <!--HTML标识表记标帜-->
<FONT size=4><P>法度片创建Date对象:
<% date=new Date(); //Java法度片
out.println(<BR>+date);
sum=add(12,34);
%>
<BR>鄙人一行输出和:<BR>
<%= sum+100 %> <!--Java表达式-->
</FONT></BODY></HTML>
2. JSP的运行道理
当Tomcat办事器上的一个JSP页面第一次被恳求履行时,Tomcat办事器将启动一个线程。该线程的任务是,起首将JSP页面文件转移成一个Java文件,再将这个Java文件编译成一个字节码文件,并将该字节码文件加载到内存中,然后履行字节码文件响应客户的恳求,该线程完成任务后,线程进入灭亡状况。这个字节码的功能如下:
(1)把JSP页面中通俗的HTML标识表记标帜符号,交给客户的浏览器履行显示。
(2)JSP标识表记标帜、数据和办法声明、Java法度片由Tomcat办事器负责履行,将须要显示的成果发送给客户的浏览器。
(3)Java表达式由Tomcat办事器负责策画,将成果转化为字符串,交给客户的浏览器负责显示。
被加载到内存中的字节码将常驻内存,当这个JSP页面再次被恳求履行时,Tomcat办事器将再启动一个线程,直接履行常驻内存的字节码文件来响应客户。这也是JSP比ASP速度快的一个原因。而JSP页面的初次履行往往由办事器经管者来进行。
当多个客户恳求一个JSP页面时,Tomcat办事器为每个客户启动一个线程,该线程负责履行常驻内存的字节码文件来响应响应客户的恳求。这些线程由Tomcat办事器来经管,将CPU的应用权在各线程之间快速切换,以包管每个线程都有机会履行字节码文件,这与传统的CGI为每个用户启动一个过程相斗劲,效力要高得多。
注:若是对JSP页面进行了批改、保存,那么Tomcat办事器会生成新的字节码。
下面是Tomcat办事器生成的example2_1.jsp的Java文件,我们把Tomcat办事器交给客户端浏览器显示的内容作了注释(&)。在Tomcat办事器下的目次work\Catalina\localhost\chapter2\org\apache\jsp中,可以找到Tomcat办事器生成的JSP页面对应的Java文件和编译Java文件获得的字节码文件。
/
Generated by the Jasper component of Apache Tomcat
Version: Apache Tomcat/7.0.29
Generated at: 2013-05-07 13:29:20 UTC
Note: The last modified time of this file was set to
the last modified time of the source file after
generation to assist with modification tracking.
/
package org.apache.jsp;
import javax.servlet.;
import javax.servlet.http.;
import javax.servlet.jsp.;
import java.util.Date;
public final class example2_005f1_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
Date date; //数据声明
int sum;
public int add(int m,int n){ //办法声明
return m+n;
}
private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory();
private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
private javax.el.ExpressionFactory _el_expressionfactory;
private org.apache.tomcat.InstanceManager _js p_instancemanager;
public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
}
public void _jspInit() {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
_js p_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
public void _jspDestroy() {
}
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
response.setContentType(text/html;charset=UTF-8);
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write( <!--JSP指令标识表记标帜-->\r\n); (&)
out.write( <!--JSP指令标识表记标帜-->\r\n); (&)
out.write(\r\n); (&)
out.write(<HTML><BODY bgcolor=cyan> <!--HTML标识表记标帜-->\r\n); (&)
out.write(<FONT size=4><P>法度片创建Date对象:\r\n); (&)
date=new Date(); //Java法度片
out.println(<BR>+date);
sum=add(12,34);
out.write(\r\n); (&)
out.write(<BR>鄙人一行输出和:<BR>\r\n); (&)
out.print( sum+100 ); (&)
out.write( <!--Java表达式-->\r\n); (&)
out.write(</FONT></BODY></HTML> ); (&)
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try { out.clearBuffer(); } catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
3. JSP页面的成员变量和办法
JSP页面可包含HTML标识表记标帜、JSP指令标识表记标帜、成员变量和办法、Java法度片和Java表达式。
JSP页面在标识表记标帜符“<%!”和“%>”之间声明他的成员变量和办法。
(1)声明变量
可以在JSP页面的标识表记标帜符“<%!”和“%>”之间声明变量,即在“<%!”和“%>”之间放置Java的变量声明语句,变量的类型可所以Java说话容许的任何数据类型。
标识表记标帜符“<%!”和“%>”之间声明的变量称为JSP页面的成员变量。例如:
<%! Int x,y=100;
Date date;
%>
“<%!”和“%>”之间声明的变量在全部JSP页面内有效,因为Tomcat办事器将JSP页面转译成Java文件时,将这些变量作为类的成员变量,这些变量的内存空间直到办事器封闭才开释。当多个客户恳求一个JSP页面时,Tomcat办事器为每个客户启动一个线程,这些用户线程将共享JSP页面的成员变量。这些用户线程由Tomcat办事器来经管,Tomcat办事器将CPU的应用权在各个线程间快速切换,以包管每个线程轮流履行JSP页面(对应的字节码),是以任何一个线程对JSP页面成员变量操纵的成果,都邑影响到其他线程。
【例2】哄骗成员变量被所有效户共享这一性质,实现一个简单的计数器。
Example2_2.jsp
<%@ page contentType=text/html;charset=UTF-8 %>
<HTML><BODY bgcolor=pink><FONT size=4>
<%! int i=0;
%>
<% i++;
%>
<P>您是第<%=i%>个接见本站的客户。
</BODY></HTML>
结果如图所示:
(2)声明办法
JSP在“<%!”和“%>”之间定义若干个办法,这些办法可以在Java法度片中被调用履行。在例3中,我们在“<%!”和“%>”之间定义了两个办法:add(int x,int y)和sub(int x,int y),然后在法度片中调用这两个办法。
【例3】
Example2_3.jsp
<%@ page contentType=text/html;Charset=UTF-8 %>
<HTML><BODY bgcolor=yellow>
<%! int add(int x,int y){
return x+y;
}
int sub(int x,int y){
return x-y;
}
%>
<% out.println(<BR>调用add办法策画200与123之和:);
int a=add(200,123);
out.println(a);
out.println(<BR>调用sub办法策画200与123之差:);
int b=sub(200,123);
out.println(b);
%>
</BODY></HTML>
结果如图所示:
4. JSP页面中的Java法度片
可以在“<%”和“%>”之间插入Java法度片。一个JSP页面可以有很多法度片,这些法度片按次序履行。在一个法度片中声明的变量称为JSP页面的局部变量。该局部变量在JSP页面后继的所有法度片及表达式内都有效。这是因为,Tomcat办事器将JSP页面转译成Java文件时,将法度片中声明的变量作为类中某个办法的变量(即局部变量)应用。
当多个客户恳求一个JSP页面时,Tomcat为每个客户启动一个线程,然后该线程履行JSP页面,那么Java法度片将被履行多次,分别在不合的线程中履行。
Java法度片的履行具有如下特点:
(1)操纵JSP页面的成员变量
Java法度片中操纵的成员变量是各线程共享的变量,任何一个线程对JSP成员变量操纵的成果,都邑影响到其他线程。
(2)调用JSP页面的办法
Java法度片中可以呈现办法调用语句,该办法必须是JSP页面的办法。
(3)声明操纵局部变量
当一个线程享用CPU资料时,Tomcat让该线程履行法度片。这时,法度片中的局部变量被分派内存空间,当轮到另一个线程享用CPU资料时,Tomcat让该线程再次履行Java法度片,那么,法度片中的局部变量会再次分派内存空间。也就是说,法度片已经被履行了两次,分别运行在不合的线程中,即运行在不合的时候片内。运行在不合线程中的法度片内的局部变量互不干扰,即一个用户改变法度片中的局部变量不会影响其他用户的法度片中的局部变量。
当一个线程的法度片履行完毕,运行在该线程中的局部变量开释所占的内存。
【例4】策画1-100的连气儿和。
Example2_4.jsp
<%@ page contentType=text/html;charset=UTF-8 %>
<HTML><BODY bgcolor=cyan><FONT size=6>
<%! int continueSum(int n){
int sum=0;
for(int i=1;i<=n;i++){
sum=sum+i;
}
return sum;
}
%>
<P>1-100的连气儿和:<BR>
<% long sum;
sum=continueSum(100);
out.print(sum);
%>
</BODY></HTML>
当多个客户同时恳求一个JSP页面时,JSP页面的法度片就会被多次调用运行,分别运行在不合的线程中。重视,一个线程在履行法度片时代可以调用JSP页面的办法操纵JSP页面的成员变量,而这些成员变量是被所有的用户共享的。在编写JSP页面时,对这种景象应多加重视。例如,若是一个用户在履行法度片时调用JSP页面的办法操纵JSP页面的成员变量时,可能不其他用户也调用该办法操纵成员变量,一面对其产生晦气的影响,就应当将操纵成员变量的办法用synchronized关键字润饰。当一个线程在履行法度片时代调用synchronized办法时,其他线程想在法度片中调用该synchronized办法时就必须守候,知道调用synchronized办法的线程调用履行完该办法。
【例5】经由过程一个synchronized办法操纵成员变量来实现一个简单的计数器。
Example2_5.jsp
<%@ page contentType=text/html;charset=UTF-8 %>
<HTML><BODY>
<%! int count=0;
synchronized void setCount(){
count++;
}
%>
<% setCount();
out.println(您是第+count+个接见本站的客户);
%>
</BODY></HTML>
有时按照须要,可以将法度片分成几个小的法度片,一边插入JSP标识表记标帜或HTML 标识表记标帜。
【例6】在几个法度片之间插入HTML标识表记标帜
Example2_6.jsp
<%@ page contentType=text/html;charset=UTF-8 %>
<HTML><BODY bgcolor=cyan>
<% int sum=0,i,j;
for(i=1;i<=6;i++){
%> <Font size=<%=i%>>
<b>大师好!</b>
</Font>
<% sum=sum+i;
}
if(sum%2==0){
out.print(<BR><b>+sum+</b>);
%> <b>是偶数。</b>
<% }
else{
out.print(<BR><b>+sum+</b>);
%> <b>是奇数。</b>
<% }
%>
</BODY></HTML>
5. JSP页面中的Java表达式
“<%=”和“%>”之间可所以一个Java表达式(重视:“<%=”是一个完全的符号,“<%”和“=”之间不要有空格),这个表达时必须能求值。表达式的值由办事器负责策画,并将策画成果用字符串情势发送到客户端显示。
【例7】策画表达式的值
Example2_7.jsp
<%@ page contentType=text/html;charset=UTF-8 %>
<HTML><BODY bgcolor=cyan><FONT size=4>
<P>Sin(0.9)除以3便是
<%=Math.sin(0.90)/3%>
<p>3的是:
<%=Math.pow(3,2)%>
<P>12345679 乘72便是
<%=1234567972%>
<P>5的根便是
<%=Math.sqrt(5)%>
<P>99大于100吗?答复:
<%=99>100%>
</BODY></HTML>
2.6 JSP中的注释
注释可以加强JSP文件的可读性,便于JSP文件的保护。常见的JSP中的注释有两种。
(1)HTML注释
在标识表记标帜符号“<!--”和“-->”之间参加注释内容:
<!--注释内容-->
JSP引擎把HTML注释交给客户机,客户机经由过程浏览器查看JSP的源文件时,可以或许看到HTML注释。
(2)JSP注释
在标识表记标帜符号“<%--”和“--%>”之间参加注释的内容:
<%--注释内容--%>
JSP引擎忽视JSP注释,即在编译JSP页面时忽视JSP注释。客户经由过程浏览器查看JSP的源文件时,不克不及看到JSP注释。
【例8】应用注释
Example2-8.jsp
<%@ page contentType=text/html;charset=UTF-8 %>
<HTML><BODY>
<!-- 以下是题目1 -->
<H1>大师要重视了,成员变量是大师共享的 </H1>
<%-- 下面是变量和办法的声明,哄骗共享的sum和n策画连气儿和 --%>
<%! long sum=0,n=1;
void computer(){
sum=sum+n;
n=n+1;
}
%>
<%-- 下面是法度片,调用办法获得成果 --%>
<% computer();
out.println(当前连气儿和是:+sum);
%>
</BODY></HTML>
2.7 在JSP页面中应用HTML标识表记标帜
JSP页面可以含有HTML标识表记标帜,当客户经由过程浏览器恳求一个JSP页面时,Tomcat办事器将该JSP页面中的HTML标识表记标帜直接发送给客户机的浏览器,由客户机的浏览器负责履行这些HTML标识表记标帜。而JSP页面中的变量声明、法度片及表达式由Tomcat处理惩罚后,再将有关的成果用文本的体式格式发送给客户机的浏览器。
JSP页面中的HTML标识表记标帜是页面中的静态项目组,即不须要办事器做任何处理惩罚,直接发送给客户机的信息。经由过程应用HTML标识表记标帜,JSP页面可认为用户供给一个友爱的界面,即数据默示层。而JSP页面中的变量声明、法度片和表达式为动态项目组,须要办事器作出处理惩罚后,再将有关处理惩罚后的成果发送给客户。
编写一个结实的Web应用法度,倡导将数据的默示和处理惩罚分别。若是将数据默示和处理惩罚混淆在一个JSP页面中,将导致代码杂沓,晦气于Web应用的拓展和保护。进修JSP,有须要懂得和把握在JSP页面中如何应用Java法度片来处理惩罚数据,因为JSP页面在须要时可以应用少量的Java法度片,而在早期的很多Web应用法度中JSP页面中有多量的Java法度片,这些项目可能须要保护或批改。
HTML是HyperText Marked Language的缩写,即超文本标识表记标帜说话。用HTML编写的文件扩大名为.html(或.htm),称为超文本文档。JSP页面中可以应用HTML标识表记标帜来显示数据,如“<br>你好</br>”将在一个新行中显示“你好”,“<H1>你好</H1>”将用黑体1号字显示“你好”。今朝的HTML大约有100多个标识表记标帜,这些标识表记标帜可以描述数据的显示格局。
1. 表单标识表记标帜
表单的一般格局如下:
<FORM method=get|post action=”提交信息的目标地页面” name=”表单的名字”>
数据提交手段项目组
</FORM>
此中,<FORM>是表单标识表记标帜,method取值get或post。Get办法与post办法的首要差别是:get办法提交的信息会在提交的过程中显示在浏览器的地址栏中,而post办法提交的信息不会显示在地址栏中。提交手段包含:经由过程文本框、经由过程列表、经由过程文本区等。例如:
<FORM action=”tom.jsp” method=”post”>
<Input type=”text” name=”game” value=”ok”>
<Input type=”submit” value=”送出” name=”submit”>
</FORM>
一个表单的数据提交手段项目组经常包含如下子标识表记标帜符号:
<Input,,,>
<Select...> <//Select>
<Option...> </Option>
<TextArea...> </TextArea>
2. <Input>标识表记标帜
在表单中,用Input标识表记标帜来指定表单中数据的输入体式格式以及表单的提交键。Input标识表记标帜中的type属性可以指定输入体式格式的GUI对象,name属性用来指定这个GUI对象的名称。其根蒂根基格局如下:
<Input type=”输入对象的GUI类型” name=”名字”>
办事器经由过程属性name指定的名字来获取“输入对象的GUI类型”中提交的数据。“输入对象的GUI类型”可所以text(文本框)、checkbox(复选框)、submit(提交键)、hidden(隐蔽)等。
(1)Text
当输入对象的GUI类型是text时,除了用name为text指定名字外,还可认为text指定其他的一些值。例如:
<Input type=”text” name=”me” value=”hi” size=”12” algin=”left” maxlength=”30”>
此中,value的值是text的初始值,size是text对象的长度(单位是字符),algin是text在浏览器窗体中的对齐体式格式,maxlength指定text可输入字符的最大长度。
(2)radio
当输入对象的GUI类型是radio时,除了用name为radio指定名字外,还可认为radio指定其他一些值。例如:
<Input type=”radio” name=”rad” value=”red” algin=”top” checked=”Java”>
此中,value指定radio的值;algin是radio在浏览器窗体中的对齐体式格式;若是几个单选钮的name取值雷同,那么同一时刻只能有一个被选中;办事器经由过程name指定的名字来获取被选中的radio提交的由value指定的值;checked若是取值是一个非空的字符串,那么该单选框的初始状况就是选中状况。
(3)Checkbox
当输入对象的GUI类型是Checkbox时,除了用name为checkbox指定名字外,还可认为checkbox指定其他值。例如:
<Input type=”checkbox” name=”ch” value=”pink” algin=”top” checked=”Java”>
此中,value指定checkbox的值。复选框与单选钮的差别就是复选框可以多选。办事器经由过程name指定的名字来获取被选中的checkbox提交的由value指定的值;checked若是取值是一个非空的字符串,那么该复选框的初始状况就是选中状况。
(4)Password
Password是输进口令用的特别文本框,输入的信息用“”回显,防止他人偷看。例如:
<Input type=”password” name=”me” size=”12” maxlength=”30”>
办事器经由过程name指定的字符串获取password提交的值,在口令框中输入“12345”,那么“12345”将被提交给办事器。口令框仅仅起着不让别人偷看的感化,不供给加密保护办法。
(5)Hidden
当<Input>属性中的type值是hidden时,<Input>没有可见的输入界面,表单直接将<Input>属性中value的值提交给办事器。例如:
<Input type=”hidden” name=”h” value=”123”>
办事器经由过程name指定的名字来获取由value指定的值。
(6)Submit
为了能把表单的数据提交给办事器,一个表单至少要包含一个提交键。例如:
<Input type=”submit” name=”me” value=”ok” size=”12”>
单击【提交】按钮后,办事器就可以获取表单提交的各数据。当然,办事器也可以获取提交键的值,办事器经由过程name指定的名字来获取由提交键提交的value指定的值。
(7)Reset
重置键将表单中输入的数据清空,以便从头输入数据。例如:
<Input type=”reset”>
【例2-9】 JSP页面input.jsp用表单向receive.jsp页面提交数据,input.jsp和receive.jsp均保存在Web办事目次chapter2中。
Input.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<HTML><BODY bgcolor=cyan><FONT size=3>
<FORM action=receive.jsp method=post name=form>
<P>请输入下列信息:
<BR>输入您的姓名:<Input type=text name=name value=张三></BR>
<BR>选择性别:<Input type=radio name=R value=男 checked=default>男
<Input type=radio name=R value=女>女
</BR>
<BR>选择您喜好的歌手:
<Input type=checkbox name=superstar value=张歌手>张歌手
<Input type=checkbox name=superstar value=李歌手>李歌手
<Input type=checkbox name=superstar value=刘歌手>刘歌手
<Input type=checkbox name=superstar value=王歌手>王歌手
</BR>
<Input type=hidden value=这里是隐蔽信息 name=secret>
<Input type=submit value=提交 name=submit>
</FORM>
</FONT></BODY></HTML>
Receive.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<HTML>
<BODY bgcolor=cyan>
<FONT size=3>
<% String yourName=request.getParameter(name);
String yourSex=request.getParameter(R);
String secretMess=request.getParameter(secret);
String personName[]=request.getParameterValues(superstar);
out.println(<P>您的姓名:+yourName+</P>);
out.println(<P>您的性别:+yourSex+</P>);
out.println(<P>您最喜好的歌手:);
if(personName==null){
out.println(一个都不喜好);
}
else{
for(int k=0;k<personName.length;k++){
out.println(+personName[k]);
}
}
out.println(<P>hidden提交的值:+secretMess);
%>
</FONT>
</BODY>
</HTML>
结果如图所示:
(表问我为何乱码,我也布吉岛)
重视:上方的例子中要希罕重视“<%@ page contentType=”text/html;Charset=GB2312” %>”中呈现的“Charset”的大小写拼写,不要写成“charset”,不然轻易呈现中文乱码。
3.<Select>、<Option>标识表记标帜
在表单中,可以应用下拉列表或迁移转变列表来选择要提交的数据。下拉列表和迁移转变列表经由过程在<Select>标识表记标帜中应用若干个<Option>子标识表记标帜来定义。其根蒂根基格局如下:
<Select name=”下拉列表的名字”>
<Option value=”cat”>文本信息
<Option value=”dog”>文本信息
……
<Option value=”600”>文本信息
</Select>
办事器经由过程name的值获取被选中的Option的值(参数value指定的值)。
在Select标识表记标帜中增长size属性,就变成了迁移转变列表。Size的值断定迁移转变列表中选项的可见数量。迁移转变列表的根蒂根基格局如下:
<Select name=”下拉列表的名字” size=”一个正整数”>
<Option value=”cat”>文本信息
<Option value=”dog”>文本信息
……
<Option value=”600”>文本信息
</Select>
办事器经由过程属性name的值获取被选中的Option的值(参数value指定的值)。
4.<TextArea>标识表记标帜
<TextArea>是一个能输入或显示多行文本的文本区。在表单中,应用<Textarea>作为子标识表记标帜,能应用户提交多行文本给办事器。其根蒂根基格局如下:
<TextArea name=”名字” Rows=”文本可见行数” Cols=”文本可见列数”>
</TextArea>
5.表格标识表记标帜<Table>
表格由<Table>、</Table>标识表记标帜定义,一般格局如下:
<TABLE>
<TR width=”该行的宽度”>
<TH width=”单位格的宽度”>单位格中的数据</TH>
……
<TD width=”单位格的宽度”>单位格中的数据</TD>
</TR>
</TABLE>
此中,<TR>……</TR>定义表格的行,行标识表记标帜经由过程应用<TH>或<TD>来定义该行的单位格,<TH>定义标识表记标帜的单位格中的数据加粗显示,<TD>不加粗显示。在<TABLE>中增长border属性,可指定该表格所带边框的宽度,如<TABLE border=2>。
【例2-10】 用一个3行的表格显示数据。
Example2_10.jsp
<%@ page contentType=text/html;charset=UTF-8 %>
<HTML>
<BODY bgcolor=yellow>
<TABLE align=Center border=1>
<TR width=400>
<TD align=Center>welcome</TD>
<TD align=Right>to</TD>
<TD align=Left>Beijing</TD>
</TR>
<TR>
<TH valign=Top>We</TH>
<TD valign=Bottom>Love</TD>
<TD valign=Bottom align=Center>JSP</TD>
</TR>
<TR>
<TD valign=Top>你好</TD>
<TD valign=Bottom>Hello</TD>
<TD valign=Bottom align=Center>how are you</TD>
</TR>
</TABLE>
</BODY>
</HTML>
结果如图所示:
6.图像标识表记标帜<IMG>
应用图像标识表记标帜可以显示一幅图像,<IMG>标识表记标帜的根蒂根基格局如下:
<IMG src=”图像文件的URL”>描述文字</IMG>
若是图像文件和当前页面在同一Web办事目次中,图像文件的地址就是该图像文件的名字,若是图像文件在当前Web办事目次的子目次中,如image子目次,那么“图像文件的URL”就是“image/图像文件的名字”。
<IMG>标识表记标帜中可以应用width和height属性来指定被显示图像的宽和高。若是省略width和height属性,<IMG>标识表记标帜将遵守图像的原始宽度和高度来显示图像。
7.多媒体标识表记标帜<EMBED>
应用<EMBED>标识表记标帜可以播放音乐和视频,当浏览器履行到该标识表记标帜时,会把浏览器地点机械中的默认播放器嵌入到浏览器中,以便播放音乐和视频文件。其根蒂根基格局如下:
<EMBED src=”音乐或视频文件的URL”>描述文字</EMBED>
若是音乐或视频文件在当前Web应用目次中,音乐或视频文件的地址就是该文件的名字。
<EMBED>标识表记标帜中经常应用的属性及取值如下:
Autostart——取值true或false,用来指定音乐或视频文件传送完毕后是否立即播放,默认值是false。
Loop——取值为正整数,用来指定音乐或视频文件轮回播放的次数。
Width,height——取值均为正整数,用width和height指定播放器的宽和高,若是省略width和height属性,将应用默认值。
【例2-11】应用标识表记标帜<IMG>和<EMBED>。用户经由过程.jsp页面中的下拉列表选择一幅图像的名字,经由过程迁移转变列表选择一个视频或音乐文件的名字,单击【提交】按钮,将数据提交给show.jsp页面,该页面应用<IMG>标识表记标帜显示图像、应用<EMBED>标识表记标帜播放音乐或视频。
.jsp
<%@ page contentType=text/html;charset=UTF-8 %>
<HTML>
<BODY bgcolor=cyan>
<FONT size=3>
<FORM action=show.jsp method=post name=form>
<BR>选择一幅图像:
<Select name=image>
<Option Selected value=img1.jsp>人物
<Option value=img2.jpg>景物
<Option value=img3.jpg>动物
</Select>
<BR>选择视频或音乐:
<Select name=video size=3>
<Option value=a.wmv>茉莉花
<Option value=b.wmv>动画片
<Option value=c.avi>飞舞的鸽子
</Select>
<BR><Input TYPE=submit value=提交你的选择 name=submit>
</FORM>
</FONT></BODY></HTML>
Show.jsp
<%@ page contentType=text/html;charset=GB2312 %>
<HTML>
<BODY bgcolor=cyan>
<FONT size=3>
<% String s1=request.getParameter(image);
String s2=request.getParameter(video);
if(s1==null){s1=img1.jpg;}
if(s2==null){s2=a.avi;}
%>
<IMG src=<%=s1 %> width=120 height=120>图像</IMG>
<EMBED src=<%=s2 %> width=150 height=120>视频</EMBED>
</FONT></BODY></HTML>
Show.jsp
<%@ page contentType=text/html;charset=GB2312 %>
<HTML>
<BODY bgcolor=cyan>
<FONT size=3>
<% String s1=request.getParameter(image);
String s2=request.getParameter(video);
if(s1==null){s1=img1.jpg;}
if(s2==null){s2=a.avi;}
%>
<IMG src=<%=s1 %> width=120 height=120>图像</IMG>
<EMBED src=<%=s2 %> width=150 height=120>视频</EMBED>
</FONT></BODY></HTML>
小结
1.“<%!”和“%>”之间声明的变量与“<%”和“%>”之间声明的变量有何不合?
答:前者是成员变量,后者是局部变量。
2. 若是有两个用户接见一个JSP页面,该页面中的Java法度片将被履行几次?
答:2次。
3. 假设有两个用户接见下列JSP页面test.jsp,第一个接见和第二个接见test.jsp页面的用户看到的页面的结果有何不合?
<%@ page contentType=text/html;charset=UTF-8 %>
<HTML>
<BODY>
<%! String str=new String(你好);
synchronized void f(String s){
str=str+s;
}
%>
<% String s=abcd;
f(s);
%>
<%=str%>
</BODY>
</HTML>
答:第一个接见的用户看到的是你好abcd,第二个接见的用户看到的是你好abcdabcd。
4.请编写一个简单的JSP页面,策画出100以内的素数。
答:
<%@ page contentType=text/html; charset=GBK %>
<html>
<head>
<title>
Text
</title>
</head>
<body bgcolor=#ffffff>
<%
int i,j;
for (i = 1; i <= 100; i++) {
for (j = 2; j < i; j++)
{
if (i % j == 0) break;
}
if (j >= i)
{
%>
<%=i %>
<%
}
}
%>
</body>
</html>
5.编写两个JSP页面a.jsp和b.jsp。a.jsp页面应用表单提交数据给b.jsp,请求a.jsp经由过程text体式格式提交一个字符串给b.jsp,b.jsp页面获取a.jsp提交的字符串,并应用Java表达式显示这个字符串及其长度(所含字符的个数)。
答:
a.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<HTML><BODY bgcolor=cyan><FONT size=3>
<FORM action=b.jsp method=post name=form>
<Input type=text name=name value=helloworld>
<Input type=submit value=提交 name=submit>
</FORM>
</FONT></BODY></HTML>
b.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<HTML>
<BODY bgcolor=cyan>
<FONT size=3>
<%!
public static int getStrLen(String str){
if (str==null || str.equals())return 0;
int j=0;
for(int i=0;i<str.length();i++)
{
if(((int)(str.charAt(i)))>255)j+=2;
else j++;
}
return j;
}
%>
<% String yourName=request.getParameter(name);
out.println(<P>您提交的字符串:+yourName+</P>);
out.println(<P>字符串的长度:+getStrLen(yourName));
%>
</FONT>
</BODY>
</HTML>
6. 编写页面inputNumber.jsp和getNumber.jsp。inputNumber.jsp页面应用表单提交数据给getNumber.jsp页面,请求inputNumber.jsp经由过程text体式格式提交一个数字给getNumber.jsp。getNumber.jsp策画并显示这个数的和立方。
答:
inputNumber.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<HTML><BODY bgcolor=cyan><FONT size=3>
<FORM action=getNumber.jsp method=post name=form>
<Input type=text name=number value=5>
<Input type=submit value=提交 name=submit>
</FORM>
</FONT></BODY></HTML>
getNumber.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<HTML>
<BODY bgcolor=cyan>
<FONT size=3>
<% String s=request.getParameter(number);
try{
double d=Double.parseDouble(s);
out.println(dd);
out.println(<BR>+ddd);
}
catch(NumberFormatException exp){
out.println(<BR>+exp);
}
%>
</FONT>
</BODY>
</HTML>