项目已接近尾声了, 这次高级部分的项目也是自己做过三个项目中最让人满意的一个。 照旧将自己所遇到的一些问题以及解决方式记录一下...
1、 JSP页面basePath路径问题
在利用MyEclipse自动创建jsp页面时其会自动带上下面的代码:
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
以前一直都没有关注过这个问题, 直到最近在使用kindEditor时遇到了导入的js不可用的问题。
这说明在该页面中的所有路径都是于项目的WebRoot为相对路径,如项目的WebRoot下的Images/xxx.jpg,则在任何含有<base href="<%=basePath%>">的页面中都是以Images/xxx.jpg来访问该图片。如WebRoot/jsp/first.jsp 在first.jsp中含有xxx.jpg应该为<img src="Images/xxx.jpg"/> 而不是<img src="../Images/xxx.jpg"/>
发现这样子做主要有以下几个好处:
a、 不需要在页面中以../或../../来回到上级或上上级目录
b、 都是相对于WebRoot目录,实现了路径的统一
c、 对于一些全局性的路径可以一次配置就了事, 如我们常在href中指定target="xxx"等, 这种情况我们可以在path中进行指定
(原来base href 不单单只有这么点作用,尤其在框架中)
——————————--更为详细的资料如下——————————————————————————————
base标记是一个基链接标记,是一个单标记。用以改变文件中所有连结标记的参数内定值。它只能应用于标记<head>与</head>之间。
你网页上的所有相对路径在链接时都将在前面加上基链接指向的地址。
来设定当前页面的基准路经。如果不设定的话,就用会以当前资源的路径作为基准路径。
重要属性:
href
设定前缀的链接地址
target
设定文件显示的窗口,同a标记中的target
简单例子:
<html>
<head>
<base href="http://www.baidu.com" target="_blank">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>base标记</title>
<link rel="Shortcut Icon" href="ani.CUR">
</head>
<body>
<a href="77.htm" target="_self">77
<a href="88.htm">88
</body>
</html>
当点了链接后,跳出的文件是http://www.baidu.com/77.htm或http://www.baidu.com/88.htm,它就是在这些相对路径的文件前加上基链接指向的地址。如果目标文件中的链接没有指定target属性,就用base标记中的target属性。
常在框架结构中用,如左右两个框架,把左边的框架中文件里的连接都显示在右边的框架里。只要用base标记,把其target属性值写为右框架名称,这就不用再为左框架里的文件中的每一个连接都指定target属性。
当使用时,BASE 元素必须出现在文档的 HEAD 内,在任何对外部源的引用之前。
此元素在 Microsoft? Internet Explorer 3.0 的 HTML 中可用,在 Internet Explorer 4.0 的脚本中可用。
此元素不会被渲染。
此元素不需要关闭标签。
总结: 用<base target=_××>来设置这个网页所有链接的目标窗口。也就是说,网页中只要添加<base target=_××>这句,那么所有的超链接就无须单独设置。最好将这句写在<head>和</head>之间。例如<base target=_blank>表示网页中所有的超链接的目标地址都在新建窗口中打开
2、 关于“Internet Explorer无法打开站点,已终止操作”
在使用kindEditor时我在jsp页面中导入kindEditor.js, 结果一运行出现上述的异常。
上网搜到的几个解决方案:
(1)在appendChild或者innerHTML操作处判断document.readyState=="complete", 若为否,则setTimeout若干秒之后重新作这个操作。但是,此属性只对ie,opeara有效,ff的document没有readyState属性,永远是undefined.
(2)在script中使用defer属性。意在页面加载完毕后再执行脚本,这样可以避免找不到对象的问题。defer不会考虑外部文件是否全部下载完,只会判当前页面是否全部加载完成。并且,有defer标签的代码块里不能写document.write方法
例如:<SCRIPT LANGUAGE="JavaScript" src="<%=path%>/pub/js/myDateControler/WdatePicker.js" defer="defer"></Script>
(3)标签是否没有闭合
————我是使用的第二种方式消除了这个异常的, 但问题是尽管异常不见了, 但我引用的js仍然没能发挥作用。
3、 关于导入外部的js、css问题:
导入外部Js和Css文件除了使用上面提到的传统方式来导入外,系统还提供了两个标签用于专门导入。Html标签库的两个标签可以用于导入外部JS和CSS文件
第一个是import标签 用以导入网站的公共JS或者CSS
例如:
<html:import type='js' file="Js.Util.Array" />
// 默认的type是js 所以下面的效果等同
<html:import file="Js.Util.Array" />
<html:import type='css' file="Css.common" />
//上面的方式默认的import的base路径是网站的Public目录,如果需要指定其他的目录,可以使用basepath属性,例如:
<html:import type='js' file="Js.Util.Array" basepath="./Common" />
Html link 标签
第二个是link标签 用以导入当前项目的公共JS或者CSS
例如:
<html:link type="js" href="../Public/Js/Common.js" />
如果没有type属性,就会自动判断文件的后缀
<html:link href="../Public/Js/Common.js" />
<html:link href="../Public/Css/common.css" />