上一章节学习了OGNL在struts2上应用的体现,分别是参数的获取、配置文件中数据的传递,还有一个是struts2标签,但是在上一章节没有记录,本章节进行学习记录~



Struts2标签——OGNL表达式在Struts2中的应用



Struts2标签——OGNL表达式在Struts2中的应用

Struts2框架中主要有、、以及这四种,下面就是对这四种进行详细的学习~

1、控制标签

这个控制标签的主要作用是控制输出一个集合中的数据的,例如输出从后台传来的某个List集合的值、对集合的属性的判断等;
首先,创建一个数据集合List,其代码如下:

代码:

package com.java.action.tag;

import java.util.ArrayList;
import java.util.List;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class tag1 extends ActionSupport{
	
	public String execute() throws Exception {
		List<String> list = new ArrayList<>();
		list.add("list1");
		list.add("list2");
		list.add("list3");
		list.add("list4");
		ActionContext.getContext().put("list", list);
		return "success";
	}
}

这样,我们就可以获得一个名为list的集合,从jsp页面中进行演示怎样操作~

(1)if、elseif、else:判断操作

<s:if test="#list.size()==2">
这个数组长度为2!
</s:if>
<s:elseif test="#list.size()==3">
这个数组长度为3!
</s:elseif>
<s:else>
这个数组长度不为2也不为3!
</s:else>

运行结果:
运行结果图片描述

(2)遍历输出List集合的值
遍历输出集合的值有两种方式,不过两种方式区别不大,可以看看~

  • 第一种:
<s:iterator value="#list">
	<s:property />
</s:iterator>

  • 第二种:
<s:iterator value="#list" var="index">
	<s:property value="index"/><br>
</s:iterator>

运行结果:
运行结果图片描述
观察两种遍历的区别就在于第二种便利方式在定义获取集合时给这个集合设定了“别名”~
这个标签就是专门用于遍历的标签,用于挨个输出集合中的数据;

拓展:
Struts2的标签主要是struts2框架下jsp页面获得参数的标签,要知道struts2框架所使用的表达式主要是OGNL(对象视图导航语言),所使用的也是OGNL的表达式,关于struts2框架页面获取值的正宗方式有两种,这两种只有细微的区别~
假设从action类中传递过来的参数集合名字是list,User对象的属性有(cust_name、cust_age、cust_phone、cust_gender、cust_dir、cust_mobile)里面存放的是从数据库中获取到的customer对象中的一条数据,放在ActionContext.getContext中(意为着使用OGNL表达式取值要在对象名前加“#”);
获取其中的值进行遍历输出:

第一种:

	<s:iterator value="#list">
		<s:property value="cust_name" />
		<s:property value="cust_age" />
		<s:property value="cust_phone" />
		<s:property value="cust_gender" />
		<s:property value="cust_dir" />
		<s:property value="cust_mobile" />
	</s:iterator>

第二种:

    <s:iterator value="#list" var="cust">
		<s:property value="#cust.cust_name" />
		<s:property value="#cust.cust_age" />
		<s:property value="#cust.cust_phone" />
		<s:property value="#cust.cust_gender" />
		<s:property value="#cust.cust_dir" />
		<s:property value="#cust.cust_mobile" />
    </s:iterator>

这两种获取值的方式基本相同,都是通过OGNL表达式来进行接收参数的,就这两种获取值的方式的标签书写进行解释:
解释图片描述


2、数据标签

主要是使用这个属性;

<s:iterator begin="0" step="1" end="100">
	<s:property/>--
</s:iterator>

释:
begin=“0”:起始数为零,从0开始叠加输出;
step=“1”:每次间隔为1(或可以理解为每次再上一个数上加1);
end=“100”:运行到所加的数到100停止;

运行结果:
运行结果图片描述


3、表单标签

在struts2中存在着自己的一套表单的标签,其使用方法如下:

代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>ValueStack</title>
</head>
<body>
	<s:form action="tag1" namespace="/">
		<s:textfield label="用户名" name="name" />
		<s:password label="密码" name="password" />
		<s:radio list="#{1:'男',0:'女'}" name="gender" label="性别" "></s:radio>
		<s:select list="#{0:'小学',1:'初中',2:'高中',3:'专科',4:'本科',5:'硕士' }" name="edu" label="学历"  headerKey="" headerValue="---请选择---" ></s:select>
		<s:checkboxlist list="#{0:'游泳',1:'书法',2:'登山',3:'划水',4:'钓鱼',5:'篮球',6:'足球',7:'乒乓',8:'LOL',9:'DOTA',10:'CF' }" name="hobby" label="爱好" ></s:checkboxlist>
		<s:file name="photo" label="照片"></s:file>
		<s:textarea name="intor" label="自我介绍"></s:textarea>
		<s:submit value="提交" />
	</s:form>
</body>
</html>

代码:

@SuppressWarnings("serial")
public class tag1 extends ActionSupport{
	private String name;
	public String execute() throws Exception {
		System.out.println(name);
		return "success";
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

代码:

<action name="tag1" class="com.java.action.tag.tag1" method="execute">
	<result name="success" type="dispatcher">/tag1.jsp</result>
</action>

运行结果:
运行结果图片描述
使用struts2的form标签好处:
1、 Struts2的form标签中存在自己的内置样式(可以将jsp页面运行后查看源代码会发现出现table的各种标签);
2、 提交的数据会回显到输入框中,根据栈中提交的数据,省去了输入框中的代码;


4、非表单标签

在tage2.action方法中返回success之前添加上,然后再在tag2.jsp中放置一个即可接收action中的错误信息,具体操作如下图:

代码:

package com.java.action.tag;

import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class tag2 extends ActionSupport{
	private String name;
	public String execute() throws Exception {
		this.addActionError("错误提示信息!");
		return "success";
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>ValueStack</title>
</head>
<body>
	<s:actionerror/>
</body>
</html>

代码:

<action name="tag2" class="com.java.action.tag.tag2" method="execute">
	<result name="success" type="dispatcher">/tag2.jsp</result>
</action>

运行后结果:
运行tag2.action后结果图片描述


pass:这就是OGNL表达式在struts2中的一个用体现了,其实最主要的还是遍历输出的那个~


《END》