jsp为了简化开发,提供了一些有容器实现和管理的内置对象,在jsp脚本标识内使用jsp内置对象时,不需要先定义这些对象即不需要在jsp页面中进行实例化,直接使用即可。jsp中共预先定义了9个这样的对象,分别为request,response,session,application,out,pageContext,config,page,Exception。 (1)request对象封装了由客户端生成的HTTP请求的所有细节,包括HTTP头信息,系统信息,请求方式,请求参数等。通过request对象提供的相应方法可以处理客户端浏览器提交的HTTP请求中的各项参数。 六个作用: 1.访问请求参数:我们知道request对像用于处理HTTP请求中的各项参数,在这些参数中,最常用的就是获取访问请求参数。当我们通过超连接的形式发送请求时,可以为该请求传递参数,这可以通过在超连接的后面加上问号?来实现,注意这个问号为英文半角的符号,例如发送一个请求到delete.jsp页面,并传弟一个名为id的参数,可以通过以下超连接实现,多个参数之间用&隔开。 //超连接方式 <a href = “跳转的jsp页面.jsp?id=1 & id2=2&id3=3”>删除 或 //jsp动作标识方式 <jsp:forward page=”modify.jsp”> 子动作标识,也叫传递参数标识<jsp:param name=“参数名” value=”参数值”/> </jsp:forward> //表格提交方式 //重定向网页方式 response对像提供的sendRedirect()方法可以将网页重定向到另一个页面,重定向操作技持将地址重定向到不同的主机上,这一点与转发不同,在客户端浏览器上将会得到跳转地址,并重发送请求连接,用户可从浏览器的地址栏中看到跳转后的地址,进行重定向操作后,request对象中的属性全部失效,并且开始一个新的request请求。
上面代码中实现了在请求转发到modify.jsp页面的同时,传递了参数name, 说明:通过动作标识里的传递参数标识指定的参数,将以参数名=值的形式加入请求中,他的功能与在文件名后面直接加?参数名=参数值的功能是相同的。
下面就在跳转的jsp页面.jsp中,通过request对象的getParameter()方法获取传递 的参数 值。 <% request.getParameter(“参数名”); %> 2.在作用域中管理属性 在请求转发时,需要把一些数据传递到转发后的页面进行处理,这时就需要request对像的setAttribute()方法将数据保存到request范围内的变量中。 request.setAttribute(String name,Object object); 说明:name:表示变量名,在转发后面的页面中就是通过这个变量名来获取数据的。 object:用于指定需要在request范围内传递的数据。 这样就可以在跳转到的jsp页面中脚本标识的代码片段中通过getAttribute()方法获取保存在request范围内的变量,并过过JSP脚本标识的jsp表达式来输出到jsp页面中,由于getAttribute()方法的返回值为Object类型,所以需要调用其toString()方法,将其Object类型转换为字符串类型。request.getAttribute(“变量名”).toString(); 3. 获取cookie Cookie[] cookies = request.getCookies(); //从request中获取cookie对像的集合。 标识用户身份,记录用户名和密码,跟踪重复用户,以key/value形式保存。在 网络服务器上生成,并发送给浏览器,浏览器将cookie以key/value的形式保存到客户机的某个指定目录中。通过cookie对像的getCookie()方法即可获取到所有cookie对象的集合,通过cookie对像的getName()方法可以获取到指定名称的cookie,通过getValue()方法即可获取到cookie对像的值,另外,将一个cookie对象发送到客户端使用了response对象的addCookie()方法。说明:在使用cookie时,要确保浏览器允许使用cookie, Cookie是保存在客户端的纯文本文件。比如txt文件。所谓的客户端就是我们自己的本地电脑。当我们使用自己的电脑通过浏览器进行访问网页的时候,服务器就会生成一个证书并返回给我的浏览器并写入我们的本地电脑。这个证书就是cookie。一般来说cookie都是服务器端写入客户端的纯文本文件。下面我们来看一下一般网站写给我们的cookie 文件如下:
应用如下:index.jsp文件中 <% Cookie[] cookies = request.getCookies(); //从request中获取cookie对像的集合。 String user = “”; //登录用户 String date = “”; //注册时间 if (cookies != null){ for(int i =0;i<cookies.length; i++){ // 遍历cookie对像的集合 if(cookie[i].getName().equals(“mrCookie”)){ String cookieValue = cookies[i].getValue(); //获取cookie的值 String userinfo[] = cookieValue.split("#");//分割,把cookie值中用户名、注册时间等 //内容进行分割。 user = URLDecoder.decode(userinfo[0],“UTF-8”);//将用户名解码,说明里面中文信息内容,说明在获取cookie信息中包括中文,一般要将中文保存到cookie中,需要调用java.net.URLEncoder类的encode()方法将要保存到cookie中的信息进行编码,在读取cookie对像的内容时,还需要使用java.net.URLDecode类的decode()方法进行解码,这样就可以成功向cookie中写中文和读取 中文信息了。 date = userinfo[1]; }}} if (" “.equals(user)&&” ".equals(date)) { %> 游客您好,欢迎您 首次光临,你还没有注册! 请输入姓名: <% }else { //已经注册过了 %> 欢迎 <%=user%>再次光临 您的注册时间是:<%=date%> <% } %>
下面编写deal.jsp文件,用于向cookie中写入注册信息。 <% String user = request.getParameter(“user”); user= new String(user.getBytes(“ISO-8859-1”),“UTF-8”);//解决中文乱码的第一种方式 user = URLEcoder.encode(user,“UTF-8”); //将中文进行编码 //解决中文乱码的第二种方式 SimpleDateFormat sdf = new SimpleDateFormat(“yyyy年MM月dd日”); //创建并实例化cookie对像,cookie的名称为mrCookie Cookie cookie = new Cookie(“mrCookie”,user+"#"+sdf.format(new Date())); cookie.setMaxAge(606024*30); // 设置cookie 有效期为30天。 response.addCookie(cookie); //保存cookie %> 说明:解决中文乱码 在网页之间传递中文参数值经常会出现乱码,这是因请求参数的文字编码方式与页面中文字编码方式不一致所造 成的。tomcat默认的request请求都是采用ISO-8859-1编码的,而在页面中采用的是UFT-8编码方式,通过两种方式可以解决中文乱码问题。 方法一:通过String()构造方法重新构造一个与页面字 符编码相同的字符患。就可以把请求参数中的中文正常显示出来了。 user= new String(user.getBytes(“ISO-8859-1”),“UTF-8”);//解决中文乱码的第一种方式 方法二:使用java.net.URLEncoder类将字符串编码成URL支持的字符,再用java.net.URLDecode类将编码后的字符串进行解码。即这两个要配套用。 user = URLEcoder.encode(user,“UTF-8”); //将中文进行编码 //解决中文乱码的第二种方式 4.获取客户端信息 通过request对象可以获取客户端的相关信息,HTTP报头信息,客户提交信息方式,客户端主机IP地址,端口号等 request.getServerPort(); request.getServerName(); request.getMethod(); 如获取客户端的主机名:<%=request.getRemoteHost()%> 5.显示国际化信息 request.getLocale()和getLocales()方法允许JSP开发人员获取根据浏览器的默认或设置语言决定而得到的一个java.util.Local类型,java.util.Local的对象封装一个国家和一种该国家所使用的语言。 <% java.util.Locale locale = request.getLocale(); String str = “”; if (locale.equals(java.util.Locale.US)){ str = “hello,nihao”; } if(locale.equals(java.util.Locale.CHINA)){ str = “嗨,您好”; } %>
(2)responset]对象 response对像用于响应客户端请求,向客端输出信息,它封装了JSP产生的响应,并发送到客户端以响应客户端的请求, 三个作用: 1.重定向网页 语法格式如下: response.sendRedirect(String path); 说明:path用于指定目标路径,可以是相对路径,也可以是不同主机的地其他的URL地址, response.sendRedirect(“login.jsp”); //与当前网页同级 response.sendRedirect(“www.mingrisoft.com”);//与该网页不在同一主机上。 2.处理HTTP文件头,即Header 最常用的是设置禁用缓存,设置页面自动刷新,定时跳转网页等 。
默认情况下,浏览器将会对显示的网页内容进行缓存,这样,当用户再次访问相关网页时,浏览器会判断网页是否有变化,如果没有变化则直接显示缓存中的内容,这样就可以提高网页的显示速度,对于一些安全性要求较高的网站,通常需要禁用缓存。 <% response.setHeader(“Cache-Control”,“no-store”); response.setDateHeader(“Expires”,0); %>
<% response.setHeader(“refresh”,10); //网页10秒刷新一次。 %>
- 定时跳转网页:
<% response.setHeader(“refresh”,“5;URL=login.jsp”); //5秒种自动跳转到指定的网页。 %> 3.设置输出缓存 通常 情况下,服务器要输出到客户端的内容不会直接写到客户端,而是先室一个缓冲区,类似一个粮库中,传送带的速度较慢,这时都是把车队上的粮食先放到一个缓存站台上,从而避免装卸车队的浪费,当满足以下3种情况时,就会把缓存区中的内容写到客户端, - JSP页面的输出信息已经全部写入缓冲区
- 缓冲区已满
- 在JSP页面中,调用了response.flushbuffer()方法或out.flush()方法强制将页面缓存输出到客户端。
response.setBufferSize(32);//设置缓冲区大小32K response.isCommitted();//检测服务端是否已经将数据写入客户端 (3)session对象 session在网络中被称为会话,HTTP协议是一种无状态协议,也就是当一个客户端向服务端发出请求,服务端接收请求,并返回响应后,该连接就结束了。而服务器并不保存相关的信息。为了弥补这一缺点,HTTP协议提供了session.通过session可以当用户在应用程序的web页间进行跳转时,保存用户的状态,使整个用户会话一直存在下去,直到关闭浏览器。但时如果在一个会话中,客户端长时间不向服务器发出请求,session对象就会自动消失。这个时间取决于服务器,例如:Tomcat服务器默认设置这个时间为30分钟,不过这个时间可以通过编写程序进行修改。 - 存储与获取在session中与客户对像相关的信息,
session.setAttribute(String name,Object object)方法与getAttribute()方法。 如session.setAttribute(“username”,“绿草”)方法与getAttribute(“username”)方法。 说明:getAttribute()方法的返回值是Object类型的,如果需要将获取的信息赋给String类型 的变量,则需要进行强制类型转换或调用toString()方法。下面两种方法都正确。 String user = (String) session.getAttribute(“username”); String user = session.getAttribute(“username”).toString(); - 从会话中移除指定的绑定对像
对于存储在session会话中的对像,如果想将其从session会话中移除,则可以使用session对像的removeAttribue()方法,如下所示: session.removeAttribute(“username”); - 销毁session
虽然当idate客户端长时间不向服务器发送请求后,session对像会自动消失 ,但是对于某些实时统计在线人数的网站,每次都等session过期后才能统计出准确的人数,这时就会需要手动消毁session.语法如下。 session.invalidate(); - 会许超时的管理
在应用session对像时应该注意session的生命周期,一般来说session的生命周期在TOMCAT中 设置20-30分钟。当用户首次访问时将产生一个新的会话,以后服务器就可以记住这个会话状态 ,当会话生命周期超时时,或者服务器端强制使会失效时,这个session就不能使用了,在开发程序时应该考虑用户访问网站时可能发生的各种情况,比如用户登录网站后在sessin 的有效期外进行相应操作,用户会看到一个错误的页面,这样的现象是不允许发生的,为了避免这种现象的发生,在开发系统时应该对session的有效性进行判断。在session对象中提供设置会话生命周期的方法 getLastAccessedTime(); //返回客户端最后一次与会话相关联的请求时间 getMaxInactiveInterval();//以秒为单位返回一个会话内两个请求的最大时间间隔。 setMaxInactiveInterval();//以秒为单位设置session的有效时间 如:setMaxInactiveInterval(10000); (4)application对象 application对像用于保存所有应用程序中的公有数据 ,它在服务器启动时自动创建,在服务器停止时销毁 ,当application对象没有被销毁时,所有用户都可以共享该application对象,与session 对象相比,application对像的生合周期更长,类似于系统的全局变量。
application对象提供他对应用程序初始化参数进行访问的方法,应用程序初始化参数在web.xml文件中进行设置。web.xml文件中通过标签配置应用程充初始化参数。例如配置连接数据库所需的url参数。 <context -param> url <param-value<jdbc:mysql://127.0.0.1:3306/db_database application提供了两种访问应用程序初始化参数的方法:
- application.getInitParameter(String name);应用如下
application.getInitParameter(url);//返回一个已命的参数值
与session 对象相同,也可以在application对象中设置属性,与session对象不同的是session只在当前客户的会话 范围内有效,当超过保存时间后,session对象就被收回,而appplication对象在整个应用区域中都有效, getAttrbiuteNames();//获取所有application对象使用的属性名。 getAttribute(String name);//从application对象中获取指定的对象名 setAttribute(String key; Object obj);使用指定名称和指定对象在application对象中进行关联。 removeAttribue(String name);//从application对象中去掉指定名称的属性。 (5)out对象 out对象用于在WEB浏览器内输出信息,并且管理
|