背景
我们可以把Struts标签分为,通用标签,控制标签,UI标签等,以下几个小节就主要来讲Struts常用的一些标签,这些标签并不是全部的标签,只是一些比较常用的标签。
通用标签 ——property
本文是以结果导向分析的方式进行的。其实property标签,我们前面已经常用了。如果value=”xxx”的xxx部分没有特意指定,那么就默认是OGNL表达式,如果要输出的是字符串的吧,可以在xxx两边打单引号(不过…想直接输出字符串,直接打不就行了吗,为啥要用property标签……),具体例子如下所示:
首先先看index.jsp的页面及代码
<?xml version="1.0" encoding="GB18030" ?>
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<%
String contextPath = request.getContextPath();
%>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
<title>Insert title here</title>
</head>
<body>
访问属性
<a href="<%=contextPath %>/tags.action?username=u&password=p">tags</a>
</body>
</html>
代码很简单,就是一个个超链接,action的名称为tags,有两个参数,username和password,点击超链接就把这条URL传给服务器端。
分析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>
<constant name="struts.devMode" value="true" />
<package name="tags" extends="struts-default">
<action name="tags" class="com.bjsxt.struts2.tags.TagsAction">
<result>/tags.jsp</result>
</action>
</package>
</struts>
可以看到TagsAction起作用,然后如果收到success就跳转到tags.jsp。
TagAction
package com.bjsxt.struts2.tags;
import com.opensymphony.xwork2.ActionSupport;
public class TagsAction extends ActionSupport {
private String username;
private String password;
@Override
public String execute() throws Exception {
return SUCCESS;
}
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;
}
}
Action中的内容非常简单,两个变量接收参数用。一个execute方法返回success。
tags.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>Struts Tag学习</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>
<ol>
<li>
property:<s:property value="username"/>
</li>
<li>
property 取值为字符串:<s:property value="'username'"/>
</li>
<li>
property 设定默认值:<s:property value="admin" default="管理员"/>
</li>
<li>
property 设定HTML(默认为true表示转义):<s:property value="'<hr/>'" escape="false"/>
</li>
</ol>
</body>
</html>
第一个<li>
标签的内容就不解释了,经常在用,最简单的OGNL表达式。
第二个<li>
标签就是开头提到的,如果property标签要输出的就是字符串怎么办,加单引号
第三个<li>
标签值得是,如果值栈中有admin的value就用那个value输出到页面,如果没有就输出 管理员 三个字
第四个<li>
标签指的是,如果property标签的value处输入的html标签,那么,struts是会默认把这个标签转义成普通字符串输出出来的,如果设定了
escape=”false”
那么就不会转义,具体效果如下图所示:
可以到第四个标签处变成了分隔线,说明没有转义。
通用标签——set
这个标签的具体作用就是将一个变量设置到一个特定的域里面。在实际的开发中,其实用的并不多,因为如果仅仅是把jsp作为一个视图,或者是页面表示的话,一般不用设置一个什么变量的。所以在应用大多set标签用于,一个变量的名称太长了,如果下面一直要用到的话,打这么长的名字也是有点麻烦的,因此需要重新set一个短一点的名字。
接下来,看看实例。
tags.jsp
<li>
set 设定AdminPassword值(不设scope存在Request和ActionContext):
<s:set var="AdminPassword" value="password"></s:set>
</li>
<li>
从request取值:
<s:property value="#request.AdminPassword"/>
</li>
<li>
从ActionContext取值:
<s:property value="#AdminPassword"/>
</li>
<li>
设定AdminName范围为session:
<s:set var="AdminName" value="username" scope="session"></s:set>
</li>
<li>
从session域取值:
<s:property value="#session.AdminName"/>
</li>
<li>
从ActionContext取值:
<s:property value="#AdminName"/>
</li>
<hr/>
从5.6.7代码及结果可得:
如果set标签不设scope那么默认的scope就是存在ActionContext和request域中的。
从8.9.10代码及结果可得:
如果设置了特定的scope那么只能在特定域中能取出变量值,不会存在ActionContext中。
通用标签——bean
这个bean标签的作用就是初始化一个class,new一个相应的对象出来,然后将这个对象放在ActionContext里面。
通过实例,来看一下,首先定义一个新的class叫Cat
package com.bjsxt.struts2.tags;
public class Cat {
private String name;
public Cat() {
super();
}
public Cat(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
tags.jsp(节选)
<li>
new出一个Cat对象cat,命名为Garfield:
<s:bean var="cat" name="com.bjsxt.struts2.tags.Cat">
<s:param name="name" value="'Garfield'"></s:param>
</s:bean>
</li>
<li>
从ActionContext中取出Garfield:
<s:property value="#cat.name"/>
</li>
<hr/>
第一个<li>
标签中的内容表示,new出一个cat对象,对cat中的name变量进行赋值,赋值为Garfield。然后struts就会把这个car变量,以cat为变量名存在ActionContext里面。
第二个<li>
标签就是表示,从ActionContext中取出cat这个对象的name变量。
效果如下图所示:
这就是本节的全部内容
若有不足之处,请不吝赐教