1、DAO设计模式
DAO(Data Access Object,数据访问对象),主要的功能是用于进行数据操作的,在程序的标准开发框架中属于数据层的操作。
软件的分层架构:
●显示层(Web层)(JSP/Servlet)
●业务层:就是用来实现具体某个功能的需求
●数据层:DAO模式来实现数据的持久化操作
●资源层
DAO组成:
●DbHelper:专门负责数据库打开与关闭操作
●VO:主要由属性,set、get方法组成,VO类中的属性与表中的字段相对应,每一个VO类的对象都表示表中的一条记录
●DAO:主要定义数据操作的接口,例如增删改查等
●Impl:DAO接口的真正实现类,主要完成具体的数据库操作,但是不负责数据库的打开和关闭
●Proxy:代理实现类,主要完成数据库的打开和关闭,并且负责调用真实实现类完成对象的操作。
●Factory:工厂类,通过工厂类创建并获取一个DAO的实例对象
XXXDao dao=new XXXDaoImpl();//OracleDaoImpl
对于包的命名:
●使用DAO时对于包有严格的命名方式
●数据库连接:xxx.dbc.DbHelper
●DAO接口:xxx.dao.IxxxDAO
●DAO接口的真实实现类:xxx.dao.impl.XxxDAOImpl
●Dao接口的代理实现类:xxx.dao.proxy.XxxDaoProxy
●VO类:xxx.vo.Xxx,或者:xxx.domain.Xxx
●工厂类:xxx.factory.DaoFactory
2、Web会话技术
WEB会话可以理解为:用户打开一个浏览器,访问某个web应用程序,在这个web应用程序中点击多个超链接,访问服务器上的多个WEB资源,然后关闭浏览器,整个过程称为一个会话。
例如:
1、打开浏览器
2、访问京东,此时就和京东网站,产生了会话
3、访问京东网站上的某个具体商品,或其他页面,也可以把商品加入到购物车,结算等一系列的操作
4、关闭浏览器,此时,与京东网站的会话也就结束了。
【HTTP协议是一种无状态的协议,所以导致服务器端不会记录客户端的任何信息,也就不认识客户端】
Java Web开发中使用的会话技术
在客户端和服务器端交互的过程中,通常会产生一些数据,为了保存会话过程中产生的数据,在Servlet技术中,提供了两个用于保存会话数据的对象,分别是Cookie和Session。
通过有状态的会话技术,可以解决的场景:
●购物车
●用户登录的状态
通过购物车案例,来了解会话技术Cookie和Session对象
●Cookie对象:客户端浏览器的会话技术,它可以把服务器传递过来的一些数据记录在客户端浏览器中,解决会话从什么时候开始,到什么时候结束。
●Session对象:服务器端的会话技术,它可以把同一用户与服务器多次请求响应的一些数据记录在服务器Session(会话域)域中,实现该用户在本次会话中,可以随时获取Session域中的数据,满足多次请求响应之间进行数据传递、访问使用。
会话实现的过程:
当客户端和服务器端,建立会话,会产生一个会话对象Session,并且会为这个会话产生一个唯一的标识,而且服务器端会自动的把这个会话的标识响应的客户端浏览器上,并且缓存到浏览器中,当下一次在请求时,浏览器会自动的带上这个会话的标识,并发送到服务器端,当服务器端接收到请求,会根据传递过来的会话标识,在服务器上查找所对应的Session对象,如果找到就之间把数据存储到对应的会话域中,如果没有找到,服务器端的会话对象有可能失效或者被删除,此时会自动的再创建一个新的会话。
3、Cookie技术
3.1、什么是Cookie
Cookie对象:客户端浏览器的会话技术,它可以把服务器传递过来的一些数据记录在客户端浏览器中,解决会话从什么时候开始,到什么时候结束。
总结:
●在客户端保存的数据,数据产生是在服务器
●在浏览器中Cookie是以文本的方式存储数据
3.2、Cookie的应用场景
1、判断用户是否登录过网站,以便下次登录时能够实现自动登录或者记住密码。如果删除Cookie,则每次登录必须重新填写登录的信息
2、保存上次登录的时间等相关信息
3、保存上次查看的页面
4、浏览计数,统计
3.3、Cookie的基础使用
3.3.1、服务器向浏览器发送Cookie
把服务器端想要保存的客户端数据,通过Cooke来完成,Cookie中保存的数据都是较小的文本数据。
实现步骤:
a) 创建Cookie对象,直接new Cookie(String key,String value);
b)将Cookie数据保存到客户端,使用response对象的addCookie()方法
API:
●Cookie类,对象创建
Cookie(Stringkey,Stringvalue),用于创建Cooke对象,并指定Cookie中的键值对信息
●Response对象
addCookie(Cookiec),用于将指定的Cookie对象,响应到客户端的浏览器中
代码演示:
package com.bdit;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = {"/cookieDemo1"})
public class CookieServletDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建Cookie对象
Cookiecookie = newCookie("bdit", "java");
//使用response对象,添加cookie到响应,并发送到客户端浏览器上
resp.addCookie(cookie);
}
}
访问演示:
3.3.2、获取浏览器携带的Cookie
浏览器在访问服务器的时候,会携带保存的Cookie数据,服务器端可使用request对象获取Cookie数据,Cookie数据放在请求头里。
实现步骤:
●使用request对象getCookies()方法,获取浏览器携带的所有Cookie数据
●遍历拿到一个Cookie对象,获取Cookie的键值对信息
API:
●request对象方法
Cookie[] getCookes(),获取所有的Cookie对象
●Cookie对象方法
StringgetName()获取Cookie的key
StringgetValue()获取Cookie的值
代码演示:
package com.bdit;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = {"/cookieDemo2"})
public class CookieServletDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求中携带的所有
Cookie[] cookies = req.getCookies();
//遍历
for (Cookie cookie:cookies) {
String key = cookie.getName();
String value = cookie.getValue();
System.out.println(key + "=" + value);
}
}
}
【注意:浏览器可以决定是否存储Cookie,如果浏览器禁用Cookie,那么浏览器也就无法存储Cookie的任何信息,会话失效】
3.4、Cookie中使用中文问题
Cookie数据,值可以使用中文,但是不建议使用中文
●如果在Cookie中使用中文,Tomcat8以下不支持,从Tomcat8开始支持中文
●如果要使用中文,建议把中文进行UTF-8编码
API:
●URLEncoder类
○String encode(“需要编码的数据”,“采用的编码”) 采用指定的编码对数据进行编码,返回编码后的字符串
●URLDecoder类
○String decode(“需要解码的数据”,“采用的编码”)采用指定的编码对数据进行解码,返回解码后的字符串
代码演示:
package com.bdit;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = {"/cookieDemo1"})
public class CookieServletDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String value="Java技术";
String encode=URLEncoder.encode(value,"utf-8");
//创建Cookie对象
Cookie cookie=new Cookie("bdit",encode);
//使用response对象,添加cookie到响应,并发送到客户端浏览器上
resp.addCookie(cookie);
}
}
package com.bdit;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = {"/cookieDemo2"})
public class CookieServletDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求中携带的所有
Cookie[] cookies = req.getCookies();
//遍历
for (Cookie cookie:cookies) {
String key = cookie.getName();
String value = cookie.getValue();
String decode=URLDecoder.decode(value,"utf-8");
System.out.println(key + "=" + decode);
}
}
}
访问演示:
3.5、Cookie的有效路径
Cookie对象
●setPath(“cookie的有效路径”),用于设置cookie的有效路径,如果参数写成request.getContextPath()代表web应用下任意资源都携带本cookie
●Cookie的最大存活时间,默认是当前会话,浏览器关闭,该会话结束,可以通过cookie的方法设置最大存活时间
■setMaxAge(int 秒) 更改Cookie的生存时间,单位是秒
代码演示:
package com.bdit;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = {"/cookieDemo1"})
public class CookieServletDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String value = "Java技术";
String encode = URLEncoder.encode(value, "utf-8");
//创建Cookie对象
Cookie cookie = new Cookie("bdit", encode);
//设置cookie的有效路径
cookie.setPath(req.getContextPath() + "/cookie/demo");
//设置cookie的存活时间
cookie.setMaxAge(60);
//使用response对象,添加cookie到响应,并发送到客户端浏览器上
resp.addCookie(cookie);
}
}
访问演示:
3.6、删除已存在的Cookie
要删除已存在的Cookie,可以设置Cookie的有效时间为0
如果要覆盖一个已经存在的Cookie,必须名称与有效路径和原cookie保持一致
覆盖原有的Cookie需要满足的条件:
●保证键的名字相同
●保证有效路径相同
4、Session技术
4.1、 什么是Session
Session对象:服务器端的会话技术,它可以把同一用户与服务器多次请求响应的一些数据记录在服务器Session域中,实现该用户在本次会中,可以随时获取Session域中对象,满足多次请求响应之间进行数据传递和访问。
●Session与Cookie是紧密相关的,Session的使用要求用户浏览器必须支持Cookie,如果浏览器不支持使用Cookie,或者设置为禁用Cookie,那么将不能使用Session。
●Session信息对客户端来说,不同的用户,使用不同的Session信息来记录,当用户启用Session时,Tomcat容器自动生成一个SessionID,在新会话开始时,服务器将SessionID当作Cookie存储在用户的浏览器中。
4.2、Session和Cookie的区别
cookie | session | |
---|---|---|
会话数据保存的位置 | 浏览器 | 服务器 |
数据的安全性 | 不安全 | 安全 |
存储的数据是否有限制 | 有 | 无 |
4.3、Session的使用场景
常见应用场景
●保存用户登录的信息
●将某些数据放入session中,供统一用户在不同的页面使用
●登录验证信息
4.4、HttpSession的常用方法
HttpServletRequest中有两个方法可用于创建会话:
●public HttpSession getSession(),调用此方法时,容器会先检查客户端先前送出的请求是否有建立过HTTP会话: 如果没有:容器会新建一个会话,并赋予一个唯一的会话ID。如果有:容器会根据客户请求中的会话ID找到相匹配的会话。
●public HttpSession getSession(boolean flag) 此方法的flag是用来指定是否有必要创建一个会话:例如:调用getSession(false)时,若客户先前没有建立过会话,则方法将返回null。
package com.bdit;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = {"/demo1"})
public class SessionDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建或获取会话对象
HttpSession session = req.getSession();
//响应
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
if (session.isNew()) {
out.print("<p>新创建了一个会话,会话id是:" + session.getId() + "</p>");
} else {
out.print("<p>会话已存在,会话id是:" + session.getId() + "</p>");
}
//设置会话的有效时间,默认是30分钟
session.setMaxInactiveInterval(3600);
out.print("<p>会话创建的时间是:" + session.getCreationTime() + "</p>");
out.print("<p>最后一次访问的时间是:" + session.getLastAccessedTime() + "</p>");
out.print("<p>session默认最大的有效时间:" + session.getMaxInactiveInterval() + "</p>");
//让session失效
//session.invalidate();
//往会话域中存储数据
session.setAttribute("a", "session会话域");
session.setAttribute("b", "2020.10.21");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
4.5、URL重写
Cookie被证明存在一些安全隐患。所以现在好多谨慎的用户都会在浏览器中设置禁用Cookie。此时就要用到另一种技术“URL重写”来维持会话。
如果在浏览器不支持Cookie或者关闭了Cookie功能的情况下,Web服务器还要能够与浏览器实现有状态的会话,就必须对所有可能被客户端访问的请求路径进行URL重写。
URL重写的原理:
●将会话ID添加到URL结尾,以标识该会话,这样服务器就可以从请求URL中取出会话ID,并用它查找匹配的会话了。http://ip:port/appName/url;jsessionid=xxxxx?param=value
URL重写的方法:
●HttpServletResponse接口中提供了两个用于完成URL重写的方法:
String encodeURL(String url) 对超链接或form表单的action属性中设置的URL进行重写。
String encodeRedirectURL(String url) 对要传递给sendRedirect()方法的URL进行重写。