首先我们先学习一些HTML标记
1.form标记
语法:
<form action="目标文件的URL" method="post/get">
<from···> ···</form> 是表单标记(表单可以理解成用户提交的数据的集合),其中的method属性取值get或者post,post是隐式的数据传输,get是显示的数据传输,输出的数据可以在url中体现出来。(URL中不允许带有中文,会导致文字编码错误)
举个栗子,form中的input标记暂时先不看。
example3_1.jsp
<%@ page contentType="text/html;charset=gb2312" %> <form action="/myfile/receive.jsp" method="post"> <input type="text" name="test" value="ok"> <input type="submit" name="submit" value="submit"> </form>
receive.jsp
<%@ page contentType="text/html;charset=gb2312" %>
<%
String boy = request.getParameter("test");
out.println(boy);
%>
我们访问example3_1.jsp,在消息栏中随便输入一串数字然后点击submit提交表单。

我们首先是post,我们发现跳转到了另一个页面,显示我们刚刚提交过来的数据,同时URL只显示receive.jsp,底下网络监测是post方法。

我们将example3_1.jsp中的post改成get,再访问example3_1.jsp并点击提交。

这时,我们发现URL部分变成了很长一串,我们提交的表单数据在URL中出现,并且底下网络监测部分是get方法。
所以我们一般使用get来传递一些不敏感的消息,用post来传递一些敏感的消息比如密码等。
2.<input>标记
语法:
<input type="GUI类型" name="名字">
该标记是<form>的子标记,用来指定表单中数据的输入方式以及表单的submit按钮。该标记中可以指定GUI类型,比如上栗中我们用到了text和submit两种类型,对应的分别是消息输入栏和提交按钮,我们接下来会提到其他GUI类型。
(1)文本框text
<input type="text" name="名字" value="默认值" size="12" align="left" maxlength="12">
其中,name为该文本框的名字,value是默认值,可以不填,size是文本框的大小,align是文本框在浏览器窗体中的对齐方式,maxlength是允许输入的最大长度。
(2)单选按钮radio
<input type="radio" name="名字" value="值" align="top" checked="hello">
其中,name为该单选按钮的名字,value是值,align是对齐方式,checked如果不为空,则默认为选中状态。(只能有一个是选中状态)
栗子(checked只要不为空就行,值是什么都行):
<%@ page contentType="text/html;charset=gb2312" %> <form action="/myfile/receive.jsp" method="get"> 这个是单选按钮radio <br>你只能选 <input type="radio" name="radio" value="red" align="top" checked="1"> 或者 <input type="radio" name="radio" value="yellow" align="top" > 中的一个 </form>
下面是在页面中插入上述代码的样子(真的可以点哦!)
(3)复选框checkbox
<input type="checkbox" name="名字" value="值" align="top" checked="hello">
其中,name为复选框的名字,value是值,align是对齐方式,checked不为空则默认选中。(可以有多个是选中状态)
栗子:
<%@ page contentType="text/html;charset=gb2312" %>
<form action="/myfile/receive.jsp" method="get">
这是一个checkbox复选框<br>你可以选择这个
<input type="checkbox" name="checkbox" value="red" align="top" checked="java">
或者这个
<input type="checkbox" name="checkbox" value="yellow" align="top">
或者这个
<input type="checkbox" name="checkbox" value="bule" align="top">
中的一个或者多个
</form>
下面是在页面中插入上述代码的样子(真的可以点哦!)
(4)口令框password
<input type="password" name="名字" size="12" maxlength="12">
其中,name是口令框的名字,size是窗口大小,maxlength是允许输入的最大长度。
栗子:
<%@ page contentType="text/html;charset=gb2312" %> <form action="/myfile/receive.jsp" method="get"> <input type="password" name="password" size="12" maxlength="12"> <input type="submit" name="submit" value="submit"> </form>
下面是在页面中插入上述代码的样子(真的可以点哦!)
不过,仅仅是起到不让人偷看的作用,并不提供任何加密措施,在你使用get时,依然会在URL上显式显示传输的值。

(5)隐藏hidden
<input type="hidden" name="名字" value="值">
隐藏没有可见的任何东西,表单直接将value值提交给服务器,通过request对象调用getParameter()方法来获取value。
栗子:
<%@ page contentType="text/html;charset=gb2312" %> <form action="/myfile/receive.jsp" method="get"> <input type="hidden" name="password" value="12" > <input type="submit" name="submit" value="submit"> </form>
(6) submit按钮
一直在用emmm,这就不说了
(7)reset按钮
<%@ page contentType="text/html;charset=gb2312" %>
<form action="/myfile/receive.jsp" method="get">
<input type="reset" >
</form>
栗子:
<%@ page contentType="text/html;charset=gb2312" %> <form action="/myfile/receive.jsp" method="get"> <input type="text" name="test" value="ok"> <input type="text" name="test1" value="ok"> <input type="submit" name="submit" value="submit"> <input type="reset" value = "重置"> </form>
点击reset,恢复成默认状态。
3.<select>、<option>标记
下拉式列表和滚动列表通过<select>、<option>标记来定义。
格式:
<select name="name"> <option value="one">one <option value="two">two </select>
或者
<select name="name" size="整数"> <option value="one">one <option value="two">two </select>
其中,第二种的size中的整数是定义可见行的数量。
<%@ page contentType="text/html;charset=gb2312" %> <select name="name"> <option value="one">one <option value="two">two <option value="three">three <option value="four">four </select> <select name="name" size="3"> <option value="one">one <option value="two">two <option value="three">three <option value="four">four </select>
下面是在页面中插入上述代码的样子(真的可以点哦!)
4.<textArea>标记
该标记是一个能输入或显示多行文本的文本区。
格式:
<textArea name="名字" rows="文本可见行数" cols="文本可见列数"> </textArea>

5.<table>标记
该标记以表格的形式显示数据,不提供数据输入功能。
格式:
<table>
<tr width="该行的宽度>
<th width="单元格的宽度">单元格中的数据</th>
···
···
</tr>
</table>
栗子:
<%@ page contentType="text/html;charset=gb2312" %>
<table border=1>
<tr width="40">
<th width="10">123</th>
<th width="10">123</th>
<th width="10">123</th>
</tr>
<tr width="10">
<th width="10">123</th>
<th width="10">123</th>
<th width="10">123</th>
</tr>
</table>
然后就是这样事的。
| 123 | 123 | 123 |
|---|---|---|
| 123 | 123 | 123 |
6.<image>标记
使用image标记可以显示一副图像。
格式:
<image src="图片URL">描述文字</image>
比如:
<%@ page contentType="text/html;charset=gb2312" %> <image src="https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1171314795,738366933&fm=27&gp=0.jpg">就是这样的</image>

7.<embed>标记
使用该标记可以播放音乐和视频。
格式:
<embed src="音视频的URL">描述文字</embed>
embed中也有一些其他属性,比如autostart,当为true时是自动播放,默认值flase,即不自动播放;loop,取正值时为重复播放的次数,取-1为无限播放;width、height等。
3.处理超链接
格式:
<a href=链接地址>文字说明</a>
超链接也可以用向目标页面传送参数。
<a href=链接地址?参数1=值&参数2=值>文字说明</a>
这里我们可以用之前我们学习get、post时的栗子,我们说get是显式传递,观察他的URL部分,就是这种格式。

学习完HTML标记之后我们继续学习JSP的内置对象。
1.request
这个我们之前用过,request是实现了ServletRequest接口的一个实例。
我们可以稍微复习一下之前所学的知识,我们来看这段代码。
example3_1.jsp
<%@ page contentType="text/html;charset=GB2312" %> <HTML><BODY bgcolor=white><FONT size=2> <FORM action="/myfile/computer.jsp" method=post name=form> <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> </FONT> </BODY></HTML>
computer.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<HTML><BODY bgcolor=white><Font size=3>
<% 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>请输入数字字符");
}
%>
</FONT></BODY></HTML>
在example3_1.jsp中,使用了form标记和input子标记,点击提交之后,将表单提交到comouter.jsp中,然后comouter.jsp通过request对象的getParameter方法来获取表单中的值,最后完成计算。
当然,如果是传输汉字的话,需要对传输的消息重新确认编码,有两种方式,一种是使用
String str = request.getParameter("message");
byte b[] = str.getByte("ISO-8859-1");
str=new String(b);
另一种方法是接受方。
request.setCharacterEncoding("gb2312");
这两种方法都可以对汉字进行重新编码,使发送的汉字不会变成乱码。

点击提交之后。

2.response对象
当用户访问一个服务器的页面时,会提交一个HTTP请求,服务器收到请求时,返回HTTP响应。响应和请求类似,也有某种结构,每个响应都由状态行开始,可以包含几个头及可能的信息体(网页的结果输出部分)。
可以用response对象对用户的请求做出动态响应,向用户端发送数据。
1.动态响应的contentType属性
页面用page指令设置页面的contentType属性的值,然后JSP引擎根据属性值做出响应,我们说过,一个页面不能设置多次contentType值;response对象提供了一种方法可以更改contentType属性值。
setContentType(String s)方法,其中s可以取之前提到过的MIME类型。
思考下面栗子:
example3_3.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<HTML><BODY bgcolor=white><Font size=1 >
<P>我正在学习response对象的
<BR>setContentType方法
<P>将当前页面保存为word文档吗?
<FORM action="" method="get" name=form>
<INPUT TYPE="submit" value="yes" name="submit">
</FORM>
<% String str=request.getParameter("submit");
if(str==null) {
str="";
}
if(str.equals("yes")) {
response.setContentType("application/msword;charset=GB2312");
}
%>
</FONT></BODY></HTML>
我们访问这个页面,然后点击yes,我们就会发现这种情况。

上面程序需要注意的是,当JSP页面被初始化的时候,submit是空,这时候并不需要对contentType属性进行更改,所以需要对submit是否为空的判断,很多类似地方也需要这种操作,值得注意。
2.response的HTTP文件头
我们可以添加新的HTTP响应报头,可以使用方法:
addHeader(String head,String value);
或
setHeader(String head,String value);
动态添加新的响应头和头的值,将这些头发送给用户的浏览器。如果添加的头已经存在,则先前的头被覆盖。
example3_4.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="java.util.*" %>
<HTML><BODY bgcolor=cyan><Font size=5 >
<P>现在的时间是:<BR>
<% out.println(""+new Date());
response.setHeader("Refresh","5");
%>
</FONT></BODY></HTML>
这个程序添加了refresh属性,值为5,也就是每5秒刷新一次页面,我们访问页面发现每5秒时间更新一次。(动图)

3.response 重定向
在某些情况下相应用户时,需要将用户重新引导至另一个页面,例如:如果用户输入的表单信息不完整,就会再被引导到该表单的输入页面,可以使用response和sendRedirect(URL url)方法实现用户的重定向。
思考下面栗子:
example3_5.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<HTML><BODY>
<P>填写姓名:<BR>
<FORM action="myfile/receive.jsp" method="get" name=form>
<INPUT TYPE="text" name="boy">
<INPUT TYPE="submit" value="Enter">
</FORM>
</BODY></HTML>
receive.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<HTML><BODY>
<% String str=request.getParameter("boy");
if(str.length()==0)
{ response.sendRedirect("../example3_5.jsp");
}
else
{ out.print("欢迎您来到本网页!");
out.print(str);
}
%>
</BODY></HTML>
我们访问example3_5.jsp页面,我们会发现,当我们不输入任何东西时,网络监测部分会get receive.jsp之后,重新被定向到example3_5.jsp,而我们输入1之后,页面成功跳转到receive.jsp

4.response的状态行
可以更改网页的状态, 比如最常见的404 not found。
| 1xx | 信息,服务器收到请求,需要请求者继续执行操作 |
| 2xx | 成功,操作被成功接收并处理 |
| 3xx | 重定向,需要进一步的操作以完成请求 |
| 4xx | 客户端错误,请求包含语法错误或无法完成请求 |
| 5xx | 服务器错误,服务器在处理请求的过程中发生了错误 |
下面是几个常见的状态码:详见这里
- 200 – 请求成功
- 301 – 资源(网页等)被永久转移到其它URL
- 404 – 请求的资源(网页等)不存在
- 500 – 内部服务器错误
书上说:
我们只需要在网页里调用response.setStatus();就可以更改页面状态,类似于我们看到的404 not found(P50最上面)
这里其实书写错了,不管你信不信,反正我是信了,这个response.setStatus();,只可以改变状态码,但是页面还是会执行完毕。换个方式说,运行成功的状态码一般是200,我们可以用这个方法,让服务器返回的状态码变成你想要的一个数字,而真正做到这个功能的方法,实际上是response.sendError();
我们来检验一下。
example3_6.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<HTML><BODY>
<% response.setStatus(408);
//response.sendError(408);
out.print("不显示了");
%>
</BODY></HTML>
我们先使用setStatus();发现依然可以显示,但是底下的状态码变成了408.(如果你忘了可以向上翻,运行成功的状态码是一个绿色的200)

我们试试sendError();

页面变成了HTTP status 408 ,状态码依然是408。
3.session对象
我们都知道,HTTP是无状态连接,那么服务器怎么区分用户呢,用的就是session对象。用户在访问一个Web服务目录期间,服务器为该用户重新分配一个session对象,服务器可以在各个页面使用这个session记录当前用户的有关信息。服务器保证不同用户的session对象互不相同。我们通常所说的cookies,就是浏览器用来保存session对象的。
example3_7.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<HTML><BODY bgcolor=white>
我是first.jsp页面,输入你的姓名连接到second.jsp
<% String id=session.getId();
out.println("您的session对象的ID是:<br>"+id);
%>
<FORM action="myfile/second.jsp" method=post name=form>
<INPUT type="text" name="boy">
<INPUT TYPE="submit" value="送出" name=submit>
</FORM>
</BODY></HTML>
second.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<HTML><BODY bgcolor=white>
我是second.jsp页面
<% String id=session.getId();
out.println("您的session对象的ID是:<br>"+id);
%>
<BR> 点击超链接,连接到third.jsp的页面。
<A HREF="/myfile/third.jsp"> 欢迎去third.jsp页面!</A>
</BODY></HTML>
third.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<HTML><BODY bgcolor=white>
我是third.jsp页面
<% String id=session.getId();
out.println("您的session对象的ID是:<br>"+id);
%>
<BR> 点击超链接,连接到first.jsp的页面。
<A HREF="../example3_7.jsp"> 欢迎去first.jsp!</A>
</BODY></HTML>



我们发现,每个界面的session ID都是一样的,如果我们把浏览器保存cookies的选项关掉,我们就会发现另一种情况。

我们发现每个页面的session ID都是不一样的。



这就是session ID的作用,我们还可以在session对象中存储数据。
1.public void setAttibute(String key,Object obj)
调用该方法可以向session对象指定一个索引关键字,如果添加的两个关键字相同,那先前的会被覆盖。
2.public Object getAttribute(String key)
返回关键字对应的对象,Object类型的,需要强制转换。
3.public void removeAttribute(String name)
移除对应对象。
3 session的生命周期
session达到发呆时间或者服务器关闭,session失效。
发呆时间是指服务器没有收到用户的请求的时间。
可以修改解压目录下的conf/web.xml中重新设定Web服务目录下的session对象的最长发呆时间。
<!-- ==================== Default Session Configuration ================= -->
<!-- You can set the default session timeout (in minutes) for all newly -->
<!-- created sessions by modifying the value below. -->
<session-config>
<session-timeout>30</session-timeout>
</session-config>
将其中的30改为需要的值(单位分钟)。

当然也有一些方法可以操作这个值,比如
public long getCreationTime() 可以获取session的创建时间
public long getMaxInactiveIntercal() 可以获取session最后一次被操作的时间
public int getMaxInactiveInterval()可以获取最长发呆时间(单位为秒)
public void setMaxInactiveInterval() 设置session最长发呆时间(单位为秒)
4.application对象
该对象和session对象类似,都是用来保存信息的,不同的是,session是为每个用户都分配一个,每个用户独享一个session对象,并且随着发呆时间结束而消失;但是application对象是随着页面的存在而存在,用来保存页面中的信息,多个用户共享一个application对象,但每个Web服务目录下的application互不相同。
application对象也和session对象一样有很多不同的方法:
1.public void setAttibute(String key,Object obj)
调用该方法可以向session对象指定一个索引关键字,如果添加的两个关键字相同,那先前的会被覆盖。
2.public Object getAttribute(String key)
返回关键字对应的对象,Object类型的,需要强制转换。
3.public void removeAttribute(String key)
移除对应对象。
栗子:用application制作留言板
example3_8.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<HTML><BODY>
<FORM action="/myfile/messagePane.jsp" method="post" name="form">
输入您的名字:<BR><INPUT type="text" name="peopleName">
<BR>输入您的留言标题:<BR><INPUT type="text" name="Title">
<BR>输入您的留言:<BR> <TEXTAREA name="messages" ROWs="10" COLS=36 WRAP="physical"></TEXTAREA>
<BR><INPUT type="submit" value="提交信息" name="submit">
</FORM>
<FORM action="/myfile/showMessage.jsp" method="post" name="form1">
<INPUT type="submit" value="查看留言板" name="look">
</FORM>
</BODY></HTML>
messagePane.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="java.util.*" %>
<HTML><BODY>
<%! Vector v=new Vector();
int i=0; ServletContext application;
synchronized void sendMessage(String s)
{ application=getServletContext();;
i++;
v.add("No."+i+","+s);
application.setAttribute("Mess",v);
}
%>
<% String name=request.getParameter("peopleName");
String title=request.getParameter("Title");
String messages=request.getParameter("messages");
if(name==null)
{name="guest"+(int)(Math.random()*10000);
}
if(title==null)
{title="无标题";
}
if(messages==null)
{messages="无信息";
}
byte a[]=name.getBytes("ISO-8859-1");
name=new String(a);
out.println(name+"<br>");
byte a1[]=title.getBytes("ISO-8859-1");
title=new String(a1);
out.println(title+"<br>");
byte a2[]=messages.getBytes("ISO-8859-1");
messages=new String(a2);
out.println(messages+"<br>");
String s="姓名:"+name+"#"+"标题:"+title+"#"+"内容:"+"<BR>"+messages;
//byte a3[]=s.getBytes("ISO-8859-1");
//s=new String(a3);
out.println(s+"<br>");
sendMessage(s);
out.print("您的信息已经提交!");
%>
<A HREF="../example3_8.jsp" >返回
</BODY></HTML>
showMessage.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="java.util.*" %>
<HTML><BODY>
<% Vector v=(Vector)application.getAttribute("Mess");
for(int i=0;i<v.size();i++)
{ String message=(String)v.elementAt(i);
StringTokenizer fenxi=new StringTokenizer(message,"#");
while(fenxi.hasMoreTokens())
{ String str=fenxi.nextToken();
//out.print("<BR>"+str);
//byte a[]=str.getBytes("ISO-8859-1");
//str=new String(a);
out.print("<BR>"+str);
}
}
%>
</BODY></HTML>
然后我们就可以访问页面,我们会发现任何人发送的留言可以被所有人看到。
5.out对象
out对象是一个输出流,用来向客户端输出数据。需要注意的是out.print和out.println,虽然从java语法来说两者差一个回车,但是浏览器并不识别println的换行标记,所以实际上二者效果一样,如果需要换行可以输出<br>实现换行。
课后题:
1.假设JSP使用的表单中有如下的GUI:
<input type="checkbox" name="item" value="bird">鸟 <input type="checkbox" name="item" value="apple">苹果 <input type="checkbox" name="item" value="cat">猫 <input type="checkbox" name="item" value="moon">月亮
该表单所请求的JSP可以使用内置对象request获取该表单提交的数据,那么,下列哪些是request获取该表单提交的值的正确语句( C )
A.String a = request.getParameter(“item”);
B.String b = request.getParameter(“checkbox”);
C.String a[] = request.getParameterValues(“item”);
D.String a[] = request.getParameterValues(“checkbox”);
2.如果表单提交的信息中有汉字,接受该信息的页面应做怎样的处理?
· 接受之前调用request.setCharacterEncoding()或者接受之后使用
String str=request.getParameter("message");
byte a[]=str.getBytes("ISO-8859-1");
str=new String(a);
进行编码转换。
3.编写两个JSP页面inputString.jsp和computer.jsp,用户可以使用inputString.jsp提供的表单输入一个字符串,并提交给computer.jsp页面,该页面通过内置对象获取inputString.jsp页面提交的字符串,计算并显示该字符串的长度。
inputString.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<html>
<body bgcolor=white>
<form action="computer.jsp" method="post">
<input type="text" name="message" size=12 maxlength=12>
<input type="submit" name="submit" value="submit">
</form>
</body></html>
computer.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%
String message=request.getParameter("message");
message=new String(message.getBytes("iso-8859-1"));
out.print(message.length());
%>
4.response调用sendRedirect(URL url)方法的作用是什么?
· 在某些情况下响应用户时,需要将用户重新引导至另一个页面,例如:如果用户输入的表单信息不完整,就会再被引导到该表单的输入页面,可以使用response和sendRedirect(URL url)方法实现用户的重定向。
5.对栗子3_1的代码进行改动,如果用户在3_1页面提供的表单中输入了非数字字符,example3_1_compute.jsp就将用户重新定向到example3_1.jsp中。
只需要对example3_1_compute.jsp进行改动(第15行)
example3_1_compute.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<HTML><BODY bgcolor=white><Font size=3>
<% 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)
{
response.sendRedirect("../example3_9.jsp"); //原来是 out.print()
}
%>
</FONT></BODY></HTML>
6.一个用户在不同的Web服务目录中的session对象相同么?
· 不相同。
7.一个用户在用一Web服务目录的不同子目录中的session对象相同么?
· 相同。
0 条评论