JSP学习笔记 04 - 内置对象request

有些对象不用声明就可以在JSP页面的Java程序片表达式部分使用,这就是JSP的内置对象。
JSP的常用内置对象有 requestresponsesessionapplicationoutresponserequest对象是JSP内置对象中较重要的两个,这两个对象提供了对服务器和浏览器通信方法的控制。直接讨论这两个对象前,要先对HTTP协议—Wordwide Wcb底层协议作简单介绍。
使用浏览器从网站获取HTML页面时,实际上是在使用 Hypertext Transfer Protocol(HTTP)。HTTP协议规定了信息在Internet上的传输方法,特别是规定了浏览器与服务器的交互方法从网站获取页面时,浏览器在网站上打开了一个针对网络服务器的连接,并发出请求服务器收到请求后回应,所以HTTP协议被称作“请求和响应”协议。
浏览器请求有某种结构,HTTP请求包括请求行头域可能信息体。最普通的请求类型是对页面的一个简单请求,请求方法包括postheaddeletetraceput方法等。
一个典型请求通常包含许多头,称为请求的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取值getpostget方法和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

其中,首行叫请求行,规定了向访问的页面请求提交信息的方式,如postget等方式,以及请求的页面的名字和使用的通信协议。
第2、3行分别是两个头Header):hostaccept-encoding,称hostaccept-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中使用 requestgetParameter方法获取表单提交的有关信息。但实际上, request对象调用相关方法可以获取请求的许多细节信息。内置对象 request常用方法如下:

方法作用
getProtocol()获取用户向服务器提交信息所使用的通信协议,比如htp/1.1等。
getServletPath()获取用户请求的JSP页面文件的目录。
getContextPath()获取用户请求的当前Web服务目录。
getContentLength()获取用户提交的整个信息的长度。
getMethod()获取用户提交信息的方式,比如postget
getHeader(String s)获取HTTP头文件中由参数s指定的头名字的值。一般来说参数s可取的头名有:acceptaccept- languagecontent-typeaccept-encodinguser agenthost、 content- lengthconnectioncookie等。比如,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属性取值getpostget方法和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时,除了用nametext指定名字外,还可以为text指定其他的一些值。其中, value的值是text初始值sizetext对象的长度(单位是字符); aligntext在浏览器窗体中的对齐方式; maxlength指定text可输入的最多字符数目。 request对象通过name指定的名字来获取用户在文本框输入的字符串。如果用户没有在文本框输入任何信息,就单击表单中的 submit按钮, request对象将调用 getPeremeter方法获取由 value指定的值;如果 value未指定任何值, getPeremeter方法获取的字符串的长度为0,即该字符串为:""

  • 单选按钮 radio。当输入对象的GUI类型是 radio时,除了用nameradio指定名字外,还可以为 radio指定其他的一些值。其中, value指定 radio的值; alignradio在浏览器窗体中的对齐方式;如果几个单选按钮的name取值相同,那么同一时刻只能有一个被选中。 request对象调用 getPeremeter方法获取被选中的 radiovalue属性指定的值。 checked如果取值是一个非空的字符串,那么该单选按钮的初始状态就是选中状态

  • 复选框 checkbox。当输入对象的GUI类型是 checkbox时,除了用namecheckbox指定名字外,还可以为 checkbox指定其他的一些值。其中, value指定 checkbox的值;复选框与单选按钮的区别就是可以多选,即如果几个checkboxnames取值相同,那么同一时刻可有多个 checkbox被选中。这时, request对象需调用 getParameterValues方法,获取被选中的多个 checkboxvalue属性指定的值。
    为了使服务器通过 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>标记中可以使用 widthheight属性指定被显示的图像的宽为和高,如果省略 widthheight属性,<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则无限循环播放。
  • widthheight属性,取值均为正整数,用 widthheight属性的值指定播放器的宽和高。

实例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>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值