Java + 腾讯企业邮箱 + javamail发送邮件

搞了一上午终于搞定了腾讯云企业邮箱的发送,话说腾讯云的东西就是繁琐,但是好用,还是得认真看文档啊,不然真的摸不着北。 腾讯企业邮箱官网:http://exmail.qq.com 点击开通 你跟着步骤走就行了,没啥难的,如果你没有域名,你就去买一个呗,也花不了多少钱的。 注册成功后,是这个页面,并且会有一个弹窗告诉你一些信息 现在你点击添加成员,因为你不添加成员的话你是无法发送邮件的。 完成后是这样 然后你打开腾讯企业邮箱登录界面,输入你刚才增加的成员邮箱的:登录名 + 密码,进去后是一个类似于普通QQ邮箱的界面 第一次进去会要求重新设置密码,设置一下就好了。默认的已经开通了SSL协议; 如何设置IMAP、POP3/SMTP及其SSL加密方式? 如果您的电子邮件客户端支持SSL,可以在设置中选择使用SSL。 <div> </div> <div> <div> <div> <div> **通用配置参数:** </div> <div> **(我们已经默认都支持这些协议,用户无需自己手动开启这些服务器与端口)** </div> <div> </div> <div> **POP3/SMTP协议** <div> <div> 接收邮件服务器:pop.exmail.qq.com ,使用SSL,端口号995 </div> <div> 发送邮件服务器:smtp.exmail.qq.com ,使用SSL,端口号465 </div> <div> 海外用户可使用以下服务器 </div> <div> <div> 接收邮件服务器:hwpop.exmail.qq.com ,使用SSL,端口号995 </div> <div> 发送邮件服务器:hwsmtp.exmail.qq.com ,使用SSL,端口号465 </div> </div> <div> </div> <div> <div> **IMAP协议** </div> <div> <div> 接收邮件服务器:imap.exmail.qq.com ,使用SSL,端口号993 </div> <div> <div> 发送邮件服务器:smtp.exmail.qq.com ,使用SSL,端口号465 </div> <div> 海外用户可使用以下服务器 </div> <div> <div> 接收邮件服务器:hwimap.exmail.qq.com ,使用SSL,端口号993 </div> <div> <div> 发送邮件服务器:hwsmtp.exmail.qq.com ,使用SSL,端口号465 </div> <div> </div> </div> </div> </div> </div> </div> </div> </div> </div> <div> <div> <div> <div> **账户名:**您的企业邮箱账户名,账户名需要填写完整的邮件地址 </div> <div> **密码:**您的企业邮箱密码 </div> <div> **电子邮件地址:**您的企业邮箱的完整邮件地址 </div> <div> </div> <div> 使用SSL协议之前,请您先参考[常用客户端的一般配置方式](http://service.exmail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1000585): </div> </div> </div> </div> </div> </div> 使用java代码发送邮箱 ...

2017年12月5日 · 1 分钟 · 天边的星星

SpringBoot 学习网站收藏

Spring Boot加载配置文件 https://my.oschina.net/wangyuefive/blog/704615#h3_4 问题3:如何根据线上环境和线下环境加载不同的配置?如何加载多个配置文件? 1、Profiles: Spring Profiles提供了一种隔离应用程序配置的方式,并让这些配置只能在特定的环境下生效。在配置文件中,用spring.profiles.active属性来指定特定环境的配置文件。在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如: application-dev.properties:开发环境 application-test.properties:测试环境 application-prod.properties:生产环境 至于哪个具体的配置文件会被加载,需要在application.properties文件中通过spring.profiles.active属性来设置,其值对应{profile}值。例如: application.properties配置:spring.profiles.active = dev即指定application-dev.properties会被加载。 2、通过启动参数指定运行环境。 通过命令行启动: ` java -jar xxxxx.jar &lt;span class="hljs-comment">--spring.profiles.active=prod。&lt;/span>` 上述指定为prod环境,则spring application会自动根据application-{profile}.properties的格式找到application-prod.properties文件加载。 3、加载多个自定义文件。 例如: ` spring.profiles.active = dev,database` 等于告诉Spring Boot加载application-dev.properties和application-database.properties文件,从而实现多个配置文件的加载。 四种读取properties文件的方式 http://www.imooc.com/article/18252 集成Mybatis http://www.imooc.com/article/15406 开启定时任务 http://www.imooc.com/article/15612 spring-boot上传文件MultiPartFile获取不到文件问题解决 http://blog.csdn.net/happy_cheng/article/details/54178392 Spring boot上传文件时MultipartFile为空问题 http://blog.csdn.net/tanga842428/article/details/72773773 spring boot默认日志配置,以及改用log4j日志配置学习使用排出多余的依赖 http://blog.csdn.net/yanweihpu/article/details/54139382 http://blog.csdn.net/loongshawn/article/details/50951329

2017年9月20日 · 1 分钟 · 天边的星星

spring-boot–使用thymeleaf模板

参考:http://blog.csdn.net/u014695188/article/details/52347318 参考:http://blog.csdn.net/u012706811/article/details/52185345 整体步骤: (1) 在pom.xml中引入thymeleaf; (2) 如何关闭thymeleaf缓存 (3) 编写模板文件.html Spring Boot默认就是使用thymeleaf模板引擎的,所以只需要在pom.xml加入依赖即可: «/span>dependency> «/span>groupId>org.springframework.boot</groupId> «/span>artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> Thymeleaf缓存在开发过程中,肯定是不行的,那么就要在开发的时候把缓存关闭,只需要在application.properties进行配置即可: [html] view plain copy ######################################################## ###THYMELEAF (ThymeleafAutoConfiguration) ######################################################## #spring.thymeleaf.prefix=classpath:/templates/ #spring.thymeleaf.suffix=.html #spring.thymeleaf.mode=HTML5 #spring.thymeleaf.encoding=UTF-8 # ;charset= is added #spring.thymeleaf.content-type=text/html # set to false for hot refresh spring.thymeleaf.cache=false 编写模板文件src/main/resouces/templates/helloHtml.html [html] view plain copy 编写访问路径(com.kfit.test.web.TemplateController): [html] view plain copy package com.kfit.test.web; import java.util.Map; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /** 模板测试. @author Administrator */ @Controller publicclass TemplateController { /** ...

2017年9月19日 · 2 分钟 · 天边的星星

MyBatis的返回参数类型

MyBatis的返回参数类型分两种 1. 对应的分类为: 1.1.resultMap: 1.2.resultType: 2 .对应返回值类型: 2.1.resultMap:结果集 2.2.resultType:int,string ,long ,class 3. 注意点: 在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。 3.1 当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时 候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。 3.2 当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。 4.案例 4.1:resultMap案例 **[html]** [view plain](http://blog.csdn.net/u010235716/article/details/51698787#) [copy](http://blog.csdn.net/u010235716/article/details/51698787#) <div> <embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_1" data-mce-fragment="1"> </embed> </div> </div> - <span class="tag"><</span><span class="tag-name">select</span> <span class="attribute">id</span>=<span class="attribute-value">&#8220;selectByPrimaryKey&#8221;</span> <span class="attribute">resultMap</span>=<span class="attribute-value">&#8220;BaseResultMap&#8221;</span> <span class="attribute">parameterType</span>=<span class="attribute-value">&#8220;java.lang.Long&#8221;</span> <span class="tag">></span> - select - <span class="tag"><</span><span class="tag-name">include</span> <span class="attribute">refid</span>=<span class="attribute-value">&#8220;Base_Column_List&#8221;</span> <span class="tag">/></span> - from common_car_make - where <span class="attribute">id</span> = #{id,<span class="attribute">jdbcType</span>=<span class="attribute-value">BIGINT</span>} - <span class="tag"></</span><span class="tag-name">select</span><span class="tag">></span> 4.2 resultType–long案例 ...

2017年8月26日 · 2 分钟 · 天边的星星

Socket请求网页

Java Socket现实简单的HTTP服务 http://jiangzhengjun.iteye.com/blog/512380 Java socket 访问网页 http://blog.csdn.net/yilip/article/details/45195713 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; public class WebpageSocket { private static int port = 80; private static String hostname = “www.iteye.com”; public static void main(String[] args) throws Exception{ Socket socket = new Socket(hostname, port); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), “utf-8”)); writer.write(“GET ” + “/ask” + ” HTTP/1.0\r\n”); writer.write(“HOST:” + hostname + “\r\n”); writer.write(“Accept:*/*\r\n”); writer.write(“\r\n”); writer.flush(); BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), “utf-8”)); String line = null; while ((line = reader.readLine()) != null) { System.out.println(line); } reader.close(); writer.close(); socket.close(); } } ...

2017年1月4日 · 3 分钟 · 天边的星星

CentOS+Nginx一步一步开始配置负载均衡

Nginx负载均衡的理解 Nginx是一个轻量级的、高性能的WebServer,他主要可以干下面两件事: 作为http服务器(和apache的效果一样) 作为反向代理服务器实现负载均衡 现在Nginx到处都可以见到,经常会看到宕机后的网页会显示nginx的字样,这也说明Nginx由于高性能、使用配置简、开源单这些特点被越来越多的用户所接受,所使用。 其中第一种作为http服务器,结合php-fpm进程,对发来的请求进行处理,nginx本身并不会解析php,他只是作为一个服务器,接受客户端发来的请求,如果是php请求,则交给php进程处理,并将php处理完成之后的结果发送给客户端。这个很简单,安装好nginx+php-fpm之后配置好各自的配置文件,启动就可以实现。运行原理可以看下面这段解释: Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接收到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端。这就是Nginx+FastCGI的整个运作过程,如图下图所示。 [][1] 上面这段话解释了nginx+fastcgi的运行机制,在nginx配置文件中会对请求进行匹配,并作做出相应的处理,比如说直接返回错误文件(这里和上面说的有点区别,我估计是nginx内部对html等这些静态文件可以做类似上图的解析),使用php进程对php请求进行处理(这里的php进程可以是多个)。 第二种是用反向代理事项负载均衡,这个其实其实很简单,说起来就是自己定义一组server,对请求进行匹配,并将请求转给server中的任意一个处理,来减轻每个server的压力,先看看网上对反向向代理的定义: 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。 反向代理是和正向代理(或者叫代理) 相反的,代理大家定听过吧,为了更方便的访问B资源,通过A资源间接的访问B资源,特点就是用户知道自己最终要访问的网站是什么,但是反向代理用户是不知道代理服务器后边做了什么处理的,反向代理中服务真正的处理服务器放在内网,对外网而言只可以访问反向代理服务器,这也大大提高了安全性。 安装软件 nginx安装很简单 1、安装nginx需要的环境,pcre(作用rewrite)、zlib(作用压缩)、ssl,这个也可以自己下载编译安装 yum -y install zlib; yum –y install pcre; yum –y install openssl; 2、下载安装nginx-*.tar.gz。 tar –zxvf nginx-1.2.8.tar.gz –C ./; cd nginx-1.2.8; ./congigure –prefix=/usr/local/nginx; make && make install; 3、配置 这里配置的时候只需要修改http{}之间的内容就行了,修改的第一个地方就是设置服务器组,在http节点之间添加 upstream myServer{ server www.88181.com:80; #这里是你自己要做负载均衡的服务器地址1 server www.linux.com:8080; #这里是要参与负载均衡的地址2 } nginx中的upstream支持下面几种方式:轮询(默认,按照时间顺序对所有服务器一个一个的访问,如果有服务器宕机,会自动剔除)、weight(服务器的方位几率和weight成正比,这个可以在服务器配置不均的时候进行配置)、ip_hash(对每个请求的ip进行hash计算,并按照一定的规则分配对应的服务器)、fair(按照每台服务器的响应时间(rt)来分配请求,rt晓得优先分配)、url_hash(按照访问url的hash值来分配请求),我这里使用了默认的轮训方式。 将请求指向myServer location / { proxy_pass http://myServer; } 完整的文件(删除注释)如下: worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream myServer{ server www.linux.com:80; server www.88181.com:8080; } server { listen 80; server_name my22; location / { proxy_pass http://myServer; } } } 设置反向代理后端作为负载均衡的两个服务器 ...

2016年8月18日 · 1 分钟 · 天边的星星

Java文件下载ContentType设置

String filePath=””; File file=new File(filePath); //解决乱码问题 String filename=URLEncoder.encode(file.getName(),”utf-8″); //重置输出流 response.reset(); Response.AddHeader(“Content-Disposition”, “attachment;filename=”+filename);//设置文件名 response.addHeader(“Content-Length”,file.length);//设置下载文件大小 response.setContentType(“application/octet-stream”);//设置文件类型 OutputStream toClient=new BufferedOuntputStream( response.getOutputStream() );//获取二进制输出流 //读取文件数据 InputStream fis=new BufferedInputStream(new FileInputStream(filePath)); byte[] buffer=new byte[file.length()]; fis.read(buffer); fis.close(); //输出文件数据 toClient.write(buffer); toClient.close(); 文件类型如下: “.*”=”application/octet-stream” “.001″=”application/x-001” “.301″=”application/x-301” “.323″=”text/h323” “.906″=”application/x-906” “.907″=”drawing/907” “.a11″=”application/x-a11” “.acp”=”audio/x-mei-aac” “.ai”=”application/postscript” “.aif”=”audio/aiff” “.aifc”=”audio/aiff” “.aiff”=”audio/aiff” “.anv”=”application/x-anv” “.asa”=”text/asa” “.asf”=”video/x-ms-asf” “.asp”=”text/asp” “.asx”=”video/x-ms-asf” “.au”=”audio/basic” “.avi”=”video/avi” “.awf”=”application/vnd.adobe.workflow” “.biz”=”text/xml” “.bmp”=”application/x-bmp” “.bot”=”application/x-bot” “.c4t”=”application/x-c4t” “.c90″=”application/x-c90” “.cal”=”application/x-cals” “.cat”=”application/vnd.ms-pki.seccat” “.cdf”=”application/x-netcdf” “.cdr”=”application/x-cdr” “.cel”=”application/x-cel” “.cer”=”application/x-x509-ca-cert” “.cg4″=”application/x-g4” “.cgm”=”application/x-cgm” “.cit”=”application/x-cit” “.class”=”java/*” “.cml”=”text/xml” “.cmp”=”application/x-cmp” ...

2016年8月18日 · 2 分钟 · 天边的星星

IntelliJ IDEA 14.1上JFinal开发环境搭建手册

JFinal官方的教程都是使用Eclipse进行开发的,而使用Intellij IDEA来做开发,不少地方和Eclipse区别还是很大的。 本文参考了网上不少文章,主要沿用了网友的内容,一步一步做了尝试后记录下来,感谢万能的互联网。 分别做了两个Module,分别使用Jetty和tomcat来运行。均测试均可正常跑起来。 本文看起来虽然很长,但实际上步骤不多,为便于初学者了解Intellij IDEA,所以细节写的非常完善,每一步都有截图。 本文使用的开发环境是Intellij IDEA 14.1.4版本。JFinal是2.0版。 请大家注意:不是Intellij IDEA配置繁琐,而是我为了便于入门初学者少走弯路,写得非常细,凡是每一个出现的界面,我都截了图,而且文章里面包含了jetty和tomcat的两个项目。所以看起来比Eclipse好像复杂,其实不是的。简单地说,就五个步骤:建项目(类比于Eclipse的Workspace),建模块(类比于Eclipse的Project),引入Jar包,建Artifacts,写代码。就可以运行了。 一、新建项目 新建一个项目,可以是空项目,也可以是连模块一起建的项目,本文为了演示Jetty和tomcat均能运行的效果,所以先建一个空项目,再分别建两个不同的module,以便区分。 如果项目和模块一起建,可以把Web Application选上,其他的默认就行。 因为我们要分别测试jetty和tomcat的效果,要建两个模块,所以先建一个空项目。 点击“Next”进入下一步。 输入项目名称和项目所在目录,点击“Finish”即可。 二、项目参数配置 1.新建Module 如果新建一个空项目,会立即出来一个Project Structure的配置窗口。如果是连模块一起建的,请从【File】-【Project Structure】中选择,对项目参数进行配置。 首先指定项目所使用的JDK版本: 如果要单独为每个模块指定JDK版本,也可以在模块中进行配置(要在下面的新建模块步骤之后才能操作)。 下面开始新建模块。 选择Modules,准备新建Module。 2.建Jetty运行模块 (1)新建模块 我们先新建一个module,用于使用jetty来运行。 选上“Web Application”后,点击Next。 在出现的窗口中,直接在Module name中输入想要新建的module名字,下面的Content root和Module file location中会自动把路径填进去。 为了便于区分,我们把jetty运行的module命名为jf_jt。 点击“Finish”。 此时会出现如下界面; 选择“Paths”选项卡,选中“Use module compile output path”后,在“Output path”和“Test output path”中均写上类输出的路径。按照一般常规写法,我把这个目录放在module下,web\WEB-INF路径下的classes目录下。 点击“Apply”,把配置启用起来; (2)导入类库 然后点击左侧的Libraries选项卡; 在做这一步之前,我们先要把需要的类库分别拷贝到我们建立的类库目录中。 这个模块是需要jetty来运行的,所以需要JFinal的类库和jetty的类库,事先准备好这几个类库。 Jfinal-2.0-all目录下有需要的类库文件。 “jfinal-2.0-bin.jar”或“jfinal-2.0-bin-with-src.jar”是jfinal本身的jar包,任选一个都可以,为了方便调试,可以选择“jfinal-2.0-bin-with-src.jar”。 目前这个项目是为了Jetty而建的,所以要把“jetty-server-8.1.8.jar”也要包含进去。 在电脑中找到项目目录,进入到Module路径中,新建文件夹; ...

2016年8月14日 · 1 分钟 · 天边的星星

Java读取文件MD5的两种方案

最近要弄一下Java读取文件MD5,注意这里是小文件,网上找了一下,有两种解决方案,一种是用MessageDigest来实现,另种是用org.apache.commons.codec.digest来实现,代码如下: **[java]** [view plain](http://blog.csdn.net/wangqiuyun/article/details/22941433#) [copy](http://blog.csdn.net/wangqiuyun/article/details/22941433#) <div> <embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_1"> </embed> </div> <span class="tracking-ad" data-mod="popu_167">[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/274974)</span><span class="tracking-ad" data-mod="popu_170">[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/274974/fork)</span></div> </div> - <span class="keyword">package</span> cdm; - <span class="keyword">import</span> java.io.File; - <span class="keyword">import</span> java.io.FileInputStream; - <span class="keyword">import</span> java.io.FileNotFoundException; - <span class="keyword">import</span> java.io.IOException; - <span class="keyword">import</span> java.math.BigInteger; - <span class="keyword">import</span> java.nio.MappedByteBuffer; - <span class="keyword">import</span> java.nio.channels.FileChannel; - <span class="keyword">import</span> java.security.MessageDigest; - - <span class="keyword">import</span> org.apache.commons.codec.digest.*; - <span class="keyword">import</span> org.apache.commons.io.IOUtils; - - <span class="keyword">public</span> <span class="keyword">class</span> testMD5 { - - <span class="keyword">public</span> <span class="keyword">static</span> String getMd5ByFile(File file) <span class="keyword">throws</span> FileNotFoundException { - String value = <span class="keyword">null</span>; - FileInputStream in = <span class="keyword">new</span> FileInputStream(file); - <span class="keyword">try</span> { - MappedByteBuffer byteBuffer = in.getChannel().map(FileChannel.MapMode.READ_ONLY, <span class="number"></span>, file.length()); - MessageDigest md5 = MessageDigest.getInstance(<span class="string">&#8220;MD5&#8221;</span>); - md5.update(byteBuffer); - BigInteger bi = <span class="keyword">new</span> BigInteger(<span class="number">1</span>, md5.digest()); - value = bi.toString(<span class="number">16</span>); - } <span class="keyword">catch</span> (Exception e) { - e.printStackTrace(); - } <span class="keyword">finally</span> { - <span class="keyword">if</span>(<span class="keyword">null</span> != in) { - <span class="keyword">try</span> { - in.close(); - } <span class="keyword">catch</span> (IOException e) { - e.printStackTrace(); - } - } - } - <span class="keyword">return</span> value; - } - - <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> main(String[] args) <span class="keyword">throws</span> IOException { - - String path=<span class="string">&#8220;E:\\commons-codec-1.9-bin.zip&#8221;</span>; - - String v = getMd5ByFile(<span class="keyword">new</span> File(path)); - System.out.println(<span class="string">&#8220;MD5:&#8221;</span>+v.toUpperCase()); - - FileInputStream fis= <span class="keyword">new</span> FileInputStream(path); - String md5 = DigestUtils.md5Hex(IOUtils.toByteArray(fis)); - IOUtils.closeQuietly(fis); - System.out.println(<span class="string">&#8220;MD5:&#8221;</span>+md5); - - <span class="comment">//System.out.println(&#8220;MD5:&#8221;+DigestUtils.md5Hex(&#8220;WANGQIUYUN&#8221;));</span> - } - - } </div> 运行: ![](http://img.blog.csdn.net/20140404160025078?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZ3FpdXl1bg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 结果在官网提供的MD5一致。 附commons-codec-1.9.jar下载地址:[http://commons.apache.org/proper/commons-codec/download_codec.cgi](http://commons.apache.org/proper/commons-codec/download_codec.cgi) 如果要处理过G的文件,请参照:[http://www.cnblogs.com/yaowukonga/p/3523668.html](http://www.cnblogs.com/yaowukonga/p/3523668.html)

2016年7月29日 · 2 分钟 · 天边的星星

MVC模式优缺点

优点: 耦合性低 重用性高 生命周期成本低 部署快 可维护性高 有利软件工程化管理 缺点: 没有明确的定义 不适合小型、中等规模 增加系统结构和实现的复杂性 视图与控制器间过于紧密的连接 视图对模型数据的低效率访问 一般高级的界面工具或构造器不支持模式

2016年6月27日 · 1 分钟 · 天边的星星