有些对象不用声明就可以在JSP页面的Java程序片和表达式部分使用,这就是JSP的内置对象。
JSP的常用内置对象有request
、response
、session
、application
和out
。response
和request
对象是JSP内置对象中较重要的两个,这两个对象提供了对服务器和浏览器通信方法的控制。直接讨论这两个对象前,要先对HTTP协议—Wordwide Wcb
底层协议作简单介绍。
使用浏览器从网站获取HTML页面时,实际上是在使用Hypertext Transfer Protocol
(HTTP)。HTTP协议规定了信息在Internet
上的传输方法,特别是规定了浏览器与服务器的交互方法从网站获取页面时,浏览器在网站上打开了一个针对网络服务器的连接,并发出请求服务器收到请求后回应,所以HTTP协议被称作“请求和响应”协议。
浏览器请求有某种结构,HTTP请求包括请求行、头域和可能的信息体。最普通的请求类型是对页面的一个简单请求,请求方法包括post
、head
、delete
、trace
及put
方法等。
一个典型请求通常包含许多头,称为请求的HTTP头。头提供了关于信息体的附加信息及请求的来源。其中有些头是标准的,有些则和特定的浏览器有关个请求还可能包含信息体。
服务器在收到请求时,返回HTTP响应。响应也有某种结构,每个响应都由状态行开始,可以包含几个头及可能的信息体,称为响应的HTTP头和响应信息体。这些头和信息体由服务器发送给用户的浏览器,信息体就是用户请求的网页的运行结果,对于JSP页面,就是网页的静态信息。状态行说明了正在使用的协议、状态代码及文本信息。
一、request对象
HTTP通信协议是用户与服务器之间一种提交(请求)信息与响应信息(request/ response)的通信协议。在JSP中,内置对象 request
封装了用户提交的信息,那么该对象调用相应的方法可以获取封装的信息,即使用该对象可以获取用户提交的信息。
内置对象 request
是实现了 Servlet Request
接口类的一个实例,可以在 Tomcat服务器的 webapps\tomcat-docs\servletapi
中查找 Servlet Request
接口的方法。
用户通常使用HTML表单向服务器的某个JSP页面提交信息,表单的一般格式是:
< form action="提交信息的目的地页面” method= get|post>
提交手段
</form>
其中<form>
是表单标记, method
取值get
或post
。get
方法和post
方法的主要区别是:使用get方法提交的信息会在提交的过程中显示在浏览器的地址栏中,而post方法提交的信息不会显示在地址栏中。提交手段包括文本框、列表、文本区等。
1、获取用户提交的信息
request
对象获取用户提交信息的最常用的方法是 getParameter( String s)
。
实例example3_1.jsp
源码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body bgcolor="cyan">
<form action = "example3_1_computer.jsp" method = post>
<input type = "text" name = "sizeA" value = 1 size = 6>
<input type = "text" name = "sizeB" value = 1 size = 6>
<input type = "text" name = "sizeC" value = 1 size = 6>
<input type = "submit" value = "提交" name = "submit">
</form>
</body>
</html>
example3_1_computer.jsp
源码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body bgcolor = "yellow">
<%
String sideA = request.getParameter("sizeA");
String sideB = request.getParameter("sizeB");
String sideC = request.getParameter("sizeC");
try{
double a = Double.parseDouble(sideA);
double b = Double.parseDouble(sideB);
double c = Double.parseDouble(sideC);
double p = (a+b+c)/2,area = 0;
area = Math.sqrt(p*(p-a)*(p-b)*(p-c));
out.println("<br>三角形的面积:" + area);
}catch(NumberFormatException ee){
out.println("<br>请输入数字字符");
}
%>
</body>
</html>
在下面的例子3_2中, example3_2.jsp
通过表单向自己提交一串用#
号分隔的数字,然后计算这些数字的算术和。如果表单中的 action
请求的页面是当前页面,可以用双引号""
代替当前页面,注意双引号中不能含有空格。
实例example3_2.jsp
源码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body bgcolor = cyan>
<font size = "4">
<form action="" method="post" name="submit">
<input type = "text" name = "girl">
<input type = "submit" value = "确定" name = "submit">
</form>
<%
String textContent = request.getParameter("girl");
if(textContent == null){
textContent = "0";
}
String a[] = textContent.split("#");
double sum = 0;
out.println("输入的数字字符是:");
try{
for(String s:a){
out.print(s + "、");
sum += Double.parseDouble(s);
}
out.print("<br>数字的和是:" + sum);
}catch(NumberFormatException e){
out.print("<br>" + "请输入数字字符");
}
%>
</font>
</body>
</html>
2、处理汉字信息
当用 request
对象获取用户提交的汉字字符时,会出现乱码问题,所以对含有汉字字符的信息必须采取特殊的处理方式—页面中使用page
指令指定编码必须是gb2312
:
<% page content Type="text/html; charset=gb2312"%>
charset
中的首字母小写(c为小写字母)。可以使用两种方式避免 request
对象获取的信息出现乱码,以下分别给予介绍。
1.对信息重新编码
request
将获取的信息重新编码,即用ISO-8859-1
进行编码,并将编码存放到一个字节数组中,然后再将这个数组转化为字符串。如下:
String str = request.getParameter("message");
byte b[] =str.getBytes("ISo-8859-1");
str = new String(b);
2.request设置编码
request
在获取信息之前使用 setCharacterEncoding
方法设置自己的编码为gb2312
:
request. setCharacterEncoding("gb2312");
例子3_3使用上述的第2种方式避免乱码问题。在例子3_3中, example3_3.jsp
通过表单向自己提交一份通信费账单,然后计算出消费总额。例子3_3使用了 String
类的String[] split( String regex)
方法,该方法可以用参数 regex
指定的正则表达式作为分隔标记分解出当前字符串中的语言符号,例如可以用正则表达式"[0123456789.]+
“匹配所有的数字序列,用”[^0123456789.]+
"匹配所有的非数字序列。
example3_3.jsp
源码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body bgcolor = cyan>
<font size=3>
<form action="" method="post" name="form">
<input type="text" name="information_fees" size=3>
<input type="submit" value="确定" name="submit">
</form>
<%
request.setCharacterEncoding("UTF-8");
String information_fees = request.getParameter("information_fees");
double number = 0;
if(information_fees == null){
information_fees = "";
}
%>
<b>账单内容:<br><%= information_fees %></b><br>
<%
String a[] = information_fees.split("[^0123456789.]");
double sum = 0;
for(String s:a){
try{
sum += Double.parseDouble(s);
}catch(NumberFormatException exp){
}
}
%>
<br><b>账单总消费额:<%= sum %></b>
</font>
</body>
</html>
3、常用方法举例
当用户访问一个页面时,会提交一个HTTP请求给JSP引擎,这个请求包括一个请求行、http头和信息体,例如:
post/example31.jsp/http.1.1
host:localhost:8080
accept-encoding:gzip, deflate
其中,首行叫请求行,规定了向访问的页面请求提交信息的方式,如post
、get
等方式,以及请求的页面的名字和使用的通信协议。
第2、3行分别是两个头( Header
):host
和 accept-encoding
,称host
、 accept-encoding
是头名字,而 localhost:8080
以及gzip
, deflate
分别是两个头的值。一个典型的请求通常包含很多的头,有些头是标准的,有些和特定的浏览器有关。
一个请求还包含信息体,即HTML标记组成的部分,可能包括各式各样用于提交信息的表单等,例如:
<form action="" method=post name=form>
<input type="text" name="boy">
<input type="submit" value="" name="submit">
</form>
尽管服务器非常关心用户提交的HTTP请求中表单的信息,如前面的例子3_1和例子3_2中使用 request
的 getParameter
方法获取表单提交的有关信息。但实际上, request
对象调用相关方法可以获取请求的许多细节信息。内置对象 request
常用方法如下:
方法 | 作用 |
---|---|
getProtocol() | 获取用户向服务器提交信息所使用的通信协议,比如htp/1.1等。 |
getServletPath() | 获取用户请求的JSP页面文件的目录。 |
getContextPath() | 获取用户请求的当前Web服务目录。 |
getContentLength() | 获取用户提交的整个信息的长度。 |
getMethod() | 获取用户提交信息的方式,比如post 或get 。 |
getHeader(String s) | 获取HTTP头文件中由参数s 指定的头名字的值。一般来说参数s 可取的头名有:accept 、 accept- language 、 content-type 、 accept-encoding 、user agent 、host 、 content- length 、 connection 、 cookie 等。比如,s 取值 user-agent 将获取用户的浏览器的版本号等信息。 |
getHeaderNames() | 获取头名字的一个枚举。 |
getHeaders( String s) | 获取头文件中指定头名字的全部值的一个枚举。 |
getRemoteAddr() | 获取用户的IP地址。 |
getRemoteHost() | 获取用户机的名称(如果获取不到,就获取IP地址)。 |
getServerName() | 获取服务器的名称。 |
getServerPort() | 获取服务器的端口号。 |
getParameterNames() | 获取用户提交的信息体部分中name参数值的一个枚举。 |
实例example3_4.jsp
源码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import = "java.util.*" %>
<!DOCTYPE html>
<html>
<body bgcolor = "cyan">
<font size="2">
<%
String path = request.getServletPath(); //请求的页面
String webDir = request.getContextPath();//获取当前的web服务目录
webDir = webDir.substring(1);//去掉web服务目录前面的目录符号“/”
String clientIP = request.getRemoteAddr();//用户的IP地址
int serverPoint = request.getServerPort();//服务器的端口号
%>
用户请求的页面:<%= path %>
<br>web服务目录的名字:<%= webDir %>
<br>用户的IP地址:<%= clientIP %>
<br>服务器的端口号:<%= serverPoint %>
</font>
</body>
</html>
4、处理HTML标记
1.<form>
标记
表单的一般格式是:
< form action="提交信息的目的地页面” method= get |post name="表单的名字">
数据提交手段部分
</form>
其中<form…>…</orm>
是表单标记,其中的 method
属性取值get
或post
。get
方法和post
方法的主要区别是:使用get方法提交的信息会在提交的过程中显示在浏览器的地址栏中,而用post方法提交的信息不会显示在地址栏中。提交手段包括:文本框、列表、文本区等。
2.<input>
标记
在表单标记<form>
中<input>
标记作为子标记用来指定表单中数据的输入方式以及表单的 submit
按钮。< input>
标记中的type
属性可以指定输入方式的GUl对象,name
属性用来指定这个GUI对象的名称。<input>
标记的基本格式是:
< input type="输入对象的Ur类型"name="名字">
服务器通过属性name
指定的名字来获取“输入对象的GUl类型”中提交的数据。“输入对象的GUI类型”可以是text
(文本框)、 checkbox
(复选框)、 submit
(“提交”按钮)等。
-
文本框text。当输入对象的GUI类型是
text
时,除了用name
为text
指定名字外,还可以为text指定其他的一些值。其中,value
的值是text
的初始值;size
是text
对象的长度(单位是字符);align
是text
在浏览器窗体中的对齐方式;maxlength
指定text
可输入的最多字符数目。request
对象通过name
指定的名字来获取用户在文本框输入的字符串。如果用户没有在文本框输入任何信息,就单击表单中的submit
按钮,request
对象将调用getPeremeter
方法获取由value
指定的值;如果value
未指定任何值,getPeremeter
方法获取的字符串的长度为0
,即该字符串为:""
。 -
单选按钮 radio。当输入对象的GUI类型是
radio
时,除了用name
为radio
指定名字外,还可以为radio
指定其他的一些值。其中,value
指定radio
的值;align
是radio
在浏览器窗体中的对齐方式;如果几个单选按钮的name
取值相同,那么同一时刻只能有一个被选中。request
对象调用getPeremeter
方法获取被选中的radio
中value
属性指定的值。checked
如果取值是一个非空的字符串,那么该单选按钮的初始状态就是选中状态。 -
复选框 checkbox。当输入对象的GUI类型是
checkbox
时,除了用name
为checkbox
指定名字外,还可以为checkbox
指定其他的一些值。其中,value
指定checkbox
的值;复选框与单选按钮的区别就是可以多选,即如果几个checkbox
的names
取值相同,那么同一时刻可有多个checkbox
被选中。这时,request
对象需调用getParameterValues
方法,获取被选中的多个checkbox
中value
属性指定的值。
为了使服务器通过getParameterValues
方法能获取提交的值,复选框name
的值应互不相同。checked
如果取值是一个非空的字符串,那么该复选框的初始状态就是选中状态。 -
口令框 password。它是输入口令用的特殊文本框,输入的信息用“
*
”回显,防止他人偷看口令。口令框仅仅起不让别人偷看的作用,不提供加密措施。 -
隐藏 hidden。当
<input>
中的属性type
的值是hidden
时,<input>
没有可见的输入界面,表单直接将<input>
中value
属性的值提交给服务器。 -
submit按钮。为了能把表单的数据提交给服务器,一个表单至少要包含一个
submit
按钮。 -
重置按钮 reset。重置按钮将表单中输入的数据清空,以便重新输入数据
<input type="reset">
.
实例example3_5.jsp
源码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body bgcolor="cyan">
<font size="2">
<form action="example3_5_receive.jsp" method="post" name="form">
<br>背景音乐:
<input type="radio" name="R" value="on">打开
<input type="radio" name="R" value="off" checked="default">关闭
<br>喜欢的球队:
<input type="checkbox" name="item" value="国际米兰队">国际米兰队
<input type="checkbox" name="item" value="AC米兰对">AC米兰队
<br>
<input type="checkbox" name="item" value="罗马队">罗马队
<input type="checkbox" name="item" value="慕尼黑队">慕尼黑队
<input type="hidden" name="secret" value="我是球迷但不会踢球">
<br>
<input type="submit" value="提交" name="submit">
<input type="reset" value="重置">
</form>
</font>
</body>
</html>
example3_5_receive.jsp
源码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%!
public String handleStr(String s){
try{
byte bb[] = s.getBytes("UTF-8");
s = new String(bb);
return s;
}catch(Exception exp){
return s;
}
}
%>
<font size="2">
<%
String onOrOff = request.getParameter("R"); //获取 radio 提交的值
String secretMess = request.getParameter("secret");//获取 hidden 提交的值
String itemName[] = request.getParameterValues("item");//获取 checkbox的值
out.println("<p>是否打开背景音乐:" + onOrOff);
out.println("<p>您喜欢的球队:");
if(itemName == null){
out.print("一个都不喜欢");
}else{
for(int k = 0; k < itemName.length; k++){
out.println(" " + handleStr(itemName[k]));
}
}
out.println("<p>你提交的隐藏信息:" + handleStr(secretMess));
if(onOrOff.equals("on")){
%>
<bgsound src="music/1.mp3" loop="-1">
<%
}
%>
</font>
</body>
</html>
3.<select>
、<option>
标记
下拉式列表和滚动列表通过< select>
和< option>
标记来定义,经常作为<form>
的子标记为表单提供选择数据的GUI。< select>
标记将< option>
作为子标记,形成下拉列表或滚动列表。
下拉列表的基本格式是:
<select name="myName">
<option value="item1">
<option value="item2">
</select>
在 select
中增加size
属性的值就变成滚动列表,size
的值是滚动列表的可见行的数目。
滚动列表的基本格式是:
< select name="myName"size="正整数">
<option value="item1">
<option value ="item2">
</select>
request
对象通过name
获取滚动列表中被选中的 option
的值(参数 value
指定的值)。
实例example3_6.jsp
源码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<%!
public String handleStr(String s){
try{
byte bb[] = s.getBytes("iso-8859-1");
s = new String(bb);
return s;
}catch(Exception exp){
return s;
}
}
%>
<%
String music = request.getParameter("music");
String pic = request.getParameter("pic");
if(music == null)
music = "";
if(pic == null)
pic = "";
music = handleStr(music);
pic = handleStr(pic);
%>
<center>
<body background="image/<%= pic %>">
<font size="2">
<bgsound src="music/<%= music %>" loop="-1">
<form action="" method="post" name="form">
<b>选择背景音乐:</b><br>
<select name="music">
<option select value="1.mp3">绿岛小夜曲
<option value="2.mp3">我是一片云
<option value="3.mp3">红河谷
</select>
<br><b>选择背景图像:</b><br>
<select name="pic" size="2">
<option value="1.jpg">荷花图
<option value="2.jpg">玫瑰图
<option value="3.jpg">校园图
</select><br>
<input type="submit" value="提交" name="submit">
</form>
</font>
</body>
</center>
</html>
4.<textArea>
标记
<textArea>
是一个能输人或显示多行文本的文本区,在表单中使用<textArea>
作为子标记可以提交多行文本给服务器。<textArea>
的基本格式为:
<textArea name="名字" rows="文本可见行数” cols="文本可见列数">
</textArea>
5.<table>
标记
表格以行列形式显示数据,不提供数据输入功能。经常将某些数据或GUI放置在表格的单元格中,让界面更加简练、美观。
表格由<table>
标记定义,一般格式是:
<table>
<tr width="该行的宽度">
<th width="单元格的宽度”>单元格中的数据</th>
<td width="单元格的宽度”>单元格中的数据</td>
</tr>
</table>
其中<tr>…</tr>
定义表格的一个行,<th>
或<td>
标记定义这一行中的表格单元。二者的区别是<th>
定义的单元着重显示,<td>
称为普通单元,不着重显示。一行中的着重单元和普通的单元可以交替出现,也可以全是着重单元或普通单元。<table>
中增加选项 border
可指明该表格是否带有边框。
实例example3_7.jsp
源码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body bgcolor="cyan">
<font size="3">
<form action="" method="post" name="form">
表格的行数:<input type="text" name="table_rows" size="6">
表格的列数:<input type="text" name="table_cols" size="6">
<input type="submit" value="确定" name="submit">
</form>
<%
String rows = request.getParameter("table_rows");
String cols = request.getParameter("table_cols");
if(cols == null || rows == null){
rows = cols = "0";
}
int m = Integer.parseInt(rows);
int n = Integer.parseInt(cols);
%>
<table border="2">
<%
for(int i = 1; i <= m; i ++){
%><tr>
<%
for(int j = 1; j <= n; j ++){
%>
<td>表格第<%= i %>行,第<%= j %>列</td>
<%
}
%><tr>
<%
}
%>
</table>
</font>
</body>
</html>
6.<image>
标记
使用<image>
标记可以显示一幅图像,<image>
标记的基本格式为:
<image src="图像文件的URL">描述文字</ image>
如果图像文件和当前页面在同一Web服务目录中,图像的文件的地址就是该图像文件的名字;如果图像文件在当前Web服务目录的一个子目录中,比如image
子目录中,那么“图像文件的URL”就是“ image/图像文件的名字
”。
<image>
标记中可以使用 width
和 height
属性指定被显示的图像的宽为和高,如果省略 width
和 height
属性,<image>
标记将按图像的原始宽度和高度来显示图像。
7.<embed>
标记
使用<embed>
标记可以播放音乐和视频,当浏览器执行该标记时,会把浏览器所在机器上的默认播放器嵌入到浏览器中,以便播放音乐或视频文件。<embed>
标记的基本格式为:
<embed src="音乐或视频文件的UR">描述文字</ embed>
如果音乐或视频文件和当前页面在同一Web服务目录中,<embed>
标记中src
属性的值就是该文件的名字;如果视频文件在当前Web服务目录的一个子目录中,比如avi子目录中,那么<embed>
标记中src
属性的值就是“avi/视频文件的名字
”。<embed>
标记中经常使用的属性及取值如下:
autostart
属性,取值"true
“或”false
",autostart
属性的值用来指定音乐或视频文件传送完毕后是否立刻播放。该属性的默认值是false
loop
属性,取值为正整数指定音乐或视频文件重复播放的次数,取值为-1
则无限循环播放。width
和height
属性,取值均为正整数,用width
和height
属性的值指定播放器的宽和高。
实例example3_8.jsp
源码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<%!
public String handleStr(String s){
try{
byte bb[] = s.getBytes("iso-8859-1");
s = new String(bb);
return s;
}catch(Exception exp){
return s;
}
}
%>
<%
String video = request.getParameter("video");
if(video == null)
video = "";
video = handleStr(video);
%>
<center>
<form action="" method="post" name="form">
<b>选择视频:<br></b>
<select name=video>
<option value="1.mp4">张国荣
<option value="2.mp4">李兰妈妈
<option value="3.mp4" selected>大鱼
</select>
<input type="submit" value="提交" name="submit">
</form>
<image src="image/1.jpg" width="120" height="90"></image>
<embed src="video/<%= video %>" width="300" height="180">视频</embed>
</center>
</body>
</html>
5、处理超链接
HTML的超链接标记
< a href=链接的页面地址>文字说明</a>
是一个常用标记。用户单击超链接标记的“文字说明”,可以访问超链接给出的链接页面。
使用超链接标记还可以增加参数以及参数的值,以便向所链接的页面传递值,格式如下:
<a href=链接的页面地址?参数1=串值参数2=串值蛋…参数n=串值n>文字说明</a>
超链接所链接的页面,使用 request
(参数n)获得超链接传递过来的值。需要注意的是,<a>
标记向所链接的页面传递串值时,串值中不能含有汉字字符(否则会出现乱码问题)。
实例example3_9.jsp
源码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body bgcolor="pink">
商品编号:A1001,价格:8765
<a href="example3_9_receive.jsp?id=A1001&price=8765">
购买
</a>
</body>
</html>
example3_9_receive.jsp
源码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body bgcolor="EEEEFF">
<%
String id = request.getParameter("id");
String price = request.getParameter("price");
%>
<b>
商品编号:<%= id %><br>
商品价格:<%= price %>
</b>
</body>
</html>