JSP数据交互(二)

JSP内置对象application

我们学习了session对象,使用session可以保存当前每个用户的会话状态信息,一个用户对应一个session。但是如果要存在这样一个数据,如应用的访问人数,需要Web应用系统中的所有用户共享,这就需要用到JSP的另一个对象——application对象。


application对象

application对象类似于系统的全局变量,用于同一个应用内的所有用户之间的数据共享。
在这里插入图片描述

示例:统计网页的访问人数:

<%@ 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>
<%
	Integer count = (Integer) application.getAttribute("count");
	if(count!=null){
		count=count+1;
	}else{
		count=1;
	}
	application.setAttribute("count", count);
	count = (Integer) application.getAttribute("count");
	out.print("统计访问量:目前有"+count+"个人访问过此网站");
%>
</body>
</html

说明:这里使用count存储统计的访问人数,由于无法控制是第几个用户访问本站,所以先通过getAttribute()方法取值进行判断,如果count为null,说明是第一个用户,赋值为1,否则在原来的计数上累加。

在这里插入图片描述

对象的作用域

在这里插入图片描述

page的作用域

page作用域指单一的JSP页面范围,page作用域内的对象只能在创建该对象的页面中访问。page作用域可以使用pageContext对象的setAttribute()和getAttrbute()方法访问。page作用域在客户端每次请求JSP页面时创建,在服务器发送响应或请求转发到其他页面或资源后失效。演示代码如下所示:
testOne.jsp页面代码如下:

<body>
	<%
		String name="page";
		pageContext.setAttribute("name", name);
	%>
	<strong>
		testOne:<%=pageContext.getAttribute("name") %>
	</strong>
	<br/>
	<%
		pageContext.include("testTwo.jsp");
	%>
</body>

testTwo.jsp代码如下:

<body>
<strong>
	testTwo:<%=pageContext.getAttribute("name") %>
</strong>
</body>

运行结果为testOne:page,testTwo:null;

request作用域
request作用是与客户端的请求绑定在一起的,其作用范围要比page作用域大,request作用域可以通过调用request对象的setAttribute()与getAttribute()方法进行访问。request作用域在页面转发或包含中同样有效,需要注意的是,request作用域对于每次客户端的请求都是不同的,对于任何一个新的请求都会重新创建与本次请求相对应的request作用域,而当请求结束后,与之向相关的request作用域也随之失效。

示例:request作用域
testOne.jsp页面代码如下:

<%
	String name="request";
	request.setAttribute("name", name);
	request.getRequestDispatcher("testTwo.jsp").forward(request, response);
%>

testTwo.jsp页面代码如下:

<body>
	<b>testTwo:<%=request.getAttribute("name") %></b>
</body>

运行结果为testTwo:request。因为通过转发方法转发至testTwo.jsp属于同一个请求。

session作用域

JSP容器为每一次会话创建一个session作用域,在会话有效期内,只要将数据绑定到session作用域中,则该数据可以被本次会话中的其他页面访问。session作用域可以通过session对象的setAttribute()与getAttribute()方法访问。示例代码如下所示:
testOne.jsp页面代码如下:

<body>
	<%
		String req="request";
		String ses="session";
		request.setAttribute("reqName", req);
		session.setAttribute("sesName", ses);
		response.sendRedirect("testTwo.jsp");
	%>
</body>

testTwo.jsp页面代码如下:

	<b>
		request:<%=request.getAttribute("reqName") %>
		session:<%=session.getAttribute("sesName") %>
	</b>

运行结果如下:
在这里插入图片描述
说明:使用response对象将页面重定向至testTwo.jsp,在testTwo.jsp中能够读取到sessionName变量,由此可见session作用域内的数据在会话有效期内都可以访问。使用response。sendRedirect()重定向到另外一个页面时,相当于重新发起了一次请求,所有上一次请求中的reqName变量则随之失效。

application作用域

相对于session作用域针对于一个会话,aoolication作用域则针对整个Web应用,被该应用下所有用户共享。在Web应用运行期间,所有页面都可以访问application作用域内的变量,其作用域最大。代码如下:
在这里插入图片描述
运行结果如下:
在这里插入图片描述
以一个全新的会话开启另一个浏览器窗口直接访问testTwo.jsp页面,效果如下:
在这里插入图片描述
由于session作用域针对当前会话,多个会话之间不能共享,所以无法读取sesName变量。而application针对于整个应用。

小结:
在这里插入图片描述

什么是cookie

cookie由Netscape公司发明,是最常用的跟踪用户会话的方式。它是由服务器端生成并发送给客户端浏览器的,浏览器会将其保存为某个目录下的文件。
当用户在浏览网站时,web服务器会将一些资料存放在客户端,这些资料包括用户在浏览网站期间输入的文字或是一些选择记录。当用户下一次访问网站的时候,服务器会先从客户端查看是否有保留下来的cookie信息然后依据cookie的内容,呈现特定的页面内容给用户。cookie最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否保存状态以便下一次进入系统时可以简化登录。

在这里插入图片描述
在JSP中使用cookie
在这里插入图片描述

cookie对象方法
在这里插入图片描述
示例:cookie的读取:
addCookie.jsp页面代码如下:
写入cookie

<body>
	<%
		response.addCookie(new Cookie("username","sa"));
		response.addCookie(new Cookie("password","123456"));
		response.sendRedirect("getCookies.jsp");
	%>
</

getcookie.jsp页面代码如下:
读取cookie

<body>
<%
	Cookie[] cookies=request.getCookies();
	String user="";
	String pwd="";
	if(cookies!=null){
		for(int i=0; i<cookies.length;i++){
			if(cookies[i].getName().equals("username")){
				user=cookies[i].getValue();
			}else if(cookies[i].getName().equals("password")){
				pwd=cookies[i].getValue();
			}
		}
		out.print("用户名"+user+",密码:"+pwd);
	}
%>
</body>

运行结果为 用户名:jack 密码:123456.

cookie的有效期

当用户访问网页时,cookie能够在客户端创建一个文件,用于记录用户的有关数据,但是一个cookie在客户端存在的时间并不是无限期的,也有其声明周期。我们可以指定cookie的有效期,在有效期内cookie始终存在并能够被读取,当达到cookie有效期后,cookie会从客户端清除。
设置cookie的有效期的方法是调用cookie对象的sexMaxAge()方法,其中参数以秒为单位

示例;假设希望cookie的有效期为30秒,
info.jsp页面代码如下:

<body>
	<%
		Cookie nc = new Cookie("info","ok");
		nc.setMaxAge(60);//设置cookie失效前时间60秒
		response.addCookie(nc);
		response.sendRedirect("showCookie.jsp");
	%>
</body>

show.jsp页面代码如下:

<body>
	<%
		Cookie[] cookies=request.getCookies();
		boolean sign=false;
		if(cookies!=null){
			for(int i=0;i<cookies.length;i++){
				if(cookies[i].getName().equals("info")){
					sign=true;
					out.print("读取cookie的值:"+cookies[i].getValue());
				}
			}
		}
		if(!sign){
			out.print("超过cookie有效期,无法读取cookie");
		}
	%>
</body>	

以上示例执行结果是为一个cookie变量设置了60秒的有效期,在60内可以读取该cookie的值,一旦超过60秒,将无法读取该cookie信息。

使用setMaxAge(int expiry)时,有以下几种情况

  • 通常情况下expiry参数应该为大于0的整数,表示cookie的有效存活时间。
  • 如果设置expiry参数等于0,表示从客户端删除该cookie。
  • 设置expiry参数为负数或者不设置,表示cookie会在当前窗口关闭后失效。

cookie与session作用域的对比

两者区别如下:

  • session作用域时在服务器端保存用户信息,cookie是在客户端保存用户信息。
  • session作用域中保存的值是Object类型,cookie保存的值是String类型。
  • session作用域随会话的结束而将其存成的数据销毁,cookie可以长期保存在客户端。
  • cookie通常用于保存不重要的用户信息,重要的信息使用session作用域保存。

在开发中根据不同的业务需求合理选择采用哪种会话技术。

JDBC连接数据库

回忆下连接数据库的步骤

  1. 加载JDBC驱动
  2. 与数据库建立连接
  3. 发送sql语句
  4. 处理返回结果
  5. 数据库访问结束后,进行资源释放。

在JSP中使用JavaBean

为什么需要JavaBean
在这里插入图片描述
什么是JavaBean
javaBean是java中开发的可以跨平台的重用组件。JavaBean在服务器端的应用中表现出了强大的生命力,在JSP应用程序中常用于封住业务逻辑,数据库操作等,JavaBean组件本质上就是一个Java类,只是这个类需要遵循一些编码的约定。

JavaBean实际上是一个java类,这个类可以重用。从JavaBead的功能上可以分为以下两类:

  1. 封装数据
  2. 封装业务

JavaBean一般情况下要满足以下要求。

  • JavaBean是一个公有类,并提供无参的公有构造方法。
  • 属性私有
  • 具有共有的访问属性的getter和setter方法。

符合以上条件的类,都可以把它看成JavaBean组件。
在程序中,开发人员所要处理的无非是业务逻辑和数据,而这两种操作都可以封装成JavaBean组件,一个应用程序中会使用很多javaBaen。由此可见Javabean组件时应用程序的重要组成部分。

看一个简单的javaBean:


public class NewsUser {
	private String uid;	//用户编号
	private String uname;	//用户名
	private String upwd;	//用户密码
	//无参构造
	public NewsUser() {
		
	}
	public NewsUser(String name,String pwd) {
		this.uname=name;
		this.upwd=pwd;
	}
	
	public String getUid() {
		return uid;
	}
	public void setUid(String uid) {
		this.uid = uid;
	}
	public String getUname() {
		return uname;
	}
	public void setUname(String uname) {
		this.uname = uname;
	}
	public String getUpwd() {
		return upwd;
	}
	public void setUpwd(String upwd) {
		this.upwd = upwd;
	}
	
	
}

这段代码实际上就是实现用户登录时用于封装用户的实体类,这也是一个很典型的封装数据的JavaBean,这个JavaBean封装了用户所用的数据,uid,unane等是用户的属性,外部通过get set方法可以对这些属性进行操作。

javabean的属性变量变量的前两个字母要么全部大写,要么全部小写,如IDCode,ID,ICCard等属性变量名是合法的,而iDCode,iD,iCCard等属性变量名则是非法的。

在编写程序时,一个封装数据的javaBean一般情况下对应着数据库内的一张表,或者视图,JavaBean的属性与表(或视图)内字段的属性一一对应。同样,相对于一个封装数据的JavaBean,一般都会有一个封装该类的业务逻辑和业务操作的JavaBean相对应,

总结:
在这里插入图片描述


版权声明:本文为yananye原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。