`

jsp jstl el tag 视图层技术总结

 
阅读更多

     最近做些前台页面表现层的工作,对这些东西好久没有接触了。遇到一些问题,总结一下:

 

    * 自定义标签文件:

           在用自定义标签实现功能时候总是报错,如下:

javax.servlet.jsp.JspException: javax.el.PropertyNotFoundException: Property 'header' not found on type java.lang.String

具体代码如下:

 

<%@tag pageEncoding="UTF-8" body-content="empty" import="com.express.platform.model.system.*"%> 
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ attribute name="module"  required="true" rtexprvalue="true" %>  
  
   
   
<div class="index_model">
	 <div class="index_model_head">
		   <c:if test="${not empty module.header }">
			  	<c:if test="${not empty module.header.url }">
			  		<a href="${module.header.url }">
			  	</c:if>
			  	<c:if test="${not empty  module.header.text }">
			  		 ${module.header.text }
			  	</c:if>
			  	<c:if test="${not empty module.header.url }">		
			  		</a>
			  	</c:if>	
		  </c:if>
	 </div>
	   
	 <c:forEach items="${module.tabSelector }" var="tab">
	  	 <c:if test="${not empty tab.tab && not empty tab.tab.text}">
	  	 	<c:set  value="true" var="isShow" scope="page"></c:set>
	  	 </c:if> <c:remove var="tab"/>
	 </c:forEach>
	  
	 <c:if test="${not empty isShow && isShow == \"true\"}">
		 <div class="index_model_tab">
		 	<c:forEach items="${module.tabSelector }" var="tab">
		 		<div>${tab.tab.text }</div>
		 	</c:forEach>
		 </div> <c:remove var="tab"/>
	 </c:if>
	   
	 
	 <div class="clear"></div>
	 
	 <div class="index_model_content">
		 <c:forEach items="${module.tabSelector }" var="tab">
	 	 	<div class="index_model_tab_content">
		 	 	 <table> 
					<tr>
						<c:forEach items="${tab.columnsWidth }" var="colWidth">
							<td width="${colWidth }"></td>
						</c:forEach>
					</tr>
					
					 <c:forEach items="${tab.tableData }" var="rowData">
					 	<tr>
					 		<c:forEach items="${rowData }" var="colData" varStatus="index">
					 			<c:choose>
					 				<c:when test="${colData.type.type == \"url\" || colData.fold }">
					 					<td   class="index_model_column_main">
					 				</c:when>
					 				<c:otherwise>
					 					<td  >
					 				</c:otherwise> 
					 			</c:choose>
					 				<c:choose>
					 					<c:when test="${colData.type.type == \"img\" }">
					 						<img src="${colData.url }" />
					 					</c:when>
					 					<c:when test="${colData.type.type == \"url\"  }">
					 						<a href="${colData.url  }" title="${colData.text }">${colData.text }</a>
					 					</c:when>
					 					<c:otherwise>
					 						${colData.text }
					 					</c:otherwise>
					 				</c:choose> 
					 			</td>
					 		</c:forEach>
					 	</tr>
					 </c:forEach>
					 
				 </table>  
	   		</div> 
	   </c:forEach>
     </div>
   
	 <div class="clear"></div>  
   	 <div class="index_model_foot">
   	 	<c:forEach items="${module.footer }" var="footer" >
 				<c:choose>
 					<c:when test="${footer.type.type == \"img\" }">
 						<img src="${footer.url }" />
 					</c:when>
 					<c:when test="${footer.type.type == \"url\" }">
 						<a href="${footer.url  }" title="${footer.text }">${footer.text }</a>
 					</c:when>
 					<c:otherwise>
 						${footer.text }
 					</c:otherwise>
 				</c:choose>&nbsp;&nbsp;&nbsp;  		 
		</c:forEach>
   	 </div>
   	 
  </div>
  
  
  
  
 

从异常信息看,貌似是module中没有header属性,仔细看了下代码,没有错,module对象中的确有header这个属性,再在页面中通过${module}打印数据,发现数据能够完整展示,怪了。怎么会这么样了。在仔细看看你异常: 

javax.servlet.jsp.JspException: javax.el.PropertyNotFoundException: Property 'header' not found on type java.lang.String

貌似是说在String中没有找到header属性,但我的el代码是${module.header},莫非el将module当成了String来处理,但打印时候又正常,能取到对应的内容,通过jsp script <%  %>方式一切都正常, 在尝试在tag里面通过   ${module.class.name }打印传入module的类型,结果显示java.lang.String ,my god,原来如此,接着就是想想办法在el里面将module 转换成自己真正的类型,查了下资料在<%@attribute 指令 中有一个type属性,可以指定传入到tag里面参数的类型,将module的type类型指定后,结果一切正常。自定义标签在处理数据的时候,假如我们不在attribute指定参数的类型,那么参数会以String的形式传递进来,只有手动指定传入的类型,才能在tag里面正常使用。最红attribute代码如下:

 

<%@ attribute name="module"  required="true" rtexprvalue="true"  type="com.express.platform.model.system.UserModule" %>  

 

通过自定义标签、struts 标签 ,attribute 等指令 定义的变量数据,如<c:set var="xx".... 、 attribute 的name="xxx" 可以再<% %>里面直接引用,编译后的文件如下:

 

  public void setJspContext(JspContext ctx) {
    
  private com.express.platform.model.system.UserModule module;

  public com.express.platform.model.system.UserModule getModule() {
    return this.module;
  }

  public void setModule(com.express.platform.model.system.UserModule module) {
    this.module = module;
    jspContext.setAttribute("module", module);
  }
  。。。。。。

 通过编译后的文件可以看出,module也就是在struts 、attribute指令 、jstl 中定义的变量,该变量在页面里面一个全局变量,所以在<%  %>可以直接引用,在set注入时,会放到jspContext中,所以可以再page里面找到该变量。

 

 

 

*el表达式是使用

   el表达式只能去对象的属性,并且是提供了get方法的属性,不能调用对象的方法,要判断对象是否为null ,字符串是否长度为0, 集合是否为空集合,在el里面可以使用empty ,如上脚本: ${empty data}  、 ${not empty data}都是用于为空性判断。

 

*jstl 保准标签库

core 包括: set  、remove  、out 、 if  、 choose 、 when 、otherwise  、 forEach 、 forTokens、 redirect

 

c:redirect <c:redirect url="/main.jsp" context="/mvc" />

c:forTakens 对字符串进行截断运算

<c:forTakens items="zhang:san:li:hao" var="info" delims=":">

<c:out value="${info}" />

</c:forTakens>

 

sql 包括:  datasource  、 query 、 delete  、update 其中update可以调用存储过程

 

format 标签包括: fmt:formatNumber value="" pattern=".000" fmt:formatDate value="" type="date time both"

 

 

 

* 特殊CSS

clear:left / right / both; 由于div float 以后脱离了原来的页面流,导致原来的内容围绕在float元素周围,为了清除这种围绕可以使用clear属性,有时为了让float在视觉上围绕父容器,也可以再float元素下添加一个clear元素的div让父容器包含float元素

 

overflow:scroll / hidden / visible; 当内容溢出的时候,该如何显示,scroll 是折行滚动, visiable 是直接显示不剪切,hidden是溢出的内容自动切除,不显示,此属性一般用在div上,用在table上不管用。

 

text-overflow:clip / ellipsis 

  1. 设置或检索是否使用一个省略标记(...)标示对象内文本的溢出。对应的脚本特性为textOverflow。
  2. text-overflow属性仅是注解,当文本溢出时是否显示省略标记。并不具备其它的样式属性定义。要实现溢出时产生省略号的效果还须定义:强制文本在一行内显示(white-space:nowrap)及溢出内容为隐藏(overflow:hidden),只有这样才能实现溢出文本显示省略号的效果。

 <td nowrap="nowrap">asdfasfdasfd</td> nowrap="nowrap" 用于控制td里面的数据部折行显示,经常结合overflow使用;

 

table-layout:fixed,用于控制表格布局,如下:

 

固定表格布局:

固定表格布局与自动表格布局相比,允许浏览器更快地对表格进行布局。

在固定表格布局中,水平布局仅取决于表格宽度、列宽度、表格边框宽度、单元格间距,而与单元格的内容无关。

通过使用固定表格布局,用户代理在接收到第一行后就可以显示表格。

自动表格布局:

在自动表格布局中,列的宽度是由列单元格中没有折行的最宽的内容设定的。

此算法有时会较慢,这是由于它需要在确定最终的布局之前访问表格中所有的内容

 

 

要让表格里面的内容在溢出的时候显示为...,需要定义表格 的tablelayout:fixed,定义td的overflow:hidden; text-overflow:ellipsis;

  -o-text-overflow: ellipsis 和 text-overflow 的作用一样,只是为了兼容oper显示...而设置的。

 

控制表格数据内容溢出时候需要下面样式结合:

table{

table-layout:fixed;

}

 

 

td{

white-space: nowrap;

overflow: hidden;

        -o-text-overflow: ellipsis;    

        text-overflow:    ellipsis;  

}

 

 

表格数据内容溢出时就会显示为....

 

word-wrap:normal / break-word;

控制容器里面字符到到容器边界是否自动换行;

normal控制连续文本换行。 显示效果会换行,但到边界的时候如果是一个英文单词,这个英文单词不会换行,即词内换行不会发生。

break-word:
内容将在边界内换行。如果需要,词内换行(word-break)也会发生。

*css 选择器概述
    css 选择器类型:
  • id选择器
  • class选择器
  •   元素选择器
  • 派生选择器
  • 属性选择器
  • 子元素选择器
  • 相邻兄弟选择器
  • 选择器分组

    id 选择器(#ss)、class选择器(.ss)、元素选择器 都没有什么好说的,是最最基本的选择器。其他选择器是复合选择器,是以上选择器的组合,其他选择器一一解释:
      
    派生选择器,例子:
  派生选择器
div p a{
   ....
}
上面的样式应用于 div 下面所以的子元素 为p的里面的超链接,这样可以通过祖先元素限制css应用访问。

子元素选择器
   子元素选择器是派生选择器的一种特殊类型,其限制是派生选择器应用的是所有子孙元素,而子元素选择器仅仅对父元素的子元素有效
div > .nav_menu{
.......
}

 

相邻兄弟选择器

   相邻兄弟元素选择器是派生选择器的一种特殊类型,其限制是派生选择器应用的是所有子孙元素,而相邻兄弟选择器仅仅对某一元素后面的兄弟元素有效

div + .nav_menu{
.......
}

 

选择器分组:

   一类元素拥有同样的css属性。

div,a,p,.menu{
.....
}

 并列元素处理

 

属性选择器

通过元素的属性过滤元素,这个用的比较少.

 

input[type="text"]
{
  width:150px;
  display:block;
  margin-bottom:10px;
  background-color:yellow;
  font-family: Verdana, Arial;
}

input[type="button"]
{
  width:120px;
  margin-left:35px;
  display:block;
  font-family: Verdana, Arial;
}

 通过[]表明元素的属性,来过滤元素应用css属性。

 

[title='contnet']{
......
}

 

 

下面例子表示带menuclass属性的div,设置字体为红色。

 

div.menu{
	color:red;
}

 

 

 

下面例子标准id为menu的div,设置字体为红色

div#menu{
	color:red;
}
 上面两种写法是对属性选择器的变形方式。理解就好了。


 * css 定位属性:
         position:  static  、 fixed 、 relative 、 absolute.
        四种定位解释如下:
       static: 正常的页面流布局,从左至右,从上到下, 块级元素正常生成一个矩形框,行级元素会生成一个或多个行级框。填充父元素,正常的显示在窗口中。
       relative:相对定位,相对元素本应该出现的位置定位, 利用top、right、left、bottom属性定位元素,其中top、right、left、bottom是相对原来出现位置的值,该定位方式中。元素只是相对本应该出现的位置移位了。但元素原来的空间依然占据,只是元素本身位置移动了。所以元素会覆盖其他元素。原来位置还一样不变。切记。
       absolute: 元素完全脱离文档流,相对于其父元素定位,脱离文档流就是元素原来的位置完全关闭,然后相对父元素绝对定位,元素定位后的位置就覆盖原先在该位置的元素。
       fixed:  该方式是absolute的特殊方式,在absolute中父元素是窗口本身时,就是fixed方式定位。


* float : left、 right
    浮动属性就是让该元素脱离原先的文档流,然后向左或者向右浮靠,直到碰到其他元素的边框。

 

 

 

 

 

 

分享到:
评论

相关推荐

    el+jstl jar包 jstl.jar和standard.jar

    在Java Web开发中,`el+jstl jar包`,包括`jstl.jar`和`standard.jar`,是两个非常关键的库文件,用于处理视图层的展示逻辑和表达式语言(EL, Expression Language)的解析。这两个库使得开发者能够更高效地将服务器...

    E-家园完整Servlet+jstl+el+web服务版

    【E-家园完整Servlet+jstl+el+web服务版】是一个典型的Java Web项目,它集成了Servlet、JSTL(JavaServer Pages Standard Tag Library)、EL(Expression Language)以及Web服务技术。这个项目旨在提供一个功能丰富...

    EL&JSTL表达式.rar_JSTL_el

    描述中的"EL和JSTL表达式学习资料,精品总结"提示我们,这份压缩包可能包含了一份详尽的教程或总结,它将重点放在EL和JSTL的使用和表达式上,可能是通过实例和清晰的解释来帮助学习者快速掌握这些技术。 **EL...

    Web数据库技术 ——视图层技术jsp.ppt

    在实际开发中,JSP常与JavaBean、EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)等技术配合使用,以提高开发效率和代码可维护性。同时,随着MVC(Model-View-Controller)框架的流行,...

    JSTL标准包

    在JavaWeb应用中,JSTL通常与EL(Expression Language,表达式语言)一起使用,EL负责数据访问,而JSTL则负责视图层的呈现。这两个技术结合可以有效地实现MVC(Model-View-Controller)架构中的视图部分。 "JSTL...

    JavaWebServlet+JSP+EL表达式+JSTL标签库+Filter过滤器+Listener监听器

    JavaWeb技术是构建基于Java平台的Web应用程序的重要框架,它包括了Servlet、JSP、EL表达式、JSTL标签库、Filter过滤器以及Listener监听器等多个关键组件。这些组件协同工作,使得开发者能够创建动态、交互式的Web...

    JSTL和EL表达式源码.rar

    **JSTL(JavaServer Pages Standard Tag Library)和EL(Expression Language)是Java Web开发中的两个重要组件,它们极大地简化了JSP页面的编写和管理。JSTL是一组预定义的标签库,用于处理常见任务,如迭代、条件...

    jstl+standar

    - **代码分离**:通过使用JSTL,可以将业务逻辑从视图层移出,有助于实现MVC架构。 - **提高性能**:JSTL标签在服务器端被编译成Java代码执行,相比脚本元素,性能更优。 - **减少错误**:避免在JSP页面中混杂大量...

    standard包和jstl包

    总结起来,"standard-1.1.2.jar"和"taglibs-standard-jstlel-1.2.5.jar"是Java Web开发中的关键工具,它们提供了强大的标签库和表达式语言扩展,帮助开发者构建更加优雅、可维护的JSP页面,提高开发效率和代码质量。...

    JSTL中文帮助文档

    - 在 MVC 框架中,如 Struts、Spring MVC 或 JSF,JSTL 可作为视图层的一部分。 通过 JSTL 中文帮助文档,开发者可以详细了解每个标签的功能、用法和示例,从而更好地掌握 JSTL,提升开发效率。学习和使用 JSTL,...

    JSTL标签依赖包下载

    **JSTL(JavaServer Pages Standard Tag Library)标签库**是Java Web开发中常用的一个工具,它提供了一系列标准的标签,用于简化JSP页面的编写,使得代码更加简洁、易于维护。JSTL的主要目标是减少在JSP页面中使用...

    jstl和standard.jar

    - **代码分离**: JSTL使得视图层(JSP)和业务逻辑(Java后端)分离,提高可维护性。 - **提高效率**: 使用标签代替脚本,减少编译和解析时间。 - **便于团队协作**: 标签语言比脚本语言更容易理解和学习,有助于...

    jstl核心jar包

    1. **代码分离**:JSTL使得业务逻辑和视图层的分离更加明确,提高了代码的可读性。 2. **可复用性**:预定义的标签可以在多个页面中重复使用,降低了代码的冗余。 3. **简化调试**:相比JSP脚本,JSTL标签更易于理解...

    JSTL绝对中文帮助文档-通俗易懂CHM版

    Struts通过Action和ActionForm对象处理用户请求,使用Tiles进行页面布局,并结合JSP和JSTL来实现视图层的展示。 在提供的"JSTL中文帮助文档(CHM)"中,您将找到详尽的JSTL标签解释、使用示例以及与EL和Struts等其他...

    stand与jstl的jar包

    在Spring MVC框架中,JSTL经常被用来在视图层展示数据,配合EL表达式,可以方便地将后台模型数据绑定到前端页面。例如,使用`&lt;c:forEach&gt;`遍历集合,`&lt;c:if&gt;`进行条件判断,`&lt;c:set&gt;`设置变量等。而由于Spring MVC...

    JSTL驱动架包

    JSTL与EL(Expression Language)一起使用,可以实现视图层的解耦,使开发者更专注于业务逻辑而不是页面展示细节。 **JSTL的主要组件** 1. **Core标签库(c.tld)**:提供基本的控制结构,如迭代、条件语句、URL...

    jstl标签库jar包

    **JSTL标签库与JAR包详解** JavaServer Pages Standard Tag Library(JSTL)是Java EE领域中用于简化JSP开发的一个...在实际项目中,结合使用JSTL和EL,能够更好地实现业务逻辑和视图层的分离,提升项目的整体质量。

    jstl标准标签库

    JSTL(JSP Standard Tag Library)是Java服务器页面(JSP)的一种标准标签库,旨在简化JSP页面中的编程,提高代码的可读性和可...结合EL表达式,开发者可以方便地在页面上处理数据,增强了JSP作为视图层技术的表现力。

    JSP2.0-EL 全讲解 共25页

    EL作为视图层的一部分,与控制器(如Servlet或Struts Action)和模型对象(JavaBeans或其他业务实体)协同工作,实现了清晰的职责划分。 EL还支持EL函数库,这是一组预定义的函数,可以扩展EL的能力,例如字符串...

    jstl.rar_JSTL

    JSTL的出现是为了替代JSP页面中的脚本元素,减少Java代码在视图层的使用,从而实现MVC设计模式中的"视图"部分与"控制"部分的分离,提高代码的可维护性和可读性。 **JSTL的主要组成部分** 1. **Core标签库(c)**:...

Global site tag (gtag.js) - Google Analytics