`

jboss + JMS 开发实例

阅读更多
核心提示:异步进程通信是面向服务架构(SOA)一个重要的组成部分,因为企业里很多系统通信,特别是与外部组织间的通信,实质上都是异步的。Java消息服务(JMS)是用于编写使用异步消息传递的JEE应用程序的API。传统的使用JMS API进行消息传递的实现包括多个步骤,例如JNDI

   异步进程通信是面向服务架构(SOA)一个重要的组成部分,因为企业里很多系统通信,特别是与外部组织间的通信,实质上都是异步的。Java消息服务(JMS)是用于编写使用异步消息传递的JEE应用程序的API。传统的使用JMS API进行消息传递的实现包括多个步骤,例如JNDI查询队列连接工厂和Queue资源,在实际发送和接收消息前创建一个JMS会话。
   Spring框架则简化了使用JEE组件(包括JMS)的任务。它提供的模板机制隐藏了典型的JMS实现的细节,这样开发人员可以集中精力放在处理消息的实际工作中,而不用担心如何去创建,访问或清除JMS资源。

   本文将对Spring JMS API作一个概述,并通过一个运行在JBoss MQ服务器上的web例程来介绍如何使用Spring JMS API来异步处理(发送和接收)消息。我将通过传统JMS实现和Spring JMS实现两者间的比较,来展示使用Spring JMS处理消息是如何的简单和灵活。

异步消息传递和面向服务架构
  在现实中,大多数web请求都是同步处理的。例如,当用户要登入一个网站,首先输入用户名和密码,然后服务器验证登录合法性。如果验证成功,程序将允许该用户进入网站。这里,登录请求在从客户端接收以后被即时处理了。信用卡验证是另一个同步处理的例子;只有服务器证实输入的信用卡号是有效的,同时客户在帐户上有足够的存款,客户才被允许继续操作。但是让我们思考一下在顺序处理系统上的支付结算步骤。一旦系统证实该用户信用卡的信息是准确的,并且在帐户上有足够的资金,就不必等到所有的支付细节落实、转账完成。支付结算可以异步方式进行,这样客户可以继续进行核查操作。

   需要比典型同步请求耗费更长时间的请求,可以使用异步处理。另一个异步处理的例子是,在本地贷款处理程序中,提交至自动承销系统(AUS)的信用请求处理过程。当借方提交贷款申请后,抵押公司会向AUS发送请求,以获取信用历史记录。由于这个请求要求得到全面而又详细的信用报告,包括借方现今和过去的帐户,最近的付款和其他财务资料,服务器需要耗费较长的时间(几小时或着有时甚至是几天)来对这些请求作出响应。客户端程序(应用)要与服务器连接并耗费如此长的时间来等待结果,这是毫无意义的。因此通信应该是异步发生的;也就是,一旦请求被提交,它就被放置在队列中,同时客户端与服务器断开连接。然后AUS服务从指定的队列中选出请求进行处理,并将处理得到的消息放置在另一个消息队列里。最后,客户端程序从这个队列中选出处理结果,紧接着处理这个信用历史数据。

JMS
   如果您使用过JMS代码,您会发现它与JDBC或JCA很像。它所包含的样本代码创建或JMS资源对象回溯,使得每一次您需要写一个新类来发送和接收消息时,都具有更好的代码密集性和重复性。以下序列显示了传统JMS实现所包括的步骤:

创建JNDI初始上下文(context)。
从JNDI上下文获取一个队列连接工厂。
从队列连接工厂中获取一个Quene。
创建一个Session对象。
创建一个发送者(sender)或接收者(receiver)对象。
使用步骤5创建的发送者或接收者对象发送或接收消息。
处理完消息后,关闭所有JMS资源。
您可以看到,步骤6是处理消息的唯一地方。其他步骤都只是管理与实际业务要求无关的JMS资源,但是开发人员必须编写并维护这些额外步骤的代码。

Spring JMS
   Spring框架提供了一个模板机制来隐藏Java APIs的细节。JEE开发人员可以使用JDBCTemplate和JNDITemplate类来分别访问后台数据库和JEE资源(数据源,连接池)。JMS也不例外。Spring提供JMSTemplate类,因此开发人员不用为一个JMS实现去编写样本代码。接下来是在开发JMS应用程序时Spring所具有一些的优势。

提供JMS抽象API,简化了访问目标(队列或主题)和向指定目标发布消息时JMS的使用。
JEE开发人员不需要关心JMS不同版本(例如JMS 1.0.2与JMS 1.1)之间的差异。
开发人员不必专门处理JMS异常,因为Spring为所有JMS异常提供了一个未经检查的异常,并在JMS代码中重新抛出。
示例程序
        说明:因为只是为了演示如何使用spring编写jms的应用,所以本例没有什么实际用途。

        程序功能:MessageProducer.java根据一用户信息产生一个消息发送到 JMS Provider;由MessageConsumer.java接收。

1.在Jboss里配置XML文件创建一个新的JMS provider。
打开位于%JBOSS_HOME%server\default\deploy\jms文件夹下的jbossmq-destinations-service.xml文件,加入以下代码片断:

  1. <!--  Register User Send/Receive Queue  -->  
  2. <mbean code="org.jboss.mq.server.jmx.Queue"  
  3.   name="jboss.mq.destination:service=Queue,name=registerUserQueue">  
  4.   <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>  
  5. </mbean>  
  6. <!--  Register User Send/Receive Topic  -->  
  7. <mbean code="org.jboss.mq.server.jmx.Topic"  
  8.  name="jboss.mq.destination:service=Topic,name=registerUserTopic">  
  9.   <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>  
  10. </mbean>  


2.在spring的配置文件中配置JMS组件的具体细节。
 (1)JNDI上下文是取得JMS资源的起始位置,因此首先我们要配置JNDI模板:

  1. <!-- JNDI上下文(它是取得JMS资源的起始位置) -->  
  2. bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">  
  3. <property name="environment">  
  4.  <props>  
  5.   <prop key="java.naming.factory.initial">  
  6.    org.jnp.interfaces.NamingContextFactory   
  7.   </prop>  
  8.   <prop key="java.naming.provider.url">localhost</prop>  
  9.   <prop key="java.naming.factory.url.pkgs">  
  10.    org.jnp.interfaces:org.jboss.naming   
  11.   </prop>  
  12.  </props>  
  13. </property>  
  14. /bean>  


   注意:此JNDI模板用到了org.jnp.interfaces.NamingContextFactory所以要把%JBOSS_HOME%\client下的jbossall-client.jar加到你的项目的classpath中。
(2)配置连接工厂:

  1. <!-- JMS连接工厂 -->  
  2.   <bean id="jmsConnectionFactory"class="org.springframework.jndi.JndiObjectFactoryBean">  
  3.  <property name="jndiTemplate">  
  4.   <ref bean="jndiTemplate" />  
  5.  </property>  
  6.  <property name="jndiName">  
  7.   <value>XAConnectionFactory</value>  
  8.  </property>  
  9. </bean>  


   注意:XAConnectionFactory这个JNDI名字是在%JBOSS_HOME%server\default\deploy\jms文件夹下的jms-ds.xml中定义的(它是由JBoss指定的)。
 (3)配置JmsTemplate组件。在例程中我们使用JmsTemplate102。同时使用defaultDestination属性来指定JMS目标。

  1. <!-- JMS模板配置 -->  
  2. <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate102">  
  3.  <property name="connectionFactory" ref="jmsConnectionFactory" />  
  4.  <property name="defaultDestination" ref="destination" />  
  5.  <property name="pubSubDomain">  
  6.   <value>true</value>  
  7.  </property>  
  8.  <!-- 等待消息的时间(ms) -->  
  9.  <property name="receiveTimeout">  
  10.        <value>30000</value>  
  11.     </property>  
  12. </bean>  


  注意:如果使用topic-subscribe(主题订阅)模式,该模板的pubSubDomain属性值为true;若使用PToP(点对点)模式,pubSubDomain属性值为false或不配置该属性。
 (4)定义一个JMS目标来发送和接收消息:

  1. <bean id="destination" class="org.springframework.jndi.JndiObjectFactoryBean">  
  2.  <property name="jndiTemplate">  
  3.   <ref bean="jndiTemplate" />  
  4.  </property>  
  5.  <property name="jndiName">  
  6.   <value>topic/registerUserTopic</value>  
  7.  </property>  
  8. </bean>  


 (5)配置发送者和接收者组件:

  1. <!-- 消息发布者 -->  
  2. <bean id="msgProducer" class="com.boco.jms.MessageProducer">  
  3.  <property name="jmsTemplate" ref="jmsTemplate" />  
  4. </bean>  
  5. <!-- 消息接收者 -->  
  6. <bean id="msgConsumer" class="com.boco.jms.MessageConsumer">  
  7.  <property name="jmsTemplate" ref="jmsTemplate" />  
  8. </bean>  


3.相应的类:
 (1). User对象。

  1.  /**  
  2.  *  User.java  
  3.  *  created on Jul 2, 2006  
  4.  *  Copyrights 2006 BOCO,Inc. All rights reserved.  
  5.  */  
  6. package com.boco.dto;   
  7.   
  8. import java.io.Serializable;   
  9.   
  10. /**  
  11.  * desc: 用户信息 Bean  
  12.  * @author qiujy  
  13.  */  
  14. public class User {   
  15.  private int id;   
  16.  private String username;   
  17.  private String password;   
  18.  private String email;   
  19.     
  20.  public User(){}   
  21.     
  22.  //以下为Getter,setter方法略   
  23.  ......   
  24. }  


  
 (2).消息生产者:

  1.  /**  
  2.  *  MessageProducer.java  
  3.  *  created on Jul 22, 2006  
  4.  *  Copyrights 2006 BOCO,Inc. All rights reserved.  
  5.  */  
  6. package com.boco.jms;   
  7.   
  8. import javax.jms.JMSException;   
  9. import javax.jms.MapMessage;   
  10. import javax.jms.Message;   
  11. import javax.jms.Session;   
  12.   
  13. import org.springframework.jms.core.JmsTemplate;   
  14. import org.springframework.jms.core.MessageCreator;   
  15.   
  16. import com.boco.dto.User;   
  17.   
  18. /**  
  19.  * desc:消息生产者  
  20.  * @author qiujy  
  21.  *  
  22.  */  
  23. public class MessageProducer {   
  24.  /** JMS模板 */  
  25.  private JmsTemplate jmsTemplate;   
  26.     
  27.  public void setJmsTemplate(JmsTemplate jmsTemplate){   
  28.   this.jmsTemplate = jmsTemplate;   
  29.  }   
  30.     
  31.  public void sendMessage(final User user){   
  32.   //调用模板的send来发送消息   
  33.   jmsTemplate.send(new MessageCreator(){   
  34.   
  35.    public Message createMessage(Session session) throws JMSException {   
  36.     //构造一个要发送的消息   
  37.     MapMessage message = session.createMapMessage();   
  38.      message.setInt("id", user.getId());   
  39.      message.setString("username", user.getUsername());   
  40.      message.setString("password", user.getPassword());   
  41.      message.setString("email", user.getEmail());   
  42.     System.out.println("send success!!");   
  43.     return message;   
  44.    }   
  45.   });   
  46.  }   
  47. }   

  
 (3).消息消费者:

  1. /**  
  2.  *  MessageConsumer.java  
  3.  *  created on Jul 22, 2006  
  4.  *  Copyrights 2006 BOCO,Inc. All rights reserved.  
  5.  */  
  6. package com.boco.jms;   
  7.   
  8. import javax.jms.JMSException;   
  9. import javax.jms.MapMessage;   
  10.   
  11. import org.springframework.jms.core.JmsTemplate;   
  12.   
  13. import com.boco.dto.User;   
  14.   
  15. /**  
  16.  * desc:消息消费者  
  17.  * @author qiujy  
  18.  *  
  19.  */  
  20. public class MessageConsumer {   
  21.  /** JMS模板 */  
  22.  private JmsTemplate jmsTemplate;   
  23.     
  24.  public void setJmsTemplate(JmsTemplate jmsTemplate){   
  25.   this.jmsTemplate = jmsTemplate;   
  26.  }   
  27.     
  28.  public User receiveMessage(){   
  29.   //参数为Destination的JNDI名字去掉前面的模式类型标识   
  30.   //MapMessage msg = (MapMessage)jmsTemplate.receive("registerUserQueue");   
  31.   MapMessage msg = (MapMessage)jmsTemplate.receive("registerUserTopic");   
  32.   User user = new User();   
  33.      
  34.   try {   
  35.    user.setId(msg.getInt("id"));   
  36.    user.setUsername(msg.getString("username"));   
  37.    user.setPassword(msg.getString("password"));   
  38.    user.setEmail(msg.getString("email"));   
  39.   } catch (JMSException e) {   
  40.    // TODO Auto-generated catch block   
  41.    e.printStackTrace();   
  42.   }   
  43.      
  44.   return user;   
  45.  }   
  46. }  

 (4).测试用例:
   //======== 生产者测试用例 ===============

  1.  /**  
  2.  *  TestMsgProducer.java  
  3.  *  created on Jul 22, 2006  
  4.  *  Copyrights 2006 BOCO,Inc. All rights reserved.  
  5.  */  
  6. package com.boco.jms;   
  7.   
  8. import junit.framework.TestCase;   
  9.   
  10. import org.springframework.context.ApplicationContext;   
  11. import org.springframework.context.support.ClassPathXmlApplicationContext;   
  12.   
  13. import com.boco.dto.User;   
  14.   
  15. /**  
  16.  * desc:  
  17.  * @author qiujy  
  18.  *  
  19.  */  
  20. public class TestMsgProducer extends TestCase {   
  21.   
  22.  private ApplicationContext context;   
  23.  /**  
  24.   * @param arg0  
  25.   */  
  26.  public TestMsgProducer(String arg0) {   
  27.   super(arg0);   
  28.   context = new ClassPathXmlApplicationContext("applicationContext_jms.xml");   
  29.  }   
  30.   
  31.  /* (non-Javadoc)  
  32.   * @see junit.framework.TestCase#setUp()  
  33.   */  
  34.  protected void setUp() throws Exception {   
  35.   super.setUp();   
  36.  }   
  37.   
  38.  /* (non-Javadoc)  
  39.   * @see junit.framework.TestCase#tearDown()  
  40.   */  
  41.  protected void tearDown() throws Exception {   
  42.   super.tearDown();   
  43.  }   
  44.   
  45.  /**  
  46.   * Test method for {@link com.boco.jms.MessageProducer#sendMessage(com.boco.dto.User)}.  
  47.   */  
  48.  public void testSendMessage() {   
  49.   User user = new User();   
  50.   user.setId(132);   
  51.   user.setUsername("JMSTest");   
  52.   user.setPassword("password");   
  53.   user.setEmail("support@boco.com.cn");   
  54.      
  55.   MessageProducer producer = (MessageProducer)context.getBean("msgProducer");   
  56.      
  57.   producer.sendMessage(user);   
  58.      
  59.  }   
  60.   
  61. }  
  1. //============ 消费者测试用例 ===============   
  2. /**  
  3.  *  TestMsgConsumer.java  
  4.  *  created on Jul 22, 2006  
  5.  *  Copyrights 2006 BOCO,Inc. All rights reserved.  
  6.  */  
  7. package com.boco.jms;   
  8.   
  9. import junit.framework.TestCase;   
  10.   
  11. import org.springframework.context.ApplicationContext;   
  12. import org.springframework.context.support.ClassPathXmlApplicationContext;   
  13.   
  14. import com.boco.dto.User;   
  15.   
  16. /**  
  17.  * desc:  
  18.  * @author qiujy  
  19.  *  
  20.  */  
  21. public class TestMsgConsumer extends TestCase {   
  22.  private ApplicationContext context;   
  23.  /**  
  24.   * @param arg0  
  25.   */  
  26.  public TestMsgConsumer(String arg0) {   
  27.   super(arg0);   
  28.   context = new ClassPathXmlApplicationContext("applicationContext_jms.xml");   
  29.  }   
  30.   
  31.  /* (non-Javadoc)  
  32.   * @see junit.framework.TestCase#setUp()  
  33.   */  
  34.  protected void setUp() throws Exception {   
  35.   super.setUp();   
  36.  }   
  37.   
  38.  /* (non-Javadoc)  
  39.   * @see junit.framework.TestCase#tearDown()  
  40.   */  
  41.  protected void tearDown() throws Exception {   
  42.   super.tearDown();   
  43.  }   
  44.   
  45.  /**  
  46.   * Test method for {@link com.boco.jms.MessageConsumer#receiveMessage()}.  
  47.   */  
  48.  public void testReceiveMessage() {   
  49.   MessageConsumer consumer = (MessageConsumer)context.getBean("msgConsumer");   
  50.   User user = consumer.receiveMessage();   
  51.   assertNotNull(user);   
  52.   System.out.println( "id========" + user.getId()   
  53.       + "\nname======" + user.getUsername()   
  54.       + "\npassword==" + user.getPassword()   
  55.       + "\nemail=====" + user.getEmail());   
  56.  }   
  57.   
  58. }  

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/liuzhenwen/archive/2009/01/13/3768766.aspx

分享到:
评论

相关推荐

    高校学生选课系统项目源码资源

    项目名称: 高校学生选课系统 内容概要: 高校学生选课系统是为了方便高校学生进行选课管理而设计的系统。该系统提供了学生选课、查看课程信息、管理个人课程表等功能,同时也为教师提供了课程发布和管理功能,以及管理员对整个选课系统的管理功能。 适用人群: 学生: 高校本科生和研究生,用于选课、查看课程信息、管理个人课程表等。 教师: 高校教师,用于发布课程、管理课程信息和学生选课情况等。 管理员: 系统管理员,用于管理整个选课系统,包括用户管理、课程管理、权限管理等。 使用场景及目标: 学生选课场景: 学生登录系统后可以浏览课程列表,根据自己的专业和兴趣选择适合自己的课程,并进行选课操作。系统会实时更新学生的选课信息,并生成个人课程表。 教师发布课程场景: 教师登录系统后可以发布新的课程信息,包括课程名称、课程描述、上课时间、上课地点等。发布后的课程将出现在课程列表中供学生选择。 管理员管理场景: 管理员可以管理系统的用户信息,包括学生、教师和管理员账号的添加、删除和修改;管理课程信息,包括课程的添加、删除和修改;管理系统的权限控制,包括用户权限的分配和管理。 目标: 为高校学生提

    TC-125 230V 50HZ 圆锯

    TC-125 230V 50HZ 圆锯

    影音娱乐北雨影音系统 v1.0.1-bymov101.rar

    北雨影音系统 v1.0.1_bymov101.rar 是一个计算机专业的 JSP 源码资料包,它为用户提供了一个强大而灵活的在线影音娱乐平台。该系统集成了多种功能,包括视频上传、播放、分享和评论等,旨在为用户提供一个全面而便捷的在线视频观看体验。首先,北雨影音系统具有强大的视频上传功能。用户可以轻松地将本地的视频文件上传到系统中,并与其他人分享。系统支持多种视频格式,包括常见的 MP4、AVI、FLV 等,确保用户能够方便地上传和观看各种类型的视频。其次,该系统提供了丰富的视频播放功能。用户可以选择不同的视频进行观看,并且可以调整视频的清晰度、音量等参数,以适应不同的观看需求。系统还支持自动播放下一个视频的功能,让用户可以连续观看多个视频,无需手动切换。此外,北雨影音系统还提供了一个社交互动的平台。用户可以在视频下方发表评论,与其他观众进行交流和讨论。这为用户之间的互动提供了便利,增加了观看视频的乐趣和参与感。最后,该系统还具备良好的用户体验和界面设计。界面简洁明了,操作直观易用,让用户可以快速上手并使用各项功能。同时,系统还提供了个性化的推荐功能,根据用户的观看历史和兴趣,为用户推荐

    Tripp Trapp 儿童椅用户指南 STOKKE

    Tripp Trapp 儿童椅用户指南

    node-v8.13.0-linux-armv6l.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提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    谷歌浏览器 64位-89.0.4389.128.exe

    Windows版本64位谷歌浏览器,是由Google谷歌公司开发的一款电脑版网络浏览器,可以运行在Windows 10/8.1/8/7 64位的操作系统上。该浏览器是基于其它开放原始码软件所撰写,包括WebKit和Mozilla,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。软件的特点是简洁、快速。并且支持多标签浏览,每个标签页面都在独立的“沙箱”内运行,在提高安全性的同时,一个标签页面的崩溃也不会导致其他标签页面被关闭。此外,谷歌浏览器(Google Chrome)基于更强大的JavaScript V8引擎,这是当前Web浏览器所无法实现的。

    适用于鲲鹏麒麟的OpenJDK1.8

    适用于鲲鹏麒麟的OpenJDK1.8

    毕业设计-基于SSH的任务调度系统的设计与实现

    任务调度试系统,基本功能包括:用户的注册、用户的登录、发起项目、项目详细及搜索等。本系统结构如下: (1)用户的注册登录: 注册模块:完成用户注册功能; 登录模块:完成用户登录功能; (2)发起项目: 发起项目模块:完成了项目及项目下一个或者多个任务的添加; 项目详细:点击项目名称,可以看到项目及任务详细信息; 搜索项目:完成对项目名称的模糊搜索功能 任务调度试系统,基本功能包括:用户的注册、用户的登录、发起项目、项目详细及搜索等。本系统结构如下: (1)用户的注册登录: 注册模块:完成用户注册功能; 登录模块:完成用户登录功能; (2)发起项目: 发起项目模块:完成了项目及项目下一个或者多个任务的添加; 项目详细:点击项目名称,可以看到项目及任务详细信息; 搜索项目:完成对项目名称的模糊搜索功能

    30个炫酷的数据可视化大屏(含源码)

    大屏数据可视化是以大屏为主要展示载体的数据可视化设计,30个可视化大屏包含源码,直接运行文件夹中的index.html,即可看到大屏。 内含:数据可视化页面设计;数据可视化演示系统;大数据可视化监管平台;智能看板;翼兴消防监控;南方软件视频平台;全国图书零售监测数据;晋城高速综合管控大数据;无线网络大数据平台;设备大数据;游戏数据大屏;厅店营业效能分析;车辆综合管控平台;政务大数据共享交换平台;智慧社区;物流云数据看板平台;风机可视化大屏等。

    基于yolov5识别算法实现的DNF自动脚本源码.zip

    优秀源码设计,详情请查看资源源码内容

    毕业设计:基于SSM的mysql-在线网上书店(源码 + 数据库 + 说明文档)

    毕业设计:基于SSM的mysql_在线网上书店(源码 + 数据库 + 说明文档) 2.系统分析与设计 3 2.1系统分析 3 2.1.1需求分析 3 2.1.2必要性分析 3 2.2系统概要设计 3 2.2.1 项目规划 3 2.2.2系统功能结构图 4 2.3开发及运行环境 4 2.4逻辑结构设计 5 2.4.1 数据库概要说明 5 2.4.2 主要数据表结构 6 2.5文件夹架构 9 2.6编写JAVA BEAN 9 3.网站前台主要功能模块设计 10 3.1前台首页架构设计 10 3.2网站前台首页设计 11 3.3新书上市模块设计 12 3.4特价书籍模块设计 13 3.5书籍分类模块设计 14 3.6会员管理模块设计 15 3.7购物车模块设计 17 3.8收银台设计模块 19 3.9畅销书籍模块设计 20 4.网站后台主要功能模块设计 21 4.1网站后台文件夹架构设计 21 4.2后台主页面设计 21 4.3书籍管理模块设计 22 4.4会员管理模块设计 25 4.5订单管理模块设计 26 4.6公告管理模块设计 28 4.7退出系统页面设计 29 5.网站制作中遇到的问

    python 开发 python爬虫数据可视化分析项目源码加课题报告,源码注解清晰一看就懂,适合新手.zip

    python 开发 python爬虫数据可视化分析项目源码加课题报告,源码注解清晰一看就懂,适合新手

    node-v8.0.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提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    使用FPGA发送一个经过曼彻斯特编码的伪随机序列

    rtl中存放的是设计文件 sim中存放的是仿真文件

    基于Java的班级管理系统课程设计源码

    附件是基于 Java的班级管理系统课程设计源码,包含程序说明和运行环境要求,文件绿色安全,仅供学习交流使用,欢迎大家下载学习交流!

    最新获取QQ微信头像橘头像阁PHP源码下载.rar

    最新获取QQ微信头像橘头像阁PHP源码下载.rar最新获取QQ微信头像橘头像阁PHP源码下载.rar

    K-750 管道疏通机手册

    K-750 管道疏通机手册 Drain Cleaner Manual K-750 Drain Cleaning Machine

    基于哈希链表的简单人员信息管理系统

    实现基于哈希表的员工信息管理系统,该系统主要用于处理员工信息,主要包括员工个人信息的录入、删除、查找、修改等,同时支持数据的导入导出

    node-v6.16.0.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提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    3D模型007,可用于建模、GIS、BIM、CIM学习

    3D模型007,可用于建模、GIS、BIM、CIM学习

Global site tag (gtag.js) - Google Analytics