Java无处不在:使用DukeScript在任何地方运行一次编写

在相当长一段时间内,Java都未能兑现“一次编写,随处运行”的承诺。 DukeScript希望通过在跨平台应用程序中实现视图和逻辑的清晰分离来改变这种状况。 在本文中,一个简单的场景用于介绍DukeScript的基础。

多年来,Java Swing使开发人员能够编写可以在任何操作系统上运行的应用程序。 随着智能手机,平板电脑和嵌入式计算机的问世,一切都结束了。 在企业中,台式机占据了很多年。 但是,与此同时,每个IT项目都包括未来的计划,将来需要将应用程序移植到移动平台。 为所有平台构建本机应用程序需要特殊技能,并且在维护和开发方面都非常昂贵。 什么是要做?

DukeScript( DukeScript.com )再次为您提供了基于Java的解决方案,使您可以开发跨平台应用程序。 DukeScript提供了视图和逻辑的清晰分隔,使UI设计人员可以专注于UI设计,而编码人员可以专注于编写经过良好测试的应用程序代码。

两全其美的

DukeScript的基本思想很简单。 每个操作系统都可以运行基本的Java应用程序。 在Android上,这是通过Dalvik Runtime和ART本身完成的,在iOS上您具有RoboVM ,在其他许多平台上,您具有OpenJDK和Oracle的Java SE Embedded 。 同时,有一系列Java虚拟机可用于浏览器( TeaVM , Doppio , Bck2Brwsr ),这些虚拟机无需浏览器插件即可运行。 但是,这里缺少的是统一视图技术,而与此同时,几乎所有平台上都提供了现代HTML渲染器组件。 将这些不同的技术,虚拟机和组件组合在一起时,便具有了全面框架的基础。

通过将所有这些部分组合在一起,可以同时利用其所有优势。 例如,由于Java具有静态类型,因此在所有编程语言中,Java都提供了最佳的IDE支持,并使可维护的代码得以编写并易于重构。 由于这些原因,它比JavaScript更适合用作大型项目的语言。 在UI方面,对于HTML和CSS,您可以访问免费的商业框架和服务库。 当UI和业务逻辑彼此清晰地分开时,我们可以毫无例外地,不受任何限制地利用完整的武器库。 为了证明这些观点,我们现在将开发和设计待办事项应用程序。

ViewModel

DukeScript使用Model-View-ViewModel(MVVM)设计模式将可视化和逻辑分离。 View是用标记语言定义的,并声明性地将活动元素绑定到ViewModel的属性。 通过这种体系结构,ViewModel不需要了解View。 无需任何更改,即可从ViewModel换出View。 所有View逻辑都在ViewModel中定义。 在MVVM模式中,模型是应用程序的其余部分,而如何可视化模型则是不确定的,因此是无限的。

epple_dukescript_1a

让我们从ViewModel开始。 清单1显示了如何创建ViewModel。 @Model批注确保将生成名为Task的类。 同时,将自动创建属性titlecomplete的 setter和getter。 这使开发人员不必编写一堆代码,并且ViewModel类的结构紧凑且一目了然。 创建过程会在后台自动进行,因此在IDE中进行开发时可以立即使用该类。

清单1

@Model(className = "Task", properties = {
@Property(name = "title", type = String.class),
@Property(name = "complete", type = boolean.class)
})
public static class TaskModel {}

对于更复杂的任务,我们可以包装模型。 清单2显示了一个TaskListViewModel ,它表示Tasks列表以及其他属性。 @Function批注标记可以从View调用的方法。

清单2

@Model(className = "TaskListViewModel", properties = {@Property(name = "input", type = String.class),@Property(name = "tasks", type = Task.class, array = true),@Property(name = "editing", type = Task.class)
}, targetId = "body")
final class TaskListViewModelDefinition {@Functionpublic static void editTask(TaskListViewModel list, Task data) {list.setEditing(data);}@Functionpublic static void stopEditing(TaskListViewModel list) {list.setEditing(null);}@Function@ModelOperationpublic static void deleteTask(TaskListViewModel model, Task data) {model.getTasks().remove(data);}@Function@ModelOperationpublic static void addTask(TaskListViewModel model) {if (null == model.getInput() || model.getInput().length() == 0) {return;}Task task = new Task(model.getInput(), false);model.setInput(""); model.getTasks().add(task);}
}

使用DukeScript进行单元测试

上面代码中的两个方法被标记为@ModelOperation 。 在DukeScript中,您使用的方法也需要从View外部调用,在我们的示例(清单3)中,这是一个单元测试。 该测试显示了如何使用生成的ViewModel。 在第一个测试用例中,我们模拟用户输入一个新任务(输入一个输入( setInput )并确认输入,例如通过按钮或Enter键( addTask )来键入新任务。 即使还没有View,我们已经可以测试ViewModel的方法了。 这种情况确实很好地显示了组件的干净去耦。

清单3

public class TodoListTest {@Testpublic void testAddTask() {TaskListViewModel taskList = new TaskListViewModel();Assert.assertEquals(taskList.getTasks().size(), 0);taskList.setInput("Buy milk!");taskList.addTask();Assert.assertEquals(taskList.getTasks().size(), 1);Task task = taskList.getTasks().get(0);Assert.assertEquals(task.getTitle(), "Buy milk!");}@Testpublic void testDeleteTask() {TaskListViewModel taskList = new TaskListViewModel();taskList.getTasks().add(new Task("Buy milk!", false));Assert.assertEquals(taskList.getTasks().size(), 1);Task task = taskList.getTasks().get(0);taskList.deleteTask(task);Assert.assertEquals(taskList.getTasks().size(), 0);}
}

JSON序列化

当您查看定义ViewModel类的注释时,您应该注意到它们看起来有点像JSON消息。 这并非巧合,因为DukeScript能够轻松地与JSON集成,因此具有巨大的价值。 ViewModel类的toString方法返回JSON字符串。 就像您可以轻松地从JSON字符串创建ViewModel对象一样。 清单4展示了ViewModel如何再次序列化和反序列化。 当您只需要一个对象的副本时,请使用clone方法。 Models.parse的目的是反序列化来自服务器或本地持久化数据的消息 。

清单4

TaskListViewModel copy;
String json = original.toString();
InputStream inputStream = new ByteArrayInputStream( json.getBytes(StandardCharsets.UTF_8));
try {copy = Models.parse(BrwsrCtx.findDefault(TaskListViewModel.class),TaskListViewModel.class, inputStream);
} catch (IOException ex) {Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}

风景

默认情况下,DukeScript使用HTML定义视图。 由于将View与ViewModel完全分开,因此也可以使用其他格式。 dukescript-javafx项目演示了它是如何工作的。 通过该项目,可以在JavaFX应用程序中轻松可视化DukeScript ViewModels。 在这种情况下,用于定义视图的语言是FXML。 Controls.js还使用另一种格式来定义View,本文稍后将对此进行讨论。

对于本文中创建的“待办事项列表”应用程序,我们将仅使用清单5所示的标准HTML格式。依赖于ViewModel的元素将使用data-bind属性。 这样,它们以声明方式绑定到ViewModel的属性和方法。 同样,可以用这种方式定义for-each循环和条件语句。

在大多数情况下, 数据绑定属性可以完成您需要的所有操作。 但是,有时您需要创建一个HTML元素,尽管View可能不需要HTML元素。 对于这些情况,有特殊的评论。 在下面清单5的示例中,通过<!– ko foreach:tasks –>遍历Tasks列表,而<!– / ko –>关闭循环。 可以从清单5中的注释以及DukeScript网站中了解有关绑定语法的更多信息。

清单5

<ul><!-- Iterate over the List of Tasks in the TaskListViewModel --><!-- ko foreach: tasks --><li><!-- When the Task is not being edited... --><!-- ko ifnot: $root.editing()===$data --><!-- ...bind the checkbox state to the Task property named "complete" --><input type="checkbox" name="" data-bind="checked: complete"/><!--...bind the text of the span to the Task property named "title" --><span data-bind="text: title"></span><span class="btns"><!-- ...on click, call the 'editTask' method --><button  data-bind="click: $root.editTask">Edit</button><!-- ...on click, call the 'deleteTask' method --><button  data-bind="click: $root.deleteTask">Delete</button></span><!-- /ko --><!-- When the Task is being edited, show an input field... --><!-- ko if: $root.editing()===$data --><!-- ...on Submit (Enter) call the 'stopEditing' method --><form data-bind="submit: $root.stopEditing"><!-- ...bind the entered text to the Task property named "title"`--><input type="text" data-bind="textInput: title"/></form><!-- /ko --></li><!-- /ko --><li><!-- On Submit (Enter) call the 'addTask' method... --><form data-bind="submit: addTask"><!-- ...bind the entered text to the Task property named "input" --><input type="text" data-bind="textInput: input"/></form></li>
</ul>

上面定义的功能原型如下图所示。 从视觉上看,它可能看起来有点谦虚,所以让我们在以下各节中进行更改!

eppleton-english-4

设计者/开发者实验

在DukeScript到来之前,已经出现了其他几个框架,它们有望将设计与开发脱钩。 在现实世界中,几乎没有希望保留的诺言。 设计往往需要专有工具,这些工具所引起的仅仅是专业设计师的疲倦之笑。 JavaFX就是一个例子。 使用JavaFX Scene Builder,您甚至都无法创建多边形, 而该工具的未来却一无所知 。 此外,创建设计的任务往往留给开发人员,开发人员需要花时间适应各种不同且相互冲突的工具。

为了测试DukeScript是否可以更好地解决所有问题,我给自己设定了一个小挑战。 我首先为待办事项应用程序找到并购买了完整的设计 ,如下面的屏幕快照所示。

eppleton-english-3

然后,我到处找人将PSD文件更改为HTML(当您搜索“ PSD到HTML”时,可以在线找到数百个服务用于此任务)。 我最终选择了Rapidxhtml,因为该服务价格便宜,尽管如此,但受到了好评。

对于“真实”项目,并确保更好的沟通,我绝对希望与设计师直接互动。 但是,对于本实验而言,将通信限于信用卡和Web表单是一个优点,因为通过这种方式,我们可以确保设计人员不了解DukeScript可能需要的任何特殊要求。

我将PSD文件上传到网站并指出我的样式要求。 例如,由于适用的样式更加精细,因此复选框和滚动条会额外花费。 因此,我决定不进行这些更详细的选择。 最后,完整的订单并不昂贵。 每页的转换成本,包括所有选定的额外功能(调整宽度,带有CSS3HTML5等),约为170欧元。付款是预先付款的,原则上是在24小时内交付。 听起来不错,我等着悬念。

6小时后,我已经收到一封包含该设计链接的电子邮件。 不错。 乍一看,结果看起来不错,尽管宽度调整不起作用。 两个小时后,在回复了我的评论后,我有了一个能够正确调整大小的新版本。 下面的屏幕截图显示了结果。

epple_dukescript_4

关于小缺陷的进一步评论被忽略。 对于“实际”项目,优质服务或具有适用建议的设计机构可能是一个更好的选择。 清单6显示了我收到HTML。

清单6

<!DOCTYPE html>
<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head><title>TODO</title><meta name="robots" content="index, follow"><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta name="author" content="RapidxHTML" /><link rel="stylesheet" href="css/normalize.css"><link rel="stylesheet" href="css/style.css"></head><body><!--[if lt IE 7]><p class="chromeframe">You are using an outdated browser.<a href="http://browsehappy.com/">Upgrade your browser today</a> or <a href="http://www.google.com/chromeframe/?redirect=true">install Google Chrome Frame</a> to better experience this site.</p><![endif]--><!-- box --><div id="box"><div class="box-cont"><header class="box-header"><div class="box-title">My tasks for today</div><div class="box-links"><a href=""><img src="images/btn-cal.png" alt="" /></a><a href=""><img src="images/btn-settings.png" alt="" /></a></div></header><section class="todo"><section class="todo-bg"><ul class="todo-list"><li class="done"><input type="checkbox" name="" class="toggle" checked="checked" />Design a to-do list <span class="btns"><a href=""><img src="images/icon-edit.png" /></a><a href=""><img src="images/icon-delete.png" /></a></span></li><li><input type="checkbox" name="" class="toggle" />Design a super task<br />with 2 lines <span class="btns"><a href=""><img src="images/icon-edit.png" /></a><a href=""><img src="images/icon-delete.png" /></a></span></li><li><input type="checkbox" name="" class="toggle" />fix the dog toy <span class="btns"><a href=""><img src="images/icon-edit.png" /></a><a href=""><img src="images/icon-delete.png" /></a></span></li><li><input type="checkbox" name="" class="toggle" />buy coffee <span class="btns"><a href=""><img src="images/icon-edit.png" /></a><a href=""><img src="images/icon-delete.png" /></a></span></li><li><input type="checkbox" name="" class="toggle" />feed the dog <span class="btns"><a href=""><img src="images/icon-edit.png" /></a><a href=""><img src="images/icon-delete.png" /></a></span></li><li><input type="checkbox" name="" class="toggle" />take a walk with the dog <img src="icon_smile.gif" alt=":)" class="wp-smiley"> <span class="btns"><a href=""><img src="images/icon-edit.png" /></a><a href=""><img src="images/icon-delete.png" /></a></span></li></ul></section></section></div></div><!-- / box --><script type="text/javascript" src="js/jquery.js"></script><script type="text/javascript" src="js/modernizr-2.6.2.min.js"></script></body>
</html>

接下来,我不得不为UI添加生命。 从原型开始,您已经在下面看到的绑定已经很熟悉了。 清单7显示了重写的代码。

清单7

<!DOCTYPE html>
<head><title>TODO</title><meta charset="utf-8"><link rel="stylesheet" href="css/normalize.css"><link rel="stylesheet" href="css/style.css">
</head>
<body id="body"><!-- box --><div id="box"><div class="box-cont"><header class="box-header"><div class="box-title">My tasks for today</div><div class="box-links"><a href=""><img src="images/btn-cal.png" alt="" /></a><a href=""><img src="images/btn-settings.png" alt="" /></a></div></header><section class="todo"><section class="todo-bg"><ul class="todo-list" ><!-- ko foreach: tasks -->   <li><!-- ko ifnot: $root.editing()===$data --><input type="checkbox" name="" class="toggle" data-bind="checked: complete"/><span data-bind="text: title"></span><span class="btns"><img src="images/icon-edit.png" alt="" data-bind="click: $root.editTask"  /><img src="images/icon-delete.png" alt="" data-bind="click: $root.deleteTask" /></span><!-- /ko --><!-- ko if: $root.editing()===$data --><form data-bind="submit: $root.stopEditing"><input type="text" data-bind="textInput: title"/></form><!-- /ko --></li><!-- /ko --><li><form data-bind="submit: addTask"><input type="text" data-bind="textInput: input"/></form></li></ul></section></section></div></div><!-- / box -->
</body>
</html>

在下面的屏幕截图中,您可以看到结果。

eppleton-英语-1

UI看起来像设计示例,并且在所有平台上均起作用。 这样,实验取得了圆满成功-可以完全委托设计。 在没有特殊要求的情况下,设计人员和转换服务能够提供可用的资产,这些资产可以以最小的更改集成到应用程序中。

通过这种方式,开发人员能够完全专注于所需功能的实现,并专注于应用程序的业务逻辑。 那些具有桌面应用程序开发经验的人都知道,定期转换应用程序设计会浪费大量开发时间。 使用DukeScript,您可以放心地将这些问题委托给设计专业人员,这可以节省宝贵的时间来实现应用程序的功能要求。

如何开发DukeScript应用程序

当前,DukeScript支持各种桌面平台以及iOS,Android和浏览器。 可用的Maven原型为每个受支持的平台创建一个单独的子项目。 对于每个平台,可以使用特定任务来测试和打包子项目。 例如,Android和iOS的子项目提供了在模拟器或连接的设备上运行它们的可能性,而浏览器的子项目会自动构建静态网站。

最新的增强功能已启用对嵌入式平台的支持,以使DukeScript可以在IoT应用程序中使用。 因此,由于Oracle 结束了对嵌入式平台上JavaFX的支持 ,因此现在再次有可能在嵌入式设备上使用Java开发专业的GUI。 在这些情况下,OpenJDK通常足以用作JVM,因此,即使对于商业项目,也不需要昂贵的Java SE嵌入式许可。

借助Maven原型,可以通过各种Java IDE完成DukeScript应用程序的开发。 专门针对NetBeans IDE,还有一个具有一系列支持功能的插件, 使开发更加舒适 。 例如,HTML编辑器中有data-bind指令的代码完成,而DOM Inspector使您可以检查正在运行的应用程序。 对HTML和CSS的更改将由正在运行的应用程序自动获取。 从0.8版开始,甚至Maven原型都引入了热插拔。 代码更改将自动部署到正在运行的应用程序中,并且可以立即进行测试,如下面的屏幕快照所示。 甚至JavaScript开发人员也应该嫉妒,因为与JavaScript开发不同,应用程序的状态得以保持,而无需进行任何手动重新加载。

eppleton-english-2

用于Java的Controls.js-不带HTML的DukeScript

DukeScript致力于在没有JavaScript的情况下实现跨平台开发。 通常,DukeScript应用程序的前端是在HTML和CSS的帮助下编写的。 如已显示的,可以委派应用程序开发的这一方面,同时它继续要求编写测试并针对各种平台进行修改,以及手动编辑HTML文件。

作为一种替代方法, Controls.js for Java项目使您可以通过拖放来开发完整的UI。 采用这种方法时,您将拥有Maven原型和一个NetBeans插件来为您提供支持。 Controls.js利用其自己的组件库。 每个单独的控件都可以通过外观显示,而外观编辑器用于创建自定义外观。 ViewModel保持不变,而绑定是在可视编辑器的帮助下完成的。

epple_dukescript_7

结论

最后,让我们研究一下百万美元的问题:“ DukeScript是否适合我的项目?” 优点很明显。

  • 使用通用的代码库,可以为许多平台开发应用程序。
  • 工作流程结构合理,同时可用丰富且完善的工具来为您提供支持。
  • 可以委派设计任务,从而极大地减少了应用程序维护和开发的成本。

尽管如此,DukeScript并不是每个应用程序的最佳解决方案。 对于那些对自己的品牌重视并具有统一的跨平台设计的人,DukeScript可以为他们提供更好的服务,而对于那些对其应用程序要部署到的设备本身的外观和感觉感兴趣的人,DukeScript可以提供更好的服务。 我也不会尝试通过DukeScript创建3D建模工具,也不会尝试通过优化的渲染管道来使用任何类型的应用程序。

但是,DukeScript是业务应用程序的很好选择。 对于简单的业务应用程序,使用Controls.js for Java会有所回报,从而可以实现快速的应用程序开发工作流程。 另外,由于其简单的通信机制,对于具有服务器后端的应用程序,DukeScript非常适合。 总体而言,DukeScript为Java开发人员提供了一个跨平台开发的顺利切入点,而无需放弃世界上使用最广泛的编程语言,该语言以静态方式提供了最佳的IDE支持,无疑比当今世界上任何其他编程语言都要好。

  • 本文经Geertjan Wielenga的翻译,由Anton Epple 用德语翻译 。

翻译自: https://www.javacodegeeks.com/2015/08/java-everywhere-write-once-run-anywhere-with-dukescript.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据仓库建设中的数据建模方法(转)

简介&#xff1a; 本文的主要内容不是介绍现有的比较流行的主要行业的一些数据模型&#xff0c;而是将笔者在数据仓库建设项目中的一些经验&#xff0c;在这里分享给大家。希望帮助大家在数据仓库项目建设中总结出一套能够合乎目前业界规范的&#xff0c;满足大部分行业数据仓库…

PAT 1065 A+B and C (64bit) (20)

1065. AB and C (64bit) (20) 时间限制 100 ms内存限制 65536 kB代码长度限制 16000 B判题程序 Standard作者 HOU, QimingGiven three integers A, B and C in [-263, 263], you are supposed to tell whether AB > C. Input Specification: The first line of the input gi…

十大有用但又偏执的Java编程技术

经过一段时间的编码&#xff08;以我为例&#xff0c;大约20年左右&#xff0c;当您玩得开心时光飞逝&#xff09;&#xff0c;人们开始接受这些习惯。 因为&#xff0c;你知道... 任何可能出错的事情都会发生。 这就是为什么人们会采用“防御性编程”的原因&#xff0c;即偏执…

NGUI 3.5教程(二)Label 标签 (Hello world)、多行文本

写在前面&#xff1a; 本文将创建NGUI的第一个样例。依照编程传统&#xff0c;第一个样例&#xff0c;就是做一个Hello world 显示出来。NGUI。我们用Label来实现 。欢迎大家纠错、拍砖&#xff01;原创非常辛苦&#xff0c;如有转载&#xff0c;请注明出处&#xff1a;htt…

linux下php可以实现哪些功能,基于Linux的远程管理系统的设计与实现(PHP)

基于Linux的远程管理系统的设计与实现(PHP)来源&#xff1a;2BYSJ.cn 资料编号&#xff1a;2SJ260700 资料等级&#xff1a;★★★★★ %D7%CA%C1%CF%B1%E0%BA%C5%A3%BA2SJ260700以下是资料介绍,如需要完整的请充值下载. 本资料已审核过,确保内容和网页里介绍一致. 密 惠1.无需…

tostring 16进制_ToString:身份哈希码的十六进制表示形式

tostring 16进制我以前在方便的Apache Commons ToStringBuilder上写过博客&#xff0c;最近有人问我&#xff0c;在生成的String输出中出现的看似神秘的文本是什么构成的。 询问该问题的同事正确地推测出他正在查看的是哈希码&#xff0c;但与他的实例的哈希码不匹配。 我解释说…

前端工程师应该掌握哪些技能才方便找工作?

作为前端工程师,必须掌握到一定的技能才方便找工作,找高薪工作,你需要掌握这些技能。 高清思维导图下载:https://download.csdn.net/download/weixin_41937552/14752706 目录 HTML5+CSS3 移动Web网页开发

延迟分析中的案例研究:锁定与同步

特别是在这篇文章中&#xff0c;我们将讨论&#xff1a; java.concurrent.Lock创建的垃圾 比较锁与同步 如何以编程方式测量延迟 争用对锁和同步的影响 协调遗漏对延迟测试的影响 回到我最喜欢的主题之一&#xff0c;垃圾创建/分配。 有关此主题的更多详细信息&#xff0…

思维脑图——数据分析实战(最新版)

导读:数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程。 在统计学领域,将数据分析划分为描述性统计分析、探索性数据分析以及验证性数据分析,探索性数据分析侧重于在数据之中发现新的特征,而验证…

java实现一个旅游网站

导读:采用JSP和Java语言以及html脚本语言,同时采用B/S模式,进行各个界面和每个功能的设计与实现,后台管理与设计选用了SQL Server 2005数据库,前台设计与后台管理相结合,共同完成各功能模块的功能。 目录 基本功能 项目结构 项目截图

【收藏】Android屏幕适配全攻略(最权威的Google官方适配指导)

来源&#xff1a;http://blog.csdn.net/zhaokaiqiang1992 更多&#xff1a;Android AutoLayout全新的适配方式&#xff0c; 堪称适配终结者 Android的屏幕适配一直以来都在折磨着我们这些开发者&#xff0c;本篇文章以Google的官方文档为基础&#xff0c;全面而深入的讲解了And…

精通推荐算法1:为什么需要推荐系统(系列文章,建议收藏)

作者简介&#xff1a; 腾讯算法研究员。硕士毕业于中国科学院大学。在阿里和腾讯工作多年&#xff0c;拥有丰富的搜索和推荐算法经验。CSDN博客专家&#xff0c;原创文章100篇。发表专利15个&#xff0c;其中已授权6个。 系列文章&#xff0c;欢迎关注 精通推荐算法1&#x…

spring 开发环境_设置Spring 3开发环境

spring 开发环境本教程简要说明了如何设置典型的环境来开发基于Spring的应用程序。 除了可以正常工作的Windows XP客户端具有足够的CPU能力和内存外&#xff0c;本教程没有其他先决条件。 在教程中&#xff0c;我们将需要安装以下组件&#xff1a; Java 6 JDK更新26 适用于Jav…

Java+SSM+Oracle+Navicat+Eclipse+Microsoft Visio实现网上招聘系统

导读:整体基于B/S架构,采用MyBatis框架,运用Java中的Servlet、Jsp等关键技术,并结合Oracle数据库的使用,为招聘者和求职者搭建了一个高效、便利的网络平台。本系统分别为求职者和招聘者提供了信息注册功能,登录功能和信息维护功能。除此之外,求职者可以选择发布、撤销或…

友盟U-share sdk 分享的接入(支持Android及IOS)

导读:公司的原生开发的APP有块功能原来需要分享小程序到微信,现在改成分享成H5的形式,携带的参数不讨论,这里记录一下。 官方文档:https://developer.umeng.com/docs/128606/detail/129137 安卓分享H5:https://developer.umeng.com/docs/128606/detail/193883#h2-u5206u4E…

javaScript中const,var,let区别与用法详解

业务场景:今天想从正则表达式数组对象取出几个参数的值,发现好多人都用的const声明的变量,这里一起总结一下吧。 上一篇——》前端使用正则表达式获取地址栏URL参数的值并将需要的参数值展示在页面 场景: 查阅相关资料,总结一下js中三种定义变量的方式const, var, let的…

使用Java和Spring构建现代Web应用程序

使用Spring Framework创建Java Web应用程序从未如此简单。 如果您已经熟悉Java并且几乎没有创建Web应用程序的经验&#xff0c;或者如果您担心所有很酷的孩子都放弃Java取而代之的是Ruby和Node.js&#xff0c;那么您想读这篇。 我的意图是在此处提供实用指南&#xff0c;以快速…

mil跟踪算法matlab,几种目标跟踪算法性能比较

这是我自己的跟踪算法%%******************************************* 实验设置 *********************************************%%clc;clear all;%%******Change title to choose the sequence you wish to run******%%%title animal;% title board;% title car11;%title …

大前端工程师进阶之路,Node全栈为前端带来更多可能

导读:对那些刚入门前端的开发者来说,前端是一个“令人畏惧”的领域,尤其是在你看到前端的技能图谱时,你会发出这样的感叹,前端怎么有那么多的东西要学?我应该从何处学起?我又该如何应对千变万化的前端技术? 目录 如何选择? 关于变化

论赵泽彬多终端应⽤下的架构设计

导读: 1.应⽤特点及关键问题 2.解决思路及实现⽅案 3.实践效果及未来⽅向