Web基础知识(12)- JSP (四) | JSP Cookies 处理、JSP JavaBean 的使用
1. JSP Cookies 处理
Cookie 不是 JSP 内置对象,Cookie 由服务器生成并发送给浏览器(客户端),浏览器会将其以文本文件的形式存储在某个目录下。
例如,IE 浏览器把 cookie 信息保存在类似于 C://windows//cookies 的目录下,当用户再次访问某个网站时,服务器就会要求浏览器查找并返回之前发送的 cookie 信息,来识别此用户。
识别用户通常有以下步骤:
(1) 服务器把 cookie 信息发送到浏览器,例如:用户 ID、用户名称等信息。
(2) 浏览器在本地存储这些信息。
(3) 浏览器再次向服务器发送请求时,它会同时将本地存储的 cookie 信息一同发送给服务器,然后服务器使用这些信息来识别用户或其它。
cookie 的作用表现在以下方面:
(1) 对特定对象的追踪,如用户的访问次数、最后访问时间等。
(2) 统计网页的浏览次数。
(3) 在 cookie 有效期内,记录用户的登录信息,简化下一次的登录过程。
(4) 实现各种个性化服务,如”最近浏览过的商品“。
注意:由于 cookie 会将用户的个人信息保存在客户端,如用户名、计算机名、以及浏览和登录的网站等。这些信息可能会包含一些比较敏感的内容,所以从安全角度来说,使用 cookie 存在着一定的风险,因此不建议在 cookie 中保存比较重要或隐私的内容。
1) cookie 常用方法
| 方法 | 说明 |
| public void setDomain(String pattern) | 设置 cookie 的域名,如 biancheng.net |
| public String getDomain() | 获取 cookie 的域名 |
| public void setMaxAge(int expiry) | 设置 cookie 有效期,单位:秒 |
| public int getMaxAge() | 获取 cookie 有效期,单位:秒。默认为 -1,表示 cookie 保存到浏览器关闭为止 |
| public String getName() | 返回 cookie 的名称,名称创建后将不能被修改 |
| public void setValue(String newValue) | 设置 cookie 的值 |
| public String getValue() | 获取 cookie 的值 |
| public void setPath(String uri) | 设置 cookie 的路径,默认为当前页面目录以及子目录下的所有 URL |
| public String getPath() | 获取 cookie 的路径 |
| public void setSecure(boolean flag) | 设置 cookie 是否要加密传输 |
| public void setComment(String purpose) | 设置 cookie 注释 |
| public String getComment() | 返回 cookie 注释,如果 cookie 没有注释,则返回 null |
2) JSP 使用 cookie
JSP 使用 cookie 主要分为以下几个步骤。
(1) 创建 cookie 对象
创建 cookie 对象,name 代表 cookie 的名称,value 表示该名称对应的值,语法如下:
cookie cookie = new cookie(String name, String value);
注意:name 和 value 中不能包含空格和以下字符:
[ ] ( ) = , " / ? @ : ;
(2) 写入 cookie
创建 cookie 对象后,调用 response.addCookie() 方法写入 cookie,代码如下:
response.addcookie(cookie);
(3) 设置 cookie 有效期
调用 setMaxAge() 方法设置 cookie 的有效期(单位:秒),如将 cookie 有效期设置为 24 小时,代码如下:
cookie.setMaxAge(60*60*24);
(4) 读取 cookie
调用 request.getCookies() 方法读取 cookie,该方法返回 HTTP 请求中的 cookie 对象数组,需要通过遍历进行访问。
(5) 删除 cookie
删除 cookie 步骤如下:
a) 获取 cookie
b) 将要删除的 cookie 有效期设置为 0
c) 调用 response.addCookie() 方法重新写入 cookie
示例,cookie.jsp 代码如下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 <%@ page import="java.net.*"%> 3 <!DOCTYPE html> 4 <html> 5 <head> 6 <title>Cookie</title> 7 </head> 8 <body> 9 <% if ("POST".equals(request.getMethod())) { 10 // 处理中文乱码 11 String username = URLEncoder.encode(request.getParameter("username"), "utf-8"); 12 //String username = request.getParameter("username"); 13 String password = request.getParameter("password"); 14 if ("admin".equals(username) && "123456".equals(password)) { 15 16 Cookie cookie_name = new Cookie("username", username); 17 cookie_name.setMaxAge(60 * 60 * 24); // 设置 cookie 有效期为24小时。 18 response.addCookie(cookie_name); 19 20 out.print("<p>Login successfully!</p>"); 21 out.print("<p>View cookie,click <a href='cookie_view.jsp'>Here</a></p>"); 22 23 } else { 24 out.print("<p>Login failed, invalid username or password!</p>"); 25 } 26 } else { %> 27 28 <h2>User Login</h2> 29 <form method="post" action=""> 30 <p>Username: <input type="text" name="username" value="admin" /></p> 31 <p>Password: <input type="text" name="password" value="123456" /></p> 32 <p><input type="submit" value="Login" /></p> 33 </form> 34 35 <% } %> 36 </body> 37 </html>
cookie_view.jsp 代码如下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 <%@ page import="java.net.*"%> 3 <!DOCTYPE html> 4 <html> 5 <head> 6 <title>Cookie View</title> 7 </head> 8 <body> 9 <%! 10 public Cookie getCookieByName(Cookie[] cookies, String name) { 11 if (cookies == null) { 12 return null; 13 } else { 14 for (Cookie cookie : cookies) { 15 if (cookie.getName().equals(name)) { 16 return cookie; 17 } 18 } 19 return null; 20 } 21 } 22 %> 23 24 <% 25 Cookie cookie_username = getCookieByName(request.getCookies(), "username"); 26 if (cookie_username != null) { 27 out.println("<p>Get username from cookie</p>"); 28 out.println("<p>username: " + cookie_username.getValue() + "</p>"); 29 out.print("<p>Remove cookie,click <a href='cookie_remove.jsp'>Here</a></p>"); 30 } else { 31 out.println("<p>No cookie, <a href='cookie.jsp'>Back</a></p>"); 32 } 33 %> 34 </body> 35 </html>
cookie_remove.jsp,代码如下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 <%@ page import="java.net.*"%> 3 <!DOCTYPE html> 4 <html> 5 <head> 6 <title>Cookie Remove</title> 7 </head> 8 <body> 9 <%! 10 public Cookie getCookieByName(Cookie[] cookies, String name) { 11 if (cookies == null) { 12 return null; 13 } else { 14 for (Cookie cookie : cookies) { 15 if (cookie.getName().equals(name)) { 16 return cookie; 17 } 18 } 19 return null; 20 } 21 } 22 %> 23 24 <% 25 Cookie cookie_username = getCookieByName(request.getCookies(), "username"); 26 if (cookie_username != null) { 27 cookie_username.setMaxAge(0); 28 response.addCookie(cookie_username); 29 response.sendRedirect("cookie_view.jsp"); 30 } else { 31 out.println("<p>No cookie, <a href='cookie.jsp'>Back</a></p>"); 32 } 33 %> 34 </body> 35 </html>
2. JSP JavaBean 的使用
Java 之父 James Gosling 在设计 Java 语言,为 Java 组件中封装数据的 Java 类进行命名时,看到了桌子上的咖啡豆,于是灵机一动,就把它命名为“JavaBean”,bean 翻译为“豆、豆子”。
在程序中,开发人员所要处理的是业务逻辑和数据,而这两种操作都可以封装成 JavaBean,一个应用程序中会使用很多的 JavaBean。由此可见,JavaBean 组件是应用程序的重要组成部分。
JavaBean 是可以重复使用的一个组件,是遵守 JavaBean API 规范的 Java 类。
一般情况下,JavaBean 要满足以下要求:
(1) JavaBean 是一个公共类,并提供无参公有的构造方法;
(2) 需要被序列化并且实现了 Serializable 接口;
(3) 属性私有化;
(4) 具有公共的访问属性的 getter 和 setter 方法;
1) JavaBean 属性
一个 JavaBean 可以有多个属性,属性应该是可以访问的,属性类型可以是任何合法的 Java 数据类型,包括自定义的类。
JavaBean 的每个属性通常都具有相应的 setter 和 getter 方法,setter 方法称为属性修改器,getter 方法称为属性访问器。
| 方法 | 描述 |
| getPropertyName() | 举例来说,如果属性的名称为 Name,那么这个方法的名字就要写成 getName() 来读取这个属性。这个方法也称为访问器。 |
| setPropertyName() | 举例来说,如果属性的名称为 Name,那么这个方法的名字就要写成 setName() 来写入这个属性。这个方法也称为写入器。 |
2) 访问 JavaBean
<jsp:useBean> 标签可以在 JSP 中声明一个 JavaBean,然后使用。声明后,JavaBean 对象就成了脚本变量,可以通过脚本元素或其他自定义标签来访问。<jsp:useBean> 标签的语法格式如下:
<jsp:useBean id="bean's name" scope="bean's scope" typeSpec/>
其中,根据具体情况,scope 的值可以是 page (默认值),request,session 或 application。id 值可任意只要不和同一 JSP 文件中其它 <jsp:useBean> 中 id 值一样就行了。
3) 访问 JavaBean 对象的属性
在 <jsp:useBean> 标签主体中使用 <jsp:getProperty/> 标签来调用 getter 方法,使用 <jsp:setProperty/> 标签来调用 setter 方法,语法格式如下:
1 <jsp:useBean id="test" class="com.example.Test"> 2 <jsp:setProperty name="test" property="name" value="default value"/> 3 <jsp:getProperty name="test" property="url"/> 4 ... 5 </jsp:useBean>
name 属性指的是 Bean 的 id 属性。property 属性指的是想要调用的 getter 或 setter 方法。
示例,Test.java 代码如下:
1 package com.example; 2 3 import java.io.Serializable; 4 5 public class Test implements Serializable { 6 7 private String name; 8 private String url; 9 10 public String getName() { 11 return name; 12 } 13 14 public void setName(String name) { 15 this.name = name; 16 } 17 18 public String getUrl() { 19 return url; 20 } 21 22 public void setUrl(String url) { 23 this.url = url; 24 } 25 }
javabean.jsp 代码如下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 <%@ page import="java.net.*"%> 3 <!DOCTYPE html> 4 <html> 5 <head> 6 <title>JavaBean</title> 7 </head> 8 <body> 9 <p>JavaBean Test Page</p> 10 11 <jsp:useBean id="test" class="com.example.Test"> 12 <jsp:setProperty name="test" property="name" value="JavaBean Name"/> 13 <jsp:setProperty name="test" property="url" value="www.test.com"/> 14 </jsp:useBean> 15 16 <p>Name: <jsp:getProperty name="test" property="name"/></p> 17 <p>Url: <jsp:getProperty name="test" property="url"/></p> 18 19 </body> 20 </html>
浙公网安备 33010602011771号