`
Aspen
  • 浏览: 8626 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

扩展SiteMesh支持WML

阅读更多

SiteMesh 是opensymphony开源组织下一款优秀的Java组件,一般用于页面模板装饰,以减少重复的视图代码为目的。

SiteMesh目前最新版本2.4.1,对HTML页面支持良好,不支持WML页面的装饰。

 

集成SiteMesh到web application较为简单,在这里假设读者熟悉SiteMesh用于HTML的装饰,如果读者不太了解SiteMesh的用法,请查阅官方相关文档。下面简单列出SiteMesh的使用步骤:

 

一、SiteMesh用法

1.1 web.xml文件配置过滤器

	<!--sitemesh filter-->

	<filter>
		<filter-name>sitemesh</filter-name>
		<filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>sitemesh</filter-name>
		<url-pattern>/*</url-pattern>
		<dispatcher>FORWARD</dispatcher>
		<dispatcher>REQUEST</dispatcher>
	</filter-mapping>

 

1.2 配置sitemesh.xml文件

<sitemesh>
    <property name="decorators-file" value="/WEB-INF/decorators.xml"/>

    <excludes file="${decorators-file}"/>

    <page-parsers>
        <parser default="true" class="com.opensymphony.module.sitemesh.parser.HTMLPageParser"/>

        <parser content-type="text/html" class="com.opensymphony.module.sitemesh.parser.HTMLPageParser"/>

        <parser content-type="text/html;charset=UTF-8" class="com.opensymphony.module.sitemesh.parser.HTMLPageParser"/>
    </page-parsers>

    <decorator-mappers>

        <mapper class="com.opensymphony.module.sitemesh.mapper.PageDecoratorMapper">
		<param name="property.1" value="meta.decorator" />
		<param name="property.2" value="decorator" />
	</mapper>

        <mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
            <param name="config" value="${decorators-file}"/>
        </mapper>

    </decorator-mappers>

</sitemesh>

 

1.3 decorators.xml 文件

 

<decorators defaultdir="/view/decorators">
    <excludes>
        <pattern>/resources/*</pattern>
    </excludes>
   
    <decorator name="system" page="system.jsp"/>
   
    <decorator name="background" page="background.jsp"/>

    <decorator name="wml" page="wml.jsp"/>

</decorators>

 

1.4 具体装饰模板

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator"%>
<%@ page pageEncoding="utf-8" %>

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">

    <head>
        <link rel="stylesheet" type="text/css" media="all" href="styles/default/theme.css" />
	<script language="javascript" src="scripts/jquery/jquery-min.js"></script>

        <decorator:head/>
        <title><decorator:title/>|title test</title>
    </head>
    
	<body
		<decorator:getProperty property="body.id" writeEntireProperty="true"/>
		<decorator:getProperty property="body.class" writeEntireProperty="true"/>>
		
		<jsp:include page="/view/common/messages.jsp"/>
		        	
		<decorator:body/>
				
                 <jsp:include page="/view/html/common/footer.jsp"/>				
	</body>
	
</html>
 

1.5 视图页面

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html;charset=utf-8" %>
<%@ include file="/view/common/taglibs.jsp" %>
<%@ page import="org.apache.shiro.SecurityUtils" %>

<html>
	<head>
		<meta name="decorator" content="system"/>
		<title>bye!</title>
	</head>	
	
	<body>
		XXXXXXXXXXXXXXXX
	</body>
</html>
 

 

以上是SiteMesh针对HTML页面的用法,下面扩展SiteMesh以实现对WML页面的支持

 

2扩展SiteMesh以实现对WML页面的支持

 

2.1 实现com.opensymphony.module.sitemesh.PageParser

 

package com.wearereading.frameworks.sitemesh.wml;

import java.io.IOException;

import com.opensymphony.module.sitemesh.Page;
import com.opensymphony.module.sitemesh.PageParser;
import com.opensymphony.module.sitemesh.html.HTMLProcessor;
import com.opensymphony.module.sitemesh.html.State;
import com.opensymphony.module.sitemesh.html.rules.HeadExtractingRule;
import com.opensymphony.module.sitemesh.html.rules.MetaTagRule;
import com.opensymphony.module.sitemesh.html.rules.TitleExtractingRule;
import com.opensymphony.module.sitemesh.html.util.CharArray;

/**
 * WML页面解析
 * @author Aspen
 *
 */
public class WMLPageParser implements PageParser {
	
    public Page parse(char[] data) throws IOException {
        CharArray head = new CharArray(64);
        CharArray card = new CharArray(4096); //cards TODO 暂只支持一个CARD
        TokenizedWMLPage page = new TokenizedWMLPage(data, card, head);
        
        HTMLProcessor processor = new HTMLProcessor(data, card);
        State wml = processor.defaultState();

        // Core rules for SiteMesh to be functional.
        wml.addRule(new HeadExtractingRule(head)); // contents of <head>
        wml.addRule(new CardTagRule(page, card)); // contents of <card>
        wml.addRule(new TitleExtractingRule(page)); // the <title>
        wml.addRule(new MetaTagRule(page));   // all <meta> tags

        processor.process();
        return page;
    }

}

 

package com.wearereading.frameworks.sitemesh.wml;

import com.opensymphony.module.sitemesh.html.BasicRule;
import com.opensymphony.module.sitemesh.html.Tag;
import com.opensymphony.module.sitemesh.html.rules.PageBuilder;
import com.opensymphony.module.sitemesh.html.util.CharArray;

/**
 * 
 * @author Aspen
 *
 */
public class CardTagRule extends BasicRule{
	
    private final PageBuilder page;
    private final CharArray card;

    public CardTagRule(PageBuilder page, CharArray card) {
        super("card");
        this.page = page;
        this.card = card;
    }

    public void process(Tag tag) {
        if (tag.getType() == Tag.OPEN || tag.getType() == Tag.EMPTY) {
            for (int i = 0; i < tag.getAttributeCount(); i++) {
                page.addProperty("card." + tag.getAttributeName(i), tag.getAttributeValue(i));
            }
            card.clear();
        } else {
            context.pushBuffer(new CharArray(64)); 
        }
    }

}

 

2.2 扩展com.opensymphony.module.sitemesh.Page

 

package com.wearereading.frameworks.sitemesh.wml;

import java.io.IOException;
import java.io.Writer;

import com.opensymphony.module.sitemesh.Page;

/**
 * WML page
 * @author Aspen
 *
 */
public interface WMLPage extends Page{
	
    /**
     * Write the contents of the <code>&lt;head&gt;</code> tag.
     */
    void writeHead(Writer out) throws IOException;

    /**
     * Convenience method to return the contents of the <code>&lt;head&gt;</code> tag as a String.
     */
    String getHead();
	
}
 
package com.wearereading.frameworks.sitemesh.wml;

import java.io.IOException;
import java.io.Writer;

import com.opensymphony.module.sitemesh.parser.AbstractPage;

/**
 * 
 * @author Aspen
 *
 */
public abstract class AbstractWMLPage extends AbstractPage implements WMLPage {

    public abstract void writeHead(Writer out) throws IOException;

}
 
package com.wearereading.frameworks.sitemesh.wml;

import java.io.IOException;
import java.io.Writer;

import com.opensymphony.module.sitemesh.html.rules.PageBuilder;
import com.opensymphony.module.sitemesh.html.util.CharArray;

/**
 * 
 * @author Aspen
 *
 */
public class TokenizedWMLPage extends AbstractWMLPage implements PageBuilder {
	
	private CharArray[] cards;
	
    private CharArray head;
    
    public TokenizedWMLPage(char[] original, CharArray[] cards, CharArray head) {
        this.pageData = original;
        this.cards = cards;
        this.head = head;
        addProperty("title", "");
    }
    
    public TokenizedWMLPage(char[] original, CharArray card, CharArray head){
    	this(original,new CharArray[]{card},head );
    }
    
    public void writeHead(Writer out) throws IOException {
        out.write(head.toString());
    }

    public void writeBody(Writer out) throws IOException {
    	for( int i=0;i<cards.length;i++)
    		out.write(cards[i].toString());
    }

    public String getHead() {
        return head.toString();
    }

    public String getBody() {
    	StringBuffer body = new StringBuffer();
    	for( int i=0;i<cards.length;i++)
    		body.append(cards[i].toString());
    	
        return body.toString();
    }

    public String getPage() {
        return new String(pageData);
    }

}

 

2.3 CARD标签

 

package com.wearereading.frameworks.sitemesh.wml;

import com.opensymphony.module.sitemesh.taglib.AbstractTag;

/**
 * 
 * @author Aspen
 *
 */
public class CardTag extends AbstractTag {
    
	private static final long serialVersionUID = 1L;

	public final int doEndTag() {
        try {
        	getPage().writeBody(getOut());
        }
        catch (Exception e) {
            trace(e);
        }
        return EVAL_PAGE;
    }

}

 

  2.4 扩展SiteMesh 过滤器

 

package com.wearereading.frameworks.sitemesh.wml;

import javax.servlet.FilterConfig;

import com.opensymphony.module.sitemesh.Config;
import com.opensymphony.module.sitemesh.Factory;
import com.opensymphony.sitemesh.ContentProcessor;
import com.opensymphony.sitemesh.webapp.SiteMeshFilter;
import com.opensymphony.sitemesh.webapp.SiteMeshWebAppContext;

/**
 * 扩展支持WML
 * @author Aspen
 *
 */
public class WMLSupportedSiteMeshFilter extends SiteMeshFilter{
	
	private FilterConfig filterConfig;
	
    public void init(FilterConfig filterConfig) {
        this.filterConfig = filterConfig;
        super.init(filterConfig);
    }

    public void destroy() {
        filterConfig = null;
        super.destroy();
    }
	
    protected ContentProcessor initContentProcessor(SiteMeshWebAppContext webAppContext) {
        Factory factory = Factory.getInstance(new Config(filterConfig));
        factory.refresh();
        return new WMLPageParser2ContentProcessor(factory);
    }
	
} 
package com.wearereading.frameworks.sitemesh.wml;

import java.io.IOException;

import com.opensymphony.module.sitemesh.Factory;
import com.opensymphony.module.sitemesh.HTMLPage;
import com.opensymphony.module.sitemesh.Page;
import com.opensymphony.module.sitemesh.PageParser;
import com.opensymphony.module.sitemesh.filter.HttpContentType;
import com.opensymphony.sitemesh.Content;
import com.opensymphony.sitemesh.SiteMeshContext;
import com.opensymphony.sitemesh.compatability.HTMLPage2Content;
import com.opensymphony.sitemesh.compatability.PageParser2ContentProcessor;

/**
 * 
 * @author Aspen
 *
 */
public class WMLPageParser2ContentProcessor extends PageParser2ContentProcessor {

	private final Factory factory;
	
	public WMLPageParser2ContentProcessor(Factory factory) {
		super(factory);
		this.factory=factory;
	}

    public Content build(char[] data, SiteMeshContext context) throws IOException {
        HttpContentType httpContentType = new HttpContentType(context.getContentType());
        PageParser pageParser = factory.getPageParser(httpContentType.getType());
        Page page = pageParser.parse(data);
        if( page instanceof WMLPage)
        	return new WMLPage2Content((WMLPage) page);
        
        return new HTMLPage2Content((HTMLPage) page);        
    }
    
}
 
package com.wearereading.frameworks.sitemesh.wml;

import java.io.IOException;
import java.io.Writer;

import com.opensymphony.sitemesh.Content;

/**
 * 
 * @author Aspen
 *
 */
public class WMLPage2Content implements Content {
	
	private final WMLPage page;
	
	public WMLPage2Content( WMLPage page ){
		this.page = page;
	}

   public void writeOriginal(Writer out) throws IOException {
        page.writePage(out);
    }

    public int originalLength() {
        return page.getContentLength();
    }

    public void writeBody(Writer out) throws IOException {
        page.writeBody(out);
    }

    public void writeHead(Writer out) throws IOException {
        page.writeHead(out);
    }

    public String getTitle() {
        return page.getTitle();
    }

    public String getProperty(String name) {
        return page.getProperty(name);
    }

    public String[] getPropertyKeys() {
        return page.getPropertyKeys();
    }

    public void addProperty(String name, String value) {
        page.addProperty(name, value);
    }

}

 

SiteMesh支持装饰HTML和WML的用法

需要上传的附件(sitemesh-2.4.1-wml-0.9.jar),你也可以使用上述源代码。

 

3.1 web.xml

 

	<!--sitemesh filter-->
	<filter>
		<filter-name>sitemesh</filter-name>
		<filter-class>com.wearereading.frameworks.sitemesh.wml.WMLSupportedSiteMeshFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>sitemesh</filter-name>
		<url-pattern>/*</url-pattern>
		<dispatcher>FORWARD</dispatcher>
		<dispatcher>REQUEST</dispatcher>
	</filter-mapping>


3.2 sitemesh.xml

 

<sitemesh>
    <property name="decorators-file" value="/WEB-INF/decorators.xml"/>
    <excludes file="${decorators-file}"/>
    <page-parsers>
        <parser default="true" class="com.opensymphony.module.sitemesh.parser.HTMLPageParser"/>
        <
parser content-type="text/vnd.wap.wml" class="com.wearereading.frameworks.sitemesh.wml.WMLPageParser"/>
        <parser content-type="text/vnd.wap.wml;charset=UTF-8" class="com.wearereading.frameworks.sitemesh.wml.WMLPageParser"/>
        <parser content-type="text/html" class="com.opensymphony.module.sitemesh.parser.HTMLPageParser"/>
        <parser content-type="text/html;charset=UTF-8" class="com.opensymphony.module.sitemesh.parser.HTMLPageParser"/>
    </page-parsers>

    <decorator-mappers>
        <mapper class="com.opensymphony.module.sitemesh.mapper.PageDecoratorMapper">
		<param name="property.1" value="meta.decorator" />
		<param name="property.2" value="decorator" />
	</mapper>

        <mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
            <param name="config" value="${decorators-file}"/>
        </mapper>
    </decorator-mappers>
</sitemesh>
 

3.3 装饰模板

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">

<%@ page contentType="text/vnd.wap.wml;charset=UTF-8"%>
<%@ taglib uri="http://www.wearereading.com/frameworks/sitemesh/wml/decorator" prefix="wml-decorator"%>

<wml>
	<head>	
		<decorator:head/>
		<meta name="keyword" content="WAP"/>
	</head>
	
	<card <decorator:getProperty property="card.id" writeEntireProperty="true" /> <decorator:getProperty property="card.title" writeEntireProperty="true"/>>
		<jsp:include page="/view/wml/common/header.jsp" />
		
		<wml-decorator:card/>
		
		<jsp:include page="/view/wml/common/footer.jsp" />
	</card>
</wml>

 

 

分享到:
评论

相关推荐

    sitemesh

    4. **可扩展性**:支持与其他模板引擎集成,适应各种开发需求。 然而,Sitemesh也有其局限性,例如对于JavaScript驱动的单页应用(SPA)支持不够理想,因为它主要是基于服务器端的装饰模型。现代Web开发中,更多地...

    SiteMesh教程及SiteMesh官方文档翻译

    除了基本的页面装饰功能之外,SiteMesh还支持与模板引擎如Freemarker的集成,以便更灵活地处理动态内容。 **Spring MVC整合Sitemesh和Freemarker** 要在Spring MVC项目中整合Sitemesh和Freemarker,首先需要确保...

    sitemesh-3.0.0的库和源码

    - **响应式设计支持**:Sitemesh 3.0.0 支持现代Web开发中的响应式设计,能够根据用户设备的屏幕尺寸自动调整页面布局。 - **模块化结构**:框架采用模块化设计,使得开发者可以根据需求选择安装特定的模块,减少...

    java sitemesh 页面框架

    3. **可扩展性**:可以通过自定义Filter或使用表达式语言(EL)来控制装饰过程。 4. **与Struts、Spring MVC等框架兼容**:Sitemesh可以很好地与其他MVC框架集成,提供统一的页面布局。 **使用Sitemesh的优点**: 1...

    sitemesh框架简单例子

    此外,Sitemesh还支持自定义装饰器的加载顺序,以及与Spring、Struts等其他框架的集成。 在实际开发中,Sitemesh可以帮助你提高效率,减少重复工作,并确保网站的整体设计一致性。通过深入学习和实践这个“sitemesh...

    sitemesh3官方下载包

    - **可扩展性**:Sitemesh3提供了插件机制,允许开发者扩展其功能,例如实现自定义的装饰逻辑或者内容过滤。 在实际项目中,安装和配置Sitemesh3通常涉及以下步骤: 1. 下载并解压Sitemesh3的官方包。 2. 将lib...

    sitemesh入门demo

    - Sitemesh支持自定义装饰策略,例如基于请求参数、用户角色等进行动态装饰。 - 可以结合其他Web框架,如Spring MVC或Struts,更方便地集成Sitemesh。 通过学习这个"**sitemesh入门demo**",你可以快速掌握...

    sitemesh教程

    - **自定义装饰器标签**:可以创建自定义的装饰器标签来扩展SiteMesh的功能。 #### 六、总结 通过本文的介绍,我们了解了如何在Web项目中集成并使用SiteMesh,以及如何结合Freemarker模板引擎实现更复杂的布局设计...

    siteMesh demo+文档

    SiteMesh 是一个开源的Web应用程序布局和装饰框架,主要用于解决Web应用中的页面布局问题。它通过拦截HTTP请求,将页面内容与预定义的布局模板相结合,实现统一的页面头部、底部和侧边栏等元素,从而提高网站的整体...

    SiteMesh

    SiteMesh 是一个开源的Web应用程序框架,主要用于帮助开发者实现页面布局和装饰功能。它通过拦截HTTP请求,将页面内容与布局模板相结合,从而提供了一种简单有效的方式来管理和控制Web应用的外观和感觉。在Web开发中...

    SiteMesh教程.pdf

    SiteMesh支持多种页面解析器(Page Parsers),能够解析不同类型的Web页面,如HTML、XHTML等。同时,SiteMesh允许自定义装饰器映射器(Decorator Mappers),用于控制哪些页面使用哪个装饰器,以及如何解析页面内容...

    sitemesh jar包

    4. **可扩展性**:Sitemesh提供了一套API,允许开发者自定义装饰逻辑和策略。 5. **易用性**:通过简单的配置和注解,开发者可以快速设置和控制页面装饰。 **三、Sitemesh的使用步骤** 1. **添加依赖**:在项目中...

    sitemesh-3.0.1-javadoc

    SiteMesh是一个网页布局和装饰框架以及Web应用程序集成框架,可帮助创建由页面组成的网站,这些页面需要一致的外观,导航和布局方案。 SiteMesh会拦截对通过Web服务器请求的任何静态或动态生成...SiteMesh是可扩展的。

    springMVC与sitemesh的结合

    Spring MVC 是一个强大的Java Web应用程序开发框架,由Spring.io团队维护,它提供了模型-视图-控制器(MVC)架构,使开发者能够更方便地构建可维护、可扩展的Web应用。而Sitemesh则是一个页面布局和装饰框架,主要...

    页面装饰器(sitemesh)实例源代码

    页面装饰器(Sitemesh)是一种广泛用于Web应用的开源框架,它的主要功能是提供页面布局和装饰功能,使得开发者可以方便地实现统一的页面头部、尾部、侧边栏等元素,从而提高网站的整体风格一致性。在本实例中,我们...

    sitemesh装饰器入门

    此外,Sitemesh 还支持自定义过滤器,可以根据需要扩展其功能,例如实现权限控制、动态装饰等高级特性。 在实际项目中,Sitemesh 可以与其他 Web 框架(如 Struts、Spring MVC 等)很好地集成,进一步提升开发效率...

    sitemesh布局知识点汇总

    - **属性体系**:Sitemesh提供了一套功能丰富的属性体系,支持构建更为复杂和灵活的装饰器,而Struts Tiles在这方面的支持相对有限。 #### 三、Sitemesh的基本原理 当用户请求某个页面时,Sitemesh的工作流程如下...

    sitemesh3-demo

    6. **动态装饰**: Sitemesh3支持动态装饰,允许在运行时根据请求信息决定是否应用装饰器或者使用哪个装饰器。 7. **响应式设计**: Sitemesh3可以与其他响应式前端框架(如Bootstrap)结合,实现响应式布局,使网站...

    SiteMesh2.3很全的一个资料

    6. **扩展性**:SiteMesh 支持与其他Web框架集成,如Spring MVC、Struts等,使得在这些框架上的应用可以轻松地应用SiteMesh的装饰功能。 7. **错误处理**:SiteMesh 提供了处理错误页面的方法,即使在发生异常时也...

Global site tag (gtag.js) - Google Analytics