MrChen

行者


  • 首页

  • 读书

  • 标签

  • 分类

  • 历程

  • 关于

  • Search

PHP实现BS模式三层结构

Posted on 2019-10-05 | In PHP

PHP语言编写,与数据库交互的登录注册小Example,体现B/S三层结构

代码细节请点击:https://github.com/8bun/BSExample

Java之设计模式

Posted on 2019-10-05 | Edited on 2019-10-15 | In Java

生成器模式

用法:当要创建一个具有复杂功能的对象时,我们可以使用一个简单对象来创建。它从小而简单的对象逐步创建更大更复杂的对象。生成器模式是另一个创建模式。

举例:当创建一个窗口作为我们应用程序的主窗口时,我们需要创建一个菜单,一个工具栏,然后添加菜单和工具栏。对于我们要创建的每个窗口,我们需要创建一个空窗口,创建菜单,创建工具栏,将菜单和工具栏安装到窗口。我们可以使用构建器模式来隐藏如何创建窗口的实现。

代码举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
//Pizza属性类
class Pizza {
private String dough = "";
private String sauce = "";
private String topping = "";

public void setDough (String dough) { this.dough = dough; }
public void setSauce (String sauce) { this.sauce = sauce; }
public void setTopping (String topping) { this.topping = topping; }
}

//pizza生成器抽象类,相当于Pizza制作标准
abstract class PizzaBuilder {
protected Pizza pizza;
//创建Pizza对象
public void createNewPizzaProduct() { pizza = new Pizza(); }
//将制作Pizza的方法抽象出来
public abstract void buildDough();
public abstract void buildSauce();
public abstract void buildTopping();
//返回此Pizza,关键用法
public Pizza getPizza() { return pizza; }
}

//具体的pizza生成器类,相当于Pizza制作具体到具体厂家
class HawaiianPizzaBuilder extends PizzaBuilder {
public void buildDough() { pizza.setDough("cross"); }
public void buildSauce() { pizza.setSauce("mild"); }
public void buildTopping() { pizza.setTopping("ham+pineapple"); }
}

class SpicyPizzaBuilder extends PizzaBuilder {
public void buildDough() { pizza.setDough("pan baked"); }
public void buildSauce() { pizza.setSauce("hot"); }
public void buildTopping() { pizza.setTopping("pepperoni+salami"); }
}

//创建pizza,万恶的指挥者,构造传入具体厂家对象,利用厂家对象制作Pizza,并将Pizza放回供后面测试调用
class Waiter {
private PizzaBuilder pizzaBuilder;
//这两步可以用构造函数传入PizzaBuilder对象代替
public void setPizzaBuilder (PizzaBuilder pb) { pizzaBuilder = pb; }
public Pizza getPizza() { return pizzaBuilder.getPizza(); }
//提供一个方法将厂家的Pizza制作方法集合起来
public void constructPizza() {
pizzaBuilder.createNewPizzaProduct();
pizzaBuilder.buildDough();
pizzaBuilder.buildSauce();
pizzaBuilder.buildTopping();
}
}

//创建实例,Test
class BuilderExample {
public static void main(String[] args) {

Waiter waiter = new Waiter();

//构建Pizza制作厂家
PizzaBuilder hawaiian_pizzabuilder = new HawaiianPizzaBuilder();
PizzaBuilder spicy_pizzabuilder = new SpicyPizzaBuilder();

waiter.setPizzaBuilder ( hawaiian_pizzabuilder );
waiter.constructPizza(); //指挥者让厂家制作Pizza

//为了构建一个复杂的Pizza对象,我们只需要利用Waiter这个简单对象即可
Pizza pizza = waiter.getPizza();
}
}

观察者模式

观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅模式。在观察者模式中,发布者我们称之为被观察者,订阅者称之为观察者。

关于观察者模式有两种应用:

自定义

主要实现思路是,观察者和被观察者都定义成接口形式,

被观察者接口提供增删观察者的方法通知方法,在实现类中添加数据设置方法

观察者接口提供数据更新方法

观察者实现类注入被观察者接口,并绑定与该观察者的关系(被观察者添加该观察者)

在测试时,构造一个被观察者以及多个观察者对象,被观察者尝试设置数据,看观察者是否接收到信息。>

使用Java内置API

在Java中,继承Observable的类称为可被观察者,实现Observer接口的类称为观察者。

有了以上的内置API,我们不再需要自己写两种接口了。

这里,需要注意的是,观察者需要实现接口的update(Observable o, Object arg)方法,其中第一个参数就是被观察者对象,而它依然是通过构造注入观察者类的。在该方法中,你可以读取到被观察者的数据,从而被观察者实现了”通知”。

以上两种方式具体代码实现可见:<https://blog.csdn.net/zhongxuebin_xq/article/details/81429625

SSM理解

Posted on 2019-09-07 | Edited on 2019-10-05 | In SSM

Spring父容器与SpringMVC子容器是如何体现出父子关系的?

所谓容器,就是上下文,在这同一个上下文里,大家可以共享一些东西。

在Spring应用启动时,会先读取web.xml文件,调用ContextLoaderListener创建Spring容器,也就是你说的父容器。

1
2
3
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

Listener创建完之后,开始创建Servlet:

1
2
3
4
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>

这时候这个DispatcherServlet开始试图创建SpringMVC的ApplicationContext,它先找刚才由上面那个ContextLoaderListener创建的Spring的ApplicationContext,找到后,把Spring的ApplicationContext作为参数传给DispatcherServlet的ApplicationContext的setParent方法,这样SpringMVC的容器就变成了Spring容器的儿子。

因为在SpringMVC这个子容器创建的时候指定了它的Spring父容器,所以儿子能找到父亲,所以SpringMVC这个子容器里的Bean可以调用父容器的服务,而父容器不知道有这个儿子的存在(一个不负责任的父亲),父容器里的Bean不能调用子容器里的服务。

Spring和SpringMVC配置文件为什么要分开扫描

平时我们在项目中注入关系是这样的顺序:在Service中注入Dao(初始化自动注入,利用@Autowired),接着在Controller里注入Service(初始化自动注入,利用@Autowired)

使用分开扫描的方式,一是为了使得父容器内的对象都能互相通信,二是为了让与浏览器显示息息相关的jsp文件直接关联的Controller与其他分隔开来,体现SpringMVC的思想。【在Controller里注入(可访问到,也就是子容器访问父容器对象)Service】。

事务为什么加在service层而不加在dao层。

在数据库中,所谓事务是指一组逻辑操作单元即一组sql语句。

当这个单元中的一部分操作失败,整个事务回滚,只有全部正确才完成提交。

判断事务是否配置成功的关键点在于出现异常时事务是否会回滚。

给Service层配置事务,因为一个Service层方法操作可以关联到多个Dao的操作。在Service层执行这些Dao操作,多Dao操作有失败全部回滚,成功则全部提交。

事务也一般放在service层进行配置,其原因可见:

当然,事务的aop配置也一般放在applicationContext.xml进行配置,因为其涉及到

Mybatis整合Spring的思路

Mybatis是使用SqlSessionFactory产生dao代理对象间接控制,然后使用代理对象调用其操作数据库的dao方法,这就是Mybatis的主要工作所在了。

而Mybatis涉及到dao层的代理对象,也涉及到与数据源有关的SqlSessionFactory

总的来说,整合的思路:

主要是获取sqlSession对象,通过MapperScannerConfigurer 自动装配SqlSessionFactory 或 SqlSessionTemplate,MapperFactoryBean 创建的代理类实现了 UserMapper 接口,并且注入到应用程序中

整合方式详解:

IOC控制反转和依赖注入

控制反转:我们不需要去new对象,只需要告诉Spring去把我们这个对象的控制权交给Spring

依赖注入:告诉Spring我要用哪个对象,这个对象之前是被Spring控制的。

自定义Mybatis

Posted on 2019-07-29 | In Mybatis

Java与数据库交互的基本步骤

  1. 加载驱动类(com.mysql.jdbc.Driver)
  2. 获取Connection对象(通过url、user、password)
  3. 获取PreparedStatement操作对象(通过Connection对象以及SQL语句)
  4. 执行
  5. 返回ResultSet并进行遍历,使用List集合添加每一行的对象
  6. 返回List集合

XML之xmlns相关

Posted on 2019-07-13 | In xml

对于很多xml文件的开头,通常都会有类似如下的:

1
2
3
<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

可以这样理解:

首先这个文件是一个xml文件,那么文件里面的所有内容都符合xml语法规范,

开头的<project></project>这最外层同样也是一个xml文件的标签,后面那一长串也就是所谓的属性,其中xmlns表示命名空间,xmlns="http://maven.apache.org/POM/4.0.0" 这表示默认命名空间(如果你的xml标签没有带任何前缀,则默认认定标签来自默认命名空间),而下面xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 这个命名空间里面的元素或者属性就必须要以xsi:这种方式来写,比如schemaLocation就是他的一个属性,所以写成xsi:schemaLocation,而默认命名空间不带类似xsi这种,其实xml标签名称有个专业叫法叫做QName,而如果没有前面的xsi:这种一般叫做NCName。

你会发现, 这个 xmlns:xsi 在不同的 xml 文档中似乎都会出现。 这是因为, xsi 已经成为了一个业界默认的用于 XSD(XML Schema Definition) 文件的命名空间。

所以像mvn里面的<dependency>这种就是默认命名空间下面的元素,最后那一行就表示把定义这个命名空间的schema文件给引用进来,好让eclipse这类型工具能够解析和验证你的xml文件是否符合语法规范。

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
上面这行的语法其实是, xsi:schemaLocation = "键" "值"。即 xsi 命名空间下 schemaLocation元素的值为一个由空格分开的键值对。等同于<import namespace="xxx" schemaLocation="xxx.xsd"/>。

PHP学习笔记

Posted on 2019-07-08 | Edited on 2019-07-10 | In CS交互

PHP表单

PHP脚本可以通过_GET或_POST来获取相应表单的提交内容。

预定义的$_REQUEST变量包含了 $_GET、$_POST 和 $_COOKIE 的内容。

$_REQUEST 变量可用来收集通过 GET 和 POST方法发送的表单数据。

函数传入表单元素name可以获取该name表单元素所填的值,函数返回该值或数组。

如果对于表单中的selector多w个option,你可以选择将该selector的name定义为一个数组,如name=p[],这样,返回的就是一个所有被选择的option 的 value构成的p数组,当然,前提是你给selector设置了multiple="multiple"。

所以,对于单选按钮,返回的name设置为变量,多选返回的name设置为数组。

Read more »

Git相关知识

Posted on 2019-07-05 | In 版本控制系统

配置

在为你的电脑安装完Git之后,因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。你也许会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无知的群众,其次,真的有冒充的也是有办法可查的。

注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

1
2
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

你可以在任何一个目录下进行git init操作,让Git系统来跟踪记录你的文件的修改情况。

Read more »

公钥、私钥和安全证书

Posted on 2019-07-03 | Edited on 2019-07-05 | In 密钥技术

在学习 SSH 章节时,一定有不少人对公钥和私钥产生过不解。在搜索公钥跟私钥的理解时,发现了这篇有趣的图解小文章,与大家共享。

Read more »

递归新理解

Posted on 2019-07-02 | Edited on 2019-07-03 | In 算法

很简单的一个问题,

给定一个整数,要求对这个整数从大位数向小位数按顺序输出。

假定这个数是345,我们来分析一下下面这个程序:

Read more »

如何获取信息

Posted on 2019-07-01 | In 知识

人是一台“电脑”

假如将人比作一台电脑,需要输入信息,存储数据,运算思考,输出表达。而其中输入信息,作为第一步,也是非常重要的。那么作为一个成年人,应当怎么样去收集信息,才能够尽可能快,尽可能全面呢?

从小到大,其实从来没有人教过我们如何收集信息,而这看起来好像是一个无意识的过程。不就是刷刷微博、看看新闻、读读书、看看文章嘛,大家都会嘛。然而,这种无意识,往往不是最有效的方式,甚至会让你觉得非常苦恼。

我一直在思考这个问题,如何搭建自己的信息收集渠道?因为过去收集信息,没有一个完整的体系,都是无头的苍蝇,乱撞。在浏览信息的时候,还容易因为一些别的话题将注意力分散开,像猴子掰玉米一样,大量的时间花在不断地分心上面,真正关心的信息却没有找到。

Read more »
123
Mr.Chen

Mr.Chen

鹿有森林,鲸有深海
23 posts
22 categories
44 tags
RSS
GitHub CSDN StackOverflow
© 2019 Mr.Chen
Powered by Hexo v3.8.0
|
Theme – NexT.Gemini v7.1.0
|
0%