Java Web中MVC设计模式与IOC
MVC是由Model(模型)、View(视图)、Controller(控制器)三个模块组成
视图:用于做数据展示以及和用户交互的一个界面(html页面)
控制层:能够接受客户端的请求,具体的业务功能还是需要借助于模型组件来完成(Controllers中央控制器)
模型层:模型分为很多种:有比较简单的值对象pojo/vo(value object),有业务模型组件(bo),有数据访问层组件(dao)
业务模型组件(bo),有数据访问层组件(dao)的区别:
数据访问层组件(dao):DAO中的一个方法就只考虑一个操作,比如单纯的添加操作,单纯的删除操作
业务模型组件(bo):BO中的一个方法可以调用多个DAO中的方法,比如注册方法(向用户积分表添加数据,消息表添加数据,日志表添加记录....)

IOC:
1)耦合/依赖
依赖是指,某个类离不开某个类,耦合是指:层与层之间有依赖
我们写程序要做到高内聚低耦合。(层与层内部要高度聚合,二层与层之间应该是低耦合的,最好是没有耦合 )
2)IOC(控制反转) / DI(依赖注入)
控制反转(IOC):
- 之前在Servlet类中,创建service对象,FruitService fruitService = new FruitServiceImpl();(1.如果出现在某个方法中,那么fruitService 的作用域(生命周期)就是方法级别的;
2.如果在类中,为成员变量,那么fruitService 的作用域(生命周期)就是类级别的)
- 之后在applicationContext.xml中定义了这个fruitService。然后通过解析XML,产生fruitService实例,存放在beanMap中,这个beanMap在一个BeanFactory中,因此,转移(改变)了之前的 service实例、dao实例等等他们的生命周期。控制权从程序员转移到BeanFactory。这个现象我们称之为控制反转
DI(依赖注入)
- 之前我们在控制层出现代码:FruitService fruitService = new FruitServiceImpl();那么,控制层和service层存在耦合。
之后,我们将代码修改成FruitService fruitService = null ;然后,在配置文件中配置:
配置文件(applicationContext.xml)
<?xml version="1.0" encoding="utf-8"?>
<beans>
<bean id="fruitDAO" class="fruit.dao.impl.FruitDAOImpl"/>
<bean id="fruitService" class="fruit.servlet.impl.FruitServiceImpl">
<property name="fruitDAO" ref="fruitDAO"/>
</bean>
<bean id="fruit" class="controllers.FruitControllers">
<property name="fruitService" ref="fruitService"/>
</bean>
</beans>
xml文件的开头一定要用
<?xml version="1.0" encoding="utf-8"?>
否则会报配置文件的错误,这句话的前面;也不可以有空格
解析XML(ClassPathXmlApplicationContext.class)
package myssm.io; import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map; public class ClassPathXmlApplicationContext implements BeanFactory{
private Map<String,Object> beanMap=new HashMap<>();
public ClassPathXmlApplicationContext(){
try {
InputStream inputStream=getClass().getClassLoader().getResourceAsStream("/com/applicationContext.xml");
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse(inputStream);
//4.获取所有的bean节点
NodeList beanNodeList = document.getElementsByTagName("bean");
for (int i = 0; i < beanNodeList.getLength(); i++) {
Node beanNode=beanNodeList.item(i);
if(beanNode.getNodeType()==Node.ELEMENT_NODE){
Element beanElement=(Element)beanNode;
String id = beanElement.getAttribute("id");
String className=beanElement.getAttribute("class");//controllers1.FruitControllers
Class beanClass=Class.forName(className);
Object beanObj=beanClass.newInstance(); beanMap.put(id,beanObj);
}
}
//5.组装bean之间的依赖关系
for (int i = 0; i < beanNodeList.getLength(); i++) {
Node beanNode=beanNodeList.item(i);
if(beanNode.getNodeType()==Node.ELEMENT_NODE){
Element beanElement=(Element)beanNode;
String beanId = beanElement.getAttribute("id");
NodeList beanChildNodeList=beanElement.getChildNodes(); for (int j = 0; j < beanChildNodeList.getLength(); j++) {
Node beanChildNode=beanChildNodeList.item(j);
//如果是个元素节点&&元素的值是property
if(beanChildNode.getNodeType()==Node.ELEMENT_NODE&&"property".equals(beanChildNode.getNodeName())){
Element propertyElement=(Element) beanChildNode; String propertyName = propertyElement.getAttribute("name");
String propertyRef = propertyElement.getAttribute("ref");//1.找到propertyRef对应的实例
Object refObj=beanMap.get(propertyRef);
//2.将refObj设置到当前bean对应的实例的property属性上去
Object beanObj=beanMap.get(beanId);
Class beanClazz=beanObj.getClass();
Field propertyFieId=beanClazz.getDeclaredField(propertyName);
propertyFieId.setAccessible(true);
propertyFieId.set(beanObj,refObj);
}
}
}
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {//*****
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
@Override
public Object getBean(String id) {
return beanMap.get(id);
}
}
Java Web中MVC设计模式与IOC的更多相关文章
- Java Web开发中MVC设计模式简介
一.有关Java Web与MVC设计模式 学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet,如何编写jsp及如何更新浏览器中显示的内容.但是我们之前自己编写的应用一般存在无条 ...
- Java Web自定义MVC框架详解 (转)
转自:http://blog.csdn.net/jackfrued/article/details/42774459 最近给学生讲Java Web,希望他们能够在学完这部分内容后自己实现一个MVC框架 ...
- Java Web中的mapper,service,controller,model
Java Web中的mapper,service,controller,model作用分别是:java web中mapper是对象持久化映射层,一般会继承ibatis或者mybatisservive是 ...
- Java Web 中使用ffmpeg实现视频转码、视频截图
Java Web 中使用ffmpeg实现视频转码.视频截图 转载自:[ http://www.cnblogs.com/dennisit/archive/2013/02/16/2913287.html ...
- JDBC在Java Web中的应用
JDBC在Java Web中的应用 制作人:全心全意 在Java Web开发中,JDBC的应用十分广泛.通常情况下,Web程序操作数据库都是通过JDBC实现,即使目前数据库方面的开源框架层出不穷,但其 ...
- Java Web 中 过滤器与拦截器的区别
过滤器,是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法u ...
- JAVA WEB 中的编码分析
JAVA WEB 中的编码分析 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src {background-co ...
- Java web中常见编码乱码问题(一)
最近在看Java web中中文编码问题,特此记录下. 本文将会介绍常见编码方式和Java web中遇到中文乱码问题的常见解决方法: 一.常见编码方式: 1.ASCII 码 众所周知,这是最简单的编码. ...
- Java web中常见编码乱码问题(二)
根据上篇记录Java web中常见编码乱码问题(一), 接着记录乱码案例: 案例分析: 2.输出流写入内容或者输入流读取内容时乱码(内容中有中文) 原因分析: a. 如果是按字节写入或读取时乱码, ...
随机推荐
- ebook下载 | 灵雀云发布《 企业高管IT战略指南——为何选择容器与Kubernetes》
发送关键词[高管指南]至灵雀云公众号,立即下载完整版电子书 "本书将提供企业领导者/IT高管应该了解的,所有关于容器技术和Kubernetes的基础认知和关键概念,突破技术语言屏障,全面梳理 ...
- python基础中遇到的问题(TypeError: unhashable type: 'list')
d20220330 #false >>> l=[{i:i+1} for i in [1,2,3]] >>> l [{1: 2}, {2: 3}, {3: 4}] & ...
- 19.Tomcat多实例部署及负载均衡、动静分离
Tomcat多实例部署及负载均衡.动静分离 目录 Tomcat多实例部署及负载均衡.动静分离 Tomcat多实例部署 安装jdk 设置jdk环境变量 安装tomcat 配置 tomcat 环境变量 修 ...
- Linux命令格式、终端类型和获取帮助的方法
Linux用户类型 Root用户:超级管理员,权限很大 普通用户:权限有限 终端 terminal 终端类型 物理终端:鼠标.键盘.显示器 虚拟终端:软件模拟出来的终端 控制台终端: /dev/con ...
- centos7 离线升级/在线升级操作系统内核
目录 一.前言 二.系统环境 三.系统内核下载网址 四.centos7离线升级系统内核 1.先查看系统环境 2.离线升级系统内核 五.在线升级系统内核 一.前言 CentOS(Community EN ...
- freeswitch拨打分机号
概述 电话语音服务中,有一种稍微复杂的场景,就是总机分机的落地场景,客户拨打总机号码之后,需要再拨打分机号转接到指定的话机. 分机号的拨打一般在总机接通之后,会有语音提示,总机收号之后转接分机. 分机 ...
- 简单到爆——用Python在MP4和GIF间互转,我会了
写在前面的一些P话: 昨天用公众号写文章的时候,遇到个问题.我发现公众号插入视频文件太繁琐,一个很小的视频,作为视频传上去平台还要审核,播放的时候也没gif来的直接.于是想着找个工具将mp4转换成gi ...
- Python实现中文字幕雨+源代码
写在前面的一些P话: 最近浏览了很多关于用Python和Pygame实现代码雨的案例,发现很多都是没有深入讲解代码的整个实现过程,从0到1教会你制作中文文字雨. 然后在介绍的过程中,我也将深入介绍Py ...
- ReentrantLock 公平锁源码 第0篇
ReentrantLock 0 关于ReentrantLock的文章其实写过的,但当时写的感觉不是太好,就给删了,那为啥又要再写一遍呢 最近闲着没事想自己写个锁,然后整了几天出来后不是跑丢线程就是和没 ...
- javascript基本属性访问对象的属性和方法
var myName = "Shelley"; //字符串基本类型 alert(myName.length); //隐式创建String对象,数值与myName相同,并执行len ...