2.1.3.1 页面标准使用<!DOCTYPE HTML>
该标准为当前支持性做好的HTML5标准,相对浏览器的兼容性(特别是对解决IE7、IE8、IE9及IE10版本兼容性有规范性上的好处)。这里特别提出:浏览器的Quirks Model(怪异模式或兼容模式Compatibility Mode)当然与之对应的就是标准模式(Standards Mode或Strict Mode)。当然在开发过程,我们通常称之为“杂项模式”,这种模式下的兼容性问题,尤为繁琐。以下引用一些资料说明一下,其产生的原因:
标准模式与怪异模式:
由于历史的原因,各个浏览器在对页面的渲染上存在差异,甚至同一浏览器在不同版本中,对页面的渲染也不同。在W3C标准出台以前,浏览器在对页面的渲染上没有统一规范,产生了差异(Quirks mode或者称为Compatibility Mode);由于W3C标准的推出,浏览器渲染页面有了统一的标准(CSScompat或称为Strict mode也有叫做Standars mode),这就是二者最简单的区别。
W3C标准推出以后,浏览器都开始采纳新标准,但存在一个问题就是如何保证旧的网页还能继续浏览,在标准出来以前,很多页面都是根据旧的渲染方法编写的,如果用的标准来渲染,将导致页面显示异常。为保持浏览器渲染的兼容性,使以前的页面能够正常浏览,浏览器都保留了旧的渲染方法(如:微软的IE)。这样浏览器渲染上就产生了Quircks mode和Standars mode,两种渲染方法共存在一个浏览器上。
火狐一直工作在标准模式下,但IE(6,7,8)标准模式与怪异模式差别很大,主要体现在对盒子模型的解释上,这个很重要,下面就重点说这个。
那么浏览器究竟该采用哪种模式渲染呢?这就引出的DTD,既是网页的头部声明,浏览器会通过识别DTD而采用相对应的渲染模式:
(2)文本标签,如<p>,也最好使用div来展示,用文本相关样式来控制即可;比如有这样的问题:连续长字段不换行问题,代码示例如下:
<div>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</div>
该div显示会超出浏览器显示区域,不换行。如果使用p等文本标签还是需要改为div。在div中添加浏览器兼容的css属性即可,在IE中使用word-wrap:break-word;在火狐中使用white-space:normal,将几个属性都设置上即可,多浏览器兼容显示。
(3)“按钮”标签。提到按钮想到就是button,其实在裁切页面的时候,可以用a标签来代替。建议遇到按钮或者触发链接等,尽量不使用button,使用a标签来实现。首先说下button,使用button标签时,经常会忘记添加type属性(type=”button”),在不添加该属性时,同时该对象也不具有onclick事件时,点击就会刷新页面,如果在表单内就会提交。还有,在IBM Portal开发中,一般都需要开发dojo组件,在组件开发过程中,事件的监听等,a标签要优于button标签。其他的就不列举了。
2.2.2 主题目录结构
主要使用目录说明:
css:样式表存放目录。当然根据当前的开发,一般样式表放在httpServer服务目录下,能提高页面展示速度,不会出现图片不加载的情况。
images:图片存放目录(一般为主题中默认目录),当然必须要跟css样式表中的图片对应。
imgs:同样是图片目录(一般是开发人员新添加的目录),同样是根据美工静态页面对应添加的目录。
js:显然是公共js或者公共组件存放目录。
nls:主题页面修改变更目录,其下的文件theme_zh.html,为开发主体之重点所在。下面详细介绍该页面修改等。
其他目录多数不会使用,暂不介绍。
#
#Wed Sep 24 12:22:16 CST 2014
com.ibm.portal.layout.template.href=dav\:fs-type1/themes/<主题名称>/layout-templates/2ColumnEqual/
resourceaggregation.profile=profiles/profile_deferred.json
在以上内容中,一般只需要修改<主题名称>这一块即可。对应的到IBM Portal中就会显示该名称。
初始代码:
<!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” lang=”zh” xml:lang=”zh” >
<head>
<title>IBM Portal主题</title>
<meta name=”viewport” content=”width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1″>
<!– rel=dynamic-content indicates an element that is replaced with the contents produced by the specified href.
dyn-cs:* URIs are resolved using the WP DynamicContentSpotMappings resource environment provider. These values can
also be set using theme metadata if a theme is specified in the URI (e.g. @tl:oid:theme_unique_name). –>
<link rel=”dynamic-content” href=”co:head”>
<link rel=”dynamic-content” href=”dyn-cs:id:80theme_head”>
<!– rendering is delegated to the specified href for each locale –>
<link rel=”stylesheet” type=”text/css” href=”css/reset.css” />
<link rel=”stylesheet” type=”text/css” href=”css/index.css” />
<link rel=”icon” type=”image/x-icon” href=”images/favicon.ico” />
<link rel=”shortcut icon” type=”image/x-icon” href=”images/favicon.ico” />
<style type=”text/css”>
</style>
<script type=”text/javascript”>
</script>
</head>
<body class=”lotusui30dojo tundra locale_zh”>
<div class=”g-layout-page”>
<!– 头部开始 –>
<div class=”g-top”>
<div class=”m-head”>
</div>
</div>
<div class=”m-leftMenu”>
<a rel=”dynamic-content” href=”dyn-cs:id:80theme_primaryNav”></a>
</div>
<!– 中间开始 –>
<div class=”wpthemeFrame”>
<div class=”wpthemeMainContent” role=”main”>
<div class=”wpthemeInner”>
<!– asa markup contributions for pages –>
<a rel=”dynamic-content” href=”dyn-cs:id:80theme_asa”></a>
<a rel=”dynamic-content” href=”dyn-cs:id:80theme_crumbTrail”></a>
<div class=”wpthemeClear”></div>
<a rel=”dynamic-content” href=”dyn-cs:id:80theme_status”></a>
</div>
<!– required – do not remove –>
<a rel=”dynamic-content” href=”state.portlet:portlet?include=windowState&include=portletMode&mime-type=text/html”></a>
<div id=”layoutContainers” class=”wpthemeLayoutContainers wpthemeLayoutContainersHidden” >
<div class=”wpthemeInner”>
<a rel=”dynamic-content” href=”dyn-cs:id:80theme_layout”></a>
<div class=”wpthemeClear”></div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
以上为删除了相关代码的简单页面框架结构,一般在这个原始页面框架上我们需要加上以下部分:
1. 浏览器文档模式控制
2. 引入dojo(目前使用IBM Portal为8版本,自带dojo版本为1.7,开发与1.9类似)
3. 布局控制,主要改写相关布局样式,和嵌套需要使用的CSS表
4. 公共功能开发,如登出、加入收藏夹等功能
注意:需要看懂IBM Portal自带的页面标签,它会解析成对应的代码或者资源路径,下面的代码中做一些解释。
修改之后如下(当然只有部分代码),以下使用粗体字标出及注释:
<!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” lang=”zh” xml:lang=”zh” >
<head>
<title>IBM Portal主题</title>
//以下两句作用主要是设置编码
//控制IE浏览器版本,意思是,使用IE8或IE9,如果当前版本为9以上,就使用当前版本
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<meta http-equiv=”X-UA-Compatible” content=”IE=8;IE=9;IE=EDGE” />
<meta name=”viewport” content=”width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1″>
<!– rel=dynamic-content indicates an element that is replaced with the contents produced by the specified href.
dyn-cs:* URIs are resolved using the WP DynamicContentSpotMappings resource environment provider. These values can
also be set using theme metadata if a theme is specified in the URI (e.g. @tl:oid:theme_unique_name). –>
<link rel=”dynamic-content” href=”co:head”>
//引入IBM Portal8本身的样式列表
<link rel=”dynamic-content” href=”dyn-cs:id:80theme_head”>
<!– rendering is delegated to the specified href for each locale –>
//引入dojo框架,便于开发Portlet
<script type=”text/javascript” src=”/wps/portal_dojo/v1.7/dojo/dojo.js” djConfig=”parseOnLoad: true, isDebug: false”></script>
//引入美工设计裁切样式列表
//@特别说明:
//如果使用主题中的样式,其实href属性应该为”/css/reset.css”,最前面多一个“/”,这个是读的主题中的样式表,但在实施中,会出现页面加载慢、图片不出来的情况,故使用HttpServer的方式,将样式置于httpServer服务中,提高速度体验。
<link rel=”stylesheet” type=”text/css” href=”css/reset.css” />
<link rel=”stylesheet” type=”text/css” href=”css/index.css” />
//设置自定义的ico,即URL前的图标
//@注:该图标在IE中的要求比较苛刻,需要事先跟美工人员说好,尽量不要裁切成其他格式的小图标,之后再改后缀,很多会破坏图片,导致图标显示不出来。
<link rel=”icon” type=”image/x-icon” href=”images/favicon.ico” />
<link rel=”shortcut icon” type=”image/x-icon” href=”images/favicon.ico” />
<style type=”text/css”>
//自定义样式,一般在该页面修改布局等样式,需要一定的经验或者好的CSS调试基础
//自定义style
</style>
<script type=”text/javascript”>
//自定义公共js方法
</script>
</head>
//body一般需要变更样式,如果使用dojo样式就需要引入dojo样式,这个根据情况,逐个添加
<body class=”lotusui30dojo tundra locale_zh”>
//该部分可以自定义头部内容,一般有搜索框,收藏夹等功能
<!– 头部开始 –>
<div class=”g-top”>
<div class=”m-head”>
//自定义公共头部功能,如LOGO等
<div class=”logo-pic”>
<img src=”imgs/style/logo.png”/>
</div>
<div class=”m-text-nav”>
<span class=”text”>加入收藏夹</span>
</div>
<div class=”m-sarech”>
<input type=”text” class=”inp” value=”请输入您要搜索的内容”/>
<button class=”u-btn-pic”><img src=”imgs/style/ico_search.png”/></button>
</div>
</div>
</div>
//导航区域布局控制
<div class=”m-leftMenu”>
//@这个a标签的作用,其实是去获取一个页面,IBM Portal自己的导航生成页面,这个页面也是开发中需要重点考虑的
<a rel=”dynamic-content” href=”dyn-cs:id:80theme_primaryNav”></a>
</div>
<!– 中间开始 –>
//主要内容显示区域
<div class=”wpthemeFrame”>
<div class=”wpthemeMainContent” role=”main”>
<div class=”wpthemeInner”>
<!– asa markup contributions for pages –>
//@BM Portal8本身的布局区域,这块区域主要有两种布局方式,下面布局开发中将进行讲述。
<a rel=”dynamic-content” href=”dyn-cs:id:80theme_asa”></a>
<a rel=”dynamic-content” href=”dyn-cs:id:80theme_crumbTrail”></a>
<div class=”wpthemeClear”></div>
<a rel=”dynamic-content” href=”dyn-cs:id:80theme_status”></a>
</div>
<!– required – do not remove –>
<a rel=”dynamic-content” href=”state.portlet:portlet?include=windowState&include=portletMode&mime-type=text/html”></a>
<div id=”layoutContainers” class=”wpthemeLayoutContainers wpthemeLayoutContainersHidden” >
<div class=”wpthemeInner”>
<a rel=”dynamic-content” href=”dyn-cs:id:80theme_layout”></a>
<div class=”wpthemeClear”></div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
当然在实施过程中,需要对IBM Portal的原理及配置有一定熟悉度,还需要有较强的样式调试能力,能够将IBM Portal样式与项目静态页面样式进行很好的融合。
当然如果是变化较大的导航就需要花点心思了。
说明:本文介绍开发,都是基于IBM Portal8,因为之前的版本开发方式有所不同,比如Portal6和Portal7。
文件名:navigation.jsp,具体位置根据服务安装为准。其中的难点应该是理解IBM Portal本身的一些标签的含义了,需要多实施来提高熟悉度和认知。
在这里主要声明一下:在IBM Portal中创建页面,有两种方式。带来的效果是不同的。
注意:
使用工具为IBM的IDE工具,安装时,必须要选好Portlet开发一项。博主使用的是RAD7.5版本。
下面就不介绍Portlet的原理了,只介绍一些在开发过程中,常见的,还有必须要遵守的规则。
下面使用名为Test的Portlet,简单的讲述一下。
结构:
项目结构与普通的Java项目类似,不过其中原理有一些区别。
当然一般情况下只要根据现在提供的示例开发即可,对代码已经进行了简化和规范。
下面贴出一些主要的代码(具体代码需要根据创建的Portlet来写):
package com.ibm.test;
import java.io.*;
import javax.portlet.*;
/**
* A sample portlet based on GenericPortlet
*/
public class TestPortlet extends GenericPortlet {
public static final String JSP_FOLDER = “/page/jsp/”; // JSP folder name
public static final String VIEW_JSP = “todo.jsp”; // JSP file name to be rendered on the view mode
/**
* @see javax.portlet.Portlet#init()
*/
public void init() throws PortletException{
super.init();
}
/**
* Serve up the <code>view</code> mode.
* @see javax.portlet.GenericPortlet#doView(javax.portlet.RenderRequest, javax.portlet.RenderResponse)
*/
public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException {
// Set the MIME type for the render response
response.setContentType(request.getResponseContentType());
// Invoke the JSP to render
PortletRequestDispatcher rd = getPortletContext().getRequestDispatcher(JSP_FOLDER + VIEW_JSP);
rd.include(request,response);
}
}
代码就如此简单,除了需要写接口,一般就这样就可以了(写好页面路径),只需要将目标转向前端组件的开发。
Todo.jsp代码如下:
<%@page session=”false” contentType=”text/html” pageEncoding=”UTF-8″ import=”java.util.*,javax.portlet.*,com.ibm.test.*” %>
<%@ taglib uri=”http://java.sun.com/portlet_2_0″ prefix=”portlet”%>
<%@taglib uri=”http://www.ibm.com/xmlns/prod/websphere/portal/v6.1/portlet-client-model” prefix=”portlet-client-model” %>
<portlet:defineObjects/>
<portlet-client-model:init>
<portlet-client-model:require module=”ibm.portal.xml.*”/>
<portlet-client-model:require module=”ibm.portal.portlet.*”/>
</portlet-client-model:init>
<%
String path = renderRequest.getContextPath();//当前portlet路径
String remoteUserName = renderRequest.getRemoteUser();//当前登录用户的登录名
PortletPreferences pp = renderRequest.getPreferences();//获取portal中portlet配置的参数
String dataUrl = pp.getValue(“todoData”,”/getData.json”);//获取portlet中配置的属性值为todoData的参数,如果没有配置该属性,则使用后面的默认
%>
<div class=”text1″>
<div class=”text3″>
<div class=”tp1″></div>
<div class=”text2″>
<h1><%=remoteUserName %></h1>
<span class=”tt4″><%=path %></span>
<span class=”tt4″><%=dataUrl %></span>
</div>
<div class=”clearfloat”></div>
</div>
</div>
以上就是需要主要开发的jsp了,其中列举了几项必须要了解且使用较多的几个值,也有注释。如果不使用jQuery等其他的js库,只需要开发一些常见的dojo组件即可,组件也同样重用性很好,可以加快开发效率,也能提高页面的加载速度等。