Logic比较标记
在Logic标记库中有以下六个比较标记:
- :判断变量是否与指定的常量相等。
- :判断变量是否与指定的常量不相等。
- :判断变量是否大于指定的常量。
- :判断变量是否大于等于指定的常量。
- :判断变量是否小于指定的常量。
- :判断变量是否小于等于指定的常量。
从标记的名称中可以看出它们各自的功能。以下是一个简单的程序小示例:
<%
pageContext.setAttribute("test1",new Integer(10000));
%>
变量test1等于10000。
上面的代码首先在pageContext内存入一个整型变量,命名为test1。然后使用标记把test1变量和常量值 10000进行比较,如果比较值为真,则显示"变量test1等于10000"的字符串。可以看出,在标记中使用value 属性来指定常量值,使用name属性指定一个已经在某个范围内存在的变量,这个范围可以是pageContext,request等。运行效果如下所示:
变量test1等于10000。
Logic标记库的六个比较标记的属性具有基本相同的含义,如上面提到的value属性,它总是代表一个常量,用来作为比较的参照。以下是几个通用的属性介绍:
header属性:它的值表示HTTP请求中的header信息,以下是一个使用header的例子。
主机地址为localhost:8080
上面的代码从HTTP请求中读出host信息,与value属性所指定的值进行比较,当相同时同输出"主机地址为localhost:8080"的信息。下面是运行效果:
主机地址为localhost:8080
parameter属性:它的值表示HTTP请求中的请求参数名,以下是一个使用parameter参数的例子。
添加参数
参数testInt的值比10000大。
上面的代码首先设置了一个链接,该链接依然链回相同的页面,只不过在页面后面添加了参数testInt并令其值为12345。接下来使用标记来判断testInt这个请求参数的值是否大于10000,如若比10000大,则显示"参数testInt的值比10000大" 这样的字符串。其中parameter属性来指定"testInt"这个请求参数。运行效果如下所示,用户首先点击"添加参数"的链接为页面添加参数就可以看到标记的效果了。
参数testInt的值比10000大。
cookie属性:它的值表示一个cookie的name。以下是一个使用cookie参数的例子。
<%
javax.servlet.http.Cookie newcookie = new javax.servlet.http.Cookie("cookiename","cookievalue");
newcookie.setComment("new Cookie");
newcookie.setMaxAge(3600);
response.addCookie(newcookie);
%>
存入的Cookie的name是cookiename,value是cookievalue。
上面的代码首先定义了一个name为"cookiename",value为"cookievalue"的Cookie对象,并将其存入response中。接下来使用 cookie参数来指定该对象,并判断它的值是否为cookievalue。倘若相等,则显示"存入的Cookie的name是cookiename,value是 cookievalue"的字符串。用户第一次访问该页面是,该Cookie不存在,所以并不会显示上述字符串。而需要用户关闭浏览器再次访问时,才可以看到。运行效果如下所示:
存入的Cookie的name是cookiename,value是cookievalue。
name属性:该属性指定一个已经存在于某范围内的变量和value属性所指定的值进行比较。以下是一个例子:
<%
pageContext.setAttribute("test2","aaaab");
%>
字符串"aaaab"比"aaaac"小。
上面的代码首先在pageContext对象内存入一个字符串"aaaab",并命名为test2。然后使用name属性指定该变量,并将它与字符串 "aaaac"进行比较,如果比它小,则输出相应字符串。以下是运行效果:
字符串"aaaab"比"aaaac"小。
当使用name属性时,如果指定的变量并不是一个字符串,而是一个JavaBean,则还需要一个property属性和其配合使用。该property 属性指定了JavaBean的某个属性,然后将该属性的值与value属性所指定的常量进行比较。如下面的代码:
<%
TestPageBean testbean = new TestPageBean("testname","testvalue");
pageContext.setAttribute("test3",testbean);
%>
TestPageBean对象的name属性的值小于等于"testname"。
以下是运行效果:
TestPageBean对象的name属性的值小于等于"testname"。
这里有一点值得注意,就是当相比较的两个字符串都可以转化为数字时,则按数字的大小来比较,当无法转成数字时,才按字符串进行比较。以下是一个例子
<%
pageContext.setAttribute("a1","10000");
%>
10000比9999.00大
"10000"比"9999.00t"小
上面的代码将一个字符串"10000"存入pageContext对象中,然后将其先后与"9999.00"和"9999.00t"两个字符串作比较。可以看出当"10000"与"9999.00"作比较时是将之做为数字来进行的,而与"9999.00t"比较时,因为无法将其转成数字,则按字符串比较。以下是运行效果:
10000比9999.00大
"10000"比"9999.00t"小
标记用于在页面中创建一个循环,以此来遍历如数组,Collection,Map这样的对象。该标记的功能强大,在 Struts应用的页面中经常使用到。
对数组进行循环遍历
使用标记可以用于遍历数组。以下是一段示例代码:
<%
String [] testArray1 = {"str0","str1","str2","str3","str4","str5","str6"};
pageContext.setAttribute("test1",testArray1);
%>
在上面的代码中,首先定义了一个字符串数组,并为其初始化。接着,将该数组存入pageContext对象中,命名为test1。然后使用 标记的name属性指定了该数组,并使用id来引用它,同时使用标记来将其显示出来。运行效果如下所示:
str0
str1
str2
str3
str4
str5
str6
分析一下上面的代码,可知标记的name属性用于指定某一存在的对象,id属性定义一个新的对象来引用name 属性所指定的对象。再使用标记的name属性来引用了id属性所定义的新的对象,将数组的值打印出来。另外,还可以通过length属性来指定输出元素的个数。如下面的代码。
其中length属性指定了输出元素的个数,offset属性指定了从第几个元素开始输出,如此处为2则表示从第三个元素开始输出。所以该代码的运行结果应当从str2一直输出到str4。实际运行效果如下:
str2
str3
str4
另外,该标记还有一个indexId属性,它指定一个变量存放当前集合中正被访问的元素的序号,如下例:
:
运行效果如下所示:
2: str2
3: str3
4: str4
可以看出,序号已经加在了输出字符串的前面。
对HashMap进行循环遍历
以下是一段使用标记遍历HashMap的代码。
<%
HashMap countries = new HashMap();
countries.put("country1","中国");
countries.put("country2","美国");
countries.put("country3","英国");
countries.put("country4","法国");
countries.put("country5","德国");
pageContext.setAttribute("countries",countries);
%>
:
上面的代码首先定义了一个HashMap的对象,并向其中添加了5个元素,再把它存入pageContext对象中,命名为countries。令标记的name属性等于"countries",id为country。再让标记的name属性和 标记的id属性相对应,令property一个为"key",一个为"value"。便会有以下输出结果:
country1: 中国
country4: 法国
country5: 德国
country2: 美国
country3: 英国
从效果上看出,标记确定遍历了HashMap的每一个元素,但它并未按添加的顺序将其显示出来。这是因为HashMap 是无序存放的。
对List进行循环遍历
标记也可以对List型的对象进行遍历,以下是一段示例代码。
<%
ArrayList list1 = new ArrayList();
list1.add("str1");
list1.add("str2");
list1.add("str3");
list1.add("str4");
list1.add("str5");
pageContext.setAttribute("testlist",list1);
%>
:
运行效果如下:
0: str1
1: str2
2: str3
3: str4
4: str5
嵌套遍历
标记还可以进行嵌套遍历,以下是一段代码示例:
<%
String [] colors = {"red","green","blue"};
String [] countries1 = {"中国","美国","法国"};
String [] persons = {"乔丹","布什","克林顿"};
ArrayList list2 = new ArrayList();
list2.add(colors);
list2.add(countries1);
list2.add(persons);
pageContext.setAttribute("list2",list2);
%>
:
上面的代码使用了双重循环来遍历一个ArrayList对象,这个ArrayList对象内的每一个元素又是一个String型的数组。以下是运行效果:
0: red green blue
1: 中国 美国 法国
2: 乔丹 布什 克林顿
Match标记
Match标记共有两个:
- :判断变量中是否包含指定的常量字符串。
- :判断变量中是否不包含指定的常量字符串。
Match标记的功能有些类似于java.lang.String类中的indexOf方法。以下是一个简单的例子:
<%
pageContext.setAttribute("test","Hello,World");
%>
上面的代码首先在pageContext内存入一个字符串对象"Hello,World",并将其命名为test。接下来使用标记的 value属性指定一个子串"Hello",来判断它是否被包含在test字符串中。如果被包含,则显示出test字符串的内容。很显然,结果为真。运行结果如下所示:
Hello,World
Match标记还有一个重要属性,就是location属性。location属性所能取的值只有两个,一个是"start",另一个是"end"。例如有以下代码示例:
上面的标记中使用了location属性,它的整句意思是判断test字符串是否是以"Hello"字符串结尾的,如果是则返回false,如果不是,则返回true。倘若将标记改为标记,把location属性的值改为start则此时的意思就成了判断test字符串是否是以"Hello"字符串开始的,如果是则返回true,如果不是,则返回true。这就有点类似于java.lang.String类中的startWith()方法和endWith()方法。以下是运行结果:
Hello,World
Presence标记
Presence标记包括以下四个:
先讲和两个标记。它们的功能是用于判断所指定的对象是否存在。例如有以下代码示例:
<%
pageContext.setAttribute("ExistingString","teststring");
%>
ExistingString的值为
上面的代码首先向pageContext对象中存入一个字符串对象,并命名为ExistingString。然后使用标记来判断是否存在"ExistingString"这个变量。如果存在,就将ExistingString变量的值输出。以下是运行效果:
ExistingString的值为teststring
和标记有以下几个常用属性:
header属性:判断是否存在header属性所指定的header信息。
parameter属性:判断是否存在parameter属性指定的请求参数。
cookie属性:判断cookie属性所指定的同名cookie对象是否存在。
name属性:判断name属性所指定的变量是否存在。
property属性:和name属性同时使用,当name属性所指定的变量是一个JavaBean时,判断property属性所指定的对象属性是否存在。
以下是一个使用name和property属性的例子:
<%
TestPageBean testbean = new TestPageBean("name of testbean","value");
pageContext.setAttribute("test",testbean);
%>
上面的代码首先创建了一个TestPageBean的对象,并将该对象存入pageContext对象中,命名为test。接下来,使用 标记来判断test对象是否有一个属性叫title。如果有,则返回false,如没有,则返回true,并将test对象的 name属性显示出来。由于TestPageBean对象只有两个属性,一个是name,一个是value。所以,title属性并不存在。运行效果如下所示:
name of testbean
接下来说一下标记和标记。这两个标记是来判断是否在request内存在特定的 ActionMessages或ActionErrors对象。它们有几个常用的属性:
name属性:指定了ActionMessages在request对象内存储时的key值。
message属性:message属性有两种取值。当其为true时,表示使用Globals.MESSAGE_KEY做为从request对象中获取ActionMessages的key 值,此时无论name指定什么都无效;当其为false时,则表示需要根据name属性所指定的值做为从request对象中获取ActionMessages的key 值,倘若此时未设置name属性的值,则使用默认的Globals.ERROR_KEY。
property属性:指定ActionMessages对象中某条特定消息的key值。
以下是一段代码示例:
<%
ActionMessages messages = new ActionMessages();
messages.add("message1",new ActionMessage("html.errors.error1"));
request.setAttribute(Globals.MESSAGE_KEY,messages);
%>
所查找的ActionMessage存在。
在上面的代码中,首先创建了一个ActionMessages对象,然后向其中添加了一个ActionMessage,将其命名为message1。再把这个 ActionMessages对象存入requeset对象中,命名为Globals.MESSAGE_KEY。接下来,将标记的message属性设为 true(即默认在request中查找key值为Globals.MESSAGE_KEY的对象),property属性的值设为message1,判断是否存在这样一个ActionMessage 对象,倘若存在,则输出相应文本。运行效果如下所示:
所查找的ActionMessage存在。
Empty标记
Empty标记共有两个:
- :判断所指定的字符串是否为空。
- :判断所指定的字符串是否不为空。
这两个标记的使用比较简单,以下是代码示例:
<%
pageContext.setAttribute("test1","");
%>
test1变量为空!
上面的代码首先向pageContext对象中存入一个空字符串对象,命名为test1。然后使用标记判断它是否为空。以下是实际运行效果:
test1变量为空!
转发与重定向
转发标记
标记用于进行全局转发,使用到该标记的页面一般不再编写其它内容,因为随着转发,页面将跳转。原页面中的内容也就无意义了。标记和struts-config.xml文件中的内的子项相对应,以下是示例代码。
当页面中包含有上面这样一句代码时,若用户请求该页面,则会自动跳转到主页。因此,用户在浏览器内看到的会是index.jsp。
重定向标记
标记用于进行重定向请求。在Java Web的基本常识中用户应能首先了解过转发和重定向的区别,在此就不再赘述。因此,该标记与在效果上基本一样,但它有另外几个属性分别是:
href属性:将页面重定向到href指定的完整外部链接。
forward属性:该属性与struts-config.xml中的内的子项相对应。即将页面重定向到forward所指定的资源。
page属性:该属性指定一个本应用内的一个网页,标记将页面重定向到这个新的网页
阅读(728) | 评论(0) | 转发(0) |