JSP内置对象
有些对象不用声明就能在JSP页面的Java程序片和Java表达式中使用,这就是JSP的内置对象。HTTP协议规定了信息在Internet上的传输方法,特别规定了浏览器和服务器之间的交互方法。
1. request对象
在JSP中,内置对象request封装了用户请求页面时提交的信息。用户在请求JSP页面时,通常使用HTML表单提交信息,表单的一般格式是:
<FORM method=get|post action=”提交信息的目的页面”>
提交手段
</FORM>
get方法:提交的信息在提交过程中会显示在浏览器的地址栏中
post方法;不会显示
1.1 获取用户提交信息
request对象获取用户提交信息常用方法是getParameter(Strings)
1.2 汉字的处理
需要先对字符串进行ISO-8859-1编码,然后存放到字节数组,最后转化为字符串对象。
1.3 常用方法举例
用户访问页面,提交一个HTTP请求给服务器的JSP引擎,请求包括:请求行、消息报头和请求正文。请求行规定了请求方法、请求的HTTP协议版本;请求报头允许客户端想服务器传递请求的附加信息和客户端自身信息。
可以使用request对象获取提交的各类信息,说明:
getProtocol()//获取用户向服务器提交信息所使用的通信协议
getServletPath()//获取用户请求的JSP页面的所在目录
getContentLength()//获取用户提交的整个信息的长度
getRemoteAddr()//获取用户的IP地址
getRemoteHost()//获取用户主机名
getServerName()//获取服务器名称
getServerPort()//获取服务器端口
1.4 使用tag文件处理
1.5 处理HTML标记
1.5.1 <FORM>标记
HTML重要标记,用户经常需要使用表单提交数据。
格式:
<FORM method=get|post action=”提交信息目的页面”name=”表单的名字”>
数据提交手段部分
</FORM>
其中,数据提交中还有子标记:
<INPUT…>
<Select…></Select>
<Option…></Option>
<TextArea…></TextArea>
1.5.2 <INPUT>标记
基本格式:
<INPUT type=”输入对象的GUI类型” name=”名字”>
(1) 文本框GUI类型为:text
(2) 单选框GUI类型为:radio。可以通过request的getParameter(String name)获得value值。
示例<INPUT type=”radio” name=”rad” value=”red” align=”top” checked=”k”>//通过设置name一样,设置多个选项中的单选;checked若不为空,则初始为选中。
(3) 复选框GUI类型:checkbox
和单选框区别:可以多选。可以通过request的getParameterValues(String name)方法获得。
(4) 口令框password
输入口令用的特殊文本,用*回显。
(5) 隐藏hidden:没有输入界面,表单直接将value交给服务器,通过getParameter(String name)可获得value值。
(6) 提交键submit
一个表单至少需要一个提交键。
(7) 充值键reset
1.5.3 <Select>/<Option>标记
基本格式:
<Select>
<Option>
<Option>
…
</Select>
当select中有一个size属性,当size属性为可见行个数,默认为0,则为下拉列表,不为0,即为滚动列表。
1.5.4 <TextArea>格式
在表单中指定一个能输入多行文本的文本域。可以指定rows和cols。
1.5.5 表格
<table>
<tr><td></td></tr>
<table>
1.5.6 其他
<image>/<img>
2. response对象
服务器收到一个HTTP请求,返回HTTP响应。和request对象对应的就是response对象。
2.1 contentType属性
利用response的setContentType(String s)动态响应
2.2 response重定向
使用response的sendRedirect(URL url)方法实现用户的重定向。
2.3 response的状态行
我们访问的时候,经常碰到例如404error,这就是状态,常见的有1开头的,表示实验性质的;2开头的表明请求成功;3开头表明请求满足之前应采取进一步行动;4开头,浏览器无法满足请求,404:页面不存在;5开头表明服务器出现问题。
可以利用response对象的setStatus(intn)方法设置状态防止jsp网站被盗链。
401:请求需要HTTP认证
403:取得请求但拒绝服务
404:页面不存在
405:请求所用方法是不允许的
408:请求超时
500:服务器内部错误
504:超时
3. session对象
HTTP协议是一种无状态协议,一个用户向服务器发送请求后,服务器响应,然后链接关闭,服务器端不保留链接的有关信息。为了适应用户的信息提交和反复访问,服务器需要知道这是同一用户,需要session对象。
3.1 session对象的ID
为用户产生的session对象中含有一个String类型的ID号,JSP引擎同时将这个ID号发送给用户端、存放在用户浏览器的cookie中。这样,session和用户之间就建立一一对应关系了,每个用户和一个session对应。同一用户在同web’服务目录中session相同,但是在不同服务目录中则不同了。
通过调用session对象的String getID()方法就能获得session的ID。
3.2 session对象与URL重写
URL重写,就是当用户从一个页面重新链接到另一个页面时,通过向这个新的URL添加参数,把session对象的ID传带过去,这样可以保证用户在该网站的各个页面中的session对象完全相同。
可以使用response对象的encodeURL(String)或encodeRedirectURL(String)方法。
3.3 session对象存储数据
session对象可以方法setAttribute(Stringkey, Object obj)存储数据。
其他方法:publiclong getCreationTime()//获取对象创建时间
Public void removeAttribute(Stringkey)//删除关键字是key的对象
3.4 在tag中使用session
3.5 session对象的生存期限
用户关闭浏览器,session消失;用户不关闭浏览器,tomcat服务器默认用户发呆时间为30分钟,当然这个发呆时间可以修改。
在tomcat中的conf中的web.xml中可以设置发呆时间—session-timeout,里面数字单位为分钟。
相关方法:
publicBoolean isNew()//判断session是否是新建的
invalidate()//使session无效
4. application对象
用户访问时,服务器上就创建application对象,除非浏览器关闭,而且所有用户在同一web服务目录中的application对象相同。
常用方法:
public void setAttribute(Stringkey, Object obj)
public ObjectgetAttribute(String key)
public voidremoveAttribute(String key)
5练习
5.1 用户做几个题目,显示回答正确个数。
第一个页面:显示题目和选项
<%@page contentType="text/html; charset=GB2312" %> <HTML><BODY gbcolor=cyan><FONT size=2> <FORM action="answer.jsp" method=post name=form> 球王“贝利”是哪国人?<BR> <INPUT type="radio" name="R" value="巴西">巴西 <INPUT type="radio" name="R" value="德国">德国 <INPUT type="radio" name="R" value="美国">美国 <INPUT type="radio" name="R" value="法国" checked="ok">法国 <BR>下列足球队中,哪些队曾获得过世界杯冠军:<BR> <INPUT type="checkbox" name="item" value="法国国家队">法国国家队 <INPUT type="checkbox" name="item" value="中国国家队">中国国家队 <INPUT type="checkbox" name="item" value="巴西国家队">巴西国家队 <INPUT type="checkbox" name="item" value="美国国家队">美国国家队 <INPUT type="hidden" value="喜欢世界杯" name="secret"> <BR><INPUT type="submit" value="提交" name="submit"> <INPUT type="reset" value="重置"> </FORM> </FONT></BODY></HTML>第二个页面,即answer页面
<%@page contentType="text/html; charset=GB2312" %> <%@page import="java.lang.*" %> <HTML><BODY bgcolor=cyan><FONT size=2> <% int score=0; String countryName=request.getParameter("R"); byte b[]=countryName.getBytes("ISO-8859-1"); countryName=new String(b); String itemNames[]=request.getParameterValues("item"); for(int k=0;k<itemNames.length;k++) { b=itemNames[k].getBytes("ISO-8859-1"); itemNames[k]=new String(b); } String secretMess=request.getParameter("secret"); b=secretMess.getBytes("ISO-8859-1"); secretMess=new String(b); String context1="巴西"; String context2="法国国家队"; String context3="巴西国家队"; b=context1.getBytes("ISO-8859-1"); context1=new String(b); b=context2.getBytes("ISO-8859-1"); context2=new String(b); b=context3.getBytes("ISO-8859-1"); context3=new String(b); if(countryName.equals(context1)) score++; if(itemNames==null) out.print("没有选择球队<BR>"); else if(itemNames.length>=2){ if(itemNames[0].equals(context2)&&itemNames[1].equals(context3)) score++; } out.print("您的得分:"+score); out.print("<BR>您提交的答案一:"+countryName); out.print("<BR>您提交的答案二:"); if(itemNames!=null) for(int k=0;k<itemNames.length;k++) out.println(" "+itemNames[k]); out.println("<BR>您提交的隐藏信息:"+secretMess); %> </FONT></BODY></HTML>
第一个页面:submit,提交留言
<%@page contentType="text/html; charset=GB2312" %> <HTML><BODY bgcolor=cyan><FONT size=2> <FORM action="messagePane.jsp" method="post" name="form"> <P>输入您的名字:</P> <INPUT type="text" name="paoplename"> <BR> <P>请输入您的留言标题:</P> <INPUT type="text" name="Title"> <BR> <P>输入您的留言:</P> <BR> <TEXTAREA type="messages" rows="10" cols="36" WRAP="physical" name="messages"> </TEXTAREA> <BR> <INPUT type="submit" value="提交信息" name="submit"> </FORM> <FORM action="showMessage.jsp" method="post" name="form1"> <INPUT type="submit" value="查看留言板" name="look"> </FORM> </FONT></BODY></HTML>第二个页面messagePane:留言列表
<%@page contentType="text/html; charset=GB2312" %> <%@page import="java.util.*" %> <%@page import="java.text.SimpleDateFormat" %> <HTML><BODY> <%! Vector<String> v=new Vector<String>(); int i=0; ServletContext application; synchronized void sendMessage(String s){ application=getServletContext(); v.add(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="无信息"; SimpleDateFormat matter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String time=matter.format(new Date()); String s=name+"#"+title+"#"+time+"#"+messages; sendMessage(s); out.print("您的信息已经提交~"); %> <A HREF="submit.jsp">返回留言板</A> <A HREF="showMessage.jsp">查看留言板</A> </FONT></BODY></HTML>
<%@page contentType="text/html; charset=GB2312" %> <%@page import="java.util.*" %> <%@page import="java.text.SimpleDateFormat" %> <HTML><BODY> <% Vector<String> v=(Vector)application.getAttribute("Mess"); out.print("<TABLE border=2>"); out.print("<tr>"); out.print("<td bagcolor=cyan>"+"留言者姓名"+"</td>"); out.print("<td bagcolor=cyan>"+"留言标题"+"</td>"); out.print("<td bagcolor=cyan>"+"留言时间"+"</td>"); out.print("<td bagcolor=cyan>"+"留言内容"+"</td>"); out.print("</tr>"); for(int i=0;i<v.size();i++){ out.print("<tr>"); String message=v.elementAt(i); byte bb[]=message.getBytes("iso-8859-1"); message=new String(bb); String a[]=message.split("#"); int number=a.length-1; for(int k=0;k<=number;i++){ if(k<number) out.print("<td bgcolor=cyan>"+a[k]+"</td>"); else out.print("<td><TextArea rows=3 cols=12>"+a[k]+"</TextArea></td>"); } out.print("</tr>"); } out.print("</table>"); %> <A HREF="submit.jsp">返回留言板</A> </BODY></HTML>
第一个页面:选择求和方式
<HTML><%@ page contentType="text/html; charset=GB2312" %> <BODY bgcolor=cyan><FONT size=2> <FORM action="sum.jsp" method=post name=form> 选择计算和的方式:<BR> <Select name="sum" size=2> <Option Selected value="1">计算1到n的连续和 <Option value="2">计算从1到n的平方和 <Option value="3">计算从1到n的立方和 </Select> <BR>选择n的值:<BR> <Select name="n"> <Option value="10">n=10 <Option value="20">n=20 <Option value="30">n=30 <Option value="40">n=40 <Option value="50">n=50 <Option value="100">n=100 </Select> <BR><INPUT TYPE="submit" value="提交你的选择" name="submit"> </FORM> </FONT></BODY></HTML>
<%@page contentType="text/html; charset=GB2312" %> <HTML><BODY bgcolor=cyan><FONT size=2> <% long sum=0; String s1=request.getParameter("sum"); String s2=request.getParameter("n"); if(s2.equals("")) { s2="0"; out.print("<P>尚未选择n的值!<BR>"); } if(s1.equals("1")){ int n=Integer.parseInt(s2); for(int i=1;i<=n;i++) sum=sum+i; } else if(s1.equals("2")){ int n=Integer.parseInt(s2); for(int i=1;i<=n;i++) sum=sum+i*i; } else if(s1.equals("3")){ int n=Integer.parseInt(s2); for(int i=1;i<=n;i++) sum=sum+i*i*i; } %> <P>求和结果:<%= sum %>. </FONT></BODY></HTML>