现在的位置: 首页 > 综合 > 正文

《struts2权威指南》学习笔记之struts2+jsf+spring+sitemesh集成开发

2012年07月07日 ⁄ 综合 ⁄ 共 6560字 ⁄ 字号 评论关闭

1.安装sitemesh插件

    与整合其他框架类似,struts2与sitemesh框架的整合也使用了插件方式进行管理 。将struts2-sitemesh-plugin-2.0.6.jar文件复制到WEB-INF/lib下,为了整合sitemesh框架,必须在web.xml中配置sitemesh过滤器,让该核心过滤器来过滤所有的用户请求。但我们知道,struts2的所有值一旦访问该stack context或ValueStack后,里面对应的数值将会被清除掉,如果先使用了struts2的FilterDispather来过滤用户请求,则sitemesh的过滤器将无法取得Stack context或者ValueStack中的数据
   为了解决这个问题,struts2提供了ActionContextCleanUp类,在struts2的架构中,标准的过滤器一般以ActionContextCleanUp开始,后面跟着其他需要的过滤器,最后,由FilterDispatcher来处理请求,FilterDispatcher通常是将请求传递给ActionMapper
   ActionContextCleanUp的一个重要作用是整合sitemesh页面装饰器,它通知FilterDispatcher在正确的时间清除ActionContext中的请求数据,所以正确的排序如下:
    (1)ActionContextCleanUp过滤器
    (2)SiteMesh核心过滤器
    (3)FilterDispatcher过滤器

web.xml

 

<?xml version="1.0" encoding="GBK"?>
<web-app id="jsf" version="2.4" 
    xmlns
="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!-- ��struts2�ܹ��У���׼�Ĺ�����tһ����ActionContextCleanUp��ʼ���������������Ҫ�Ĺ����������FilterDispatcher�������� -->
    
<filter>
        
<filter-name>struts-cleanup</filter-name>
        
<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
    
</filter>
    
<filter>
        
<filter-name>sitemesh</filter-name>
        
<filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
    
</filter>
    
<filter>
        
<filter-name>struts</filter-name>
        
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    
</filter>

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

    
<listener>
        
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    
</listener>

    
<listener>
        
<listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
    
</listener>
    
        
<!-- JavaServer Faces Servlet Configuration, not used directly -->
    
<servlet>
        
<servlet-name>faces</servlet-name>
        
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        
<load-on-startup>1</load-on-startup>
    
</servlet>

    
<!-- JavaServer Faces Servlet Mapping, not called directly -->
    
<servlet-mapping>
        
<servlet-name>faces</servlet-name>
        
<url-pattern>*.action</url-pattern>
    
</servlet-mapping>

</web-app>

 

spring配置文件

 

<?xml version="1.0" encoding="GBK"?>
<!-- 指定Spring配置文件的Schema信息 -->
<beans xmlns="http://www.springframework.org/schema/beans"
       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.xsd">

    
<bean id="bs" class="lee.service.BookService"/>

</beans>

 

sitemesh装饰配置文件

 

<?xml version="1.0" encoding="GBK"?>

<decorators defaultdir="/decorators">
    
<!-- 在excludes元素下指定的页面将不会由SiteMesh来装饰 -->
    
<excludes>
        
<pattern>/exclude.jsp</pattern>
        
<pattern>/exclude/*</pattern>
    
</excludes>

    
<!-- 创建一个名为main的装饰器,该装饰器页面为main.jsp,
         用于装饰pattern指定的URL的所有页面
-->
    
<decorator name="main" page="main.jsp">
        
<pattern>/*</pattern>
    
</decorator>

    
<!-- 定义一个装饰器,但该装饰器默认不装饰任何页面 -->
    
<decorator name="panel" page="panel.jsp"/>
</decorators>

 

装饰器decorators/main.jsp

 

<%@ page contentType="text/html; charset=GBK"%>
<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator"%>
<%@ taglib uri="http://www.opensymphony.com/sitemesh/page" prefix="page"%>
<html>
    
<head>
        
<title><decorator:title default="SiteMesh的装饰器页"/></title>
        
<link href="decorators/main.css" rel="stylesheet" type="text/css">
        
<decorator:head/>
    
</head>
    
<body>
        
<table width="100%" height="100%">
            
<tr>
                
<td valign="top">
                    
<!-- 引入一个页面,临时指定所用的装饰器 -->
                    
<page:applyDecorator page="/book.html" name="panel" />
                    
<page:applyDecorator page="/link.html" name="panel" />
                
</td>
                
<td width="100%">
                    
<table width="100%" height="100%">
                        
<tr>
                            
<td id="pageTitle">
                                
<decorator:title/>
                            
</td>
                        
</tr>
                        
<tr>
                            
<td valign="top" height="100%">
                                
<decorator:body />
                            
</td>
                        
</tr>
                        
<tr>
                            
<td id="footer">
                                
<b>被包含的内容</b><br>
                                SithMesh提供页面装饰支持
                            
</td>
                        
</tr>
                    
</table>
                
</td>
            
</tr>
        
</table>
    
</body>
</html>

装饰器decorators/panel.jsp

 

<%@ page contentType="text/html; charset=GBK"%>
<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator" %>
<p>
    
<table width=250 border=0 cellpadding=0 cellspacing=0>
        
<tr>
            
<th class="panelTitle">
                
<decorator:title default="小面板页面" />
            
</th>
        
</tr>
        
<tr>
            
<td class="panelBody">
                
<decorator:body />
            
</td>
        
</tr>
    
</table>
</p>

 

装饰器样式decorators/main.css

 

body, td, p {
    font: normal x-small verdana, arial, helvetica, sans-serif;
}

.panelTitle {
    background-color: #003399;
    color:#eeeeee;
    font-weight: bold;
    border-color: #3366ff #000033 #000033 #3366ff;
    border-width: 1;
    border-style: solid;
    padding: 1;
}

.panelBody {
    background-color: #eeeeee;
    border-color: black;
    border-width: 0 1 1 1;
    border-style: solid;
    padding: 2;
}

#pageTitle {
    background-color: #003399;
    color:#eeeeee;
    font-weight: bold;
    font-size: large;
    border-color: #3366ff #000033 #000033 #3366ff;
    border-width: 1;
    border-style: solid;
    padding: 1;
    text-align: center;
}

#footer {
    background-color:#eeeeee;
    font-size: 9pt;    
    text-align: center;
    color: black;
    border-color: #666666 #cccccc #cccccc #666666;
    border-width: 1;
    border-style: solid;
    padding: 1;
}

 

被装饰页面book.html

 

<html>
    
<head>
        
<title>作者图书</title>
    
</head>
    
<body>
        
<center>
            Spring2.0宝典
<br>
            轻量级J2EE企业应用实战
<br>
            基于J2EE的Ajax宝典

抱歉!评论已关闭.