`
adamed
  • 浏览: 181076 次
社区版块
存档分类
最新评论

Quartz Job Scheduling Framework第8章翻译初稿 续

阅读更多
 

You can have as many properties as you need to configure your plug-in.

你可以用多个属性配置插件。

Plug-In Properties Must Have set() Methods<o:p></o:p>

插件属性必须含有set()方法<o:p></o:p>

You must provide a setXXX() method for each property you intend to pass to the plug-in class. Quartz throws a SchedulerException and halts the Scheduler if it can't find a public setXXX() method for the property. Based on the JavaBean specification, you should provide both get() and set() methods for the properties.

<o:p> </o:p>

你必须为预传递插件类的每个属性提供setXXX()方法。如果Scheduler找不到属性publicsetXXX()方法Quartz会抛出SchedulerException并中断Scheduler。依据JavaBean规范,你必须提供每个属性的get()set()方法。

<o:p> </o:p>

The Quartz framework converts the property values to the type specified in the plug-in, assuming that it's a primitive type. For example, you can specify properties of type int and expect Quartz to convert the String from the quartz.properties file to an int. The framework, however, will not convert 1 to an integer class.

<o:p> </o:p>

Quartz会将属性值转换为插件中定义的类型,假定该类型是基本数据类型。例如你可以指定参数为intQuartz会将quartz.properties中的字符串转换为int值。然而框架不会将1转换为Integer类。

<o:p> </o:p>

Quartz Uses Introspection to Set Values<o:p></o:p>

Quartz使用反射机制赋值<o:p></o:p>

<o:p> </o:p>

Quartz uses introspection and reflection to convert the parameter values in the quartz.properties file to their correct type in the plug-in class. You might have guessed that it uses the Common BeanUtils from Jakarata, but this isn't the case yet.

Quartz使用自省(introspection译者注:Introspection就是类的getset方法,也就是类设定和获取自身属性值的方法。)和反射机制将quartz.properties内的信息转换为插件中需要的类型。你可能猜测框架使用了Jakarata的公共BeanUtils,但事实并非如此。



Creating the Job File for the JobLoaderPlugin<o:p></o:p>

创建JobLoaderPlugin使用的Job文件<o:p></o:p>

<o:p> </o:p>

The JobLoaderPlugin looks for all XML files in the specified directory and assumes that each file is a valid Quartz jobs file. By "valid," we mean that the XML file adheres to the latest job-scheduling XSD file, which at the time of this writing is job_scheduling_data_1_5.xsd.

<o:p> </o:p>

JobLoaderPlugin在指定的文件夹中查找所有的XML文件并假定这些文件都是合法的Quartz job定义文件。所谓“合法”值XML遵循最新的作业调度XSD文件。在本书编写时最新的版本是job_scheduling_data_1_5.xsd

<o:p> </o:p>

To make the JobLoaderPlugin more useful, we put each job, along with its job detail and trigger information, in a single XML file. This enables us to add and remove complete jobs just by putting the file into the directory or taking it out. This is very helpful in a development environment when you want to test only certain jobs. A single job XML file is shown in Listing 8.4.

<o:p> </o:p>

为了让JobLoaderPlugin更加有用,我们将每个job与它的job detail、触发器信息单独作为一个XML文件。这使得我们添加移除整个job时候只需要将文件添加或移出文件夹。在开发环境中如果我们需要测试某个单独的job的时候这是非常有帮助的。一个单独的job XML文件如列表8.4

<o:p> </o:p>

Listing 8.4. A Job XML File Read by the JobLoaderPlugin<o:p></o:p>

列表8.4 JobLoaderPlugin读取的一个Job XML文件

xml 代码
  1. <?xml version='1.0' encoding='utf-8'?>  
  2.   
  3.   
  4. <quartz xmlns="http://www.opensymphony.com/quartz/JobSchedulingData"  
  5.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  6.  xsi:schemaLocation="http://www.opensymphony.com/quartz/JobSchedulingData   
  7.  http://www.opensymphony.com/quartz/xml/job_scheduling_data_1_5.xsd"   
  8.  version="1.5">  
  9.   
  10.  <job>  
  11.    <job-detail>  
  12.      <name>PrintInfoJob1</name>  
  13.      <group>DEFAULT</group>  
  14.      <job-class>  
  15.        org.cavaness.quartzbook.chapter3.ScanDirectoryJob   
  16.      </job-class>  
  17.      <volatility>false</volatility>  
  18.      <durability>false</durability>  
  19.      <recover>false</recover>  
  20.   
  21.      <job-data-map allows-transient-data="true">  
  22.        <entry>  
  23.          <key>SCAN_DIR</key>  
  24.          <value>c:\quartz-book\input1</value>  
  25.        </entry>  
  26.      </job-data-map>  
  27.    </job-detail>  
  28.   
  29.    <trigger>  
  30.      <simple>  
  31.        <name>trigger1</name>  
  32.        <group>DEFAULT</group>  
  33.        <job-name>PrintInfoJob1</job-name>  
  34.        <job-group>DEFAULT</job-group>  
  35.        <start-time>2005-07-30T16:04:00</start-time>  
  36.   
  37.        <!-- repeat indefinitely every 10 seconds -->  
  38.        <repeat-count>-1</repeat-count>  
  39.        <repeat-interval>10000</repeat-interval>  
  40.      </simple>  
  41.    </trigger>  
  42.  </job>  
  43.   
  44.   
  45. </quartz>  
  46.   

 

The job file is Listing 8.4 contains all the information necessary for the JobLoaderPlugin to schedule the job. This file also contains an entry for the JobDataMap, which is available to the job class at runtime. The example in Listing 8.4 uses a configured SimpleTrigger to schedule an infinitely repeating trigger that fires every 10 seconds. To further test the plug-in, we created a second job file, which differs from the first in some small way. Listing 8.5 shows the second job file.

<o:p> </o:p>

列表8.4显示的job文件包含所有的供JobLoaderPlugin调度job所需要的信息。这个文件还包含一个可以在类中实时供JobDataMap调用的实体。列表8.4战士的例子使用SimpleTrigger。它频率是没10秒一次,无限循环。为了更进一步测试插件,我们创建第2job文件,与第一个相比有一些小不同。列表8.5显示了第2job文件。

<o:p> </o:p>

Listing 8.5. A Second Job XML File Loaded by the JobLoaderPlugin<o:p></o:p>

列表8.5 JobLoaderPlugin加载的第2个job XML文件<o:p></o:p>

xml 代码
  1. <?xml version='1.0' encoding='utf-8'?>  
  2.   
  3. <quartz xmlns="http://www.opensymphony.com/quartz/JobSchedulingData"  
  4.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.  xsi:schemaLocation="http://www.opensymphony.com/quartz/JobSchedulingData   
  6.  http://www.opensymphony.com/quartz/xml/job_scheduling_data_1_5.xsd"   
  7.  version="1.5">  
  8.   
  9.  <job>  
  10.    <job-detail>  
  11.      <name>PrintInfoJob2</name>  
  12.      <group>DEFAULT</group>  
  13.      <job-class>  
  14.        org.cavaness.quartzbook.chapter3.ScanDirectoryJob</job-class>  
  15.      <volatility>false</volatility>  
  16.      <durability>false</durability>  
  17.      <recover>false</recover>  
  18.   
  19.      <job-data-map allows-transient-data="true">  
  20.         <entry>  
  21.          <key>SCAN_DIR</key>  
  22.           <value>c:\quartz-book\input2</value>  
  23.         </entry>  
  24.      </job-data-map>  
  25.   
  26.    </job-detail>  
  27.   
  28.     <trigger>  
  29.      <simple>  
  30.        <name>trigger2</name>  
  31.        <group>DEFAULT</group>  
  32.        <job-name>PrintInfoJob2</job-name>  
  33.        <job-group>DEFAULT</job-group>  
  34.        <start-time>2005-07-30T16:04:00</start-time>  
  35.        <!-- repeat indefinitely every 10 seconds -->  
  36.        <repeat-count>-1</repeat-count>  
  37.        <repeat-interval>60000</repeat-interval>  
  38.      </simple>  
  39.    </trigger>  
  40.  </job>  
  41.   
  42. </quartz>  
  43.   

 

The second job file in Listing 8.5 differs only slightly from the one in Listing 8.4. We've changed the directory for the job, which is scanned and changed the trigger schedule. The point here is that you can have multiple jobs in the jobs directory, and the JobLoaderPlugin will load them all and schedule them individually with the Scheduler.

<o:p> </o:p>

列表8.5显示的第2job文件与8.4显示的第一个相比只有一点不同。我们改变了搜索改变触发调度作业的文件夹。有一点注意的是你可以放多个job文件到文件夹中,JobLoaderPlugin将分别加载并用Scheduler调度他们。(老外就是这样说了好几遍还罗嗦^_^

<o:p> </o:p>

<v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><v:shape id="_x0000_i1025" style="WIDTH: 0.75pt; HEIGHT: 0.75pt" o:button="t" alt="" type="#_x0000_t75"></v:shape>

Using Multiple Plug-Ins<o:p></o:p>

使用多个插件<o:p></o:p>

You can register as many plug-ins in the quartz.properties file as you like. However, the order of loading and initialization can't be guaranteed because Quartz loads all the properties into a map and then loops through the plug-ins in the order that they are retrieved from the map.

<o:p> </o:p>

你可以在quartz.properties文件中注册任意多个插件。然而加载初始化的顺序不能保证,因为Quartz加载所有的属性到Map中然后按map的中的顺序查找插件。

<o:p> </o:p>

To get around this limitation, you can create a Quartz plug-in that acts as a parent plug-in and loads multiple other plug-ins in a given order. Listing 8.6 shows what the ParentPlugin looks like.

<o:p> </o:p>

为绕开这一限制,你可以建立一个Quartz插件做为其他插件的父插件。该插件按指定顺序加载其他插件。列表8.6展示了父插件的样子。

<o:p> </o:p>

Listing 8.6. The ParentPlugin Can Load Child Plug-Ins in a Specified Order<o:p></o:p>

列表8.6 父插件可以按指定顺序加载子插件<o:p></o:p>

java 代码
  1. package org.cavaness.quartzbook.chapter8;   
  2.   
  3. import java.util.ArrayList;   
  4. import java.util.List;   
  5. import java.util.StringTokenizer;   
  6.   
  7. import org.apache.commons.logging.Log;   
  8. import org.apache.commons.logging.LogFactory;   
  9. import org.quartz.Scheduler;   
  10. import org.quartz.SchedulerConfigException;   
  11. import org.quartz.SchedulerException;   
  12. import org.quartz.spi.SchedulerPlugin;   
  13.   
  14. public class ParentPlugin implements SchedulerPlugin {   
  15.     private static Log logger = LogFactory.getLog(ParentPlugin.class);   
  16.   
  17. // A list of child plug-ins   
  18. //子插件列表   
  19.     private List childPlugins = new ArrayList();   
  20.   
  21.     private String childPluginNames;   
  22.   
  23.     private String pluginName;   
  24.   
  25.     private Scheduler scheduler;   
  26.   
  27.     /**  
  28.      * Default no-arg Constructor  
  29.      *  
  30.      */  
  31.     public ParentPlugin() {   
  32.     }   
  33.   
  34.     /**  
  35.      * Pass the initialize call on to the child plug-ins.  
  36.      *  
  37.      * @throws SchedulerConfigException  
  38.      *             if there is an error initializing.  
  39.      */  
  40.   
  41. public void initialize(String name, final Scheduler scheduler)   
  42.               throws SchedulerException {   
  43.   
  44.          this.pluginName = name;   
  45.          this.scheduler = scheduler;   
  46.   
  47.          logger.info("Searching for child plugins to load");   
  48.   
  49.          // The child plug-ins are comma-separated   
  50.          StringTokenizer tokenizer =   
  51.               new StringTokenizer(childPluginNames, ",");   
  52.   
  53.          while (tokenizer.hasMoreElements()) {   
  54.               String pluginClassname = tokenizer.nextToken();   
  55.   
  56.               try {   
  57.                    Class pluginClass =   
  58.                         Class.forName(pluginClassname);   
  59.   
  60.                    Object obj = pluginClass.newInstance();   
  61.   
  62.                    // Make sure the specified class is a plug-in   
  63.                    if (obj instanceof SchedulerPlugin) {   
  64.                         // Initialize the Plugin   
  65.                         SchedulerPlugin childPlugin =   
  66.                               (SchedulerPlugin) obj;   
  67.   
  68.                              logger.info("Init child Plugin " +   
  69.                                   pluginClassname);   
  70.   
  71.                         childPlugin.initialize(pluginClassname,   
  72.                              scheduler);   
  73.   
  74.                         // Store the child plug-in in the list   
  75.                         childPlugins.add(childPlugin);   
  76.                    } else {   
  77.                         // Skip loading class   
  78.                         logger.error("Class is not a plugin " +   
  79.                              pluginClass);   
  80.                    }   
  81.   
  82.               } catch (Exception ex) {   
  83.                    // On error, log and go to next child plug-in   
  84.                    logger.error("Error loading plugin " +   
  85.                         pluginClassname, ex);   
  86.               }   
  87.          }   
  88.     }   
  89.     public void start() {   
  90.          // Start each child plug-in   
  91.          int size = childPlugins.size();   
  92.          for (int i = 0; i < size; i++) {   
  93.               SchedulerPlugin childPlugin =   
  94.                    ((SchedulerPlugin) childPlugins.get(i));   
  95.   
  96.               logger.info("Starting Child Plugin " + childPlugin);   
  97.               childPlugin.start();   
  98.          }   
  99.     }   
  100.   
  101.     public void shutdown() {   
  102.          // Stop each child plug-in   
  103.          int size = childPlugins.size();   
  104.          for (int i = 0; i < size; i++) {   
  105.               SchedulerPlugin childPlugin =   
  106.                    ((SchedulerPlugin) childPlugins.get(i));   
  107.   
  108.               logger.info("Stopping Plugin " + childPlugin);   
  109.               childPlugin.shutdown();   
  110.          }   
  111.     }   
  112.   
  113.     public String getPluginName() {   
  114.          return pluginName;   
  115.     }   
  116.   
  117.     public void setPluginName(String pluginName) {   
  118.          this.pluginName = pluginName;   
  119.     }   
  120.   
  121.     public String getChildPluginNames() {   
  122.          return childPluginNames;   
  123.     }   
  124.   
  125.     public void setChildPluginNames(String childPluginNames) {   
  126.          this.childPluginNames = childPluginNames;   
  127.     }   
  128. }   
  129.  &nbs
评论

相关推荐

    Quartz Job Scheduling Framework第2章翻译初稿

    Quartz Job Scheduling Framework第2章翻译初稿 博文链接:https://adamed.iteye.com/blog/135880

    Quartz Job Scheduling Framework第11章翻译初稿

    博文链接:https://adamed.iteye.com/blog/135883

    Quartz Job Scheduling Framework第5章翻译初稿

    博文链接:https://adamed.iteye.com/blog/135881

    Quartz Job Scheduling Framework第7章翻译初稿

    博文链接:https://adamed.iteye.com/blog/135882

    248ssm-mysql-jsp 校园外卖管理系统.zip(可运行源码+数据库文件+文档)

    此次设计的外卖订单管理系统的登录角色一共分为四个,消费者、商户、管理员以及骑手。设计的系统为前端网页和后台管理系统。 消费者主要有以模块的需求:(1)购物车,(2)订单中心,(3)收藏夹,(4)收货地址,(5)个人信息管理,(6)站内咨询浏览,(7)在线留言。 商户的用例包括了一下几个模块设计:(1)商品管理,(2)库存管理,(3)订单管理,(4)销量统计,(5)收藏统计(6)销售额统计,(7)订单量统计 管理员系统结构中的功能设计比较多,分为三个大类分别是基础信息、业务功能和统计信息,基础信息主要是对消费者、商户以及骑手进行信息的维护工作,维护网站内的资讯信息等。业务功能是对网站内的商家进行分类管理,对于商品以及库存进行管理,对订单进行管理以及留言管理。统计信息包括对于商品销量的统计、订单走势图的分析等。 此次使用了java web技术线进行网页端的开发,开发工具采用idea.工具,数据库采用了MySQL进行设计开发,服务器采用了Tomcat服务器技术。该网站系统能够将学校周围商家的外卖产品在网站上向用户进行展示

    MyBatis 动态 SQL 示例

    MyBatis 是一个持久层框架,它允许用户在 XML 文件中编写动态 SQL 语句。MyBatis 的动态 SQL 功能非常强大,它允许开发者根据运行时的条件动态地生成 SQL 语句。这使得 MyBatis 能够灵活地处理各种复杂的查询需求。 MyBatis 动态 SQL 通过使用 <if>、<choose>、<when>、<otherwise>、<trim>、<set> 等标签来实现。附件中是一些常见的动态 SQL 标签及其用法,通过组合使用这些标签,可以编写出非常灵活和强大的 SQL 语句,以适应不同的查询和更新需求

    华为数据治理方法论,包括:数据治理框架、数据治理组织架构、数据治理度量评估体系以及华为数据治理案例分享

    华为数据治理方法论,包括:数据治理框架、数据治理组织架构、数据治理度量评估体系以及华为数据治理案例分享。 1目的 1 2面向的读者 2 3数据治理框架 3 3.1数据治理框架 3 3.2数据治理模块域 3 3.3数据治理各模块域之间的关系 4 4数据治理组织架构 7 4.1数据治理组织架构框架 7 4.2数据治理组织职责 7 5数据治理度量评估体系 10 5.1数据治理实施方法论 10 5.2数据治理度量维度 11 5.3数据治理度量评分规则 11 6华为数据治理案例 13 6.1华为数据治理思考 13 6.2华为数据治理实践 14 6.3华为数据治理效果 15 7新冠疫情数据治理思考 16 8DAYU 方法论产品落地 17

    毕业设计:基于SSM的mysql-羽毛球馆管理系统(源码 + 数据库 + 说明文档)

    毕业设计:基于SSM的mysql_羽毛球馆管理系统(源码 + 数据库 + 说明文档) 第二章 需求分析 3 2.1需求调研 3 2.2可行性分析 3 2.2.1技术的可行性 3 2.2.2经济的可行性 3 2.2.3操作可行性 3 2.2.4法律的可行性 4 2.3开发工具及技术 4 2.3.1网站开发环境 4 2.3.2 PHP语言简介 4 2.3.3 JavaScript技术 4 2.3.4 MySQL数据库 4 2.3.5 PHPstorm平台 5 2.3.6 工作环境 5 第三章 网站系统设计 5 3.1系统功能研究 5 3.1.1系统功能需求 5 3.2功能模块分析 6 3.3 设计的基本思想 7 3.4 性能要求 8 3.4.1 网站的安全性 8 3.4.2 数据的完整性 8 3.4.3界面要求 8 第四章 网站功能实现 8 4.1系统实现 8 4.1.1 管理员登录界面 9 4.1.2 后台用户管理 9 4.1.3 球场管理 10 4.1.4 物资管理 11 4.1.5 预定管理 12 4.2数据库的分析与设计 13 4.2.1数据库的概念结构设计 13 4.2.2数据库

    搜索链接相见欢友情链接系统ASPX版 v1.0-xjlinkaspxv1.0.rar

    相见欢友情链接系统ASPX版 v1.0_xjlinkaspxv1.0.rar,这是一个专为计算机专业人士设计的JSP源码资料包。这款系统是基于ASPX技术构建的,旨在为用户提供一个高效、便捷的友情链接管理平台。它能够帮助网站管理员轻松地管理和控制网站上的友情链接,提高网站的互动性和用户体验。这个资料包包含了完整的源代码和相关的文档,使得用户可以轻松地进行二次开发和定制。它提供了丰富的功能,包括友情链接的添加、删除、修改、审核等,以及链接分类、排序、搜索等功能。此外,它还支持多种链接样式和模板,可以根据用户的喜好和需求进行个性化设置。相见欢友情链接系统ASPX版 v1.0不仅功能强大,而且操作简便。它的界面设计简洁明了,用户可以快速上手,无需专业的计算机知识。同时,它还具有良好的兼容性和稳定性,可以在不同的环境和平台上运行,满足各种规模的网站建设需求。总的来说,相见欢友情链接系统ASPX版 v1.0是一个实用、高效、易用的友情链接管理工具。无论是对计算机专业人士,还是对普通用户,都是一个很好的选择。通过使用这个系统,可以大大提高网站管理的工作效率,提升网站的专业性和用户体验。重新回答||

    node-v8.12.0-linux-armv7l.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    最新UI站长引流工具箱 带后台+安装说明.rar

    最新UI站长引流工具箱 带后台+安装说明.rar最新UI站长引流工具箱 带后台+安装说明.rar最新UI站长引流工具箱 带后台+安装说明.rar

    上市公司-企业要素密集度数据集(2000-2022年).txt

    数据存放网盘,txt文件内包含下载链接及提取码,永久有效。 样例数据及详细介绍参见文章:https://blog.csdn.net/li514006030/article/details/138294086

    node-v6.12.3.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    乐趣大型购物系统 v1.1(jsp+servlet+mysql)130223.rar

    这个文件名为"乐趣大型购物系统 v1.1(jsp+servlet+mysql)130223.rar",是一个计算机专业的JSP源码资料包。它包含了一个使用JSP、Servlet和MySQL技术实现的大型购物系统的源代码。该系统的设计理念是以用户为中心,提供便捷、高效的购物体验。系统采用了模块化的设计方法,将不同的功能划分为不同的模块,提高了代码的可读性和可维护性。同时,系统使用了MVC设计模式,将业务逻辑、数据访问和用户界面进行了分离,使得系统具有更好的扩展性和灵活性。在数据库设计方面,系统使用了MySQL数据库,对商品信息、用户信息、订单信息等进行了合理的设计和存储。通过使用数据库的事务管理机制,保证了数据的一致性和完整性。在用户界面设计上,系统提供了简洁明了的页面布局,使用户能够快速上手并完成购物操作。系统还提供了搜索功能,方便用户快速找到自己需要的商品。此外,系统还提供了购物车功能,用户可以将选购的商品加入购物车,并在合适的时间进行结算。总的来说,这个"乐趣大型购物系统 v1.1(jsp+servlet+mysql)130223.rar"是一个功能齐全、设计合理的购物系统,对于学

    node-v8.15.0-x64.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    记账管理系统的设计与实现

    近年来由于生活节奏的加快,好像每个人都被很多难以启齿的问题困惑,然而关于随意消费是大多数人头疼的问题,没有任何计划和筹备的情况下随意消费,导致现实生活中我们所称为的“月光族”。 当你逐渐了解自己的财务状况,就可以学着做简单的收支规划。大部分月光族的根源其实是缺乏规划,想买什么的时候就买了。并不是说规划不能随意买东西,规划的价值在于让你使用资金的效率最高。无论你用金钱换取的必需品,满足感或者快乐,都可以通过规划获得比较高的效率。 本记账系统是一个基于国内外电子商务网站的发展现状,采用B2C(Business to Consumers)模式开发的电子商务平台,它的价值所在对于那些随意消费性的人群能起到一个很大的警示作用,而且系统扩张性很强,能根据客户的不同需求进行快速改进。该系统采用B/S三层结构,服务器是Tomcat同时运用JSp技术进行动态页面设计,后台数据库是Oracle。

    Linux 0.01版,经典中的经典

    大名鼎鼎的Linux源码,最经典的第一版

    node-v12.5.0-sunos-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v8.3.0-win-x64.zip

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v0.10.48.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

Global site tag (gtag.js) - Google Analytics