基于seam框架的嵌入式广告(embedded javascript)实现

目前有很多网站都提供javascript脚本供其他网站来引用自己的内容,像广告,新闻等等。典型案例如 “google adsense”

最近用seam实现了一个比较简易的应用,耗费了3个工作日,实现上面也是由繁入简,目前这个实现应该是比较简单了。在此愿意与大家分享。

由于我的例子比较简单,因此只用了一个类ConsumerEmbeddedJavascriptAction。既输出javascript和css,由其他网站来应用;而当其他网站引用javascript时,实际调用的还是这个类来产生相应的内容。

@Name("consumerEmbeddedJavascriptAction")
@Scope(ScopeType.PAGE)
public class ConsumerEmbeddedJavascriptAction implements Serializable {

	private static final long serialVersionUID = -7550289081159249326L;


	@In
	UserBean sessionUser;

	@In (create=true)
	private EntityManager entityManager;
	

	@RequestParameter("contentType")
	String contentType;
	
	/**
	 * 生成嵌入的css和js脚本,JS脚本的生成就在当前类的getEmbeddedJsText()方法
         * 中,css稍后我会列出。形如
	 * <link rel="stylesheet" href="http://localhost:8080/embeddedjs.css" />
	 * <script src=="http://localhost:8080/embedded_javascript.seam?contentType=AD" />
	 * @return
	 */
	@Factory(value = "embeddedJsReferenceForContents", scope = ScopeType.PAGE, autoCreate = false)
	public String getEmbeddedJsReference() {
		HttpServletRequest request = FacesUtil.getServletRequest();
		String requestPath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
		StringBuilder remoteReference = new StringBuilder();
		remoteReference.append("<link rel=\"stylesheet\" href=\""+requestPath+"ver20/embeddedjs.css\" />");
		remoteReference.append("<script src=\""+requestPath+"ver20/embedded_javascript.seam?contentType="+EntityTWContent.TYPE_NEWS+"\"></script>");
		return remoteReference.toString();
	}
 

	@Factory(value = "embeddedJsForContents", scope = ScopeType.PAGE, autoCreate = false)
	public String getEmbeddedJsText() {
		String query = "";
		/**
		 * 构造查询语句....
		 */
		Query q = this.entityManager.createQuery(query);
		
		Collection<EntityTWContent> contentList = q.getResultList();
		return  getHtmlContent(contentList);
	}

	/**
	 * 根据数据库的数据产生输出的html,并由js脚本document.write()输出。
	 * 
	 * @return
	 */
	private String getHtmlContent(Collection<EntityTWContent> contentList){
		HttpServletRequest request = FacesUtil.getServletRequest();
		String requestPath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
		StringBuilder html = new StringBuilder();
		html.append("document.write(\"<div id='twid_container'>\");");
		for(EntityTWContent content:contentList){
			html.append("document.write(\"<div id='subjectColumn'>");
			html.append("<a href='"+requestPath+"c/"+content.getContentId()+"'>"+content.getSubject()+"</a>");
			html.append("</div>\");");
			html.append("document.write(\"<div id='publishTimeColumn'>");
			html.append(content.getPublishTime());
			html.append("</div>\");");
			html.append("document.write(\"<div style='clear:both;'></div>\");");
			html.append("document.write(\"<div id='summaryColumn'>");
			html.append(content.getSummary());
			html.append("</div>\");");
			html.append("document.write(\"<div style='clear:both;'></div>\");");
		}
		html.append("document.write(\"</div>\");");
		return html.toString();
	}
 

	public String getContentType() {
		return contentType;
	}

	public void setContentType(String contentType) {
		this.contentType = contentType;
	}
    
}

然后是输出javascript引用的xhtml文件,其他网站可以从文本框中将类似的内容拷贝到自己的html页面中( <link rel="stylesheet" href="http://localhost:8080/embeddedjs.css" /> <script src=="http://localhost:8080/embedded_javascript.seam?contentType=AD" />):

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	  xmlns:s="http://jboss.com/products/seam/taglib"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:a4j="http://richfaces.org/a4j"
      xmlns:rich="http://richfaces.org/rich"
      xmlns:c="http://java.sun.com/jstl/core">
<body>

            <h:form>
			<h:inputTextarea value="#{embeddedJsReferenceForContents}" cols="80"
								rows="5" />
			</h:form>
		
	
</body>
</html>

当<script src=="http://localhost:8080/embedded_javascript.seam?contentType=AD" />被执行时,另一个xhtml页面:embedded_javascript.xhtml将会被调用,这个页面更简单。

<f:view xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
  <f:view contentType="application/x-javascript" />
  <h:outputText value="#{embeddedJsForContents}" escape="false"/>
	

</f:view>

到此,所有的工作全部完成。噢,还差一个,css文件:embeddedjs.css,其他网站可以仿照这个css加入自己的css。

#twid_container {
	width:400px;
}
#subjectColumn{
	float: left;
	margin-top: 0px;
	padding-top: 0px;
	margin-bottom: 0px;
	font-weight: bold;
	font-size: 14px;
}
#publishTimeColumn{
	margin-top: 0px;
	margin-bottom: 0px;
	padding-right: 10px;
	padding-top: 0px;
	font-size: 11px;
	vertical-align: top;
	float: right;
}
#summaryColumn{
	float: left;
	margin-top: 0px;
	padding-top: 0px;
	margin-bottom: 0px;
	font-size: 13px;
}
 

相关推荐