当前位置: 首页 > news >正文

腾度网站建设网站设计者

腾度网站建设,网站设计者,购物网站模板免费,好用的wordpress博客主题目录 1. Servlet的getInitParameter2. 业务层3. 控制反转IOC和依赖注入DI3.1 背景3.2 实现如下3.3 原理 1. Servlet的getInitParameter Servlet有两个getInitParameter 一个是servletContext.getInitParameter#xff0c;获取context-param的全局参数一个是servletConfig.ge… 目录 1. Servlet的getInitParameter2. 业务层3. 控制反转IOC和依赖注入DI3.1 背景3.2 实现如下3.3 原理 1. Servlet的getInitParameter Servlet有两个getInitParameter 一个是servletContext.getInitParameter获取context-param的全局参数一个是servletConfig.getInitParameter取init-param的servlet参数 示例如下 web.xml ?xml version1.0 encodingUTF-8? web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaeexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsdversion4.0context-paramparam-nameglobal-name/param-nameparam-valueglobal-value/param-value/context-paramservletservlet-nameDemo01Servlet/servlet-nameservlet-classcom.hh.javaWebTest.demo.Demo01Servlet/servlet-classinit-paramparam-nameservlet-name1/param-nameparam-valueservlet-value1/param-value/init-paraminit-paramparam-nameservlet-name2/param-nameparam-valueservlet-value2/param-value/init-param/servletservlet-mappingservlet-nameDemo01Servlet/servlet-nameurl-pattern/demo01/url-pattern/servlet-mapping/web-appDemo01.java package com.hh.javaWebTest.demo;import jakarta.servlet.ServletConfig; import jakarta.servlet.ServletContext; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet;/* // web.xml和注解选择一种 WebServlet(urlPatterns {/demo01} ,initParams {WebInitParam(nameservlet-name1,valueservlet-value1),WebInitParam(nameservlet-name2,valueservlet-value2)} )*/ public class Demo01Servlet extends HttpServlet {Overridepublic void init() throws ServletException {// 获取context-param的全局参数// request.getServletContext();// request.getSession().getServletContext();ServletContext servletContext getServletContext();String globalValue servletContext.getInitParameter(global-name);System.out.println(globalValue globalValue); // globalValue global-value// 获取init-param的servlet参数ServletConfig servletConfig getServletConfig();String servletValue1 servletConfig.getInitParameter(servlet-name1);System.out.println(servletValue1 servletValue1); // servletValue1 servlet-value1} }2. 业务层 Model1介绍典型的就是JSP用HTML(CSS、JS) Java代码(将数据提供给页面的代码加上和数据库通信的代码)。这样的Java代码显得很乱 Model2即MVC: Model(模型) View(视图) Controller(控制器) 视图层用于做数据展示以及和用户交互的一个界面控制层能够接受客户端的请求具体的业务功能还是需要借助于模型组件来完成模型层模型分为很多种有比较简单的pojo/vo(value object)有业务模型组件(BO业务对象)有数据访问层组件(DAO数据访问对象)、有Service传输给Controller的组件(DTO数据传输对象一般用于前后端分离) 区分业务对象和数据访问对象 DAO中的方法都是细粒度方法。一个方法只考虑一个操作比如insert添加BO中的方法属于业务方法粒度是比较粗的对应复杂的业务逻辑处理如注册新用户需要调用很多DAO和做很多逻辑操作 3. 控制反转IOC和依赖注入DI 3.1 背景 在软件系统中层与层之间是存在依赖的。我们也称之为耦合。但我们系统架构设计的一个原则是 高内聚低耦合。即层内部的组成应该是高度聚合的而层与层之间的关系应该是低耦合的最理想的情况0耦合。我们可以通过控制反转IOC和依赖注入DI来实现高内聚低耦合 3.2 实现如下 FruitService.java package com.hh.javaWebTest.service;public interface FruitService { }FruitServiceImpl.java package com.hh.javaWebTest.service.impl;import com.hh.javaWebTest.service.FruitService;public class FruitServiceImpl implements FruitService { }FruitController.java。里面有一个FruitService类型的属性 package com.hh.javaWebTest.controller;import com.hh.javaWebTest.service.FruitService; ......省略部分......public class FruitController {private FruitService fruitService null;......省略部分......}applicationContext.xml。定义了两个bean同时定义了fruitService是FruitController的属性 ?xml version1.0 encodingutf-8?beansbean idfruitService classcom.hh.javaWebTest.service.impl.FruitServiceImpl/!--Node节点:Element元素节点Text文本节点--!-- 子节点总共有5个。空白Text、注释Text、空白Text、property元素节点、空白Text--bean idfruit classcom.hh.javaWebTest.controller.FruitController!-- property标签用来表示属性name表示属性名ref表示引用其他bean的id值 --property namefruitService reffruitService//bean /beansBeanFactory.java package com.hh.javaWebTest.ioc;public interface BeanFactory {Object getBean(String id); }ClassPathXmlApplicationContext.java。解析applicationContext.xml将bean放到beanMap中然后给各个bean设置property属性 package com.hh.javaWebTest.ioc;import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList;import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.InputStream; import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map;public class ClassPathXmlApplicationContext implements BeanFactory {private MapString, Object beanMap new HashMap();public ClassPathXmlApplicationContext() {try {InputStream inputStream getClass().getClassLoader().getResourceAsStream(applicationContext.xml);DocumentBuilderFactory documentBuilderFactory DocumentBuilderFactory.newInstance();DocumentBuilder documentBuilder documentBuilderFactory.newDocumentBuilder();Document document documentBuilder.parse(inputStream);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 beanId beanElement.getAttribute(id);String className beanElement.getAttribute(class);Class controllerBeanClass Class.forName(className);Object beanObj controllerBeanClass.getDeclaredConstructor().newInstance();beanMap.put(beanId, beanObj);}}// 组装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);// 获取属性的值Object refObj beanMap.get(propertyRef);// 获取到主节点的beanObject beanObj beanMap.get(beanId);Class beanClazz beanObj.getClass();// 获取到主节点的bean的属性Field propertyField beanClazz.getDeclaredField(propertyName);propertyField.setAccessible(true);// 设置属性的值propertyField.set(beanObj, refObj);}}}}} catch (Exception e) {e.printStackTrace();}}Overridepublic Object getBean(String id) {return beanMap.get(id);} }DispatcherServlet.java。不在DispatcherServlet进行applicationContext.xml的解析而是直接从BeanFactory获取bean package com.hh.javaWebTest.servlet;import com.hh.javaWebTest.ioc.BeanFactory; import com.hh.javaWebTest.ioc.ClassPathXmlApplicationContext; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; ......省略部分......WebServlet(*.do) public class DispatcherServlet extends ViewBaseServlet {private BeanFactory beanFactory;Overridepublic void init() throws ServletException {// 手动进行ViewBaseServlet的初始化super.init();beanFactory new ClassPathXmlApplicationContext();}Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {......省略部分......// 获取fruit对应的classObject controllerBeanObj beanFactory.getBean(servletPath);......省略部分......} }3.3 原理 控制反转 之前在FruitController中我们创建Service属性 FruitService fruitService new FruitServiceImpl()。fruitService的作用域(生命周期)是FruitController实例级别之后我们在applicationContext.xml中定义了这个fruitService。然后通过解析XML产生fruitService实例。所有bean都存放在beanMap中这个beanMap在一个BeanFactory中因此我们改变了之前的service实例等他们的作用域(生命周期)。控制权从程序员转移到BeanFactory。这个现象我们称之为控制反转 依赖注入 之前在FruitController中我们创建Service属性 FruitService fruitService new FruitServiceImpl()。那么FruitController和FruitService存在耦合之后我们将代码修改成FruitService fruitService null;然后在配置文件中给FruitController这个bean定义了属性fruitService的值解析配置文件就可以将fruitService变量注入到FruitController的属性中实现了解耦
http://www.hkea.cn/news/14365927/

相关文章:

  • 深圳建设行业网站软装潢.企业网站建设
  • 招聘网站开发源码医院网站开发
  • 做网站的数据库的设计无锡电商网站
  • wordpress网站无法访问宁波网站制作出售
  • 网站后台作用宝塔无法安装wordpress插件
  • 给企业做网站多少钱怎么给网站做百度优化
  • 自助网站建设技术支持益阳网站开发
  • 网站后台页面模板下载seo发贴软件
  • 做淘宝客进哪个网站网站做好了怎么做后台
  • html网站源码移动互联网终端
  • 东莞网站建设工作设计一个网站需要什么
  • 海口免费网站建站模板网站模版建设教程
  • python 网站开发小项目沙河高端网站建设
  • 网站购买流程室内设计软件3d
  • 怎么做考试资料网站一小时学会网站建设
  • 怎么选择企业建站公司wordpress 微博同步插件
  • 网站投资设计coding 部署wordpress
  • 文学网站建设学校网站开发实际意义
  • 哪个网站的ppt模板最好重庆装修价格明细表
  • 网站没备案如何做淘宝客济南网站排名优化报价
  • dw做的网站如何使用太原网络营销公司
  • 网站产品详情用哪个软件做的奇客影院wordpress
  • qq开放平台网站开发申请不通过的原因无锡那家网络公司做网站好
  • 网站建设代码编译的问题及解决方案wordpress七牛
  • 文化局网站建设方案中国建设网站企业网上银行业务功能
  • 利用云盘做网站有空间怎么做网站
  • 做网站用小动画自己建的网站也要注册域名吗
  • 厦门网站建设培训机构网站空间 按流量计费
  • 宁夏网站设计几十万做网站平台
  • 昆山市建设局网站途途外贸企业网站管理系统