`
clongjava
  • 浏览: 64458 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

使用sitemesh替换tiles2,spring mvc+spring web flow+sitemsh

阅读更多

   之 前改写的spring web flow发行包中的booking-mvc应用(参见 http://clongjava.iteye.com/blog/1314108 ),采用的是 tiles2来统一整个站点页面风格,spring web flow提供了一个ViewResolver为 org.springframework.js.ajax.AjaxUrlBasedViewResolver,它结合了spring-js,提供了 ajax内置的支持,可以使我们局部加载某个tiles的put-attribute中的内容。可是每次都要写tiles配置文件,感觉不爽,由于之前使 用过sitemesh感觉不错,就想替换掉tiles,由于tiles和sitemesh采用统一页面风格的理念不一样,sitemesh采用的是装饰 (decorator)通过filter来过滤所有请求生成的页面。而tiles是采用的模板方法。二者目的都是一样的,统一风格

       sitemesh配置很简单:首先在web.xml中添加一个sitemesh filter,代码如下:

    

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

<!-- note:sitemesh filter mapping must appear after springSecurityFilterChain filter mapping -->
    <filter-mapping>
        <filter-name>sitemesh</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

 这里有个注意点要提下:当我们也配置了spring security filter的时候,sitemesh的filter mapping应该在spring security filter mapping之后,不然sitemesh对于使用spring security jsp tag的页面显示不出来,这也可以理解,sitemesh已经装饰完成了,而spring security filter还没结束,当然显示不出来。


第二步,在WEB-INF目录下,新建一个名为decorators.xml文件即可,内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<decorators defaultDir="/WEB-INF/layout">
    <excludes>
        <pattern>/resources/*</pattern>
    </excludes>

    <decorator name="main" page="main.jsp">
        <pattern>/*</pattern>
    </decorator>
</decorators>

 第三步,开始编写我们的装饰者页面,这里展示一下我的页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<%@ taglib prefix="s" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="decorator" uri="http://www.opensymphony.com/sitemesh/decorator" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>

<!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">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <title><decorator:title default="Spring Travel: Spring MVC and Web Flow Reference Application" /></title>
    <link type="text/css" rel="stylesheet" href="<c:url value="/resources/dijit/themes/tundra/tundra.css" />" />
    <link rel="stylesheet" type="text/css" href="<s:url value="/resources/css/main.css" />" />
    <!--[if lte IE 6]>
    <link rel="stylesheet" type="text/css" href="<s:url value="/resources/css/ie6.css" />" />
    <![endif]-->
    <script type="text/javascript" src="<c:url value="/resources/dojo/dojo.js" />"></script>
    <script type="text/javascript" src="<c:url value="/resources/spring/Spring.js" />"></script>
    <script type="text/javascript" src="<c:url value="/resources/spring/Spring-Dojo.js" />"></script>

    <script type="text/javascript" src="<s:url value="/resources/js/jquery-1.7.1.min.js" />"></script>
    <script type="text/javascript" src="<s:url value="/resources/js/jquery.validate.min.js" />"></script>

    <decorator:head />
</head>
<body class="tundra">
<div id="wrapper">
    <div id="header">
        <div id="topbar">
            <p>
                <sec:authorize access="hasRole('ROLE_USER')">
                    <c:if test="${pageContext.request.userPrincipal != null}">
						Welcome, ${pageContext.request.userPrincipal.name} |
					</c:if>
					<a href="<c:url value="/logout" />">Logout</a> |
                    <a href="<c:url value="/sec/users/changePassword" />">Change Password</a>
                </sec:authorize>
                <sec:authorize access="anonymous">
                    <a href="<c:url value="/login" />">Login</a>
                </sec:authorize>
            </p>
        </div>

        <div id="logo">
             <p>
                <a href="<s:url value="/" />"><img src="<s:url value="/resources/images/header.jpg" />" alt="generic hotel" /></a>
            </p>
        </div>
    </div>

    <div id="content">
        <div id="primary">
            <decorator:body />
        </div>

        <div id="secondary">
            <p>
                <a href="http://www.thespringexperience.com">
					<img src="<s:url value="/resources/images/myDog.jpg" />" width="208px" height="300px" alt="generic hotel" />
				</a>
            </p>
            <p class="center">
				<a href="http://www.thespringexperience.com">
					<img src="<s:url value="/resources/images/springone2gx.jpeg" />" alt="SpringOne 2GX" />
				</a>
			</p>
        </div>
    </div>

    <div id="footer">
        <a href="http://www.springframework.org">
			<img src="<s:url value="/resources/images/powered-by-spring.png" />" alt="Powered by Spring" />
		</a>
    </div>
</div>
</body>
</html>

 这里充分显示你的前端水平,规划好整个风格后,后面开发起来就轻松多了。

传几张图片看看效果图吧,图中的dog是我养的,非常棒。





 

 

 

 

 


 

            本来打算使用sitemesh3的,它里面有些新的东西,对返回的MIME不是text/html的响应也能进行装饰,可是发现sitemesh3有一个问题,当第一次访问页面的时候没有问题,可是一刷新页面就会出现页面加载缓慢,并抛出一个异常,异常如下:

[DEBUG,FlowHandlerMapping,qtp1056001-20 - /SpringWebFlowTutorial/resources/js/jquery.validate.min.js] No flow mapping found for request with URI '/SpringWebFlowTutorial/resources/js/jquery.validate.min.js'
[DEBUG,RequestMappingHandlerMapping,qtp1056001-20 - /SpringWebFlowTutorial/resources/js/jquery.validate.min.js] Looking up handler method for path /resources/js/jquery.validate.min.js
[DEBUG,DispatcherServlet,qtp1056001-24 - /SpringWebFlowTutorial/resources/js/jquery-1.7.1.min.js] Could not complete request
java.lang.IllegalStateException: NO CONTENT
	at org.eclipse.jetty.http.HttpGenerator.addContent(HttpGenerator.java:156)
	at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:167)
	at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:101)
	at org.sitemesh.webapp.contentfilter.io.RoutableServletOutputStream.write(RoutableServletOutputStream.java:133)
	at org.springframework.util.FileCopyUtils.copy(FileCopyUtils.java:113)
	at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.writeContent(ResourceHttpRequestHandler.java:240)
	at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:141)
	at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:49)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:900)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:705)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:814)
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:547)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1359)
	at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1330)
	at org.sitemesh.webapp.contentfilter.ContentBufferingFilter.bufferAndPostProcess(ContentBufferingFilter.java:169)
	at org.sitemesh.webapp.contentfilter.ContentBufferingFilter.doFilter(ContentBufferingFilter.java:126)
	at org.sitemesh.config.ConfigurableSiteMeshFilter.doFilter(ConfigurableSiteMeshFilter.java:163)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1330)
	at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:167)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1330)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:478)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
	at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:520)
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:941)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:409)
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:186)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:875)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
	at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)
	at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)
	at org.eclipse.jetty.server.Server.handle(Server.java:345)
	at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:441)
	at org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:919)
	at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:582)
	at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:218)
	at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:51)
	at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:586)
	at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:44)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:598)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533)
	at java.lang.Thread.run(Thread.java:662)

 这个只有在刷新当前页面的时候才会出现,我想就是在加载静态资源文件时会出错,可能是sitemesh3的一个bug,毕竟sitemesh3还是alpha版本,不知道有没有高人遇到过这个问题,帮小弟解答一下。

sitemesh3配置更简单,只需在WEB-INF下放置sitemesh3.xml即可。

<?xml version="1.0" encoding="UTF-8"?>
<sitemesh>
    <!-- Map default decorator. This shall be applied to all paths if no other paths match. -->
    <mapping path="/*" decorator="/WEB-INF/layout/main.jsp" exclue="false"/>

    <!-- Exclude path from decoration. -->
    <mapping path="/resources/*" exclue="true"/>
</sitemesh>

 web.xml过滤器配置如下:

<filter>
    <filter-name>sitemesh</filter-name>
    <filter-class>org.sitemesh.config.ConfigurableSiteMeshFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>sitemesh</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

当然了应该把sitemesh3的maven依赖加进去。pom.xml

<dependency>
  <groupId>org.sitemesh</groupId>
  <artifactId>sitemesh</artifactId>
  <version>3.0-alpha-2</version>
</dependency>

  对于使用maven作为项目管理工具的,应该拥有自己的一台私服,比如nexus,这样构件搜索起来比较快速,便于管理。



 

 

  • 大小: 588.3 KB
  • 大小: 593 KB
  • 大小: 584.8 KB
  • 大小: 570.8 KB
  • 大小: 570.6 KB
  • 大小: 577.3 KB
  • 大小: 572.8 KB
  • 大小: 56.4 KB
  • 大小: 585.6 KB
分享到:
评论
2 楼 xiaolng 2016-09-21  
这个问题的解决办法如下:

将你项目的静态资源(如js,css,图片等)在sitemesh.xml配置文件内配置成exclude

如:
<mapping path="/js/*" exclude="true"/>

即可解决
1 楼 daragon 2012-06-07  
引用
java.lang.IllegalStateException: NO CONTENT 


这个异常的原因是sitemesh 文档里的一个拼写错误

引用
<mapping path="/resources/*" exclue="true"/> 

改为
引用
<mapping path="/resources/*" exclude="true"/> 

相关推荐

    sitemesh+ spring2 + struts2 + hibernate 的 demo

    在Java Web开发领域,Spring、Struts2和Hibernate是三大主流框架,它们各自负责不同的职责:Spring提供依赖注入和面向切面编程,Struts2处理MVC(Model-View-Controller)模式,而Hibernate则作为ORM(对象关系映射...

    spring mvc sitemesh velocity整合

    Spring MVC 是一个强大的Java Web开发框架,用于构建可维护、高性能和灵活的Web应用程序。它提供了模型-视图-控制器(MVC)架构,使得开发者可以将业务逻辑、数据处理和用户界面清晰地分离,提高了代码的可测试性...

    struts2 + spring2+hibernate3+sitemesh+myeclipse

    Struts2、Spring2、Hibernate3和Sitemesh是经典的Java Web开发框架组合,它们在构建企业级应用中发挥着重要作用。MyEclipse则是一款强大的集成开发环境,为这种组合提供了便捷的开发支持。 Struts2是MVC(模型-视图...

    一个Struts2+Spring2.5+SiteMesh的小DEMO

    Struts2、Spring2.5 和 SiteMesh 是Java Web开发中的三个重要框架,它们共同构建了一个强大且灵活的Web应用程序架构。在这个小DEMO中,我们将深入探讨这三个框架的集成和工作原理。 **Struts2** 是一个基于MVC...

    struts2+spring2+hibernate3+velocity+sitemesh集成框架代码

    Struts2、Spring2、Hibernate3、Velocity和Sitemesh是经典的Java Web开发框架组合,它们各自在Web应用的不同层面提供了强大的支持。这个集成框架代码集合了这些技术,旨在提供一个高效、灵活和可扩展的开发环境。 1...

    Struts2+Spring+Hibernet+JPA+sitemesh+log4j

    Struts2、Spring、Hibernate、JPA、SiteMesh和Log4j是Java Web开发中非常重要的六个组件,它们各自承担着不同的职责,并且在实际项目中经常被整合使用,形成了所谓的"SSH2"(Struts2 + Spring + Hibernate)框架组合...

    Struts2+Spring+Hibernate+sitemesh

    Struts2+Spring+Hibernate+sitemesh做的一个在线音乐站点写的一个在线音乐 的站点.功能实现的相对比较粗糙(如歌曲列表没考虑分页什么的),另外只能使用IE(使用了ActiveX 控件播放音乐的).

    Spring MVC4.3.5+MyBatis3.4.2+Apache Shiro1.3.2整合开发高仿小米商城的后台用户管理系统

    视图框架:Spring MVC 4.3.5 任务调度:Spring + Quartz 2.2.3 持久层框架:MyBatis 3.4.2 + Mybatis-plus 2.0.1 数据库连接池:Alibaba Druid 1.0 缓存框架:Ehcache 2.6 + Redis 2.9.0 日志管理:SLF4J 1.7 + Log4...

    webwork+spring+ibatis+sitemesh开发的应用系统

    WebWork+Spring+iBatis+Sitemesh是一个经典的Java Web应用程序开发框架组合,它们各自承担着不同的职责,共同构建了一个高效、灵活且可维护的Web应用系统。下面将详细介绍这四个组件及其在开发中的作用。 1. **...

    spring+springmvc+mybatis项目案例实现用户角色权限管理

    使用spring+springmvc框架 整合了Mybatis持久层框架 整合Druid用于数据库连接,并使用Druid对业务层监控spring jdbc 整合EhCache,对Mybatis的二级缓存进行管理和对spring进行缓存管理 整合FastJson对指定http类型的...

    Maven版,Spring mvc, CXF WebService, WebService/Controller Interceptor, Sitemesh

    本项目基于Maven,采用Spring MVC和Apache CXF框架,实现了一个完整的WebService服务器,同时还涉及到了Interceptor(拦截器)和Sitemesh技术。下面我们将深入探讨这些技术及其在项目中的应用。 首先,Maven是一个...

    struts2+spring +hibernate 整合应用实现用户登陆。

    在Java Web开发中,Struts2、Spring和Hibernate是三个非常重要的开源框架。它们各自解决了不同层面的问题,而将它们整合在一起可以构建出高效、灵活和可维护的Web应用程序。以下是这三个框架的详细说明以及整合过程...

    spring mvc

    这将使 Spring MVC 使用 Velocity 模板作为视图,并且模板文件位于 `/WEB-INF/views/` 目录下,后缀为 `.vm`。 2. **Velocity 模板使用**: 在 Velocity 模板中,我们可以使用 Velocity 语法来控制输出,例如 `${...

    springMVC与sitemesh的结合

    将Spring MVC与Sitemesh结合使用,可以实现更高效的Web应用开发。以下是对这一结合的详细说明: 1. **Sitemesh的引入**:首先,我们需要在项目中引入Sitemesh的依赖。这通常通过在Maven的pom.xml文件中添加Sitemesh...

    Struts2+Spring2+Hibernate3

    Struts2、Spring和Hibernate是Java Web开发中的三大主流框架,它们各司其职,共同构建了一个高效、灵活的企业级应用开发环境。SSH框架整合,是将这三个框架的优势结合在一起,形成一个强大的后端开发解决方案。 ...

    基于shiro+struts2+hibernate+Spring+sitemash框架集合的毕业设计管理系统

    【Struts2框架】Struts2是一个基于MVC设计模式的Web应用框架,用于简化企业级Java Web应用程序的开发。它整合了众多优秀框架,如拦截器、OGNL表达式语言等,使得业务逻辑和视图分离,提高代码可维护性。在本系统中,...

    siteMesh demo+文档

    6. **处理动态内容**:SiteMesh能够处理动态生成的内容,比如由Struts、Spring MVC或其他Web框架生成的页面。 7. **调试和测试**:文档中还会介绍如何查看 SiteMesh 的日志输出,以及如何在开发阶段快速检查装饰...

Global site tag (gtag.js) - Google Analytics