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. .net core webapi 文件上传在 Swagger 文档中的有好提示处理

    前提: 需要nuget   Swashbuckle.AspNetCore 我暂时用的是  4.01 最新版本: 描述:解决 .net core webapi 上传文件使用的是 IFormFile,在S ...

  2. java的多线程安全,ReentrantLock与synchronized锁

    前言 多线程总的来说是一个很大的模块,所以虽然之前就想写但一直感觉有地方没有理解透,在经过了一段时间学习后,终于有点感觉了,在此写下随笔. 多线程安全问题##: 首先和大家讨论一下多线程为什么会不安全 ...

  3. CentOS Vi编辑器

    vim:通过vim a.cfg进入文档 i:编辑状态 ESC:返回不可编辑状态 dd:在不可编辑状态下,dd可删除光标所在的行,2dd删除两行,以此类推 u:在不可编辑状态下,u可恢复删除的行 yy: ...

  4. go 常见问题

    以下是我在go项目中碰到问题 1. 如何只测试指定的test文件,而不是所有的单元测试都跑一遍. go tool vet -test -v src\github.com\astaxie\beego\c ...

  5. 什么时候调用dealloc

    什么时候回调用dealloc? 1.这个类被release的时候会被调用: 2.这个对象的retain count为0的时候会被调用: 3.或者说一个对象或者类被置为nil的时候:

  6. HSSFWorkbook导出表格使用

    HSSFWorkbook                      excel的文档对象 HSSFSheet                         excel的表单 HSSFRow      ...

  7. 【guava】字符串操作

    一,Strings类 public void testStrings(){ Strings.isNullOrEmpty("");//返回true Strings.nullToEmp ...

  8. 在Discuz X 中增加一个单独的页面

    如果在DZ中增加一个新的页面,并且取得DZ中相关的用户等乱七八糟的属性,在旧的版本中只要引用一个 -. comm.php 文件就可以,但是在 X 版本以后好像就没.还好,X版本中还是有办法解决的,使用 ...

  9. Preferences偏好设置

    Preferences偏好设置-Preferences偏好设置 General(综合设置):在综合设置界面内,对Unity集成开发环境进行一些相关的设置 Auto Refresh:自动更新 Alway ...

  10. CentOS 7 安装中网络设置111

    如果在安装过程中需要使用网络,需要启动网卡,默认是DHCP 点击configure进入设置 General 常规设置 Automatically connect to this network whe ...