JSP内置对象下.docx

上传人:b****8 文档编号:10493246 上传时间:2023-02-14 格式:DOCX 页数:22 大小:24.77KB
下载 相关 举报
JSP内置对象下.docx_第1页
第1页 / 共22页
JSP内置对象下.docx_第2页
第2页 / 共22页
JSP内置对象下.docx_第3页
第3页 / 共22页
JSP内置对象下.docx_第4页
第4页 / 共22页
JSP内置对象下.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

JSP内置对象下.docx

《JSP内置对象下.docx》由会员分享,可在线阅读,更多相关《JSP内置对象下.docx(22页珍藏版)》请在冰豆网上搜索。

JSP内置对象下.docx

JSP内置对象下

1、课程名称:

JSP内置对象

2、知识点

2.1、上次课程的主要知识点

1、JSP中的四种属性范围:

page、request、session、application;

2、request对象的使用:

getParameter()、getParmeterValues()、getContextPath()、getRemoteAddr()、setCharacterEncoding();

3、完全是围绕着JSP+JDBC的开发,可以发现代码极其重复。

2.2、本次预计讲解的知识点

1、response对象的使用;

2、session对象的使用,并且使用session修改登陆程序;

3、config及application对象的使用。

3、具体内容

3.1、response对象(重点)

服务器端接收客户端的请求使用的是request对象,而服务器端对客户端请求的回应使用的就是response对象,response对应的类型是:

javax.servlet.http.HttpServletResponse,而在实际的工作之中,response对象主要有以下三个作用:

设置头信息、请求重定向(跳转)、操作Cookie。

3.1.1、设置头信息

头信息:

头信息是附加在请求和回应上的一些内容。

范例:

观察请求的头信息

·既然要想取得头信息,现在依靠的肯定是request对象,在request对象之中提供了如下的几个方法;

|-取得全部头信息的名字:

publicEnumerationgetHeaderNames()

|-取得头信息的内容:

publicStringgetHeader(Stringname)

<%@pagecontentType="text/html"pageEncoding="GBK"%>

<%@pageimport="java.util.*"%>

<%

Enumerationenu=request.getHeaderNames();//取得全部头信息

while(enu.hasMoreElements()){

StringheadName=(String)enu.nextElement();//取得头信息的名称

%>

<%=headName%>--><%=request.getHeader(headName)%>

<%

}

%>

但是在这些头信息之中有一个头信息是最需要关注的,那么就是定时刷新,可以使用refresh的头信息完成。

<%@pagecontentType="text/html"pageEncoding="GBK"%>

<%!

intcount=0;

%>

<%//1秒一刷新

response.setHeader("refresh","1");

%>

<%=count++%>

现在声明了一个全局变量,之后每次一刷新,变量的内容就自增,一般的刷新频率都是2秒一刷新。

除了定时刷新之外,设置此类的头信息也可以完成定时跳转的操作功能。

<%@pagecontentType="text/html"pageEncoding="GBK"%>

<%//1秒一刷新

response.setHeader("refresh","2;URL=show.htm");

%>

恭喜您,注册成功,两秒后将跳转到首页!

如果没有跳转,请按这里!

定时跳转之后的地址栏发生了改变,所以此跳转属于客户端跳转。

3.1.2、页面重定向

在respose对象之中有一个跳转的操作:

publicvoidsendRedirect(Stringlocation)throwsIOException

范例:

观察跳转

<%@pagecontentType="text/html"pageEncoding="GBK"%>

<%//客户端跳转

response.sendRedirect("show.htm");

%>

面试题:

请解释JSP中两种跳转的区别?

在JSP中存在两种跳转:

·

forward>:

服务器端跳转,可以传递request属性,无条件跳转,执行之后立刻跳转;

·response.sendRedirect():

客户端跳转,不能传递request属性,整个页面执行完之后才进行跳转。

3.1.3、设置Cookie

Cookie是服务器端保留在客户端上的一组数据,例如:

经常可以在某些论坛上发现有记住密码的功能,实际上这些密码都是保存在客户端上的,而保存的数据就称为Cookie。

但是由于Cookie是保存在客户端,所以安全性是相当的差的,在JSP之中专门提供了Cookie的操作类。

·构造:

publicpublicCookie(Stringname,Stringvalue),直接传入要设置的Cookie的名称和内容;

·取得Cookie的名称:

publicStringgetName()

·取得Cookie的内容:

publicStringgetValue()

·设置Cookie的保存时间:

publicvoidsetMaxAge(intexpiry),单位是秒

当Cookie的对象准备完成之后,下面可以直接利用response对象的方法:

publicvoidaddCookie(Cookiecookie)

<%@pagecontentType="text/html"pageEncoding="GBK"%>

<%

Cookiec1=newCookie("username","hello");

Cookiec2=newCookie("userpass","mldn");

response.addCookie(c1);

response.addCookie(c2);

%>

现在的Cookie设置到了客户端之后,如果服务器要想取得,则依靠request对象,之所以要使用request对象,主要的原因是因为所有的Cookie会随着用户的请求头信息一起发送到服务器端。

在request对象中提供了接收Cookie的方法:

publicCookie[]getCookies()

<%@pagecontentType="text/html"pageEncoding="GBK"%>

<%//取得全部的Cookie

Cookiec[]=request.getCookies();

for(intx=0;x

%>

<%=c[x].getName()%>--><%=c[x].getValue()%>

<%

}

%>

以上的程序运行之后发现可以取得了所设置的Cookie,但是同时又增加了以下一个Cookie:

JSESSIONID-->CC2B62B3293C76BA7B9FF3F9B209AD81

此字符串为服务器端自动设置到客户端上的一个标记,这个标记就是SESSIONID,而且是32位。

在默认的情况下,一个Cookie只会保存在客户端浏览器上,而没有真正的保存在了系统文件之中,所以要想保存,就必须设置Cookie的保存时间,使用setMaxAge()方法完成。

<%@pagecontentType="text/html"pageEncoding="GBK"%>

<%

Cookiec1=newCookie("username","hello");

Cookiec2=newCookie("userpass","mldn");

c1.setMaxAge(20);

c2.setMaxAge(50);

response.addCookie(c1);

response.addCookie(c2);

%>

要想真正保存,必须设置保存的时间。

3.3、session对象(重点)

session在web中表示的是每一个用户的操作,session是javax.servlet.http.HttpSession接口的实例,而此接口没有任何的继承关系,因为session只是HTTP协议的范畴。

3.3.1、sessionid

session表示的是每一个用户,那么服务器端如何去区分每一个用户呢?

在每一个用户第一次连接到服务器上的时候,服务器会为这个用户分配一个唯一的编号,而这个编号就称为SESSIONID,每个用户的ID不一样,所以服务器端就根据这些ID的不同来区分不同的用户。

如果要想取得ID方法:

publicStringgetId(),此方法没有对应的setter,因为sessionid如果让用户设置了就会出现重复的问题。

范例:

观察SESSIONID

<%@pagecontentType="text/html"pageEncoding="GBK"%>

<%//取得SESSIONID

Stringid=session.getId();

%>

<%=id%>

<%=id.length()%>

可以发现每一个SESSIONID的长度都是32位,而且这个SESSIONID的内容与自动设置到浏览器中Cookie的内容是一样的,所以SESSION实际上是利用到了Cookie的处理机制,每次客户端发送请求的时候都会将自己对应的SESSIONID发送到服务器端上,服务器端接收到此ID之后,与服务器端自己保留的SESSIONID相比较,如果成功了,则取出用户的信息,如果没有成功,则认为是一个新的SESSION。

3.3.2、登陆检查

在实际的应用之中,session的最大用处就是完成用户的登陆验证及注销的操作,session中存在着属性的设置方法,而且使用session属性范围保存的对象不管是何种跳转都能够保留下来,如果是新的用户则没有,那么就可以根据此特性完成用户的登陆检查。

范例:

编写login.jsp用于用户的登陆操作

<%@pagecontentType="text/html"pageEncoding="GBK"%>

用户名:


密  码:


<%//现在假设用户名是hello,密码是mldn

Stringname=request.getParameter("uname");

Stringpassword=request.getParameter("upass");

if(!

(name==null||"".equals(name)||password==null||"".equals(password))){

if("hello".equals(name)&&"mldn".equals(password)){

session.setAttribute("username",name);//设置session

response.setHeader("refresh","2;URL=welcome.jsp");

%>

您已登陆成功,欢迎回来!

两秒后跳转到首页,如果没有跳转,请按这里!

<%

}else{

%>

错误的用户名和密码!

<%

}

}

%>

由于登陆成功之后可以设置session属性,而此属性又不受跳转的限制,所以无论如何跳转,都可以取得,随后就通过此属性是否存在来判断用户是否已登陆。

范例:

欢迎页——welcome.jsp

<%@pagecontentType="text/html"pageEncoding="GBK"%>

<%//此页面应该是登陆之后才可以访问

if(session.getAttribute("username")!

=null){//设置过属性

%>

欢迎<%=session.getAttribute("username")%>的光临!

注销登陆!

<%

}else{

%>

您还未登陆,请先登陆!

<%

}

%>

既然用户可以登陆,那么也就可以注销,在session对象中提供了一个方法:

publicvoidinvalidate()

范例:

注销页——logout.jsp

<%@pagecontentType="text/html"pageEncoding="GBK"%>

<%//session失效,所有的属性没有,而且意味着sessionid也消失

session.invalidate();

response.sendRedirect("login.jsp");

%>

这种代码就是一个典型的用户的登陆验证操作,可是从现实的生活中来讲,这种登陆操作往往还会增加一个验证码功能,之所以会有此功能,主要是防止机器人程序。

3.3.3、判断是否是新的session

在session对象之中提供了一个方法,用于判断一个session是否是新的(就是刚创建的)

·方法:

publicbooleanisNew()

<%@pagecontentType="text/html"pageEncoding="GBK"%>

<%

if(session.isNew()){//是一个新连接的用户

%>

您好,欢迎您的光临!

<%

}else{

%>

您已经来过了,别来了!

<%

}

%>

而在实际的工作之中,session的最大功能就是登陆的验证及注销的实现。

3.4、application对象(重点)

application是javax.servlet.ServletContext接口的实例,此对象表示的是Servlet上下文,如果按照通俗的理解来讲,就是表示的整个WEB容器的操作,在application对象之中属性操作也是一个经常使用到的操作,但是之前也强调了由于此类属性保存在服务器上,所以这种属性越少越好,另外在这个对象之中有一个最常用的方法:

·取得虚拟目录对应的真实路径:

publicStringgetRealPath(Stringpath)

范例:

观察取得真实路径

<%@pagecontentType="text/html"pageEncoding="GBK"%>

<%

Stringpath=application.getRealPath("/");

%>

<%=path%>

现在找到的是在“”中配置的“docBase”属性的内容,另外需要注意的是,在实际的工作之中,很少会有人直接使用application进行操作,而都会使用getServletContext()方法来代替application。

<%@pagecontentType="text/html"pageEncoding="GBK"%>

<%

Stringpath=this.getServletContext().getRealPath("/");

%>

<%=path%>

以后只要是看见了getServletContext()方法肯定表示调用的就是application对象。

既然现在已经可以取得真实路径了,那么下面就可以利用此操作完成文件的输出。

范例:

定义一个输入的文本框,输入文件名称及文件内容

JavaScript程序

输入文件名称:


输入文件内容:


范例:

接收文件内容并保存文件,使用PrintStream输出最方便。

<%@pagecontentType="text/html"pageEncoding="GBK"%>

<%@pageimport="java.io.*"%>

<%

request.setCharacterEncoding("GBK");

%>

<%

StringfileName=request.getParameter("filename");

StringfileContent=request.getParameter("filecontent");

Filefile=newFile(this.getServletContext().getRealPath("/")+File.separator+"myfile"+File.separator+fileName);//输出文件路径

PrintStreamps=newPrintStream(newFileOutputStream(file));

ps.println(fileContent);

ps.close();

%>

现在文件已经成功的保存了,如果要想显示则需要输入流,使用Scanner类完成。

范例:

读取hello.txt文件

<%@pagecontentType="text/html"pageEncoding="GBK"%>

<%@pageimport="java.io.*"%>

<%@pageimport="java.util.*"%>

<%

request.setCharacterEncoding("GBK");

%>

<%

Filefile=newFile(this.getServletContext().getRealPath("/")+File.separator+"myfile"+File.separator+"hello.txt");//输出文件路径

StringBufferbuf=newStringBuffer();

Scannerscan=newScanner(newFileInputStream(file));

scan.useDelimiter("\n");//设置分割符

while(scan.hasNext()){

buf.append(scan.next()).append("
");//手工处理换行操作

}

scan.close();

%>

<%=buf%>

一定要记住在HTML之中,所有的换行是会被忽略掉的,所以必须手工设置“
”以完成换行的操作。

既然已经可以操作文件了,那么下面就可以继续完成一个网站计数器的操作,如果要想完成此类程序要考虑:

·本计数的操作即使服务器关闭了也应该可以将数字保存,所以肯定利用文件;

·当一个用户第一次访问的时候我才应该开始计数,使用session对象的isNew()方法;

·还要考虑如果访问的数据量过大应该使用BigInteger类操作。

范例:

完成网站的计数器

·在开发目录之中,建立一个count.txt的文本,用于保存每次的增长的数值

<%@pagecontentType="text/html"pageEncoding="GBK"%>

<%@pageimport="java.io.*"%>

<%@pageimport="java.util.*"%>

<%@pageimport="java.math.*"%>

<%

request.setCharacterEncoding("GBK");

%>

<%!

//为了方便建立两个方法

publicstaticfinalStringFILENAME="count.txt";//默认的文件名称

publicBigIntegerload()throwsException{//读取已有的数据

BigIntegerbig=null;

Filefile=newFile(this.getServletContext().getRealPath("/")+File.separator+FILENAME);

Scannerscan=newScanner(newFileInputStream(file));

if(scan.hasNext()){

Stringstr=scan.next();//读取内容

big=newBigInteger(str);//将数据放在大整数的操作类中

}

scan.close();

returnbig;

}

publicvoidsave(BigIntegernum)throwsException{//保存处理后的数据

Filefile=newFile(this.getServletContext().getRealPath("/")+File.separator+FILENAME);

PrintStreamps=newPrintStream(newFileOutputStream(file));

ps.print(num);//输出新内容

ps.close();

}

%>

<%

BigIntegernum=load();//读取已有的内容

if(session.isNew()){//是新的session,则处理

synchronized(this){

num=num.add(newBigInte

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 管理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1