您的位置:首页 > 编程语言 > Java开发

SSH实战OA 05:Struts2标签

2017-04-29 01:59 405 查看
Struts2标签库提供了主题、模板支持,极大地简化了视图页面的编写,而且,struts2的主题、模板都提供了很好的扩展性。实现了更好的代码复用。Struts2允许在页面中使用自定义组件,这完全能满足项目中页面显示复杂,多变的需求。本文仅给出常用的struts标签的用法,这些标签的分类有:通用标签,控制流程标签、ajax标签、UI标签等。

在搭建好的Struts2工程下新建TagsAction.java,代码如下:

import com.opensymphony.xwork2.ActionSupport;

public class TagsAction extends ActionSupport {

private String password;

private String username;

private String id;

public TagsAction() {
}

@Override
public String execute() throws Exception {
this.addFieldError("fielderror.test", "用户名或密码出错!");

return this.SUCCESS;
}

public String getPassword() {
return password;
}

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

public String getUsername() {
return username;
}

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

public String getId() {
return id;
}

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

}


这个action的逻辑很简单,复写了父类的execute()方法的代码逻辑向前端返回了一句错误信息和一个SUCCESS的视图。这个action有3个属性,分别是:username,password,id,并生成相应的getter/setter方法,除此之外该action还有一个空的构造方法。

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.enable.DynamicMethodInvocation" value="false" />
-->
<!--
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
-->

<constant name="struts.devMode" value="true" />
<constant name="struts.ui.theme" value="simple" />

<package name="tags" extends="struts-default">
<action name="tagsAction" class="com.shizongger.tags.TagsAction">
<result>/tags.jsp</result>
</action>
</package>
</struts>


本文的重点放在struts的标签,所以struts.xml做了最简单的配置,只配置了一个action,并且定义了一个前端的返回视图tags.jsp。

tags.jsp的最开始状态如下:

<%@ 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>Struts-Tags学习案例</title>
</head>
<body>
<ol>
<li>property:<s:property value="username" /></li>
</ol>
</body>
</html>


使用struts2的标签,引入struts2的taglib是第一步。上诉的jsp代码是最简单的使用property的用法。

在浏览器中输入下列链接:

http://localhost:8080/StrutsTags/tagsAction.action?username=u&password=p


服务器将会向前端浏览器输出

property:u

property用法

property的常用法还有以下几种:

<li>property:<s:property value="username" /></li>
<li>property取值为字符串:<s:property value="'username'"/></li>
<li>property设置默认值:<s:property value="id" default="没有id" /></li>
<li>property设定html:<s:property value="'<hr />'" escape="false" /></li>
<hr />


第一行的li是我们常用的OGNL表达式取出了username的值,value值是OGNL表达式。第二行的用法是将’username’作为字符串输出来,而不是希望struts标签将我们的字符串解析。第三行多了一个default属性值,当没有id作为参数传递进来的时候就显示defalut里面的内容,当有id值传递进来的时候就显示id的值。如下面的两个案例输出:

url:

http://localhost:8080/StrutsTags/tagsAction.action?username=u&password=p&id=1


输出:

property设置默认值:1

url:

http://localhost:8080/StrutsTags/tagsAction.action?username=u&password=p


property设置默认值:没有id

第四个li里面的property用法,当escape为true时value的值当作是普通字符输出,而当时escape为false时浏览器将作为html标签来解析,比如上诉的escape为false,此时浏览器当作标签< hr />来输出,既多出了一横。

set标签用法

<li>set 设定adminName值(默认为request 和 ActionContext): <s:set var="adminName" value="username" /></li>
<li>s标签从request中取出adminName:<s:property value="#request.adminName" /></li>
<li>s标签从ActionContext中取出adminName:<s:property value="adminName" /></li>
<li>s标签从ActionContext中取出adminName:<s:property value="#adminName" /></li>
<li>set 设定var,范围为ActionContext: <s:set var="adminPassword" value="password" scope="reqeust" /></li>
<li>使用#取出adminPassword:<s:property value="#adminPassword" /></li>
<li>从session取出:<s:property value="#session.adminPassword" /></li>
<li>从request取出:<s:property value="#request.adminPassword" /></li>
<hr />


set标签主要作用是在jsp页面中定义变量,本案例中我们将参数传递进来的username值赋给变量adminName,之后用property方法从作用域中取出值。第一个li是set赋值的用法,第2到4是将set取出来的用法。需要注意的后面带有指定作用域的scope的用法,当我们指定了变量的作用域时,取出时需要指定我们的作用域。

bean、param标签使用

<li>bean 定义bean,并使用param来设定新的属性值:
<s:bean name="com.shizongger.tags.Dog">
<s:param name="name" value="大黄" />
<s:property value="name" />
</s:bean>
</li>
<li>bean 查看debug情况:
<s:bean name="com.shizongger.tags.Dog" var="myDog">
<s:param name="name" value="'Sam'" />
</s:bean>
取出值:<s:property value="#myDog.name" />
</li>
<hr />


这里用到了我们的javaBean Dog,Dog的代码如下:

public class Dog {
private String name;

public Dog() {
System.out.println("Dog无参构造方法");
}

public Dog(String name) {
System.out.println("Dog有参构造方法,name = " + name);

this.name = name;
}

public String getName() {
return name;
}

public void setName(String name) {
System.out.println("name = " + name);

this.name = name;
}

@Override
public String toString() {
return "Dog [name=" + name + "]";
}

}


Dog类只有一个name属性,一个空的构造方法一个带参数的构造方法,还覆盖toString方法。当然本类的输出语句是为了更好的看参数输出情况,你也可以去除输出语句。

jsp的bean标签的name指定了Dog类的全路径,param标签对其属性进行赋值。由于我给dog的name属性赋予了”大黄”的值,用debug标签可以看到:



同时页面输出:

bean 定义bean,并使用param来设定新的属性值:

bean 查看debug情况: 取出值:Sam

include标签

<li>include mydemo1.html 包含静态英文页面
<s:include value="/myDemo1.html"></s:include>
</li>
<li>include mydemo2.html 包含静态中文页面
<s:include value="/myDemo2.html"></s:include>
</li>
<li>include _include1.html 包含静态英文文件,说明%用法
<s:set var="incPage" value="%{'/myDemo1.html'}" />
<s:include value="%{#incPage}"></s:include>
</li>
<hr />


struts的inlcude标签用法与jsp的include差不多。上诉的两个静态html文件如下:

myDemo1.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>_include1.html</title>

<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=GB18030">

<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

</head>

<body>
<h3>This is the head</h3>
<p>This is a Paragram.</p>
</body>
</html>


myDemo2.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>_include1.html</title>

<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=GB18030">

<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

</head>

<body>
<h3>This is the head</h3>
<p>中文字符的段落.</p>
</body>
</html>


可能由于版本bug问题,英文静态html能够正常加载进来,而中文静态html没有正常加载进来,建议用jsp自带的include语句。

if elseif else标签的用法

<li>if elseif else的用法:
sex参数的值是=<s:property value="#parameters.sex[0]"/><br />
将parameters.sex[0]的值赋到age变量中去<s:set name="sex" value="#parameters.sex[0]"></s:set><br />
用户性别=<s:if test="#sex == 1">男</s:if>
<s:elseif test="#sex == 2">女</s:elseif>
<s:else>未知</s:else>
</li>
<li>username是否为空:
<s:if test="#parameters.username == null">是</s:if>
<s:else>否</s:else>
</li>
<hr />


这里用到的parameters是什么鬼?就是我们url传递的参数,在HttpServletRequest有一个方法getParamters(String str)就是从这个parameters里面获取jsp向Servlet传递参数的。

本代码片段逻辑是先从url获取parameters.sex[0]参数,赋值为sex变量,然后利用struts判断标签判断sex的值,如果sex等于1则为男,sex等于2则为女,其他是输出未知。

在本案例中我输入的url如下:

http://localhost:8080/StrutsTags/tagsAction.action?username=u&password=p&sex=1


浏览器输出如下:

if elseif else的用法: sex参数的值是=1

将parameters.sex[0]的值赋到age变量中去

用户性别=男

username是否为空: 否

遍历集合

<li>遍历集合:<br />
<s:iterator value="{'hello','to','struts','tags'}">
<s:property/>
</s:iterator>
</li>
<li>自定义变量:<br />
<s:iterator value="{'this','is','the','self','define','struts','tags'}" var="word">
<s:property value="#word.toUpperCase()"/>
</s:iterator>!
</li>
<li>使用status:<br />
<s:iterator value="{'this','is','the','self','define','struts','tags'}" status="status">
<s:property/>->
已经遍历了元素的个数:<s:property value="#status.count" /> .
元素的索引:<s:property value="#status.index" /> .
当前是偶数?:<s:property value="#status.even" /> .
当前是奇数? :<s:property value="#status.odd" /> .
是否是集合第一个元素?:<s:property value="#status.first" /> .
是否是集合最后一个元素? :<s:property value="#status.last" />
<br />
</s:iterator>
</li>
<li>
<s:iterator value="#{001:'root', 002:'admin', 003:'shizongger'}">
key = <s:property value="key"/> ,value = <s:property value="value" /><br />
</s:iterator>
</li>
<li>
<s:iterator value="#{001:'Sam', 002:'Big Huang',003:'Perk'}" var="dog">
key = <s:property value="#dog.key" /> ,value = <s:property value="#dog.value" /><br />
</s:iterator>
</li>
<hr />


集合的遍历在项目开发中经常用到,第一个li给出了最简单的集合遍历方法。第二个li的标签中将集合的每个元素赋值给变量word,再将其输出。第三个li的status用法能够显示出当前的元素的状态出来。

第4和第5个li下面的标签展示了map的用法,在迭代标签s:iterator中嵌套property标签,可以依次取出key值,再取出value,依次的将map的key-value取出来。

最后浏览器输出如图:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: