网页的静态-实际项目中的应用

原创 2018年04月17日 21:46:58

1.1. 商品详情页面静态化

当我们新增一个商品时,并通过消息队列,在商品详情表现层为他生成相应的静态页面html

输出文件的名称:商品id+“.html”
输出文件的路径:工程外部的任意目录。
网页访问:使用nginx访问网页。在此方案下tomcat只有一个作用就是生成静态页面。
工程部署:可以把e3-item-web部署到多个服务器上。
生成静态页面的时机:商品添加后,生成静态页面。可以使用Activemq,订阅topic(商品添加)


开始实战:

前提条件:会(ActiveMq,Nginx,Freemarker)







然后我们用nginx服务器,去访问静态页面,这样我们tomcat服务器根本没什么压力,就只是去生成了一下静态页面,除此之外,nginx处理并发数量远大于tomcat。





核心思想代码讲解:



<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
		http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">

	<!-- 加载配置文件 -->
	<context:property-placeholder location="classpath:conf/resource.properties" />
	
	<context:component-scan base-package="cn.e3mall.item.controller" />
	<mvc:annotation-driven />
	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/jsp/" />
		<property name="suffix" value=".jsp" />
	</bean>
	<!-- 配置freemarker -->
	<bean id="freemarkerConfig"
		class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
		<property name="templateLoaderPath" value="/WEB-INF/ftl/" />
		<property name="defaultEncoding" value="UTF-8" />
	</bean>
	
	<!-- 引用dubbo服务 -->
	<dubbo:application name="e3-item-web"/>
	<dubbo:registry protocol="zookeeper" address="115.159.126.205:2181"/>
	<dubbo:reference interface="cn.e3mall.service.ItemService" id="itemService" />
</beans>


<?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://115.159.126.205:61616" />
	</bean>
	<!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
	<bean id="connectionFactory"
		class="org.springframework.jms.connection.SingleConnectionFactory">
		<!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->
		<property name="targetConnectionFactory" ref="targetConnectionFactory" />
	</bean>
	<!--这个是主题目的地,一对多的 -->
	<bean id="topicDestination" class="org.apache.activemq.command.ActiveMQTopic">
		<constructor-arg value="itemAddTopic" />
	</bean>
	<!-- 监听商品添加消息,同步索引库 -->
	<bean id="htmlGenListener" class="cn.e3mall.item.listener.HtmlGenListener"/>
	<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
		<property name="connectionFactory" ref="connectionFactory" />
		<property name="destination" ref="topicDestination" />
		<property name="messageListener" ref="htmlGenListener" />
	</bean>
</beans>
#生成静态页面的位置
HTML_GEN_PATH=F:/freemarker/item/
package cn.e3mall.item.listener;

import java.io.FileWriter;
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 cn.e3mall.item.pojo.Item;
import cn.e3mall.pojo.TbItem;
import cn.e3mall.pojo.TbItemDesc;
import cn.e3mall.service.ItemService;
import freemarker.template.Configuration;
import freemarker.template.Template;

/**
 * 监听商品添加消息,生成对应的静态页面
 * <p>Title: HtmlGenListener</p>
 * <p>Description: </p>
 * <p>Company: www.itcast.cn</p> 
 * @version 1.0
 */
public class HtmlGenListener implements MessageListener {
	
	@Autowired
	private ItemService itemService;
	@Autowired
	private FreeMarkerConfigurer freeMarkerConfigurer;
	@Value("${HTML_GEN_PATH}")
	private String HTML_GEN_PATH;

	@Override
	public void onMessage(Message message) {
		try {
			//创建一个模板,参考jsp
			//从消息中取商品id
			TextMessage textMessage = (TextMessage) message;
			String text = textMessage.getText();
			Long itemId = new Long(text);
			System.out.println("接收到消息,去创建静态模板:"+itemId);
			//等待事务提交
			Thread.sleep(1000);
			//根据商品id查询商品信息,商品基本信息和商品描述。
			TbItem tbItem = itemService.getItemById(itemId);
			Item item = new Item(tbItem);
			//取商品描述
			TbItemDesc itemDesc = itemService.getItemDescById(itemId);
			//创建一个数据集,把商品数据封装
			Map<Object,Object> data = new HashMap<>();
			data.put("item", item);
			data.put("itemDesc", itemDesc);
			//加载模板对象
			Configuration configuration = freeMarkerConfigurer.getConfiguration();
			Template template = configuration.getTemplate("item.ftl");
			//创建一个输出流,指定输出的目录及文件名。
			Writer out = new FileWriter(HTML_GEN_PATH + itemId + ".html");
			//生成静态页面。
			template.process(data, out);
			//关闭流
			out.close();
			
		} catch (Exception e) {
			// TODO: handle exception
		}

	}

}

注意:修改web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	version="2.5">
	<display-name>e3-item-web</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
	</welcome-file-list>

	<!-- 解决post乱码 -->
	<filter>
		<filter-name>CharacterEncodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>utf-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>CharacterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>


	<!-- springmvc的前端控制器 -->
	<servlet>
		<servlet-name>e3-item-web</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- contextConfigLocation不是必须的, 如果不配置contextConfigLocation, springmvc的配置文件默认在:WEB-INF/servlet的name+"-servlet.xml" -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring/*.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>e3-item-web</servlet-name>
		<!-- 伪静态化 -->
		<url-pattern>*.html</url-pattern>
	</servlet-mapping>
</web-app>

配置Nginx:






版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37499059/article/details/79981237

线程在实际项目中简单的应用

前段时间开发的项目中有一个office在线预览的功能,我们知道需要实现这个功能一般是 后台把用户上传的txt啊excel啊word啊先转换成pdf格式,然后使用pdf.js进行前台预览(有的还 需要转...
  • u014417573
  • u014417573
  • 2017-11-30 13:50:31
  • 1252

GIT在实际项目中的应用

现在在对项目进行管理时,大多都选择的版本控制工具为GIT,在我使用GIT的过程中也遇到过一些实际的问题,这里跟大家分享一下,我遇到实际问题的解决方法,希望能给大家提供一些帮助。不足地方请大家谅解!!!...
  • jyghgq
  • jyghgq
  • 2017-07-26 17:27:19
  • 373

闭包的实际应用(更新中。。。)

1、匿名自执行函数  我们知道所有的变量,如果不加上var关键字,则默认的会添加到全局对象的属性上去,这样的临时变量加入全局对象有很多坏处, 比如:别的函数可能误用这些变量;造成全局对象过于庞大,影...
  • ForMyQianDuan
  • ForMyQianDuan
  • 2016-07-13 19:45:17
  • 1616

Redis在实际项目中的使用

redis: host: 172.27.15.23 port: 6379 database: 0 pool: max-idle: 20 min-...
  • dgutliangxuan
  • dgutliangxuan
  • 2018-01-08 15:29:06
  • 516

【Redis】Redis在实际项目中的应用

前言Redis作为内存型的数据库,比mysql的速度快很多,所以经常会被用作缓存等,下面列举一下我在实际项目中的的使用。Code缓存 string采用string的存储结构对字符串进行存储常用的命令为...
  • diandianxiyu
  • diandianxiyu
  • 2016-10-31 19:53:32
  • 5329

hadoop在项目中的应用笔记

hadoop在java项目中的应用,一般是调用本地hadoop  调试,运行成功后才上次到hadoop集群中进行运行, public class RunJob { public stati...
  • qq_26562641
  • qq_26562641
  • 2016-04-26 09:18:02
  • 666

GCD实际应用

GCD 先行概念 程序:是为了实现特定目标或解决特定问题而用计算机语言编程的命令序列集合。程序分为两种:系统程序与应用程序 进程:这里为了避免引入过多的概念造成误解与便于后续问题的展开就粗暴与错...
  • qq_18133317
  • qq_18133317
  • 2015-12-13 16:32:37
  • 334

Ajax在实际项目中的简单使用

我们在项目的练习中会经常使用到Ajax,实现异步刷新,这里记录一下商城项目中后台进行订单数据管理使用Ajax的情况。 ---------orderItem.jsp...
  • sinat_35821285
  • sinat_35821285
  • 2018-01-13 17:18:27
  • 208

多线程编程在实际项目中的运用

最近在实际项目中遇到了需要多线程来处理的一个实际问题:一堆视频资源需要上传到一个cc平台,如果串行处理,显然不能很好实用多核的cpu处理器,于是考虑到实用线程的方式进行上传,但是创建多少个线程了?如果...
  • fengchao2016
  • fengchao2016
  • 2018-03-08 21:31:35
  • 129

关于Runtime在项目中使用的总结

关于Runtime在项目中使用的总结 关于Runtime其实有很多事情可以做,具体可以参考头文件objc/runtime.h,本文主要介绍在项目使用过程中,通过Runtime解决了的几个问题的用法...
  • lcl12111211
  • lcl12111211
  • 2017-03-06 20:03:04
  • 340
收藏助手
不良信息举报
您举报文章:网页的静态-实际项目中的应用
举报原因:
原因补充:

(最多只允许输入30个字)