1 bean.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans>
<!-- 配置AdminServiceImpl的清单 -->
<bean id="adminService" class="www.test.service.impl.AdminServiceImpl"></bean>
</beans>

2 BeanFactory工厂类代码

package www.test.utils;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; public class BeanFactory { public static Object getBean(String id){
//生成对象--根据清单生产--配置文件--将每一个bean对象的生产细节配置到配置文件中 //使用dom4j的xml解析技术 导入两个jar包
// dom4j-1.6.1.jar 和 jaxen-1.1-beta-6.jar try {
// 1 创建解析器
SAXReader reader = new SAXReader();
// 2 解析文档--bean.xml 在src下面
String path = BeanFactory.class.getClassLoader().getResource("bean.xml").getPath();
//读取
Document doc = reader.read(path); // 3 获得元素--参数是xpath规则
Element element = (Element) doc.selectSingleNode("//bean[@id='"+id+"']");
//<bean id="adminService" class="www.test.service.impl.AdminServiceImpl"></bean>
String className = element.attributeValue("class");
//www.test.service.impl.AdminServiceImpl
//使用反射创建对象
Class clazz = Class.forName(className);
Object object = clazz.getDeclaredConstructor().newInstance();
return object; } catch (Exception e) { e.printStackTrace();
} return null;
}
}

3 AdminService接口代码

package www.test.service;

import java.sql.SQLException;
import java.util.List;
import java.util.Map; import www.test.dao.AdminDao;
import www.test.domain.Category;
import www.test.domain.Order;
import www.test.domain.Product; public interface AdminService { // 获取分类
public List<Category> findAllCategory(); // 添加商品
public void saveProduct(Product product) throws SQLException; // 获取商品列表
public List<Product> findProductList() throws SQLException ;
public void deleteProductByPid(String pid) throws SQLException; // 商品修改的回显
public Map<String, Object> productBackShow(String pid) throws SQLException; // 获取所有订单
public List<Order> findAllOrdersList() throws SQLException; //查询订单详情
public List<Map<String, Object>> findOrderInfoByOid(String oid) throws SQLException; }

4 AdminServiceImpl接口实现类代码

package www.test.service.impl;

import java.sql.SQLException;
import java.util.List;
import java.util.Map; import www.test.dao.AdminDao;
import www.test.domain.Category;
import www.test.domain.Order;
import www.test.domain.Product;
import www.test.service.AdminService; public class AdminServiceImpl implements AdminService { // 获取分类
public List<Category> findAllCategory() {
AdminDao dao = new AdminDao();
try {
return dao.findAllCategory();
} catch (SQLException e) {
e.printStackTrace();
return null;
}
} // 添加商品
public void saveProduct(Product product) throws SQLException {
AdminDao dao = new AdminDao();
dao.saveProduct(product);
} // 获取商品列表
public List<Product> findProductList() throws SQLException {
AdminDao dao = new AdminDao();
return dao.findProductList();
} public void deleteProductByPid(String pid) throws SQLException {
AdminDao dao = new AdminDao();
dao.deleteProductByPid(pid);
} // 商品修改的回显
public Map<String, Object> productBackShow(String pid) throws SQLException {
AdminDao dao = new AdminDao();
return dao.productBackShow(pid);
} // 获取所有订单
public List<Order> findAllOrdersList() throws SQLException {
AdminDao dao = new AdminDao();
return dao.findAllOrdersList(); } //查询订单详情
public List<Map<String, Object>> findOrderInfoByOid(String oid) throws SQLException { AdminDao dao = new AdminDao();
return dao.findOrderInfoByOid(oid);
} }

5 AdminServlet代码

package www.test.web.servlet;

import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
import java.util.Map; import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.commons.beanutils.BeanUtils; import com.google.gson.Gson; import www.test.domain.Category;
import www.test.domain.Order;
import www.test.domain.Product;
import www.test.service.AdminService;
import www.test.service.impl.AdminServiceImpl;
import www.test.utils.BeanFactory; public class AdminServlet extends BaseServlet{ // 1 页面加载完毕后异步获得分类数据
public void findAllCategory(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //提供一个List<Category>转成json字符串
AdminService service = (AdminService) BeanFactory.getBean("adminService");
List<Category> categoryList = service.findAllCategory(); //将List<Category>转换成json格式
Gson gson = new Gson();
String json = gson.toJson(categoryList); //解决乱码并写出
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write(json); } // 2 商品列表的展示findAllProductList
public void findAllProductList(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { AdminService service = (AdminService) BeanFactory.getBean("adminService");
List<Product> productList = null;
try {
productList = service.findProductList();
} catch (SQLException e) { e.printStackTrace();
} // 转发
request.setAttribute("productList", productList);
request.getRequestDispatcher("/admin/product/list.jsp").forward(request, response); } // 3 删除商品 delProduct
public void delProduct(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取要删除商品的id
String pid = request.getParameter("pid");
AdminService service = (AdminService) BeanFactory.getBean("adminService");
try {
service.deleteProductByPid(pid);
//删除成功后回到商品列表页面
List<Product> productList = service.findProductList();
request.setAttribute("productList", productList);
request.getRequestDispatcher("/admin/product/list.jsp").forward(request, response);
} catch (SQLException e) { e.printStackTrace();
} } // 4 修改商品的操作 editProduct
public void editProduct(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//修改商品的回显部分

AdminService service = (AdminService) BeanFactory.getBean("adminService");
// 1获取要修改的商品的pid
String pid = request.getParameter("pid");
// 2 调用AdminService的方法
Map<String, Object> map = null;
Product product =new Product();
try {
map = service.productBackShow(pid);
/*{shop_price=2298.0, market_price=2399.0,
pflag=0, pimage=products/1/c_0014.jpg,
pname=vivo X5Pro, is_hot=1,
pdesc=移动联通双4G手机 3G运存版 极光白【购机送蓝牙耳机+蓝牙自拍杆】
新升级3G运行内存·双2.5D弧面玻璃·眼球识别技术,
pid=11, cid=1, pdate=2015-11-02}*/ // 将除了category的进行自动映射封装
BeanUtils.populate(product, map); //private Category category; 进行手动封装
Category category = new Category();
String cid =map.get("cid").toString();
category.setCid(cid); //将category封装到product中
product.setCategory(category); } catch (Exception e) { e.printStackTrace();
}
//存储转发
request.setAttribute("product", product);
request.getRequestDispatcher("/admin/product/edit.jsp").forward(request, response); } // 5 获得所有订单 findAllOrders
public void findAllOrders(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获得所有的订单信息---List<Order>
AdminService service = (AdminService) BeanFactory.getBean("adminService");
List<Order> orderList = null;
try {
orderList = service.findAllOrdersList();
} catch (SQLException e) { e.printStackTrace();
} request.setAttribute("orderList", orderList);
request.getRequestDispatcher("/admin/order/list.jsp").forward(request, response);
} // 6根据订单oid查询订单项和商品信息 findOrderInfoByOid
public void findOrderInfoByOid(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { //模拟从服务器读数据有一个延迟的效果
try {
Thread.sleep(500);
} catch (InterruptedException e1) { e1.printStackTrace();
} //获得oid
String oid = request.getParameter("oid"); //用解耦合的方式进行编码-----解web层与service层
//使用工厂+反射+配置文件
AdminService service = (AdminService) BeanFactory.getBean("adminService"
); List<Map<String,Object>> mapList = null;
try {
mapList = service.findOrderInfoByOid(oid);
} catch (SQLException e) { e.printStackTrace();
}
//格式转换
Gson gson = new Gson();
String json = gson.toJson(mapList);
//注意ajax提交回写
System.out.println(json);
/*
* [
* {"shop_price":5999.0,"count":2,"pname":"微星(MSI)GE62 2QC-264XCN","pimage":"products/1/c_0042.jpg","subtotal":11998.0},
* {"shop_price":1299.0,"count":1,"pname":"小米 4c 标准版","pimage":"products/1/c_0001.jpg","subtotal":1299.0},{"shop_price":2699.0,"count":6,"pname":"中兴 AXON","pimage":"products/1/c_0002.jpg","subtotal":16194.0},
* {"shop_price":2298.0,"count":1,"pname":"vivo X5Pro","pimage":"products/1/c_0014.jpg","subtotal":2298.0}]
*/
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write(json);
} }

案例40-层与层之间的解耦(面向接口编程)BeanFactory的更多相关文章

  1. IOC解耦-面向接口编程的优点

    原文:https://blog.csdn.net/jj_nan/article/details/70161086 参考:https://www.cnblogs.com/landeanfen/p/477 ...

  2. [转]JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分

    首先这是现在最基本的分层方式,结合了SSH架构.modle层就是对应的数据库表的实体类.Dao层是使用了Hibernate连接数据库.操作数据库(增删改查).Service层:引用对应的Dao数据库操 ...

  3. Android中的分层----service 层,domain层,dao 层,action层等设计

    service 层 服务层:直接为客户端提供的服务或功能.也是系统所能对外提供的功能. domain层 领域层:系统内的领域活动,存放实体. dao 层 持久层,DB操作都写在这里,数据访问对象,通过 ...

  4. AI:IPPR的数学表示-CNN基本结构分析( Conv层、Pooling层、FCN层/softmax层)

    类似于SVM,CNN为代表的DNN方法的边缘参数随着多类和高精度的要求必然增长.比如向量机方法,使用可以映射到无穷维的高斯核,即使进行两类分类,在大数据集上得到高精度,即保持准确率和高精度的双指标,支 ...

  5. 依赖注入(DI)有助于应用对象之间的解耦,而面向切面编程(AOP)有助于横切关注点与所影响的对象之间的解耦(转good)

    依赖注入(DI)有助于应用对象之间的解耦,而面向切面编程(AOP)有助于横切关注点与所影响的对象之间的解耦.所谓横切关注点,即影响应用多处的功能,这些功能各个应用模块都需要,但又不是其主要关注点,常见 ...

  6. 【转载】 【caffe转向pytorch】caffe的BN层+scale层=pytorch的BN层

    原文地址: https://blog.csdn.net/u011668104/article/details/81532592 ------------------------------------ ...

  7. 题目:企业发放的奖金根据利润提成。 利润(I)低于或等于10万元时,奖金可提10%; 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%; 20万到40万之间时,高于20万元的部分,可提成5%; 40万到60万之间时高于40万元的部分,可提成 3%; 60万到100万之间时,高于60万元的部分,可提成1.5%; 高于100万元时,超过

    题目:企业发放的奖金根据利润提成. 利润(I)低于或等于10万元时,奖金可提10%: 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%: 20万到 ...

  8. [Vue 牛刀小试]:第十四章 - 编程式导航与实现组件与 Vue Router 之间的解耦

    一.前言 在上一章的学习中,通过举例说明,我们了解了 Vue Router 中命名路由.命名视图的使用方法,以及如何通过 query 查询参数传参,或者是采用 param 传参的方式实现路由间的参数传 ...

  9. 代码实现:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%; 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%; 20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%; 60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元

    import java.util.Scanner; /* 企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%: 利润高于10万元,低于20万元时,低于10万元的部分按10%提成 ...

随机推荐

  1. sqlserver中 多条数据合并成一条数据 (stuff 与 for xml path 连用)

    SQL 列转行,即多行合并成一条   需求:按照分组,将多条记录内容合并成一条,效果如下: 数据库示例: CREATE TABLE [t2]([NID] [bigint] NULL,[district ...

  2. 【连载】redis库存操作,分布式锁的四种实现方式[二]--基于Redisson实现分布式锁

    一.redisson介绍 redisson实现了分布式和可扩展的java数据结构,支持的数据结构有:List, Set, Map, Queue, SortedSet, ConcureentMap, L ...

  3. 【01】循序渐进学 docker:到底是啥

    写在前面的话 首先说一下,我本身是做运维的,4 年工作,多家公司.所以可能接下来谈到的更多的是一些在工作过程中积累的个人看法.且有些并不具备普遍性,有不合适的地方,全当我在吹牛逼就行. 一开始我们得谈 ...

  4. 《C#多线程编程实战》2.4 SemaphoreSlim

    这个简单多了. 理解也是很好理解. 比上一个mutex好理解多了. 这个SemaphoreSlim是干什么呢? 就是限制线程的来访问. 好比说一次只有两个,一次只有三个  这样的线程来访问资源. 有点 ...

  5. sqlite数据库文件查看

  6. [WebShow系列] 现场控制台操作方法

    正在制作......,敬请期待. 现场控制台操作方法 现场控制台是现场管理员的管理后台.现场管理员首先登录指定的网址.使用现场管理员指定的登录名及密码就可以登录到后台.在后台点击[WebShow现场控 ...

  7. apache shiro学习笔记

    一.权限概述 1.1 认证与授权 认证:系统提供的用于识别用户身份的功能,通常登录功能就是认证功能-----让系统知道你是谁?? 授权:系统授予用户可以访问哪些功能的许可(证书)----让系统知道你能 ...

  8. HTML <form> target 属性

    浏览器支持 所有主流浏览器都支持 target 属性. 定义和用法 target 属性规定一个名称或一个关键词,指示在何处打开 action URL,即在何处显示提交表单后接收到的响应. target ...

  9. 洛谷 P3695 CYaRon!语 题解 【模拟】【字符串】

    大模拟好啊! 万一远古计算机让我写个解释器还真是得爆零了呢. 题目背景 「千歌です」(我是千歌).「曜です」(我是曜).「ルビィです」(我是露比).「3人合わせて.We are CYaRon! よろし ...

  10. P2762 太空飞行计划问题

    传送门 经典的最大权闭合子图问题 实验有正的价值,仪器的价值为负 为了实验我们必须选择相应的仪器 所以从 S 连向实验,边权为实验的价值 实验与相应仪器之间连边,边权为 INF 仪器连向 T 边权为仪 ...