MapReduce
- MapReduce是一个解决复杂问题的思路。把解决1问题的过程拆分成两步:
- 映射:目的是将数据转换成目标类型
- 标签对象 —> 字符串对象
- 作用是转换或抽取数据
- 聚合:目的是将所有的数据聚合成一个数据
- 好处是:将Map和Reduce分开,可以使Map和Reduce都更加简单
- Map时只需考虑怎样抽取或转换数据即可
- Reduce只需考虑怎样将上一步的计算结果和当前值计算在一起
- 在集群运行环境中,Map和Reduce可以分散到N多电脑上同时进行。
- 好处是:将Map和Reduce分开,可以使Map和Reduce都更加简单
JS中的MapReduce
- [].map( x=>y ).reduce( (prev,current)=>A(prev,current),initValue )
- 计算平方和:[1,2,3]
[1,2,3].map(x => x*x):[1,4,9]
.reduce( (prev,current) => (prev + current),0):14
0:为结果的初始值
URLEncoded格式
- application/x-www-form-urlencoded
- 形状:key1 = value1&key2 = value2&...
- 生成这种格式:
- $(form).serialize():收集表单数据,生成URLEncoded
- 拼字符串
- $.param(object):把JS对象变成URLEncoded
Ajax登录
可能会存在一种担心,就是Ajax登录成功时,网页是否也同时登录。
答案是:Ajax的Cookie和网页的Cookie是连通的,所以Ajax登录成功时,Cookie将会被正确地设置到网页中,网页也同时”登录成功”(虽然网页并没有刷新)
接口开发返回数据的统一模式
- 通过code表示服务端处理是否成功,如果失败,则用各种数字表示不同的失败原因
- 通过message表示失败的具体原因
- 鉴于每一次请求都需要返回code和message,所以通常创建一个JSONResult类,在其中添加code和messag两个属性以统一作为Ajax或App接口得返回类型。
- 因为成功的请求一定是占大多数的,所以在JSONResult上面还会有个static final的success属性,表示请求成功的结果,处理成功时直接返回JSONRestult.success
- 如果要同时返回很多数据,则从JSONResult继承一个子类JSONDataResult,添加一个新属性:HashMap<String,Object> data 把需要返回的数据都put到data中即可
SpringMVC上传文件常见问题
- 创建了一个Bug模型,在Bug模型中定义了一个属性与文件上传input的name相同
- 网页上 <input type="file" name="image">
- 模型中 String image
- 会出现 400错误
- 解决方法:把input的name后属性的名字改成不一样的!
- 此时需单独添加一个参数:@RequestPart("image")、@RequestParam("image") MultipartFile image来接收上传的文件
- 不创建模型,在请求处理方法中 @RequestPart("desc") String desc。。。
- 解决的方法是只有MultipartFile类型的参数可以用@RequestPart
- 其他参数用@RequestParam即可解决问题
- 不用SpringMVC的机制,改为request.Part("desc").getInputStream()
- 会报Servlet上缺少MultipartConfig错误
- 解决办法:不要用该方法!
上传文件的分布问题
- 用户上传的文件不能全部放到一个固定的文件夹中。
- 用为随着用户量的增加及运行时长增长,该文件夹中的文件数量过多,导致系统IO性能降低并且该文件夹将很难维护
- 解决方法,把用户上传的文件根据一个特定的方法分散到很多文件夹中,比如按上传日期分文件夹、按照商户ID分文件夹
开发过程中,上传的图片被删除的问题
- Eclipse重启服务器Servers,或者删除Servers重新部署时,会导致应用被删除,应用内部的上传文件也会一并被删除
- 解决方法:通过配置文件向应用指明,将上传的文件保存在应用之外的地方
- 用一台服务器上的其他磁盘
- 其他存储设备
- 其他服务器
- 当把文件保存在应用之外时,如果希望通过应用内的URL访问这个文件,就需要创建虚拟目录:
- 虚拟目录:应用内本来没有这个目录,但是Tomcat通过读取配置文件会把另外一个目录的内容当作是这个目录的内容。
- <Host>
- <Context>
- <Host>
- 虚拟主机:在同一台硬件服务器上部署多个网站,这些网站可以使用不同的域名后端口。Tomcat通过分辨域名或端口号区分不同的请求,将之转发给不同的应用去处理。从而实现在一台硬件服务器上可以部署多个网站的效果。
- <Connector>
- <Host>
- 虚拟目录:应用内本来没有这个目录,但是Tomcat通过读取配置文件会把另外一个目录的内容当作是这个目录的内容。
SpringMVC的对象池及Bean
- 从对象池中获取Bean(对象):
- 使用注解@Autowired可以自动获取对象池中的对象
- 通过对象池(WebApplicationContext)的getBean()方法
- 对象池:
- 对象池是一个容器对象,对应的类型是各种ApplicationContext→底层是BeanFactor
- 对象池与ServletContext之间的关系
- ServletContext在jsp中有一个别名,叫application
- ServletContext是Servlet的容器,内部管理的是Servlet对象(还可以通过addAttribute方法添加其他对象。但是仅仅是将这些对象放进去而已,并没有提供Spring自动获取对象的强大机制),而ApplicationContext是对象池,内部管理的是普通对象。
- WebApplicationContext在ServletContext内部
- WebApplicationContentUtils.findWebApplicationContext(ServletContext)可以获取ApplicationContext。
- 之后可以通过getBean()方法获取对象池中的对象。
Bean对象的作用域(生存范围)
- singleton:单例:整个应用声明周期中只创建一次
- prototype:多例:每一次获取都创建一个新对象
- 下面3个是Web特有的作用域
- request:请求:每一次请求都可以创建一个新对象
- session:用户会话:每一个JSESSIONID只创建一个新对象
- globalSession:全局:一个应用只创建一次
在Bean中获取管理它的对象池
- 让Bean实现BeanFactoryAware接口,即可接收到BeanFactory(对象池)
- 如果子对象和父对象定义了同名的bean,则在子对象中获取的是本对象池中的bean
JS中this的指向是不固定的!!!
- this的指向:
- 事件监听函数中的this,指向触发事件的标签元素
- jQuery的Ajax请求处理函数中的this,指向xhr对象
- setTimeout等定时器函数中的this,指向window对象
- 迭代函数中的this($.each, [].foreach),指向当前被迭代的元素
- 构造函数中的this,指向当前构造的实例对象
- 改变函数中this指向的方法
- newFunc = func.bind(obj):返回了一个新函数,调用时func内部的this指向了obj
- func.apply(obj,....):立即调用func函数,并且使func内部的this指向obj
- func.call(obj,[func的参数]):同上,区别仅仅是传参的方式不同
- new Func = $,proxy(func,obj):返回一个新函数,与bind类似
- 使用_this或that或me等变量代替this(因为this会被改变)