首页 文章 精选 留言 我的

精选列表

搜索[学习],共10000篇文章
优秀的个人博客,低调大师

【java学习】spring mvc 公共dao的实现,定义基本的增删改查

接口类: package com.blog.db.dao; import com.blog.util.Pagination; import java.util.List; public interface PublicDao<T> { public void setMapper(Class t); public void setTableName(String tn); public List<T> queryList(Pagination pagination); public void deleteByID(int ID); public void add(T t,Object[] values,int[] types); public T queryById(int id); public T queryByField(String fieldname,String value); public void updateByID(T t,int ID,Object[] values,int[] types); } 实现类: package com.blog.db.dao.impl; import com.blog.db.dao.PublicDao; import com.blog.util.Pagination; import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; import javax.annotation.Resource; import java.sql.Types; import java.util.List; /** * 公共dao实现 * @deprecated 提供常见的列表、插入、查询单个、更新数据服务 * @author ztf * */ @Repository("publicDao") public class PublicDaoimpl<T> implements PublicDao<T> { @Resource private JdbcTemplate jdbcTemplate; private String table_name = ""; //表名称 private List<String> fields; //表字段 @Value("${db_schema}") private String schema; //表模式 private RowMapper<T> mapper; /** * 设置Mapper映射 */ public void setMapper(Class t){ this.mapper = new BeanPropertyRowMapper<T>(t); } public RowMapper<T> getMapper(){ return mapper; } public void setTableName(String tn){ this.table_name = tn; } public String getTable_name() { return schema+"."+table_name; } public List<String> getFields(){ return this.fields; } public String getFieldsToString(){ String _fields; List<String> fields = getFields(); _fields = String.join(",",fields); return _fields; } /** * 查询列表 * @param pagination 传入公共util中定义的分页对象 * @return List<T> * */ public List<T> queryList(Pagination pagination) { List lists = null; String sql = "select * from ? ?"; lists = jdbcTemplate.queryForList( sql, getTable_name(), pagination.getSql(), getMapper() ); return lists; } /** * 根据ID删除某一个行 * @param ID 传入行id * */ public void deleteByID(int ID) { String sql = "delete from "+ getTable_name()+" where ID=?"; jdbcTemplate.update( sql, new Object[] { ID }, new int[] {Types.INTEGER} ); } /** * 插入数据 * @param t 传入操作的数据对象 * @param values 值的object[]对象 * @param types 值对象的类型 * */ public void add(T t,Object[] values,int[] types) { String sql = "insert into "+getTable_name()+"("+getFieldsToString()+") values(?)"; jdbcTemplate.update( sql, values, types ); } /** * 根据ID查询指定的行 * @param id 传入id * */ public T queryById(int id) { T t = null; String sql = "select * from "+getTable_name()+" where ID=?"; try{ t = jdbcTemplate.queryForObject( sql, new Object[] {id}, new int[] {Types.INTEGER}, getMapper() ); }catch(EmptyResultDataAccessException e){ t = null; } return t; } /** * 根据指定的fieldname查询指定值的单行数据 * @param fieldname 传入id * */ public T queryByField(String fieldname,String value) { T t = null; String sql = "select * from "+getTable_name()+" where "+fieldname+"=?"; try{ t = jdbcTemplate.queryForObject( sql, new Object[] {value}, new int[] {Types.VARCHAR}, getMapper() ); }catch(EmptyResultDataAccessException e){ t = null; } return t; } /** * 根据指定的id更新指定值的单行数据 * @param t 传入更新对象 * @param ID 传入指定的ID * @param values 值的object[]对象 * @param types 值对象的类型 int[] * */ public void updateByID(T t, int ID,Object[] values,int[] types) { String sql = "update "+getTable_name()+" set username=?,password=?,pic=?,describe=?,check_time=? where ID="+ID; jdbcTemplate.update( sql, values, types ); } } 核心的地方在:如何传递Mapper 这里我使用的是 private RowMapper<T> mapper; /** * 设置Mapper映射 */ public void setMapper(Class t){ this.mapper = new BeanPropertyRowMapper<T>(t); } public RowMapper<T> getMapper(){ return mapper; } 在调用Dao时传入 T类的.class对象 调用例如(部分代码): @Qualifier("publicDao") private PublicDao<User> ud; public User Sign(String username, String password) throws UnsupportedEncodingException { String md5_pass = MD5Encryption.getEncryption(password); ud.setTableName("users"); //指定查询表名 ud.setMapper(User.class); //指定映射class对象 User user = ud.queryByField("username",username); //根据字段 username查询值为xxx 可以实现基本表的增删改查,提升开发效率, 如果有特殊的Dao可以自定义一个专属Dao 再添加特殊方法======================================================== 转载请注明出处。

优秀的个人博客,低调大师

ABP架构学习系列二:ABP中配置的注册和初始化

一、手工搭建平台 1.创建项目 创建MVC5项目,手动引入Abp、Abp.Web、Abp.Web.Mvc、Abp.Web.Api 使用nuget添加Newtonsoft.Json、Castle.Core、Castle.Windsor Install-Package Newtonsoft.Json -Version 8.0.3 Install-Package Castle.Windsor -Version 3.3.0 2.创建WebModule类 在App_Start下创建一个ZmBlogWebModule类型,DependsOn指示 ZmBlogWebModule依赖于AbpWebMvcModule,核心模块AbpWebMvcModule会在应用模块ZmBlogWebModule之前进行初始化,核心模块同时可以加载多个。 namespace ZmBlog.Web.App_Start { [DependsOn(typeof(AbpWebMvcModule))] public class ZmBlogWebModule:AbpModule { public override void PreInitialize() { //依赖注入注册之前,主要用于初始化默认的配置 //开启本地化语言、配置等Hangfire //关闭多租户、审计日志、AntiForgery等 } public override void Initialize() { //该方法通常是依赖注入注册的地方 IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); AreaRegistration.RegisterAllAreas(); //FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); } public override void PostInitialize() { //依赖注入注册之后调用,在这里可以安全地解析一个依赖 } public override void Shutdown() { //在应用关闭的时候调用 } } } 3.配置Global.asax MvcApplication 要继承AbpWebApplication,重写Application_Start来初始化abp的内部初始化 public class MvcApplication : AbpWebApplication { protected override void Application_Start(object sender, EventArgs e) { base.Application_Start(sender, e); } } 4.修改默认控制器 Home控制器必须集成于AbpController,否则会报错 好了,现在项目可以正常运行了 二、初始化过程 1.abp框架的启动是从Global.asax文件的Application_Start启动的,通过base去初始化。 2.AbpWebApplication的Application_Start方法中,通过AbpBootstrapper来将各个Abpmodule模块载入Abp框架中的AbpBootstrapper类在Abp.dll中,其主要用于框架的基本配置的注册和初始化,AbpBootstrapper调用Initialize方法初始化 public abstract class AbpWebApplication : HttpApplication { protected virtual void Application_Start(object sender, EventArgs e) { ThreadCultureSanitizer.Sanitize(); //设置当前线程的区域性 AbpBootstrapper.IocManager.RegisterIfNot<IAssemblyFinder, WebAssemblyFinder>();//加载bin目录下的所有dll并注册 AbpBootstrapper.Initialize(); } } 3.关于AbpBootstrapper的Initialize()方法 public virtual void Initialize() { IocManager.IocContainer.Install(new AbpCoreInstaller());//注册系统框架级的所有配置类 IocManager.Resolve<AbpStartupConfiguration>().Initialize();//实例化配置类 _moduleManager = IocManager.Resolve<IAbpModuleManager>(); _moduleManager.InitializeModules(); } 4. IAbpModuleManager的实例调用其InitializeModules()初始化所有的Module public virtual void InitializeModules() { LoadAll(); var sortedModules = _modules.GetSortedModuleListByDependency(); sortedModules.ForEach(module => module.Instance.PreInitialize());//先完成所有Module的PreInitialize sortedModules.ForEach(module => module.Instance.Initialize());//再执行所有Module的Initialize sortedModules.ForEach(module => module.Instance.PostInitialize());//最后执行PostInitialize } 另外,AbpModule的基本信息是用AbpModuleInfo封装的,将一个abpmodule类封装成Type,Assembly以及模块的依赖模块的AbpModuleInfo等信息。 5.应用程序结束将在AbpWebApplication中调用AbpBootstrapper的Dispose方法,Dispose通过IAbpModuleManager,执行其ShutdownModules,关闭所有Module。 public virtual void ShutdownModules() { var sortedModules = _modules.GetSortedModuleListByDependency(); sortedModules.Reverse(); sortedModules.ForEach(sm => sm.Instance.Shutdown()); } 三、AbpBootstrapper 在核心启动类AbpBootstrapper中的两个至关重要的属性: IIocManager 和 IAbpModuleManager。 IIocManager内部包装了一个Castle的依赖注入容器IWindsorContainer,所有类型的注册、解析、AOP机制的拦截器都是注册在该容器中的,将具体的注册还有解析功能分别包含在其父接口IIocRegistrar和IIocResolver中。 namespace Abp.Dependency { /// 此接口用于直接执行依赖项注入任务 public interface IIocManager : IIocRegistrar, IIocResolver, IDisposable { IWindsorContainer IocContainer { get; } /// 引用 Castle Windsor Container. new bool IsRegistered(Type type); /// 检测该类型是否已注册. new bool IsRegistered<T>(); /// 检测该类型是否已注册. } } 其中关系类图如下: 四、AbpCoreInstaller AbpCoreInstaller只是完成注册系统框架级的所有配置类。Abp支持自动完成符合Conventional(基于约定)的组件的注册。 Conventional 的规则要通过继承IConventionalDependencyRegistrar接口实现。 如下图,ABP中继承自IConventionalDependencyRegistrar接口的四个类。 其中BasicConventionalRegistrar设置了所有继承至ITransientDependency,ISingletonDependency和IInterceptor接口的类都会被自动注册。 其他三个则分别注册AbpDbContext,ApiController和Controller的派生类。 BasicConventionalRegistrar的代码,其注册所有继承至ITransientDependency,ISingletonDependency和IInterceptor接口的类。 参考文章: https://www.cnblogs.com/farb/p/ABPModuleSystem.html http://www.cnblogs.com/xuzimian/p/5561708.html https://www.cnblogs.com/xuzimian/p/5579144.html http://www.cnblogs.com/skabyy/p/7295533.html http://www.cnblogs.com/1zhk/p/5277610.html https://www.cnblogs.com/huaizuo/p/4836853.html

优秀的个人博客,低调大师

【天池直播】图像系列直播第一讲--带你入坑深度学习

天池医疗AI大赛以“人工智能辅助医疗决策”为主题,围绕全球第一高发恶性肿瘤——肺癌,以肺部小结节病变的智能识别、诊断为课题,通过胸部CT影像(mhd格式),检测CT影像中的肺部结节区域。 大赛通过探索早期肺癌精确智能诊断的优秀算法,提升早期肺癌检测的准确度,降低临床上常见的假阳性的误诊发生,实现“早发现,早诊断,早治疗”,从而挽救更多患者生命。 本次邀请医疗AI大赛人气奖冠军带来肺部结节智能诊断的比赛分享。 人气冠军奖帖子《天池医疗AI大赛[第一季] 解决方案:适合新人的工程指南》分享链接:点击详情 直播主题:肺部结节智能诊断比赛分享 直播时间:11月30日 20:00 直播链接:点击查看 直播嘉宾: 马晖 天池ID : 天雷无妄 2003 毕业于上海交通大学生物医学工程专业, 目前就职于吉祥航空 ,从事战略规划和商业分析等。 对未知领域有好奇 ,对

优秀的个人博客,低调大师

《Pro ASP.NET MVC 3 Framework》学习笔记之十九【URL和Routing】

创建传出的URL(Outgoing URLs) 处理传入的URL(Incoming URLs)仅仅是路由系统的一部分功能。我们也需要使用URL架构来创建Outgoing URLs,我们可以将这些URL嵌入到我们的View里面,并且能够让用户点击URL提交表单给我们的应用程序,并能够命中合适的controller和action。 下面会展示用不同的技术来创建Outgoing URLs: 最便捷的创建Outgoing URLs就是手动定义如:<a href="/Home/About">About this application</a> 这样的URL。这个URL会命中HomeController中的About action方法。手动定义Outgoing URLs的确非常便捷,但是这样做也是非常危险的,因为一旦你改变了自己应用程序的URL架构,你就打破了所有手动创建的Outgoing URLs。你必须排查修改所有的View里面的Outgoing URLs,并更新所有的Controller和Action中对这些URL的引用。 Routing System能够从URL架构创建URL,因此如果URL架构发生了变化,那么由此创建在View里面的Outgoing URLs也会随之发生改变。显然这种方式才是明智之举,但也需要我们在前期做一些初始化的工作,这是非常值得的,长远来看这会让我们获益匪浅。 下面会通过实例来说明,仍然借用前面的项目, 只不过做些修改:1)移除AdditionalControllers 2)修改RegisterRoutes如下: View Code 最简便的在View里面创建一个Outgoing URL就是调用Html.ActionLink方法。如:@Html.ActionLink("关于", "About").该方法是根据当前的URL架构创建URL的,查看页面的源文件可以发现该URL为<a href="/Home/About">关于</a>。假设我们改变URL架构如下: View Code 我们会得到这样的一个URL:<a href="/App/DoAbout">关于</a> 理解输出的URL路由匹配 通过上面的介绍,我们已经了解了路由系统是怎么根据URL架构的改变来创建的Outgoing URL的。应用程序通常会定义若干路由,所以理解路由怎样被选中来进行URL创建就非常重要。路由系统是按照路由被添加到RouteCollection里面的顺序来处理的,RouteCollection对象是要传递给RegisterRoutes方法。对每一个路由会根据下面三个条件来进行是否匹配的检查: 1)提供的值必须对定义在URL模式里面的每一个segment变量是可用的。 为每一个segment寻找值时遵循如下规则: 首先,路由系统会在我们提供的值,也就是定义在匿名类型的属性里面的值中寻找 其次,在当前请求的变量值里寻找 最后,在我们定义路由时提供的默认值里面寻找 2)我们提供的segment变量的值可能都与定义在route里面的默认变量(default-only)一致。这些变量的默认值已经提供,但是这些变量并没有出现在我们定义的URL模式中。 例如有这样一个路由:routes.MapRoute("MyRoute", "{controller}/{action}", new { myVar = "true" });其中myVar就是default-only变量,为了让这个路由匹配, 我们必须注意不要为myVar提供一个值或确保我们提供的值能够匹配默认值。 3)所有segment变量的值必须满足路由约束 要明确的是:路由系统不是寻找最佳的匹配路由,仅仅是找第一个匹配的然后用它创建URL。只有找到了一个匹配的路由,那么路由系统就会忽略后面所有的路由。因此,我们定义路由时一定按照从具体到模糊的顺序。 下面进行单元测试Outgoing URLs View Code 针对其他控制器(Targeting Other Controllers) ActionLink方法默认是假定我们针对的是同一个Controller中的action方法,由该action方法来呈现view。如果要指定其他的Controller可以多加个参数如:@Html.ActionLink("About this application", "About", "MyController")。 传递额外的值(Passing Extra Values) 我们可以使用匿名类型的属性来传递segment变量的值。如@Html.ActionLink("About this application", "About", new { id = "MyID" })。生成的URL如下: <a href="/Home/About/MyID">About this application</a> 理解segment变量的重用 在我们描述路由匹配到传出的URLs时,我们提到当为每一个segment变量寻找值时,路由系统将会从当前的请求中寻找。现在我们定义这样一个路由如下: routes.MapRoute("MyRoute","{controller}/{action}/{color}/{page}") 接着在Index视图里面定义这样一个连接:@Html.ActionLink("点我啊", "Index", "Home", new { page = 789}, null).运行程序首先输入如下URL: http://localhost:<port>/Home/Index/Purple/123。页面呈现的链接是:<ahref="/Home/Index/Purple/789">点我啊</a>. 我们定义链接时并没有给color赋值,而这里的Purple是怎么来的呢? 这就是重用了刚开始传入的URL:http://localhost:<port>/Home/Index/Purple/123中的color值Purple。而且路由系统是重用page之前的segment变量的值。当我们对ActionLink做下修改:@Html.ActionLink("Click me", "List", "Catalog", new {color="Aqua"}, null); 这里我们提供了color的值,因为color在page之前,所以这里不会重用传入URL的color值。展示为:<ahref="/?color=Red">点我啊</a> 这里强烈建议我们避免这种行为出现,而是在定义URL模式时提供你需要的所有segment变量的值。 当我们提供的值跟segment变量的值不一致时,这个值会作为querystring附加在URL的后面。 例如:@Html.ActionLink("About this application", "About", new { id = "MyID", myVariable = "MyValue" }),创建的连接显示如下: <a href="/Home/About/MyID?myVariable=MyValue">About this application</a> 。 如果我们提供的值碰巧跟默认值一样,这时路由系统会忽略来自Outgoing URL的变量。例如:创建这样一个链接 @Html.ActionLink("About this application", "Index", "Home") 。显示的链接就是这样:<a href="/">About this application</a> 指定HTML属性 我们可以为创建的链接指定css样式,如可以指定一个样式类别为myCSSClass可以这样做: @Html.ActionLink("About this application", "Index", "Home", null, new {id = "myAnchorID",@class = "myCSSClass"})注意这里用了一个"@"符号,因为class是C#里面关键字,这里需要的是HTML样式类名。这样展示的<a>标签会多一个属性:<aclass="myCSSClass"href="/" id="myAnchorID">About this application</a> 创建绝对路径的URL 前面创建的都是相对路径,我们还可以创建全路径如下: @Html.ActionLink("About this application", "Index", "Home", "https", "myserver.mydomain.com", "myFragmentName",new { id = "MyId"}, new { id = "myAnchorID", @class = "myCSSClass"}) 。 这里建议我们尽量使用相对路径。因为全路径依赖于呈现给用户的应用程序的基础架构,有太多依赖绝对路径的大的应用程序最后因为网络基础设施或域名策略的改变而被破坏,而这种变化常常是程序员无法控制的。 有时我们需要将URL作为文本显示在页面上,这是可以是用Url.Action(),用法跟Html.ActionLink类似。 根据Routing Data创建链接或URL 如@Html.RouteLink("Routed Link", new { controller = "Home", action = "About", id="MyID"})。 在页面展示的链接如下: <a href="/Home/About/MyID">Routed Link</a> 使用Url.RouteUrl方法可以让创建的链接以文本形式显示。 在Action方法里面创建Outgoing URLs 大多数情况下,我们会在View里面创建Outgoing URLs,但有些时候我们也需要在action方法里面做类似的事情。方法一样,如下所示: View Code 根据一个具体的Route创建URL 我们在使用routes.MapRoute()时一般传了一个名字作为参数,如下面这样的: routes.MapRoute("MyRoute", "{controller}/{action}"); routes.MapRoute("MyOtherRoute", "App/{action}", new { controller = "Home" }); 给route命名有如下两个理由: 1.可以用来提示该路由的作用 2.在创建Outgoing URL时可以选择具体的route 我们在使用@Html.ActionLink("Click me","About")时具体会选择那一个route呢? 答案就是:定义在RegisterRoutes()里面的第一个route。这里选择的就是MyRoute。当然我们也可以自己指定一个route,如@Html.RouteLink("Click me", "MyOtherRoute", new { action = "About" }); 不建议使用命名路由的情形 创建Outgoing URL依赖route命名会打破"分解关注点"(这是MVC设计模式的核心思想)。当在view或action里面创建URL或链接时,我们的关注点是用户将被定向到的action和Controller,不是要使用的URL格式。所以我们倾向于避免给route命名,而是是用null代替。 好了,今天的笔记做到这里! 周末愉快! 本文转自Rt-张雪飞博客园博客,原文链接http://www.cnblogs.com/mszhangxuefei/archive/2012/02/18/mvcnotes_19.html如需转载请自行联系原作者 张雪飞

优秀的个人博客,低调大师

《Pro ASP.NET MVC 3 Framework》学习笔记之三【MVC模式介绍】

主题:MVC模式 1.MVC的历史: MVC(model-view-controller)这个概念在20世纪70年代就已经被使用了,MVC是从Smalltalk项目中提出的。所以原始的MVC模式所包含非常好的细节跟Smalltalk项目的具体概念是紧密相关的。我们假定View是无状态的,跟mvc的应用程序的交互遵循这样一个的过程:用户产生行为造成view更新,这刚好跟Web应用程序通过HTTP请求和响应的本质吻合。而且,mvc强调分解关注点的思想--领域模型和控制逻辑跟UI的松耦合,这意味着大量的HTML是可以独立其他部分而存在,这也使得维护和测试更加的简单。当然,这也是Ruby on Rails在mvc里面一直推崇和主张的,也是许多其他的MVC框架吸收和阐释的一个优点,当然也包括了ASP.NET MVC框架。 2.理解MVC模式: Models:控制或呈现用户(users)处理的数据,可以是仅仅用来呈现在View和Controller之间传递数据的view model;也可以是相对复杂的包含在业务领域里面,用来执行操作,传输,处理规则的数据。 Views:作为UI,负责呈现数据给客户端,也就是最终的HTML页 Controllers:处理请求,执行对model的操作,并选择一个View来把model的数据呈现给浏览器或者说是用户。 Models是对整个应用程序所工作的环境的定义,例如在一个银行系统中,model代表了程序支持的所有一切,比如总账,客户的信用额度等等,以及可以用来操控数据的所有操作(诸如,存款和取款的操作),我们也越发知道Models对于整个mvc应用程序的重要性。 Models同样可以从它不负责的那方面来理解,比如它不负责呈现UI和处理各种请求,这些属于Views和Controllers的工作,Views除了负责展示model的成员给用户别无其他的工作,也就是说,Views是不知道Models的存在的,也不会跟Models有任何直接的联系。Controllers才是Views跟Models之间的桥梁,当有来自客户端的请求时,Controllers就会选择一个合适的View来响应用户的请求。 如果有必要,在Models里面也会实现一些必要的操作。可以说,MVC架构的每个部分都得到了很好的定义和划分,这也正是MVC一直贯彻的"分解关注点"的思想:对数据操控的逻辑都包含在Models里面;对数据的展示逻辑都包含在Views里面;处理用户请求和输入的逻辑都包含在Controllers里面。伴随着这样一个非常清晰明确的分工,我们的程序会变得更加容易维护和扩展,甚至是系统非常庞大了以后也一样。 3.理解领域模型(Domain Model) 前面也有说过,MVC里面最重要的部分就是Domain Model(至于什么是Domain Model前面的笔记有过介绍),我们根据应用程序必须支持的行业或者活动中存在的现实世界的实体,操作,以及规则把这些称为领域(Domain),在此基础上来创建Models的。创建的Model也自然可以称为Domain Model。对于用C#开发的人来说,Domain Model就是一套C#类型(类,结构等)的集合,把这些统称为领域类型(Domain Type).通过定义在领域类型里面的方法表示对领域的各种操作,并且领域的规则也表示在了这些方法里面,当我们创建了一个领域类型(Domain Type)的实例时,也就是创建了一个领域对象(Domain Object),领域模型通常是持久化的,当然持久化有很多方式,通常情况下利用关系型数据库。 为了进一步分解ASP.NET MVC应用程序的领域模型,会将model放在不同的C# assembly里面。这样我们就可以从程序的其他部分创建到领域模型(Domain Model)的引用,这对应规模较大的项目尤其有用。 4.ASP.NET的MVC实现 在MVC中,Controllers是C#类,通常继承了System.Web.Mvc.Controller类,每一个公有的方法我们称为Action Method,这些Action方法通过ASP.NET Routing System(路由系统)跟可配置的URL相关联。为了实现一些Domain Model里面的操作,Controllers里面的语句会被执行,之后选择一个View呈现到客户端。下面的图很好的展现了这样一个过程: 从上面的图我们也能清楚的看到,View是不依赖Controller的,也不知道Controller的存在,更加不会发生直接的联系。ASP.NET MVC3提供了一种新的View Engine--Razor,当然以前的aspx视图引擎仍然可以直接用的,在MVC里面,我们可以选择任意的方式去实现Domain Model,而不会有任何的限制。 这里也有传统的三层架构的图解过程,如下所示: 对比一下,我们也能体会MVC架构的一些优点吧。 传统的三层架构也是一个很大的跨越。现在被广泛的应用在了各种业务系统里面,它对应UI的如何实现没有任何限制,不管你是Winform还是Webfrom,或是其他的,都可以应用。在没有太复杂的情况下提供了对关注点的分解。当我们仔细看时,给DAL创建单元测试相对容易些。并且三层架构跟MVC看起来有非常相似的地方,但是MVC跟三层却是完全不同的东西,不要把两者混淆了。按照老赵在MSDN里面的说法(我看过几个相关的MSDN的MVC教程),MVC是一种呈现模式,而三层是一种架构模式。 对应三层:当我们的UI层 耦合了按钮事件以后,会使得自动化的单元测试几乎不可能实现。 5.MVC也有很多的变体,例如:Model-View-Presenter Pattern(MVP模式),Model-View-View Model Pattern(MVVM模式) 今天的笔记先做到这里,明天继续。 我刚学MVC,对于书里面的理解肯定会有错误,请路过的大牛多多指正,谢谢 祝路过的朋友工作顺利! 本文转自Rt-张雪飞博客园博客,原文链接http://www.cnblogs.com/mszhangxuefei/archive/2011/12/03/mvcnotes_3.html如需转载请自行联系原作者 张雪飞

优秀的个人博客,低调大师

《从零开始学Swift》学习笔记(Day 52)——Cocoa错误处理模式

Swift错误处理模式,在Swift1.x和Swift 2.0是不同的两种模式。 Swift 1.x代码错误处理模式采用Cocoa框架错误处理模式,到现在Objective-C还沿用这种处理模式,而Swift2.0之后采用了do-try-catch错误处理模式。 下面的示例代码是从文件中读取字符串到内存中,如果使用Swift 1.x错误处理模式代码如下: 1 2 3 4 5 6 7 8 9 10 import Foundation varerr:NSError? //定义可选的NSError?变量 letcontents=NSString(contentsOfFile:filePath, encoding:NSUTF8StringEncoding,error:&err) if err!=nil{ //判断err变量是否还是nil //错误处理 } NSError?一定是可选的变量,因为要给它初始化为nil。 判断err变量是否还是nil,如果还是nil在代码 1 2 letcontents=NSString(contentsOfFile:filePath, encoding:NSUTF8StringEncoding,error:&err) 方法调用过程中没有发生错误,否则说明有错误发生。 上述代码的构造函数,它的Swift语法定义如下: 1 2 3 init?(contentsOfURLurl:NSURL, encodingenc:UInt, errorerror:NSErrorPointer) 构造函数的最后一个参数是NSErrorPointer(即NSError指针),那么在实际调用时候我们需要传递err变量地址(即&err),&是取地址符。当方法调用完成后,如果有错误则err变量会被赋值。 本文转自 tony关东升 51CTO博客,原文链接:http://blog.51cto.com/tonyguan/1748299,如需转载请自行联系原作者

优秀的个人博客,低调大师

《从零开始学Swift》学习笔记(Day 10)——运算符是“ +、-、*、/ ”吗?

运算符是用于执行程序代码运算,会针对一个或一个以上操作数项目来进行运算。例如:2+3,其操作数是2和3,而运算符则是“+”。那么“+、-、*、/”是运算符。 运算符有哪几种呢? 在Swift语言中主要的运算符包括算术、关系、逻辑、位运算符等。 “+、-、*、/”是算术运算符中的二元运算符,一元运算符是是-、++和--。 二元运算符: + 加 求和,还可用String类型,进行字符串连接操作 -减 求差 *乘 求积 /除 求商 %取余求余数 一元运算符: -取反符号取反运算 ++自加一先取值再加一,或先加一再取值 --自减一先取值再减一,或先减一再取值 本文转自 tony关东升 51CTO博客,原文链接:http://blog.51cto.com/tonyguan/1746085,如需转载请自行联系原作者

优秀的个人博客,低调大师

Hadoop Hive概念学习系列之hive里的HiveQL——查询语言(十五)

Hive的操作与传统关系型数据库SQL操作十分类似。 Hive主要支持以下几类操作: DDL 1、DDL:数据定义语句,包括CREATE、ALTER、SHOW、DESCRIBE、DROP等。 详细点,就是 Hive支持大量SQL数据定义语言(Data Definition Language,DDL)中的现有功能,包括以下各种语句: CREATE DATABASE/SCHEMA,TABLE,VIEW,FUNCTION,INDEX DROP DATABASE/SCHEMA,TABLE,VIEW,INDEX TRUNCATE TABLE ALTER DATABASE/SCHEMA,TABLE,VIEW MSCK REPAIR TABLE (or ALTER TABLE RECOVER PARTITIONS) SHOW DATABASES/SCHEMAS,TABLES,TBLPROPERTIES,PARTITIONS,FUNCTIONS,INDEX[ES] DESCRIBE DATABASE,table_name,view_name 具体,见 Hive的数据类型和DDL见 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL DML 2、DML:数据操作语句,包括LOAD DATA,INSERT(将查询结果写入Hive表或文件系统中)。 注意,Hive的设计中,没有考虑UPDATE操作。 详细点,就是 Hive支持大量SQL数据定义语言(Data Manipulation Language,DML)中的现有功能,包括以下各种语句: 使用where条件过滤表的行 使用列或子查询的select表达式 使用等值连接,连接多张表 合并表的所有行或子查询 针对多个“分组”的列进行聚合计算 将查询结果存入另一张表 导出表中的内容到本地目录或HDFS目录中 Hive支持的原生数据类型 数值类型 TINYINT (1字节有符号整型) SMALLINT(2字节有符号整型) INT(4字节有符号整型) BIGINT(8字节有符号整型) FLOAT(4字节单精度浮点数) DOUBLE(8字节双精度浮点数) DECIMAL(用户定义精度和尺寸) 日期/时间类型 TIMESTAMP(传统的UNIX时间戳,精度到纳秒) DATE(使用YYYY-MM-DD格式的日期,没有时刻信息) 字符串类型 STRING(不指定长度) VARCHAR(1~65535个字符) CHAR(1~225个字符,固定长度,不足255长度会在末尾补齐空格) 其他类型 BOOLEAN BINARY Hive支持的符合数据类型 Struct:不同类型数据的集合 Array:相同类型的集合 Map:键值对数据类型的集合 QUERY 3、QUERY:数据查询语句,主要是SELECT语句。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/6105543.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

openstack学习笔记五 多节点部署之 rabbitmq信息中枢与元数据

元数据 rabbitmq信息中枢 rabbitmq信息中枢 所有组件通信的时候 实用 AMQP 高级消息队列 qpid rabbitmq 端口5672 sll加密5671 1 2 3 192.168.1.201h1.hequan.comh1 192.168.1.202h2.hequan.comh2 192.168.1.203h3.hequan.comh3 在h3上操作 配置YUM源 把openstack软件包上传到openstack目录下 1 2 3 4 5 6 7 8 [openstack] name=openstack baseurl= file : ///openstack enabled=1 gpgcheck=0 yumcleanall yummakecache [root@h1yum.repos.d] #yuminstall-yrabbitmq-server.noarch 1 2 3 4 5 [root@h3~] #systemctlstartrabbitmq-server.service [root@h3~] #systemctlenablerabbitmq-server.service [root@h3~] #netstat-lntup|grep5672 tcp000.0.0.0:256720.0.0.0:*LISTEN1354 /beam .smp tcp600:::5672:::*LISTEN1354 /beam .smp #使用这个 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [root@h1keystone] #egrep-v'^$|^#'keystone.conf|greprabbit [oslo_messaging_rabbit] rabbit_host=localhost rabbit_port=5672 rabbit_hosts=localhost:5672 rabbit_use_ssl=False rabbit_userid=guest #默认用户 rabbit_password=guest rabbit_virtual_host=/ rabbit_ha_queues=False [root@h3~] #cd/etc/rabbitmq/ [root@h3rabbitmq] #ls rabbitmq.config ##配置文件 [root@h1rabbitmq] #catrabbitmq-env.conf NODE_PORT=5672 可以用web管理 1 2 3 4 5 6 7 8 9 10 11 12 13 [root@h3rabbitmq] #rabbitmq-pluginslist##查看插件 [root@h3rabbitmq] #rabbitmq-pluginsenablerabbitmq_management##启用管理插件 Thefollowingpluginshavebeenenabled: mochiweb webmachine rabbitmq_web_dispatch amqp_client rabbitmq_management_agent rabbitmq_management Pluginconfigurationhaschanged.RestartRabbitMQ for changestotakeeffect. [root@h3rabbitmq] #systemctlrestartrabbitmq-server.service [root@h3rabbitmq] #netstat-lntup|grep15672 tcp000.0.0.0:156720.0.0.0:*LISTEN1976 /beam .smp http://192.168.1.203:15672/ 用户guest 密码guest 元数据metadata 查看控制节点 网卡设置是否有问题 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [root@h1~] #ovs-vsctlshow c34056d1-7b80-437f-b73c-5bf05258d303 Bridgebr-ex Port "qg-c4dff563-63" Interface "qg-c4dff563-63" type :internal Port "qg-62a3088b-40" Interface "qg-62a3088b-40" type :internal Port "qg-df2db69c-60" Interface "qg-df2db69c-60" type :internal Port "eth0" Interface "eth0" Portbr-ex Interfacebr-ex type :internal [root@h1~] #cat/proc/sys/net/ipv4/ip_forward##转发功能 1 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 [root@h2~] #cd/etc/nova/ [root@h2nova] #grepmetadatanova.conf #Numberofmetadataitemsallowedperinstance(integervalue) #quota_metadata_items=128 #enabled_apis=ec2,osapi_compute,metadata #OpenStackmetadataservicemanager(stringvalue) #metadata_manager=nova.api.manager.MetadataManager #TheIPaddressonwhichthemetadataAPIwilllisten.(stringvalue) #metadata_listen=0.0.0.0 #TheportonwhichthemetadataAPIwilllisten.(integervalue) #metadata_listen_port=8775 #Numberofworkersformetadataservice.Thedefaultwillbethenumberof #metadata_workers=<None> #Listofmetadataversionstoskipplacingintotheconfigdrive(string #vendordata_driver=nova.api.metadata.vendordata_json.JsonFileVendorData #Timeinsecondstocachemetadata;0todisablemetadatacachingentirely #metadataAPIwhenunderheavyload.Highervaluesmayincreasememoryusage #andresultinlongertimesforhostmetadatachangestotakeeffect.(integer #metadata_cache_expiration=15 #TheIPaddressforthemetadataAPIserver(stringvalue) #metadata_host=$my_ip metadata_host=192.168.1.201 ################主机 #TheportforthemetadataAPIport(integervalue) #metadata_port=8775 #SetflagtoindicateNeutronwillproxymetadatarequestsandresolve #service_metadata_proxy=false #SharedsecrettovalidateproxiesNeutronmetadatarequests(stringvalue) #metadata_proxy_shared_secret= 实例云主机 可以查看metadate的设置数据 1 2 3 4 5 curlhtt: //169 .254.169.254 /2009-04-04/meta-data/ hostname local -ipv4 public-ipv4 seruity- groups 安全组 本文转自 295631788 51CTO博客,原文链接:http://blog.51cto.com/hequan/1796041,如需转载请自行联系原作者

优秀的个人博客,低调大师

Spark RDD概念学习系列之RDD的重要内部属性(十五)

RDD的重要内部属性 通过 RDD 的内部属性,用户可以获取相应的元数据信息。通过这些信息可以支持更复杂的算法或优化。 1)分区列表:通过分区列表可以找到一个 RDD 中包含的所有分区及其所在地址。 2)计算每个分片的函数:通过函数可以对每个数据块进行 RDD 需要进行的用户自定义函数运算。 3)对父 RDD 的依赖列表:为了能够回溯到父 RDD,为容错等提供支持。 4)对 key-value pair 数据类型 RDD 的分区器,控制分区策略和分区数。通过分区函数可以确定数据记录在各个分区和节点上的分配,减少分布不平衡。 5)每个数据分区的地址列表(如 HDFS 上的数据块的地址)。如果数据有副本,则通过地址列表可以获知单个数据块的所有副本地址,为负载均 衡和容错提供支持。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5724033.html,如需转载请自行联系原作者

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册