从零搭建项目开发框架-12SiteMesh设计

在开发页面之前先讲讲SiteMesh。
SiteMesh 是一个网页布局和修饰的框架,利用它可以将网页的内容和页面结构分离,以达到页面结构共享的目的。其中涉及到两个名词: 装饰页面(decorator page)和 "被装饰页面(Content page)" , 即 SiteMesh通过对Content Page的装饰,最终得到页面布局和外观一致的页面,并返回给客户。

下面是一个常见的页面布局图:


页面布局.png

一个常见页面分为四块:

  • Header:放置系统标题、注销按钮等
  • Menu:放置菜单
  • Footer:放置版权信息等
  • Content:核心内容

还有两个看不到的,引用的CSS和JS,就是说完成一个页面其中有5块是不用变的,每次只需要完成Content的内容即可,剩下的由修饰框架完成即可。
没有SiteMesh的时候可以定义公共的jsp,然后依次include过来即可,这样会很麻烦,而且还会出现该外层结构,导致所有页面都需要跟着调整的风险。

SiteMesh3的配置

1、pom.xml添加依赖

 <!--sitemesh-->
<dependency>
      <groupId>org.sitemesh</groupId>
      <artifactId>sitemesh</artifactId>
      <version>${sitemesh.version}</version>
</dependency>

2.web.xml添加配置

<!-- 设置SiteMesh页面框架布局 -->
    <filter>
        <filter-name>sitemesh3</filter-name>
        <filter-class>org.sitemesh.config.ConfigurableSiteMeshFilter</filter-class>
    </filter>
    <!--设置sitemesh映射-->
    <filter-mapping>
        <filter-name>sitemesh3</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>ERROR</dispatcher>
    </filter-mapping>

这一段主要是配置SiteMesh的过滤器

3、配置SiteMesh

<?xml version="1.0" encoding="UTF-8"?>
<sitemesh>
    <!--默认情况下,sitemesh 只对 HTTP 响应头中 Content-Type 为 text/html 的类型进行拦截和装饰,我们可以添加更多的 mime 类型-->
    <mime-type>text/html</mime-type>

    <!-- 指明满足“/*”的页面,将被“/WEB-INF/views/decorators/decorator.jsp”所装饰 -->
    <mapping path="/*" decorator="/WEB-INF/views/plat/decorators/decorator.jsp" />

    <!-- 指明满足“/login”的页面,将被排除,不被装饰 -->
    <mapping path="/login.htm" exclue="true" />
</sitemesh>

这样除了login.htm其余都会被SiteMesh拦截,进行装饰。

4、装饰页面代码

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta name="renderer" content="webkit">
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1"/>
    <meta charset="utf-8"/>
    <meta name="description" content="${webTitle}"/>
    <title><sitemesh:write property='title'/> - ${webTitle}</title>

    <%@include file="../common/styles.jspf" %>
    <sitemesh:write property='head'/>
</head>
<body class="no-skin">
<%@ include file="../common/header.jspf" %>
<div class="main-container" id="main-container">
    <%@ include file="../common/menu.jspf" %>
    <div class="main-content">
        <div class="main-content-inner">
            <sitemesh:write property='body'/>
        </div>
    </div>
</div>
<%@include file="../common/scripts.jspf" %>
</body>
</html>

这是装饰页面的代码,下面讲讲几个核心点:
1、<meta name="renderer" content="webkit">加上这句话,如果用的是360浏览器,就会默认使用高速模式
2、<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0"/>这句话可以识别设备的种类
3、<sitemesh:write property='title'/>这句话的作用就是把被装饰页面内的title标签内的内容取过来填充至这地方
4、<sitemesh:write property='body'/>把被装饰页面内的body里面的内容取过来填充至这地方
5、<%@include file="../common/styles.jspf" %>引用公共的资源
6、${webTitle}这个值是怎么来的呢?这是通过servlet-context.xml配置得来

5、servlet-context.xml增加页面引用参数

在jsp页面也需要引用一些公共参数,这时候就需要直接获取,用EL直接在页面展示出来。

<!--读取配置文件-->
    <context:property-placeholder ignore-unresolvable="true" location="classpath:/application.properties"/>

    <!-- 默认的注解映射的支持,自动注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
    <mvc:annotation-driven/>

    <!-- 设置Controller注解,及json格式解析器-->
    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    <!-- 设置请求适配器 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    </bean>
    <!-- 设置静态资源文件夹 -->
    <mvc:resources mapping="/assets/**" location="/assets/"/>
    <!-- 设置全局公共变量 -->
    <bean id="viewResolver" abstract="true">
        <property name="attributes">
            <props>
                <prop key="versionNo">${versionNo}</prop>
                <prop key="imageServer">${imageServer}</prop>
                <prop key="staticServer">${staticServer}</prop>
                <prop key="dynamicServer">${dynamicServer}</prop>
                <prop key="webTitle">${webTitle}</prop>
            </props>
        </property>
    </bean>
    <!--设置视图解析器及视图对应文件位置和后缀名,当前设置jsp -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" parent="viewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <!-- 设置注解的扫描包名t -->
    <mvc:default-servlet-handler/>
    <context:component-scan base-package="com.critc.*.*.controller">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

这里面定义了viewResolver,可以获取配置文件里面的参数
这里面还定义SpringMVC的消息转换方式,利用json来进行转换,所以还需要配置Json的依赖,jackson

 <!-- Jackson -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>${jackson.version}</version>
        </dependency>

下一节讲UI开发

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,598评论 18 399
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,778评论 6 342
  • JAVA面试题 1、作用域public,private,protected,以及不写时的区别答:区别如下:作用域 ...
    JA尐白阅读 1,146评论 1 0
  • 因为要招聘辅导员,这段时间我看了很多应聘者的简历。我将简历中展示出来在本科和研究生阶段有丰富学生工作经历的人挑选了...
    目难阅读 398评论 0 4