Struts2之数据标签(一)

时间:2021-11-16 22:03:34

一.Struts2的数据标签主要用于提供各种数据访问相关的功能,包括显示一个Action里的属性,以及生成国际化输出等功能。数据标签主要包括:property、set、push、param、bean、action、include、url、i18n和text、date及debug标签等。



1.property标签:用于输出value属性指定的值。可以与<s:bean>标签结合使用,一个是给bean赋值,一个是从bean中读取值。

(1).如果没有指定value属性,默认输出valueStack(值栈)栈顶的值,它有以下几个属性:

— default:可选属性,如果需要输出的值为null,则输出default属性指定的值。

— escape:可选属性,指定是否escapeHTML代码。

— value:可选属性,指定要输出的属性值,默认输出valueStack栈顶的值。

— id:可选属性,指定引用该元素的ID。

(2).接下来附上一个例子,新建一个Struts2项目,项目名为DataLabelTest,在使用Struts2标签时,一定要在前面加入一个标签库,即加入这行代码:

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

— 在WebRoot目录底下新建一个登录页面login.jsp,点击登录按钮后,跳转到一个login的action中,其中还使用了property标签显示提示信息,页面代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'login.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">
<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

</head>

<body>
	<center>
	<s:property value="tip"/>
		<s:form action="login" method="post">
			<s:textfield name="username" label="用户名"></s:textfield>
			<s:password name="password" label="密码"></s:password>
			<s:submit value="登录"></s:submit>
		</s:form>
	</center>
</body>
</html>

— 再新建一个action类,LoginAction类,放在com.action包下,其中如果我们输入的用户名为xg,密码为123的话,就返回继承于ActionSupport类的字符串SUCCESS,如果不是即返回ERROR,并提示登录失败的信息,LoginAction类代码如下:

package com.action;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {

	private String username;
	private String password;
	private String tip;

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getTip() {
		return tip;
	}

	public void setTip(String tip) {
		this.tip = tip;
	}

	public String execute() {
		if (username.equals("xg") && password.equals("123")) {
			return SUCCESS;
		} else {
			setTip("登录失败");
			return ERROR;
		}
	}
}

— 接着,配置一下struts.xml配置文件,如果从LoginAction类中返回的为success的话,即跳转到login_success.jsp页面,返回error的话,跳转到login.jsp页面,代码如下:

<?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>
	<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
	<constant name="struts.devMode" value="true"></constant>
	<package name="default" namespace="/" extends="struts-default">
		<action name="login" class="com.action.LoginAction">
			<result name="success">/login_success.jsp</result>
			<result name="error">/login.jsp</result>
		</action>
	</package>
</struts>

— 最后,附上登录成功后跳转的login_success.jsp页面,使用了property标签来显示用户名,代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'login_success.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">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
    尊敬的<s:property value="username"/>用户,登录成功。
  </body>
</html>


— 部署此项目到tomcat服务器上,开启tomcat服务器,运行效果如下:

Struts2之数据标签(一)

用户名输入xg,密码输入123后,按下登录按钮,跳转到login这个action,显示用户名,即:

Struts2之数据标签(一)

如果用户名和密码输入错误的话,会跳转到login.jsp,提示登录失败:

Struts2之数据标签(一)



2.set标签:用于将某个值放入指定范围内,如application、session范围等。

(1).set标签在某些情况下是比较有用的,当在页面中多次引用一个复杂的表达式时或当某个值所在的对象图深度非常深时,例如如下:person.worker.wife.parent.age,每次访问该值不仅性能低下,而可读性也很差。要解决这个问题,可以将该值设置成以一个新值,并放入特定范围内。

(2).set标签属性:

— name:必填,重新生成的新变量的名字。

— scope:可选,指定新变量被放置的范围,该属性可以接受application、session、request、page或action五个值。如果没有指定,默认是放在Stack Context中,即栈的上下文中。

— value:可选,指定将赋给变量的值,如果没指定,则将ValueStack栈顶的值赋给新变量。

— id:可选,指定该元素的引用ID。

(3).接下来附上一个例子,同样也在DataLabelTest项目底下写测试代码。

— 首先,新建一个Bean类,即Person类,里面有两个属性name和age,分别为这两个属性设置set与get方法,代码如下:

package com.bean;

public class Person {
	private String name;
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

}


— 接着,新建一个person_message.jsp标签,使用了bean数据标签创建一个JavaBean实例,并将其放在Stack Context中,其中利用了param数据标签为name和age属性赋值,再利用set标签将这个bean对象放入OgnlContext中,然后利用property标签显示出来,代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'person_message.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">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
    <s:bean name="com.bean.Person" id="person">
    	<s:param name="name" value="'John'"/>
    	<s:param name="age" value="23"/>
    </s:bean>
    <s:set name="p" value="#person"/>
    <s:property value="#p.name"/><br/>
    <s:property value="#p.age"/><br/>
  </body>
</html>


— 最后,运行效果如下:

Struts2之数据标签(一)


— 这里,默认是将bean对象放入了栈的上下文中,如果想把这些值保存到application或session范围里,再显示出来,可以把上面的person_message.jsp页面中的主要代码分别改为:

将Stack Context的p值放入application范围内:

    <s:bean name="com.bean.Person" id="person">
    	<s:param name="name" value="'John'"/>
    	<s:param name="age" value="23"/>
    </s:bean>
    <s:set name="p" value="#person" scope="application"/>
    <s:property value="#attr.p.name"/><br/>
    <s:property value="#attr.p.age"/><br/>
    <s:debug></s:debug>
  </body>

这里指定了scope属性,改为application,获取时用#attr.p.name来获取到name值。

将Stack Context的p值放入session范围内,并使用了Ognl表达式来获取到相应的值:

    <s:bean name="com.bean.Person" id="person">
    	<s:param name="name" value="'John'"/>
    	<s:param name="age" value="23"/>
    </s:bean>
    <s:set name="p" value="#person" scope="session"/>
 	${sessionScope.p.name }<br/>
 	${sessionScope.p.age }<br/>

运行效果都是一样的。



3.push标签:可以将某个值放到ValueStack(值栈)的栈顶,从而可以更简单地访问该值。

(1).它有两个属性:

— value:必填属性,用于指定要放到ValueStack(值栈)栈顶的元素。

— id:可选属性,指定用于引用此标签的ID。

如果对某个对象操作比较频繁,可以使用push标签将这个对象压入值栈的顶部,随后针对该对象的操作就可以简化了。

(2).将上面的person_message.jsp页面中的主要代码改为如下:

    <s:bean name="com.bean.Person" id="person">
    	<s:param name="name" value="'Ann'"/>
    	<s:param name="age" value="20"/>
    </s:bean>
	<s:push value="#person">
		<s:property value="name"/><br/>
		<s:property value="age"/>
	</s:push>

将person对象的值放入值栈的栈顶,运行后如下图所示:

 Struts2之数据标签(一)



4.param标签:主要用于为其他标签提供参数,如为append、merge、bean和include标签提供参数。

(1).该标签有以下属性:

— name:可选,指定需要设置参数的参数名。

— value:可选,指定需要设置参数的参数值。

— id:可选,指定引用该元素的id。

(2).用法:

— <s:param name="name" value="'Ann'"/>

— <s:param name="name">Ann</s:param>



5.bean标签:用于创建一个JavaBean的实例。当创建JavaBean实例时,可以在标签内使用param标签为该JavaBean实例传入属性,要使用这个标签,需要为该JavaBean类提供对应的setter方法。如该JavaBean类提供了对应的getter方法,就可以访问对应的属性。

(1).bean标签的属性:

— name:必填,指定要实例化的JavaBean的实现类。

— id:可选,如指定了该属性,则该JavaBean实例会被放入Stack Context(栈的上下文)中,而不Value Stack(值栈),从而允许直接通过该id属性访问该JavaBean实例。

(2).使用bean标签注意事项:在bean标签内时,bena标签创建的JavaBean实例放在ValueStack的栈顶,该标签结束,生成的子集被移出valueStack栈,除非指定了id属性。

(3).接下来附上一个使用bean标签和param标签例子:

— 我们可以新建一个JavaBean类,即Student类,此类放在com.bean包下,其中此测试代码也放在DataLabelTest项目下,代码如下:

package com.bean;

public class Student {
	private int id;// 学号
	private String name;// 学生姓名
	private int age;// 学生年龄
	private String sex;// 学生性别
	private String major;// 学生专业

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public String getMajor() {
		return major;
	}

	public void setMajor(String major) {
		this.major = major;
	}

}

— 接着新建一个页面student_message.jsp,代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'student_message.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">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
  <!-- 使用bean标签创建一个com.bean.Student类的实例,其中不带id属性的用法 -->
  <s:bean name="com.bean.Student">
  	<!-- 使用param标签为com.bean.Student类的实例传入参数 -->
  	<s:param name="id" value="1"/>
  	<s:param name="name" value="'张三'"/>
  	<s:param name="age" value="23"/>
  	<s:param name="sex" value="'男'"/>
  	<s:param name="major" value="'市场营销'"/>
  	学号为:<s:property value="id"/><br/>
  	姓名为:<s:property value="name"/><br/>
  	 年龄为:<s:property value="age"/><br/>
  	 性别为: <s:property value="sex"/><br/>
  	专业为:  <s:property value="major"/>
  </s:bean>
  <br/>
  <!-- 使用bean标签创建一个com.bean.Student类的实例,带id属性的用法 -->
  <s:bean name="com.bean.Student" id="student">
  <!-- 使用param标签为com.bean.Student类的实例传入参数 -->
  	<s:param name="id">2</s:param>
  	<s:param name="name">李四</s:param>
  	<s:param name="age">22</s:param>
  	<s:param name="sex">男</s:param>
  	<s:param name="major">计算机</s:param>
  </s:bean>
	  学号为:<s:property value="#student.id"/><br/>
	  姓名为:<s:property value="#student.name"/><br/>
	  年龄为:<s:property value="#student.age"/><br/>
	  性别为: <s:property value="#student.sex"/><br/>
	  专业为:<s:property value="#student.major"/>
  </body>
</html>


— 运行效果如下:

Struts2之数据标签(一)


6.以上就是Struts2中数据标签中的一些常用标签,还有一些数据标签,等到下次写了,以免篇幅过长,请见谅。



7.以上内容仅供大家学习参考,写得不好,请见谅,如有错误,请指出,谢谢!