jstl标签库 stuts2标签OGNL表达式

jstl标签库  stuts2标签OGNL表达式

在早期的jsp开发中,是使用java代码来控制逻辑和显示的,但这样会给前端开发人员带来些麻烦并且代码的可读性也会降低。为了解决上述情况,标签库被创造出来了。标签库的目的在于让开发人员能像使用html标签一样的标签来完成前端的逻辑控制和内容显示,而把那些繁琐、复杂的java代码隐藏在背后,返还jsp文件的干净整洁。 

 

jsp标签库的配置

 


1.jsp标签    JSTLJSP Standard Tag LibraryJSP标准标签库) 是一个不断完善的开放源代码的JSP标签库  


JSP页面引入核心标签库的代码为:


<span style="font-size:14px;"><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %></span>

 

使用前配置
如果要在系统使用JSTL标签,则必须将jstl.jar和 standard.jar文件放到classpath中

访问官网,链接 http://www.apache.org/dist/  

 

点击jakarta文件夹。

 

点击“Archives”链接。

 

点击taglibs文件夹。

 

点击standard文件夹。

 

点击binaries文件夹。

 

找到要下载的版本,如jakarta-taglibs-standard-1.1.2.zip,单击下载。

 



将下载的压缩包解压,双击打开里面的lib文件夹。

 

终于看到想要的jstl.jar和standard.jar了。

 

 


将所需jar包放入lib下 

 在jsp页面引用标签,就可以正常使用标签了

 

 

 


2.struts标签


<%@ taglib prefix="s" uri="/struts-tags" %> 

 

使用前配置

struts2相关的几个lib放在你工程的WEB-INF/lib/下面就可以了.
:struts2-core-2.0.11.1.jar ognl-2.6.11.jar oro-2.0.8.jar freemarker-2.3.8.jar struts-core-1.3.5.jar 等等.

主要的包:

1 commons-fileupload-1.2.1.jar

2 commons-logging-1.0.4.jar  

3 freemarker-2.3.15.jar  

4 ognl-2.7.3.jar 

5 struts2-core-2.1.8.jar  

6 xwork-core-2.1.6.jar

注意:由于struts2版本的差异性,上面提到的包不一定满足所有版本的需求。配置完struts2后,请部署运行一下。根据运行时的错误提示来添加jar包解决问题。比如,配置struts-2.2.1.1时需要commons-io-1.3.2.jar包和javassist-3.7.ga.jar包,但是2.1版本就不需要这两个包。 

 下载地址:http://struts.apache.org/download.cgi 

 


可以打开下载的struts2安装包里的apps目录下的任意一个jar包,在里面的WEB_INFR/src目录下,寻找struts.xml文件,将该文件复制进项目的src根目录下,将里面的内容清空(只留下<struts>标签和头部标签即可) 

 

配置struts.xml 例如

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <package name="default" namespace="/" extends="struts-default">
        <action name="login" class="com.gsww.kingreturns.struts2.excise.LoginAction" method="execute">
            <result name="success">/welcome.jsp</result>
            <result name="login">/login.jsp</result>
        </action>
    </package>
</struts>

主要属性说明:package-name:用于区别不同的package;必须是唯一的、可用的变量名;用于其它package来继承;

                    package--namespace:用于减少重复代码(和struts1比较);是调用action时输入路径的组成部分;

                    package--extends:用于继承其它package以使用里面的过滤器等东东;

                    action--name:用于在一个package里区别不同的action;必须是唯一的、可用的变量名;是调用action时输入路径的组成部分;

                    action--classaction所在的路径(包名+类名);

       action--methodaction所调用的方法名;

还有其它的属性,如有需要,请查阅相关文档。

 

修改web.xml,配置拦截器  

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
 xmlns="http://java.sun.com/xml/ns/javaee" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 
 <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
 
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

需要注意:这个文件里,配置的过滤器的类是:org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter。和原来配置的类不一样。原来配置的类是:org.apache.struts2.dispatcher.FileDispatcher。这是因为,从struts-2.1.3以后,org.apache.struts2.dispatcher.FileDispatcher值被标注为过时。虽然仍然起作用,但是不建议使用。

 

   根据struts.xml里配置的内容,还需要一个welcome.jsp页面。编写welcome.jsp页面。代码如下:

 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    
    <title>My JSP 'welcome.jsp' starting page</title>
    
 <meta http-equiv="pragma" content="no-cache">
 <meta http-equiv="cache-control" content="no-cache">
 <meta http-equiv="expires" content="0">    
 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
 <meta http-equiv="description" content="This is my page">
 
  </head>
  
  <body>
   欢迎${username }!
  </body>
</html>

 

 

 

 

 

Struts 2默认的表达式语言是OGNL所以项目没有用Struts2 就不能使用OGNL

 

OGNLObject-Graph Navigation Language),大概可以理解为:对象图形化导航语言。是一种可以方便地操作对象属性的开源表达式语言。OGNL有如下特点:  

 

1、支持对象方法调用,形式如:objName.methodName();   
  
2、支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路)]@[方法名 |  值名],例如:   
  
@java.lang.String@format('foo %s', 'bar')@tutorial.MyConstant@APP_NAME;   
  
3、支持赋值操作和表达式串联,例如:   
  
price=100, discount=0.8, calculatePrice(),这个表达式会返回80;   
  
4、访问OGNL上下文(OGNL context)和ActionContext;   
  
5、操作集合对象。

   
二、使用OGNL表达式   


OGNL要结合struts标签来使用。由于比较灵活,也容易把人给弄晕,尤其是“%”“#”“$”这三个符号的使用。由于$广泛应用于EL中,这里重点写%#符号的用法。   
1“#”符号有三种用途:   
(1)、访问非根对象(struts中值栈为根对象)如OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:   
名称                          作用                                                                                                        例子      
parameters   包含当前HTTP请求参数的Map                                              #parameters.id[0]作用相当于request.getParameter("id")    
     
request         包含当前HttpServletRequest的属性(attribute)Map        #request.userName相当于request.getAttribute("userName")    
    
session        包含当前HttpSession的属性(attribute)的Map                  #session.userName相当于session.getAttribute("userName")     


application   包含当前应用的ServletContext的属性(attribute)的Map   #application.userName相当于application.getAttribute("userName")    
    
注:attr 用于按request > session > application顺序访问其属性(attribute),#attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止。用于过滤和投影(projecting)集合,如books.{?#this.price<100};构造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。   
  
(2)、用于过滤和投影(projecting)集合,如: books.{?#this.price>35}     
books.{?#this.price>35}   


(3)、构造Map,如: #{'foo1':'bar1', 'foo2':'bar2'}     
#{'foo1':'bar1', 'foo2':'bar2'}这种方式常用在给radioselectcheckbox等标签赋值上。如果要在页面中取一个map的值可以这样写:    
<s:property value="#myMap['foo1']"/>     
<s:property value="#myMap['foo1']"/>   
  

2“%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。   
这是一开始最让我不能理解的符号,原因是一些相关资源在表述时不太准备,经过一翻痛苦的探索,终于明白了它的用途。实际上就是让被理解为字符串的表达式,被真正当成ognl来执行。很有点类似javascript里面的eval_r()功能,例如 :   
var oDiv = eval_r("document.all.div"+index)     
var oDiv = eval_r("document.all.div"+index)   
index变量为1时,语句就会被当作var oDiv = document.all.div1  var oDiv = document.all.div1来执行。%{}就是起这个作用。举例:    
<s:set name="myMap" value="#{'key1':'value1','key2':'value2'}"/>      
<s:property value="#myMap['key1']"/>      
<s:url value="#myMap['key1']" />    
<s:set name="myMap" value="#{'key1':'value1','key2':'value2'}"/>   
<s:property value="#myMap['key1']"/>   
<s:url value="#myMap['key1']"/>    
上面的代码第2行会在页面上输出“value1”,而第3行则会输出"#myMap['key1']"这么一个字符串。 如果将第3行改写成这样:   
<s:url value="%{#myMap['key1']}"/>     
<s:url value="%{#myMap['key1']}"/>   
则输出为“value1”。   

这说明struts2里不同的标签对ognl的表达式的理解是不一样的。如果当有的标签看不懂类似“#myMap['key1']”的语句时,就要用%{}来把这括进去,翻译一下了。   

3“$”有两种用途   
(1)、在国际化资源文件中,引用OGNL表达式。   
(2)、在Struts 2配置文件中,引用OGNL表达式:    
<action name="saveUser" class="userAction" method="save">   
<result type="redirect">listUser.action?msg=${msg}</result>   
</action>   
<action name="saveUser" class="userAction" method="save">       
<result type="redirect">listUser.action?msg=${msg}</result>   
</action>

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值