DAO模式与Servlet
DAO模式
什么是dao模式?
DAO(Data Access Object)顾名思义是一个为数据库或其他持久化机制提供了抽象接口的对象,在不暴露底层持久化方案实现细节的前提下提供了各种数据访问操作。在实际的开发中,应该将所有对数据源的访问操作进行抽象化后封装在一个公共API中。用程序设计语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的类来实现这个接口,在逻辑上该类对应一个特定的数据存储。DAO模式实际上包含了两个模式,一是Data Accessor(数据访问器),二是Data Object(数据对象),前者要解决如何访问数据的问题,而后者要解决的是如何用对象封装数据。
信息系统的开发架构
客户层-------显示层-------业务层---------数据层---------数据库
1.客户层:客户层就是客户端,简单的来说就是浏览器。
2.显示层:JSP/Servlet,用于给浏览器显示。
3.业务层:对于数据层的原子操作进行整合。
4.数据层:对于数据库进行的原子操作,增加、删除等;
DAO(Data Access Object)介绍
DAO应用在数据层那块(对于数据库进行的原子操作,增加、删除等;),用于访问数据库,对数据库进行操作的类。
DAO设计模式的结构
DAO设计模式一般分为几个类:
1.VO(Value Object):一个用于存放网页的一行数据即一条记录的类,比如网页要显示一个用户的信息,则这个类就是用户的类。
2.DatabaseConnection:用于打开和关闭数据库。
3.DAO接口:用于声明对于数据库的操作。
4.DAOImpl:必须实现DAO接口,真实实现DAO接口的函数,但是不包括数据库的打开和关闭。
5.DAOProxy:也是实现DAO接口,但是只需要借助DAOImpl即可,但是包括数据库的打开和关闭。
6.DAOFactory:工厂类,含有getInstance()创建一个Proxy类。
DAO的好处
DAO的好处就是提供给用户的接口只有DAO的接口,所以如果用户想添加数据,只需要调用create函数即可,不需要数据库的操作。
Properties类(配置文件)
Java中的配置文件常为properties文件,格式为文本文件,文件的内容是“键=值”格式,注信息使用#注释。
步骤:
1.添加.properties文件
new ——》 File命令 新建properties文件
2.添加文件内容
例:连接数据库参数
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/pets
user=pets
password=111111
3.读取配置文件
properties类的常用方法
String getProperty(String key);根据指定的键返回一个字符串值。
Object setProperty(String key,String value);调用基类的方法来添加键值对;
void load(InputStream in);从输入流中读取属性列表,通过对指定文件进行装载获取该文件中的所有键值对;
void clear();清除所装载的键值对.
示例:
//创建对象
Properties para = new Properties();
//创建输入流
InputStream inputStream =
databaseUtil.class.getClassLoader().getResourceAsStream(str);
//从输入流中读取属性列表
try {
para.load(inputStream);
String dri = para.getProperty("driver");
String url = para.getProperty("url");
String user = para.getProperty("user");
String password = para.getProperty("password");
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
Servlet
概述
Servlet是sun公司提供的一门用于开发动态web资源的技术。
Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:
1、编写一个Java类,实现servlet接口。
2、把开发好的Java类部署到web服务器中。
按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet
Servlet接口实现类
- Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet、HttpServlet。
- HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
- HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式。
如为GET请求,则调用HttpServlet的doGet方法
如为Post请求,则调用doPost方法
配置Servlet
<servlet>
<!--给servlet取得的名字,一般与servlet类名相同-->
<servlet-name>userServerlet</servlet-name>
<!--servlet全限定类名,也就是servlet的位置-->
<servlet-class>cn.kgc.kb11.serverlet.UserServerlet</servlet-class>
</servlet>
<servlet-mapping>
<!--与上面的servlet名字相同-->
<servlet-name>userServerlet</servlet-name>
<!--浏览器通过该url找到servlet,"/"一定要加-->
<url-pattern>/doCreate</url-pattern>
</servlet-mapping>
示例
package cn.kgc.kb11.serverlet;
import cn.kgc.kb11.service.UserService;
import cn.kgc.kb11.service.impl.UserServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Author ZhangPeng
* @Date 2021/3/9
* @Description
*/
public class UserServerlet extends HttpServlet {
UserService user = new UserServiceImpl();
public void create(HttpServletRequest req, HttpServletResponse resp) throws IOException{
//注册
String name = req.getParameter("user");
String pwd = req.getParameter("pwd");
String cfmPwd = req.getParameter("cfmPwd");
boolean isSuccess = user.register(name, pwd, cfmPwd);
//System.out.println(isSuccess ? "注册成功" : "注册失败");
if (isSuccess) {
resp.sendRedirect("/login/home.jsp");
} else {
//req.getRequestDispatcher("/login/createUser.jsp").forward(req,resp);
resp.sendRedirect("/login/createUser.jsp");
}
}
public void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
//登录
String name = req.getParameter("user");
String pwd = req.getParameter("pwd");
boolean isSuccess = user.login(name,pwd);
if (isSuccess){
req.getRequestDispatcher("/login/doLogin.jsp").forward(req,resp);
}else {
resp.sendRedirect("/login/home.jsp");
}
}
public void modify(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
//修改密码
String name = req.getParameter("user");
String oldPwd = req.getParameter("oldPwd");
String newPwd = req.getParameter("newPwd");
boolean isSuccess = user.modify(name,oldPwd,newPwd);
if (isSuccess){
req.getSession().setAttribute("isSuccess",true);
req.getRequestDispatcher("/login/doModify.jsp").forward(req,resp);
}else {
req.getSession().setAttribute("isSuccess",false);
req.getRequestDispatcher("/login/doModify.jsp").forward(req,resp);
}
}
public void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
//删除用户
String name = req.getParameter("user");
String pwd = req.getParameter("pwd");
boolean isSuccess = user.delete(name,pwd);
if (isSuccess){
req.getSession().setAttribute("isSuccess",true);
req.getRequestDispatcher("/login/doDelete.jsp").forward(req,resp);
}else {
req.getSession().setAttribute("isSuccess",false);
req.getRequestDispatcher("/login/doDelete.jsp").forward(req,resp);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String type = req.getParameter("type");
if ("login".equals(type)){
login(req,resp);
}else if ("create".equals(type)){
create(req,resp);
}else if ("modify".equals(type)){
modify(req,resp);
}else {
delete(req,resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.service(req, resp);
}
}