学习淘淘商城第七十二课(网页静态化-业务逻辑及测试)

110 篇文章 383 订阅
7 篇文章 0 订阅

        首先,需要在taotao-item-web工程添加对activemq的依赖,如下图所示。


         依赖代码如下:

<!-- activemq组件 -->
  	<dependency>
		<groupId>org.apache.activemq</groupId>
		<artifactId>activemq-all</artifactId>
	</dependency>
        下面我们需要把taotao-search-web工程下的applicationContext-activemq.xml文件拷贝到taotao-item-web工程下的spring目录下并且更名为springmvc-activemq.xml,要加载spring目录下的两个xml文件则需要修改taotao-item-web工程的web.xml文件,将原来扫描的springmvc.xml修改为springmvc*.xml,如下图所示。


        另外springmvc-activemq.xml文件也需要做些修改,修改后的代码如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">
	
	<!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供 -->
	<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
		<property name="brokerURL" value="tcp://192.168.156.30:61616" />
	</bean>
	<!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
	<bean id="connectionFactory"
		class="org.springframework.jms.connection.SingleConnectionFactory">
		<!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->
		<property name="targetConnectionFactory" ref="targetConnectionFactory" />
	</bean>
	<!-- 配置生产者 -->
	<!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->
	<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
		<!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
		<property name="connectionFactory" ref="connectionFactory" />
	</bean>
	<!--这个是主题目的地,一对多的 -->
	<bean id="itemAddTopic" class="org.apache.activemq.command.ActiveMQTopic">
		<constructor-arg value="item-add-topic" />
	</bean>
	
	
	<!-- 配置监听器 -->
	<bean id="itemAddMessageListener" class="com.taotao.item.listener.ItemAddMessageListener"/>
	<!-- 消息监听容器 -->
	<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
	    <property name="connectionFactory" ref="connectionFactory"/>
	    <property name="destination" ref="itemAddTopic"/>
	    <property name="messageListener" ref="itemAddMessageListener"/>
	</bean>

</beans>

         上面配置文件中配置了一个监听器,我们需要创建这么一个监听器,当监听到有添加商品的消息时便去生成静态页面,监听类如下图所示。


        监听类代码如下:

package com.taotao.item.listener;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;

import com.taotao.item.pojo.Item;
import com.taotao.pojo.TbItem;
import com.taotao.pojo.TbItemDesc;
import com.taotao.service.ItemService;

import freemarker.template.Configuration;
import freemarker.template.Template;

public class ItemAddMessageListener implements MessageListener {
	@Autowired
	private ItemService itemService;
	@Autowired
	private FreeMarkerConfigurer freeMarkerConfiger;
	@Value("${HTML_OUT_PATH}")
	private String HTML_OUT_PATH;

	@Override
	public void onMessage(Message message) {
		try {
			//从消息中获取商品ID
			TextMessage textMessage = (TextMessage)message;
			String itemIdStr = textMessage.getText();
			Long itemId = Long.parseLong(itemIdStr);
			//等待事务的提交,采用三次尝试的机会
			TbItem tbItem = null;
			for(int i=0;i<3;i++){
				//根据商品id查询商品信息及商品描述
				Thread.sleep(1000);
				tbItem = itemService.getItemById(itemId);
				if(tbItem != null){
					break;
				}
			}
			Item item = new Item(tbItem);
			TbItemDesc itemDesc = itemService.getItemDescById(itemId);
			//使用freemarker生成静态页面
			Configuration configuration = freeMarkerConfiger.getConfiguration();
			//创建模板并加载模板对象
			Template template = configuration.getTemplate("item.ftl");
			//准备模板需要的数据
			Map data = new HashMap<>();
			data.put("item", item);
			data.put("itemDesc", itemDesc);
			//指定输出的目录及文件名
			OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(new File(HTML_OUT_PATH+itemIdStr+".html")),"UTF-8");
			//生成静态页面
			template.process(data, out);
			//关闭流
			out.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

       代码中输出的文件路径配置在配置文件中,如下图所示。


       写完了代码,下面我们来测试一下,先启动五个服务(zookeeper、image、solr、redis、activemq),然后依次启动taotao-manager、taotao-content、taotao-search、taotao-manager-web、taotao-portal-web、taotao-search-web、taotao-item-web工程。启动完后,我们在淘淘商城后台页面添加一个商品,如下图所示。


         添加完商品后,我们到静态文件目录下查看生成的静态文件,如下图所示。我们双击生成的静态页面。


         可以看到生成的静态页面是没有样式的,这是因为我们没有把样式文件放到相应的目录下。

          为了让样式好看,我们把taotao-item-web工程的webapp目录下的css、images、js文件拷贝到"E:/freemarker"目录下也就是要与"out"目录在同一级别。

          放置的目录如下图所示

        要想看到页面正常效果,我们可以先使用windows版的nginx,大家可以到nginx官网下载一个windows版本的安装包,我下载的是1.8.1版本,解压后进入它的conf目录下,打开nginx.conf文件,修改location下面的root目录为"E:/freemarker/"。


         修改完后,回到上一级目录,双击nginx.exe运行nginx,会看到一闪而过,这时nginx便启动了。


           下面我们便使用nginx来访问我们的静态网页,在地址栏中输入http://localhost/out/149520429903365.html即可看到如下图所示界面,页面正常展示出了商品详情页面。




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值