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

做床上用品网站石家庄网站制作网站

做床上用品网站,石家庄网站制作网站,wordpress+本地编辑,营销型网站套餐技术体系 文章目录一 HTML1 网页的组成部分2 HTML 概述3 HTML 标签4 常用标签5 表单与表单的提交二 CSS1 语法格式2 使用方法三 JavaScript1 概述2 与 HTML 结合的两种方式3 变量类型及特殊值4 关系、逻辑运算5 数组6 函数7 事件8 DOM #xff08;Document Object Model#…技术体系 文章目录一 HTML1 网页的组成部分2 HTML 概述3 HTML 标签4 常用标签5 表单与表单的提交二 CSS1 语法格式2 使用方法三 JavaScript1 概述2 与 HTML 结合的两种方式3 变量类型及特殊值4 关系、逻辑运算5 数组6 函数7 事件8 DOM Document Object Model9 DOM实例验证用户名是否有效四 Tomcat五 Servlet1 举例向数据库中添加表单信息2 Servlet 的继承关系3 Servlet 的生命周期4 HTTP 协议与 Session会话跟踪5 服务器端内部转发、重定向6 Servlet 保存作用域7 Servlet 的 init 方法与初始化参数设置8 ServletContext六 Thymeleaf1 配置过程2 Servlet 优化 - 合并同类方法3 Servlet 优化 - dispatchedServlet七 MVC1 概念2 降低各层间的耦合 - IOC 与 DI3 IOC 与 DI 的实现过程八 Filter1 概述2 使用 Filter 实现事务的原子性九 Listener十 总结一 HTML 1 网页的组成部分 内容结构在页面中可以看到的数据。我们称之为内容。一般使用 HTML 技术展示。表现内容在页面上的展示形式比如布局颜色大小等等。一般使用CSS 技术实现。行为页面中元素与输入设备交互的响应。一般使用 JavaScript 技术实现。 2 HTML 概述 Hyper Text Markup Language 超文本标记语言网页文件本身是一种文本文件通过在文本文件中添加标记符可以告诉浏览器如何显示其中的内容。HTML 文件不需要编译直接由浏览器进行解析执行。书写规范大致由 head 和 body 两部分组成。 html langen !-- 页面开始 --head !-- HEAD --meta charsetUTF-8title 我的标题 /title/headbody !-- BODY --hello!/body/html !-- 页面结束 --3 HTML 标签 标签名对大小写不敏感。双标签的格式标签名 封装的数据 /标签名 单标签的格式标签名/标签拥有自己的属性分为基本属性和事件属性。属性必须有值属性值必须加引号。双标签必须正确关闭不能交叉嵌套。想显示“转义字符”的问题比如想打印出左尖括号用实体名称解决对应的实体名称是lt;。 body onclickalert(警告) !-- 带有事件属性 --点击body部分会出现警告 hr/ !-- 单标签 --font colorblue 蓝色的字体 /font !-- 双标签带有基本属性 --/body4 常用标签 重点是超链接、表格、表单 !--标题标签最大是h1最小是h6对齐可以选择 left/ center/ right-- h1 aligncenter 标题 /h1!--字体-- font colorred size7 字体 /font!--超链接可选参数 target _self 在当前页面跳转_blank 在新页面跳转...-- a hrefwww.baidu.com target_blank 超链接 /a!--无序列表有序将ul改为ol-- ulli item1 /lili item2 /li /ul!--图片img标签是图片标签,用来显示图片src属性可以设置图片的路径width属性设置图片的宽度height属性设置图片的高度border属性设置图片边框大小alt属性设置当指定路径找不到图片时,用来代替显示的文本内容绝对路径的正确格式是: http://ip:port/工程名/资源路径 -- img src./imgs/1.jpg width100 height200/!--表格table 标签是表格标签border 设置表格标签width 设置表格宽度height 设置表格高度align 设置表格相对于页面的对齐方式cellspacing 设置单元格间距tr 是行标签th 是表头标签td 是单元格标签align 设置单元格文本对齐方式b 是加粗标签如果要实现跨行、跨列改变 td 的 colspan、rowspan 属性 -- table aligncenter border1 width300 height300 cellspacing0trth1.1/thth1.2/thth1.3/th/trtrtd2.1/tdtd2.2/tdtd2.3/td/trtrtd3.1/tdtd3.2/tdtd3.3/td/tr /table!--iframe标签在原页面之上显示一个小的页面其中的 name 属性可以作为超链接的 target 属性点击超链接后将在 iframe 中显示-- iframe src1.html width500 height400 nameabc/iframe a href2.html targetabc 超链接 /a5 表单与表单的提交 表单类型单独列出可以使用 table 实现对齐。 !-- 要顺利提交表单需要为所有项加上 value 或者 name 属性 --form actionhttp://localhost:8080 methodpost姓名input typetext value默认姓名//br密码input typepassword valuedefault//br!-- name 属性用于分组同一组的选项互斥--性别input typeradio namesex checkedchecked/男 input typeradio namesex/女/br爱好input typecheckbox checkedchecked/跑步 input typecheckbox/跳绳/br国籍selectoption--请选择--/optionoption selectedselectedCHN/optionoptionUSA/option/selectbr/简介textarea rows10 cols20默认简介/textareabr/附件input typefile//brinput typereset value重置input typesubmit value提交/formform 标签的 action 属性设置提交的服务器地址method 属性设置提交的方式 GET(默认) 或 POSTGET 请求的特点是 浏览器地址栏中的地址是服务器地址 ? 请求参数请求参数的格式是 namevaluenamevalue不安全有数据长度的限制 POST 请求的特点 浏览器地址栏中只有服务器地址action的属性值相对于GET请求要安全理论上没有数据长度的限制 表单提交的时候数据没有发送给服务器的三种情况 表单项没有name属性值单选 radio 、复选 checkbox、下拉列表中的 option 标签 都需要添加value属性以便发送给服务器表单项不在提交的form标签中 二 CSS 1 语法格式 /* 标签名选择器样式绑定标签 */ label_name { property1: val1;property2: val2; }/* id选择器样式绑定具体的idid是人为设定的每个实例不相同*/ #id {property1: val1;property2: val2; }/* class选择器样式绑定标签分配的class可以多个实例绑定一个class */ .class class_name {property1: val1;property2: val2; }/* 组合选择器选择器间是并的关系 */ 选择器1, 选择器2 ... {property1: val1;property2: val2; }2 使用方法 head !-- HEAD --meta charsetUTF-8title my_title /title/* 导入已经写好的CSS文件推荐 */link relstylesheet typetext/CSS hrefmycss.css/* 或者把CSS写到此处的 style 标签中 */style typetext/csslabel_name { property1: val1;property2: val2;}/style/head三 JavaScript 1 概述 JS 运行在客户端需要运行浏览器来解析执行 JavaScript 代码和 Java 并无直接关系。JS 是弱类型的语言Java 是强类型的语言。强弱的差别在于定义变量后变量的数据类型是否可变。特点是 交互性信息的动态交互、安全性不允许直接访问本地硬盘、跨平台性只要是可以解释 JS 的浏览器都可以执行和平台无关。 2 与 HTML 结合的两种方式 在 HTML 文件中的 head 部分用 script 标签写入在 script 标签中导入 JS 文件。 上述两种方法不能写在一个标签里。 headmeta charsetUTF-8titleTitle/titlescript typetext/javascriptalert(JS嵌入方式1);/scriptscript srcmyjs.js/script !-- 文件内容 alert(JS嵌入方式2); -- /head3 变量类型及特殊值 关键字 对应类型 number数值类型string字符串类型object对象类型bool布尔类型function函数类型 特殊值 含义 undefined未定义所有 JS 变量未赋于初始值的时候默认值都是 undefinednull空NaN非数字非数值 4 关系、逻辑运算 比较两个变量的值是否相等比如“123”123是成立的 比较两个变量的类型和值是否相等JS 中所有变量都可以作为布尔值使用0、null、undefined、空串 都认为是 false||或 与 具有短路特性返回值为第一个导致结果的变量。 5 数组 数组不会出现越界的问题。在超过原来长度的位置赋值时会进行自动扩容读操作不会扩容。 // 数组定义 var arr [1, abc];// 数组遍历 for (var i 0; i arr.length; i) {alert(arr[i]) }// 自动扩容下标2、3、4的元素均为undefined arr[5] 2;6 函数 JS 不允许函数重载。一个函数名只能对应一个具体实现。 function noParam() {alert(无参函数调用);}noParam();function withParam(a, b) {alert(有参函数调用 a b);}withParam(1, 2);function withReturn(a, b) {alert(有参有返回值函数调用);return a b;}alert(withReturn(10, 5));隐形参数 arguments 将所有实参组织为一个数组通过下标可以访问所有参数。 function testInvisibleParams() {var res 0;for (var i 0; i arguments.length; i) {res arguments[i];}return res;}alert(testInvisibleParams(1, 2, 3, 4));7 事件 常用事件 事件操作onload加载完成常用做页面 JS 代码初始化操作onclick单击按钮的点击响应操作onblur失去焦点输入框失去焦点后验证其输入内容是否合法onchange内容发生改变下拉列表和输入框内容发生改变后操作onsubmit表单提交表单提交前验证所有表单项是否合法 事件需要进行注册才能使用 静态注册通过 HTML 标签的事件属性直接赋于事件响应后的代码动态注册先通过 JS 代码得到标签的 dom 对象然后再通过 dom 对象.事件名 function(){} 这种形式赋于事件响应后的代码。 onload 事件 html langen headmeta charsetUTF-8titleTitle/titlescript typetext/javascriptfunction onloadEvent() {alert(静态注册onload事件需要在body标签下添加 οnlοadonloadEvent )}window.onload function () {alert(动态注册onload事件)}/script /head body/body /htmlonclick 事件 html langen headmeta charsetUTF-8titleTitle/titlescript typetext/javascriptfunction onclickEvent() {alert(静态注册onclick事件)}window.onload function () {!-- document对象表示整个页面通过id获取button对象 --var btn2_obj document.getElementById(btn2);!-- 绑定行为 --btn2_obj.onclick function () {alert(动态注册onclick事件)}}/script /head bodybutton onclickonclickEvent()静态注册的按钮/buttonbutton idbtn2动态注册的按钮/button /body /htmlonblur 事件同上 html langen headmeta charsetUTF-8titleTitle/titlescript typetext/javascriptfunction onblurEvent() {console.log(静态失去焦点);}window.onload function () {var pw document.getElementById(p);pw.onblur function () {console.log(动态失去焦点);}}/script /head body账户input typetext onbluronblurEvent()/密码input typepassword idp/ /body /htmlonchange 事件绑定的是 select 而非 option 标签 html langen headmeta charsetUTF-8titleTitle/titlescript typetext/javascriptfunction onchangeEvent() {alert(静态注册onchange);}window.onload function () {var select2 document.getElementById(s);select2.onchange function () {alert(动态注册onchange)}}/script /head body选择1select onchangeonchangeEvent()option选项11/optionoption选项12/option/select选择2select idsoption选项21/optionoption选项22/option/select /body /htmlonsubmit 事件绑定的是表格而非按钮返回 false 则不会提交表单 html langen headmeta charsetUTF-8titleTitle/titlescript typetext/javascriptfunction onsubmitEvent() {alert(静态注册onsubmit);!--如果发现不合法返回false阻止提交--return false;}window.onload function () {var form2 document.getElementById(f);form2.onsubmit function () {alert(动态注册onsubmit);!--如果发现不合法返回false阻止提交--return false;}}/script /head bodyform actionhttp://localhost:8080 onsubmitreturn onsubmitEvent() !--静态注册 return 不能少--input typesubmit value静态注册提交/formform actionhttp://localhost:8080 idfinput typesubmit value动态注册提交/form /body /html8 DOM Document Object Model 简单来说将整个 HTML 文件视为一个 document 对象并把其中所有的标签对象化形成了树型结构。document 实例提供查询方法使用优先级从高到低getElementByID返回一个实例getElementByName可以数组形式返回多个实例getElementByTagName以数组形式返回指定标签的对象。注意页面加载完之后才能进行查询不仅限于放在 onload 事件中。document 实例提供创建方法createElement html langen headmeta charsetUTF-8titleTitle/titlescript typetext/javascriptwindow.onload function () {var new_div document.createElement(div);new_div.innerHTML 你好;document.body.appendChild(new_div); !-- 在加载完后执行 --}/script /head body/body /html9 DOM实例验证用户名是否有效 限制用户名由数字和字母组成长度区间为 [5, 12] html langen headmeta charsetUTF-8titleTitle/titlescriptwindow.onload function () {var tip document.getElementById(tip);var btn document.getElementById(btn);var text document.getElementById(text);btn.onclick function () {var input text.value;var pattern /^\w{5,12}$/;if (pattern.test(input)) { !-- 匹配正则表达式 --tip.innerHTML 通过; !-- innerHTML 返回的是开始和结束标签之间的值可读写--} else {tip.innerHTML 不通过;}}}/script /head body input typetext idtext span idtip stylecolor: brown/span button idbtn检查/button /body /html四 Tomcat 简单来说Tomcat 就是一个运行JAVA的网络服务器。HTML 文件通过本地访问使用的协议是 file执行的操作是直接获取并解析IDEA 2021.3.1 创建JavaWeb工程的方法通过WEB服务器访问使用的协议是 http经过了客户端请求与服务器响应的过程执行操作如下图 五 Servlet 1 举例向数据库中添加表单信息 客户端请求表单页面 add.html表单指定 action“add”(可以自定义) method“post”服务器返回。客户端填写表单使用 HttpRequest 实例提交给服务器。服务器的具有一个类 继承自 HttpServlet 类其中的 doPost() 方法定义了 post 请求的处理与返回过程调用 DAO 将表单信息写入数据库。 //WebServlet(/add) public class AddServlet extends HttpServlet {Overridepublic void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// methodpost 设置编码方式防止乱码且在获取参数的操作之前放在首行request.setCharacterEncoding(UTF-8);String name request.getParameter(name);System.out.println(name);// 调用DAO// ...} }如何指定 action“add” 与自定义类 AddServlet 的绑定 一种方式是使用 web.xml 配置另一种是通过在 AddServlet 注释 WebServlet(“/add”) !--指定servlet信息--servletservlet-nameAddServlet/servlet-nameservlet-classcom.atguigu.servlets.AddServlet/servlet-class/servlet!--设定servlet映射--servlet-mappingservlet-nameAddServlet/servlet-nameurl-pattern/add/url-pattern !--actionadd--/servlet-mapping2 Servlet 的继承关系 继承关系 HttpServlet 具体实现类 - GenericServlet 抽象类 - Servlet 接口Servlet中的核心方法service()当收到请求service 方法会自动响应tomcat 容器调用在 HttpServlet 中分析请求的方式到底是get、post、head 等等然后再决定调用具体的 doXX 的方法。在 HttpServlet 中doXX 方法默认都是405报错信息是找不到方法实现除非子类去实现对应的 doXX 方法否则默认会报405错误。 3 Servlet 的生命周期 三个重要的方法init、service、destory默认情况下 第一次接收请求时Servlet 会进行实例化调用构造方法、初始化调用init()、然后服务调用service()从第二次请求开始每一次都是服务调用service()当容器关闭时其中的所有的 Servlet 实例会被销毁调用destroy()。如果需要提高响应速度应该设置 Servlet 的初始化时机在第一次请求之前执行实例化和初始化。具体做法是在 web.xml 中的 servlet 中添加 load-on-startup 标签。Servlet 是单例的、线程不安全的。单例是指对于一个确定的 Servlet 类型所有的请求都是同一个 Servlet 实例去响应由于 Servlet 线程不安全所以尽量避免在其中设置成员变量如果设置尽量不要读写。 4 HTTP 协议与 Session会话跟踪 HTTP 协议是无状态的需要通过会话跟踪技术保存用户的历史信息。HTTP 请求与响应报文的格式略。常用的API request.getSession() - 获取当前的会话没有则创建一个新的会话 request.getSession(true) - 效果和不带参数相同 request.getSession(false) - 获取当前会话没有则返回null不会创建新的 session.getId() - 获取sessionID session.isNew() - 判断当前session是否是新的 session.getMaxInactiveInterval() - session的非激活间隔时长默认1800秒 session.setMaxInactiveInterval() session.invalidate() - 强制让会话立即失效 5 服务器端内部转发、重定向 服务器端内部转发对客户端是不可见的执行方法request.getRequestDispatcher(...).forward(request, response) 重定向对客户端可见并且会显示地更改 URL执行方法response.sendRedirect(...) 6 Servlet 保存作用域 request一次请求响应内有效。session一次会话内有效。application一次应用内有效除非关闭服务器。 public class Demo extends HttpServlet {Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// request 级别req.setAttribute(property1, 1);// session 级别HttpSession session req.getSession();session.setAttribute(property2, 2);// application 级别ServletContext servletContext req.getServletContext();servletContext.setAttribute(property3, 3);} }7 Servlet 的 init 方法与初始化参数设置 两种 init 方法 如果需要进行一些初始化操作重写无参的 init 方法 // Servlet中的初始化方法有两个init() , init(config)// 其中带参数的方法代码如下public void init(ServletConfig config) throws ServletException {this.config config ;init(); // *调用无参的init*}// 另外一个无参的init方法如下public void init() throws ServletException{}初始化参数设置 1. 通过 web.xml 配置servletservlet-nameDemo01Servlet/servlet-nameservlet-classcom.atguigu.servlet.Demo01Servlet/servlet-class!--设置参数--init-paramparam-namehello/param-nameparam-valueworld/param-value/init-param/servlet2. 通过注解 Webservlet(urlPatterns {/demo01} ,initParams {WebInitParam(namehello,valueworld)})读取初始化参数 ServletConfig config getServletConfig(); // 获取config对象 config.getInitParameter(hello); // 读取初始化的值8 ServletContext ServletContext是一个全局的储存信息的空间服务器开始就存在服务器关闭才释放application级别类似 session可以想象成一个 map多个Servlet可以通过ServletContext对象来实现数据间的共享如果是涉及到不同用户共享数据而这些数据量不大同时又不希望写入数据库中我们就可以考虑使用 ServletContext 实现初始化 ServletContext 时不能写在具体的某个 servlet 标签中因为它是全局的 !--写在servlet之外-- context-paramparam-namename/param-nameparam-valuegavin/param-value /context-paramservlet servlet-nameMyServlet/servlet-name servlet-classcom.gavin.servlet.MyServlet/servlet-class init-param param-nameencoding/param-name param-valueutf-8/param-value /init-param /servlet 六 Thymeleaf 1 配置过程 添加依赖 maven 中添加 dependencygroupIdorg.thymeleaf/groupIdartifactIdthymeleaf/artifactIdversion3.0.14.RELEASE/version/dependency新建一个类 ViewBaseServlet 继承 HttpServlet public class ViewBaseServlet extends HttpServlet {private TemplateEngine templateEngine;Overridepublic void init() throws ServletException {// 1.获取ServletContext对象ServletContext servletContext this.getServletContext();// 2.创建Thymeleaf解析器对象ServletContextTemplateResolver templateResolver new ServletContextTemplateResolver(servletContext);// 3.给解析器对象设置参数// ①HTML是默认模式明确设置是为了代码更容易理解templateResolver.setTemplateMode(TemplateMode.HTML);// ②设置前缀String viewPrefix servletContext.getInitParameter(view-prefix);templateResolver.setPrefix(viewPrefix);// ③设置后缀String viewSuffix servletContext.getInitParameter(view-suffix);templateResolver.setSuffix(viewSuffix);// ④设置缓存过期时间毫秒templateResolver.setCacheTTLMs(60000L);// ⑤设置是否缓存templateResolver.setCacheable(true);// ⑥设置服务器端编码方式templateResolver.setCharacterEncoding(utf-8);// 4.创建模板引擎对象templateEngine new TemplateEngine();// 5.给模板引擎对象设置模板解析器templateEngine.setTemplateResolver(templateResolver);}protected void processTemplate(String templateName, HttpServletRequest req, HttpServletResponse resp) throws IOException {// 1.设置响应体内容类型和字符集resp.setContentType(text/html;charsetUTF-8);// 2.创建WebContext对象WebContext webContext new WebContext(req, resp, getServletContext());// 3.处理模板数据templateEngine.process(templateName, webContext, resp.getWriter());} }在 web.xml 配置前缀和后缀根据逻辑视图名称得到物理视图名称。 逻辑视图名称 index 物理视图名称 view-prefix 逻辑视图名称 view-suffix 真实的视图名称 / index .html context-paramparam-nameview-prefix/param-nameparam-value//param-value/context-paramcontext-paramparam-nameview-suffix/param-nameparam-value.html/param-value/context-param创建自定义的 Servlet 类继承 ViewBaseServlet调用 super.processTemplate(index,request,response); 定位到指定 HTML 页面。对于跳转到的 HTML 页面需要显示查询内容。设置 html langen xmlns:thhttp://www.thymeleaf.org使用 thymeleaf 的标签完成操作。 2 Servlet 优化 - 合并同类方法 之前的一个 Servlet 只提供一种方法此处的改进是将同类的多种方法合并到一个 Servlet 中使用反射代替 switch-case WebServlet(/fruit.do) public class FruitServlet extends ViewBaseServlet {private final FruitDAO fruitDAO new FruitDAOImpl();/*** 设置一个Fruit 的 meta servlet*/Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {req.setCharacterEncoding(UTF-8);String operation (String) req.getAttribute(operation);// 简化了switch-caseMethod[] methods this.getClass().getDeclaredMethods();for (Method method: methods) {method.setAccessible(true);if (operation.equals(method.getName())) {try {method.invoke(this, req, resp);return ;} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}}throw new IOException(输入操作错误); // 对应default}private void insertFruit(HttpServletRequest request, HttpServletResponse response) {// ...}private void selectFruit(HttpServletRequest request, HttpServletResponse response) {// ...} }3 Servlet 优化 - dispatchedServlet 相当于一个 meta 的 Servlet称为 DispatchedServlet继承自 ViewBaseServlet。合并所有种类的 Servlet并将原来的 Servlet 转为 Controller剥夺其注释 WebServlet在 src 目录下创建 applicationContext.xml利用 bean 标签为参数名和 Controller 建立映射DispatchedServlet 的 init 方法根据 xml 配置 MapString,Object beanMap ?xml version1.0 encodingutf-8?beans!-- 这个bean标签的作用是 将来servletpath中涉及的名字对应的是fruit那么就要FruitController这个类来处理 --bean idfruit classcom.atguigu.fruit.controllers.FruitController/ /beans使用时向 DispatchedServlet 传递参数由其 service 方法负责解析并根据 beanMap 调用指定的 Controller具体步骤 获取参数获取即将要调用的方法的参数签名信息执行方法Object returnObj method.invoke(controllerBean , parameterValues);视图处理根据返回值调用重定向等 String returnStr (String)returnObj; if(returnStr.startWith(redirect:)){ .... } else if..... 七 MVC 1 概念 MVCModel–View–Controller模式是软件工程中的一种软件架构模式它把软件系统分为三个基本部分模型Model、视图View和控制器Controller。Controller 作为 Model 和 View 部分的“胶水”本身不适合包含太多的逻辑。 2 降低各层间的耦合 - IOC 与 DI DIDependency Injection依赖注入是 IOCInversion of Control控制反转最常用的方法。IOC 是一种设计思想核心是将设计好的对象交给容器控制而不是传统的在对象内部直接控制。 把创建和查找依赖对象的控制权交给了容器由容器进行注入组合对象所以对象与对象之间是松散的耦合。Spring 所倡导的开发方式就是如此所有的类都会在 spring 容器中登记告诉 spring 你是个什么东西你需要什么东西然后 spring 会在系统运行到适当的时候把你要的东西主动给你同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring 容器来控制也就是说控制对象生存周期的不再是引用它的对象而是 spring。对于某个具体的对象而言以前是它控制其他对象现在是所有对象都被 spring 控制所以这叫控制反转。IOC 容器实际上就是 map(keyvalue)里面存的是各种对象在 xml 里配置的 bean 节点、service、controller、component在项目启动的时候会读取配置文件里面的 bean 节点根据全限定类名使用反射创建对象并放到 map 里。 通过 IOC 容器上述过程转为 IoC的一个重点是在系统运行中动态的向某个对象提供它所需要的其他对象。这一点是通过 DI 来实现的。在类中需要使用到的对象全部通过反射从第三方容器注入而不是自己创建。比如对象A需要操作数据库以前我们总是要在A中自己编写代码来获得一个 Connection 对象有了 spring 只需要告诉 spring A中需要一个 Connection至于这个 Connection 怎么构造何时构造A不需要知道。在系统运行时spring 会在适当的时候制造一个 Connection然后像打针一样注射到A当中这样就完成了对各个对象之间关系的控制。A需要依赖 Connection 才能正常运行而这个 Connection 是由 spring 注入到A中的依赖注入的名字就这么来的。 3 IOC 与 DI 的实现过程 对于 Servlet - Controller - Service - DAO 的结构首先将用到的类及其依赖关系注册到 applicationContext.xml 中。 ?xml version1.0 encodingutf-8?beans!-- FruitDAO不依赖于其它组件 --bean idfruitDAO classcom.atguigu.fruit.dao.impl.FruitDAOImpl/!-- FruitService依赖于FruitDAOFruitService类包含FruitDAO属性 --bean idfruitService classcom.atguigu.fruit.service.impl.FruitServiceImpl!-- property标签用来表示属性name表示属性名ref表示引用其他bean的id值--property namefruitDAO reffruitDAO//bean!-- FruitController依赖于FruitServiceFruitController类包含FruitService属性 --bean idfruit classcom.atguigu.fruit.controllers.FruitControllerproperty namefruitService reffruitService//bean!-- FruitServlet中具有 包含所有对象的 map以BeanFactory作为 map 的包装 -- /beans使用 BeanFactory 读取 xml 配置填充 map并设置依赖关系比如 A 以 B 作为属性执行此过程前将属性值设置为 null在此过程将 A 的对应属性设置为 B 的实例完成依赖注入 BeanFactory 实现 public class ClassPathXmlApplicationContext implements BeanFactory {private MapString,Object beanMap new HashMap();public ClassPathXmlApplicationContext(){try {InputStream inputStream getClass().getClassLoader().getResourceAsStream(applicationContext.xml);//1.创建DocumentBuilderFactoryDocumentBuilderFactory documentBuilderFactory DocumentBuilderFactory.newInstance();//2.创建DocumentBuilder对象DocumentBuilder documentBuilder documentBuilderFactory.newDocumentBuilder() ;//3.创建Document对象Document document documentBuilder.parse(inputStream);//4.获取所有的bean节点NodeList beanNodeList document.getElementsByTagName(bean);for(int i 0 ; ibeanNodeList.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 beanClass Class.forName(className);//创建bean实例Object beanObj beanClass.newInstance() ;//将bean实例对象保存到map容器中beanMap.put(beanId , beanObj) ;//到目前为止此处需要注意的是bean和bean之间的依赖关系还没有设置}}//5.组装bean之间的依赖关系for(int i 0 ; ibeanNodeList.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);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 propertyField beanClazz.getDeclaredField(propertyName);propertyField.setAccessible(true);propertyField.set(beanObj,refObj);}}}}} catch (ParserConfigurationException e) {e.printStackTrace();} catch (SAXException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();}}Overridepublic Object getBean(String id) {return beanMap.get(id);} }重写 Servlet 的 无参 init 方法和 service 方法。其中 init 方法负责获取 BeanMapservice 方法负责解析方法调用执行方法调用处理返回值。 WebServlet(*.do) public class DispatcherServlet extends ViewBaseServlet{private BeanFactory beanFactory ;public DispatcherServlet(){}public void init() throws ServletException {super.init();beanFactory new ClassPathXmlApplicationContext();}Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//设置编码request.setCharacterEncoding(UTF-8);//假设url是 http://localhost:8080/pro15/hello.do//那么servletPath是 /hello.do// 我的思路是// 第1步 /hello.do - hello 或者 /fruit.do - fruit// 第2步 hello - HelloController 或者 fruit - FruitControllerString servletPath request.getServletPath();servletPath servletPath.substring(1);int lastDotIndex servletPath.lastIndexOf(.do) ;servletPath servletPath.substring(0,lastDotIndex);Object controllerBeanObj beanFactory.getBean(servletPath);String operate request.getParameter(operate);if(StringUtil.isEmpty(operate)){operate index ;}try {Method[] methods controllerBeanObj.getClass().getDeclaredMethods();for(Method method : methods){if(operate.equals(method.getName())){//1.统一获取请求参数//1-1.获取当前方法的参数返回参数数组Parameter[] parameters method.getParameters();//1-2.parameterValues 用来承载参数的值Object[] parameterValues new Object[parameters.length];for (int i 0; i parameters.length; i) {Parameter parameter parameters[i];String parameterName parameter.getName() ;//如果参数名是request,response,session 那么就不是通过请求中获取参数的方式了if(request.equals(parameterName)){parameterValues[i] request ;}else if(response.equals(parameterName)){parameterValues[i] response ;}else if(session.equals(parameterName)){parameterValues[i] request.getSession() ;}else{//从请求中获取参数值String parameterValue request.getParameter(parameterName);String typeName parameter.getType().getName();Object parameterObj parameterValue ;if(parameterObj!null) {if (java.lang.Integer.equals(typeName)) {parameterObj Integer.parseInt(parameterValue);}}parameterValues[i] parameterObj ;}}//2.controller组件中的方法调用method.setAccessible(true);Object returnObj method.invoke(controllerBeanObj,parameterValues);//3.视图处理String methodReturnStr (String)returnObj ;if(methodReturnStr.startsWith(redirect:)){ //比如 redirect:fruit.doString redirectStr methodReturnStr.substring(redirect:.length());response.sendRedirect(redirectStr);}else{super.processTemplate(methodReturnStr,request,response); // 比如 edit}}}} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}} }八 Filter 1 概述 继承自 Filter 类具有 init, doFilter, destory 方法可以使用注解的形式 WebFilter(fruit.do)也可以在 web.xml 中配置使用注解形式当具有多个 Filter 时按照类名的字典序组织过滤顺序 WebFilter(*.do) public class Demo01Filter implements Filter {Overridepublic void init(FilterConfig filterConfig) throws ServletException {}Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println(before);//放行filterChain.doFilter(servletRequest,servletResponse);System.out.println(after);}Overridepublic void destroy() {} }2 使用 Filter 实现事务的原子性 利用 Filter 的机制在放行之前撤销 conn 的自动提交在返回时手动执行提交并在捕获到异常时执行回滚要求事务执行的过程中遇到的异常要层层向外抛出直到被 Filter 捕获而不是就地解决将 conn 绑定 ThreadLocal 实例再进一步保存到 ThreadLocalMap 中保证了多个 DAO 共用同一个数据库连接不会因为连接的关闭而自动提交破坏事务的原子性 九 Listener 监听某个组件的某种行为当这种行为被监听到时调用指定的方法可以用于完成初始化的创建以及结束时的销毁操作一个应用实例IOC 容器的 beanMap当监听到 ServletContext 对象创建时在监听器内进行初始化而非在 Servlet 的 init 方法中完成 // 监听上下文启动在上下文启动的时候去创建IOC容器,然后将其保存到 application 作用域 // 后面DispatchedServlet 再从 application 作用域中去获取IOC容器WebListener public class ContextLoaderListener implements ServletContextListener {Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {//1.获取ServletContext对象ServletContext application servletContextEvent.getServletContext();//2.获取上下文的初始化参数bean类型以及依赖关系String path application.getInitParameter(contextConfigLocation);//3.创建IOC容器BeanFactory beanFactory new ClassPathXmlApplicationContext(path);//4.将IOC容器保存到application作用域application.setAttribute(beanFactory, beanFactory);}Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {// ...} } 十 总结
http://www.pierceye.com/news/96366/

相关文章:

  • 常州做网站的公司在盐城做网站的网络公司电话
  • seo站外推广如何用wampp 做网站
  • 怎样用手机做网站中企动力百度百科
  • 哪些网站可以做任务挣钱免费app软件
  • 国内简约网站平潭县机场建设网站
  • wordpress 全站通知wordpress怎样打开速度快
  • 广州市建设职业培训学校网站移除wordpress版本
  • 如何申请一个网站 新网动画制作大师
  • 动易后台 网站统计调查 报表类型怎样使用手机相册备份网站源码
  • 做网站放到百度上需要什么查看wordpress使用什么主题
  • 深圳企业网站seo郑州汉狮专业做网站公司
  • 广东网站建设多少钱辛集专业网站建设
  • 怎样做网站公司的销售小程序推广计划怎么赚钱
  • 网站开发文档编写wordpress小说站群
  • 南宁网站开发推广网站html模板下载
  • 网络编辑的网站建设题二手域名交易平台
  • 定制网站开发商业计划书贵南县网站建设公司
  • 如何免费发布个人网站网站项目需求分析
  • 太原免费网站建设网站开发合作协议书
  • 深圳龙华做网站上海响应式网站制作公司
  • 招投标 网站建设专业型网站和个人网站
  • 网站建设需要那些基础增城线上教学
  • 专注移动网站建设免费咨询电脑维修
  • 六里桥做网站公司惠州做网站 百度优化
  • 做网站怎么选择上市公司wordpress 进销存
  • 做视频网站用哪个模板昆明贤邦网站建设
  • 自建网站工具wordpress仿内涵段子
  • 做推广最好的网站是哪个菜鸟网站建设
  • 首钢建设公司网站微信网站怎么做的好处
  • 西安网站开发费用网站即将 模板