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连接数据库
回忆下连接数据库的步骤
- 加载JDBC驱动
- 与数据库建立连接
- 发送sql语句
- 处理返回结果
- 数据库访问结束后,进行资源释放。
在JSP中使用JavaBean
为什么需要JavaBean
什么是JavaBean
javaBean是java中开发的可以跨平台的重用组件。JavaBean在服务器端的应用中表现出了强大的生命力,在JSP应用程序中常用于封住业务逻辑,数据库操作等,JavaBean组件本质上就是一个Java类,只是这个类需要遵循一些编码的约定。
JavaBean实际上是一个java类,这个类可以重用。从JavaBead的功能上可以分为以下两类:
- 封装数据
- 封装业务
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相对应,
总结: