strust2标签小结

时间:2024.4.5

关于Struts2 中常用标签的用法小结

一、Struts2中的标签可以分为两种类型:通用标签和UI标签标签,其中通用标签可以分为数据标签和控制标签,UI标签可以分为表单标签、非表单标签和Ajax标签。Struts2标签结构如下:

通用标签

? 数据标签:

主要用于提供各种数据访问相关功能,这类标签通常会对值栈进行相关

的操作。

? 控制标签:

主要用于在呈现页面的时候,进行程序执行流程的控制,根据执行的

不同状态,输出不同的结果。

UI标签

? 表单标签

? 非表单标签

? Ajax标签(这里暂不不介绍)

二、Struts2标签库的描述文件被包含在struts2的核心JAR包(struts2-core-2.0.11.jar)中,在META-INF目录下,文件名为struts-tags.tld,并且在此文件中引用标签文件的URI为“/struts-tags”。因此我们要使用struts2标签只需要在JSP页面当中写入如下代码即可:

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

三、常用的数据标签:property,set,push,bean,action,param,date,debug.

(一)<s:property>标签

Peroperty 标签的作用就是输出value属性指定的值。如果没有指定value属性,这表示默认输出值栈栈顶的值。该标签有如下几个属性:

Default:该属性是可选的,如果需要输出的的属性值为null,这可以显示default指定的值。

Escape:该属性是可选的,指定是否通过HTML的转义,默认为true.

Value:该属性是可选的,指定需要输出的属性值,如果没有指定该属性,则默认是输出值栈栈顶的值(如果是对象,这会输出对象是内存地址)。

(二)<s:param>标签

Peroperty标签主要为其他的标签提供参数,例如include,bean标签,该标签有连个属性。

Name:该属性是可选的,指定需要设置参数的参数名。

Value:该属性是可选的,指定需要设置参数的的参数值。

该标签的使用方式有两种,一种没有应用value属性的,如:

<s:param name=”参数名” >参数值</s:param>

这种情况下是指:name的指定的参数的value就是表情中间的文本值。

看这样一个例子:<s:param name=”uname” >zhangsan</s:param>

也就是说我们提供了一个名为“uname“,值为“张三“的参数。

另一种是有应用value属性的,如: <s:param name=”参数名” value=”参数值” ></s:param> 这种情况下是指:name名指定的参数的值是value指定的属性的值。 我们可以看下面一个例子:

看这样一个例子:<s:param name=”uname” value=”zhangsan” > </s:param> 也就是说我们提供了一个名为“uname“,

值为”值栈中一个对象的的属性为zhangsan的值”这样一个的参数。

当然如果我们硬要通过第二种方式,表示和第一种相同的意义的时候,我们可以在value属性表示值上再加上一个单引号,如:

<s:param name=”uname” value= ” ’zhangsan’ ” > </s:param>

Default:该属性是可选的,如果需要输出的的属性值为null,这可以显示default指定的值。

Escape:该属性是可选的,指定是否通过HTML的转义,默认为true.

Value:该属性是可选的,指定需要输出的属性值,如果没有指定该属性,则默认是输出值栈栈顶的值(如果是对象,这会输出对象是内存地址)。

(三)<s:bean>标签

Peroperty 标签的作用就是创建一个javaBean,创建bean的实例时,我们可以通过param标签为javaBean实例属性赋值,这是javaBean中必须要有相关性必须要有setter方法,如果要取值,我们也可以创建getter方法,该标签有两个属性如:

Id:该属性是可选的,如果设置了该属性,则该javaBean 会放入actionContext中,我们可以通过Id属性值为key来访问该javaBean.

Name:是必选的,用来指定要实例化的javaBean的全名(包括包)。

下面我么通过一个简单的例子了解下:

再packag包下创建一个类User如下:

package entity;

public class User {

}

private String uname; public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; }

再beanTag.jsp中主要代码如下:

<body>

<s:bean name="entity.User1" id="user">

方式一 :

<s:param name="uname">zhangSan</s:param> <s:property value="uname"/>

方式一:

<s:param name="uname" value="'张三'"></s:param>

<s:property value="uname"/>

</s:bean>

bean外部可以输出:

<s:property value="#user.uname"/>

</body>

执行的结果为:

方式一 : zhangSan

方式一: 张三

bean外部可以输出: 张三

(四)<s:push>标签

push标签的作用将一个指定的值放入值栈中该标签只用一个属性:

id:该元素的标识(一般不用)

value:指定要放入值栈中的值。

看这样一个例子:再pushTag.jsp中:

<s:push value="放入值栈顶部的值"> <br>

<!—只能在这里取,因为标签在标签结束后,push标签放入到值栈中的对象将被删除(换句话说,要访问push标签压入栈中的对象,需要要push标签内部去访问。 -->

<s:property>

</s:push> (五)<s:set>标签

Set 标签的作用是将某个值放入指定的范围内,该标签的包含属性:

Id:该属性是可选的,为这个引用的元素赋一个Id值。

Name:该属性是必须的,指定重新生成的变量的名字。

Scope:该属性是可选的,指定存放新变量的位置,该属性有5个值,分别是application,session,request,page,action,该属性的默认是是action.

Value:该属性是可选的,指定赋给变量的值,这个值可以是自己给定的值,也可以是从其他的地方取的值,若未指定该属性,则将值栈顶端的值赋给新变量。

(六)<s:action>标签

Action标签直接在页面调用action请求,该标签有下面几个属性:

Id:该属性是可选的,用于作为该action的引用标识Id;

Name:该属性是必选的,用来指定调用哪个action的请求。

Namespace:该属性是可选的,指定该标签调用的action所在的命名空间。

ExecuteResult:该属性是可选的,指定是否要将action的处理的结果页面包含到本页面,如果为true,就是包含,如果为false,这不包含,默认是false.

IgnoreContextParam:该属性是可选的,它指定页面的请求的参数是否要求调入action.如果为false,如果为false,则是调入,如果为true,表示不调入。

看下面一个小例子:

再acitonTag.jsp中:

<body>

<h3>

actionTag

</h3>

<!-- ac将作为actionTagAction在栈中的标识 --> <s:action id="ac" name="actionTagAction" executeResult="false"

ignoreContextParams="true">

//这里以参数是形式给action中的minAge和maxAge赋值。 <s:param name="minAge" value="38"></s:param> <s:param name="maxAge" value="40"></s:param> </s:action> <table border="1"> <tr> <td> 姓名 </td> <td> 年龄 </td> </tr> <s:iterator value="#ac.users"> <tr> <td> <s:property value="userName" /> </td> <td> <s:property value="age" /> </td> </tr> </s:iterator> </table> </body>

在ActionTagAction中:

package example3;

import java.util.ArrayList;

import java.util.List;

import com.opensymphony.xwork2.ActionSupport;

import entity.User;

public class ActionTagAction extends ActionSupport {

private Integer minAge;

private Integer maxAge;

private List<User> users;

public ActionTagAction() {

super();

}

public Integer getMaxAge() {

return maxAge;

}

public void setMaxAge(Integer maxAge) {

this.maxAge = maxAge;

}

public Integer getMinAge() {

return minAge;

}

public void setMinAge(Integer minAge) {

this.minAge = minAge;

}

public List<User> getUsers() {

return users;

}

public void setUsers(List<User> users) {

this.users = users;

}

} @Override public String execute() throws Exception { } System.out.println("actionTagAction.execute()方法"); users = new ArrayList<User>(); User u = null; for (int i = 0; i < 100; i++) { u = new User(); u.setUserName("user" + (i + 1)); u.setPassword("888888"); u.setEmail("abc" + i + "@126.com"); u.setAge(this.getRandomAge()); if ((null != minAge && u.getAge() < minAge) || (null != maxAge && u.getAge() > maxAge)) { continue; } users.add(u); } return null; // 生成1~60的年龄 private int getRandomAge() { int age = (int) ((60 - 1 + 1) * Math.random()) + 1; return age; }

在strust.xml中:

<action name="actionTagAction"

class="example3.ActionTagAction"> </action>

输出的结果为:

actionTag

strust2标签小结

也就这些了,如果读者觉得有什么不好的,可以多提意见啊!!!


第二篇:struts2学习心得


一.

配置问题:

最新的struts2为GA版2.2.1

其中必须类库为1.commons-fileupload-1.2.1.jar  

2. commons-io-1.3.2.jar

3. freemarker-2.3.16.jar

4. javassist-3.7.ga.jar

5. ognl-3.0.jar

6. struts2-core-2.2.1.jar

7. xwork-core-2.2.1.jar

之前的版本使用ognl时不需要javassist这个类库   现在这个版本则需要。。

二.

EL表达式(JSP EL)

目的是为了使JSP写起来更加简单。

A、语法结构

     ${expression}

B、[ ]与.运算符

     EL 提供“.“和“[ ]“两种运算符来存取数据。

     当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用“[ ]“。例如:

         ${user.My-Name}应当改为${user["My-Name"] }

     如果要动态取值时,就可以用“[ ]“来做,而“.“无法做到动态取值。例如:

         ${sessionScope.user[data]}中data 是一个变量

C、变量

     EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。

     因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找

     假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null。

     属性范围在EL中的名称

         Page          PageScope

         Request          RequestScope

         Session          SessionScope

         Application      ApplicationScope

D、特别强调:

1、注意当表达式根据名称引用这些对象之一时,返回的是相应的对象而不是相应的属性。例如:即使现有的 pageContext 属性包含某些其他值,${pageContext} 也返回 PageContext 对象。

2、 注意 <%@ page isELIgnored="true" %> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言。

3、在web中用EL表达式时 ${name}其意思是调用其getName方法,而不是name这个属性

例如:

public class HelloWordAction{

       private String msg;

       public String getMessage{

       return msg;

}

}

在jsp中使用${message} 就是返回msg的值。经实验证明了的

三.

Struts2是在webwork2的基础上发展而来的。和struts1一样也是mvc框架。但是虽然他们名字一样但是原理差异很大。Struts2之所以会产生是因为有以下几个优点:

1.  在软件设计方面struts2没有像struts1那样和servlet API和struts API那样紧密的耦合。Struts2可以不依赖它们。Struts2属于无侵入式设计。而struts1属于侵入式设计。

Public class HelloWordAction extends Action{

        Public ActionForward execute(ActionMapping mapping ActionForm form HttpRequest request  HttpResponse response)throws Exception{

。。。。

}

}

而struts2则不需要,只需自己定义就好。

2.Struts2不需要注意线程同步的问题,而struts1则面临这个问题,因为struts1对action创建的时候只创建一次,当多个用户同时访问这个action时,则必须出现这个同步的问题。

struts2来说,需要action时都要重新new出一个对象

四.

Namespace决定了action的访问路径,默认为“”,可以接受所有路径的action。Namespace后面可以加/也可以加/xx或者/xx/yy,则action的访问的路径就相对于/index.action,/xx/index.action或者/xx/yy/index.action

Package顾名思义为“包”可以把你的action包裹进来,然后在里面定义自己的action

可以定义N个包,但是包和包之间的名字不能重复,包里面的action可以和别的包的重复。

3.

Action的几个属性:

1.Name:

2.Method:默认为自动的Actionsupport  里面有个方法execute()方法返回suceess字符串。所以result的默认值为 success。但是注意:并不是一定要执行execute()方法,而是根据Method方法指定的来说,也可以在地址中动态指定(动态方法调用DMI(动向指标或趋向指标))推荐使用

(开发action一般继承Actionsupport重写execute()方法。。。(企业开发只用这种)

当然还有其他两个方法 自己写个execute()方法,或者继承Action接口 重写execute()方法)

3.Class:自己开发写的action路径。

五.

路径问题:一般用绝对路径

因为struts2的路径问题是根据action的路径而不是jsp路径来确定的

六.

通配符(WildCard)  *  

一定要遵守“约定优于配置”的原则: 就是说什么东西 你必须符合一定的标准,在这个基础上在进行优化配置。。。。。

<package name=”actions” extend=“struts-default”namespace=“/actions”

看第一个action配置

<action Name=“Student*”class=“。。。。” method=“{1}”/>

<result>student{1}_success.jsp<result>

意思就是说凡是带url为/actions/Student,后缀无论是什么的都可以访问,但是method=“{1}”说明其方法为你之前*所代表的那个.当你返回success时就调用student{1}_success.jsp

比如:你访问http://……./actions/StudentAdd,那他就调用的方法是Add

成功之后(返回success)访问studentAdd_success.jsp

看第二个action配置

<action Name=”*_*” class=”cn.itcast.struts2.{1}Action” method=”{2}”/>

<result>/{1}_{2}_success.jsp</result>

这又是什么意思呢?

就是说凡是带url为/actions/*_*的,无论两个*星号代表什么都可以访问,但是method=“{2}”说明其访问的方法为第一个*所代表的那个类中的第二个*所代表的方法

比如:你访问http://....../actions/Student_Add,那他就调用StudentAction中的Add方法

成功之后就访问Student_Add_success.jsp

这就是通配符的具体意思

七.

Action参数的传递方式:

1.  直接在地址栏上传递(url)

http://localhost:8080/project-name/namespace/action-name!add?name=a&age=10

就是给action中的两个属性 name和age 分别传值a和10

2.  用DomainModel方式传递

1.  当需要的参数过多时,创建一个域模型DomainModel也就是(javabean

注意的是:这个DomainModel要有不含参数(参数为空)的构造方法,而且想让他自己new出对象的会 必须要传参数值

比如

http://localhost:8080/project-name/namespace/action-name!add?user.name=aa&user.age=10

解释一下,add?之前的和前面的一样,user.name和user.age是指把数据传给user这个对象的name和age属性

       因为在action中我们不定义属性 而是直接定义一个User类型的对象

       Private User user;并有getUser()方法和setUser()方法

而这个User就是我们说的DomainModel,他定义了两个属性name和age并有getter和setter方法,方便我们送值和取值。(相当于一个javabean)

2.当传入的值的个数和DomainModel的属性个数不一致的情况下,再用DTO(Data Transfer Object(数据传输对象))

举个例子说明一下:

如果用户注册的时候肯定有用户名,密码和验证密码。但是你定义一个User的时候只能有两个属性username和password,那这种情况下怎么办呢?我传的第三个值传给谁呢?所以要再建一个DTO(其实也是一个java类)UserDTO

       Private String username;

       Private String password;Private String confirmPassword;

生成getter和setter方法,然后通过这个再定义User的DomainModel

Private String username;

Private String password;写出getter方法和setter方法

注意:要写一个带UserDTO参数的User构造方法,

Public User(UserDTO userDTO){}目的是为了把得到的UserDTO属性传给User对象!

接受参数的时候注意,一定要把得到的值放到User对象里,即调用setter方法

User.setName(userDTO.getName());

用url传参数时要传给userDTO

   3.用ModelDriven方式传递参数

ModelDriven是一个接口(不大常用)。

八.

配置struts2的属性有三种方法:

1.  写一个struts2。Properties文件来管理属性。一般放在项目的WEBINF/classes下。

采用的key-value对。每个key就是struts2的属性,每个value就是这个struts2的属性值。

2.  在struts2的配置文件struts.xml配置常量

在里面加入<constant name=”” value=””>

Name为属性,value为属性值

3.  在web.xml文件中配置filter时也可以配置属性

<init-param>

        <param-name>     </param-name>里面为属性名

        <param-value>      </param-value>里面为属性值

       <init-param>

上述文件的加载顺序为:struts.xml      struts.properties    web.xml

意思就是说  如果重复的属性   则按最后那个文件配置的算起。

九.

Action的总结:

1.  实现action的方法有三种,一般继承Actionsupport类

2.  DMI动态方法调用

3.  通配符配置

4.  接受参数的方法,一般用属性或者DomainModel来接受

5.  简单参数的验证addFilterError

a)       一般不使用struts2的UI标签

6.  访问web元素

a)       Map类型

1.  LoC

2.  依赖struts2

b)       

1.  LoC

2.  依赖struts2

7.  包含文件配置

8.  默认action处理

十.

1.常用的四种类型

       A)dispatcher(默认)

       B)redirect

       C)chain

       D)redirectAction

2.全局结果集

       A)global-results|extends

3.动态结果(了解)

       A)在action中保存一个属性,存储具体的结果location

<result>${r}</result>  这个意思就是说:用中间那个表达式可以去读value stack(如下面所述)中的r的值。

Value stack栈中的值

每一个动作在执行相应方法之前,都会创建一个value stack的对象。value stack用来保存这个动作对象和其他对象。

可以使用el表达式和Struts2标签进行对值栈的访问:

使用Struts2标签,需要引入标签库:

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

   

<body>

       ${errors.name[0]}

       <br />

       <s:property value="errors.name[0]" />

       <s:debug /><!-- debug标签会将页面访问到的栈值通过一个a标签显示出来 -->

    </body>

Action中进行简单的数据校验:

package actions;

import com.opensymphony.xwork2.ActionSupport;

import enetitys.User;

publicclassUserActionextends ActionSupport {

   

    private User user;

   

    public User getUser() {

       return user;

    }

    publicvoid setUser(User user) {

       this.user = user;

    }

    public String add(){

       System.out.println("name="+user.getName());

       System.out.println("admin".equals(user.getName()));

       if("admin".equals(user.getName())){

           returnSUCCESS;

       }else{

           this.addFieldError("name", "该用户不存在!"); //添加一个属性错误.

           return "error";

       }

    }  

}

提交地址:

点击Debug链接.下面的图片中灰色背景的将显示出来, 还有很多. 抓图没办法全部抓下来.

可以发现,在值栈中,都是以Map形式存储的值,actionErrors存储的是action的错误.fieldErrors存储的属性错误.errors包含这两者.

看下面的Stack Context.顾名思义,栈的上下文环境.

访问的时候,通过#key来访问.如下:假设reques中有名为obj属性的值.使用OGNL表达式访问.

<s:property value="#request.obj” />这样就可以取到stack Context中的值.

4.传递参数

       A)客户端跳转才需要传递

       B)${}表达式(不是EL)????

更多相关推荐:
struts2常用标签

struts2标签一写jsp页面的时候在struts2中用的是s标记先引入标记lttaglibprefixquotsquoturiquotstrutstagsquotgt二struts2的标签和1是完全不同的s...

struts2常用标签方法总结

1输出action中属性值在jsp页面中显示用ltspropertyvaluequot属性名quotgt如果是对象域则表示为ltspropertyvaluequot对象属性名quotgt2在页面中实现自动增加的...

struts2常用标签总结

Struts2常用标签总结Struts2常用标签总结002一介绍0031Struts2的作用Struts2标签库提供了主题模板支持极大地简化了视图页面的编写而且struts2的主题模板都提供了很好的扩展性实现了...

Struts2常用标签总结

001Struts2常用标签总结002一介绍0031Struts2的作用Struts2标签库提供了主题模板支持极大地简化了视图页面的编写而且struts2的主题模板都提供了很好的扩展性实现了更好的代码复用004...

Struts2常用标签总结

libviewopen1331393920xx2htmlStruts2常用标签总结一介绍1Struts2的作用Struts2标签库提供了主题模板支持极大地简化了视图页面的编写而且struts2的主题模板都提供了...

Struts2常用标签总结

Struts2常用标签总结一介绍1Struts2的作用Struts2标签库提供了主题模板支持极大地简化了视图页面的编写而且struts2的主题模板都提供了很好的扩展性实现了更好的代码复用Struts2允许在页面...

struts2的iterator标签总结(精)

一遍历数组ltStringarrstrnewStringquotaquotquotbquotquotcquotquotdquotrequestsetAttributequotarrstrquotarrstrgt...

总结了Struts1与Struts2的12点区别

总结了Struts1与Struts2的12点区别Postedon20xx11170914陈小东阅读36856评论11编辑收藏1在Action实现类方面的对比Struts1要求Action类继承一个抽象基类Str...

Struts2 ognl标签使用

Struts2标签使用ognl标签1ltstextfieldgt文本输入框使用ltstextfieldname实体Bean属性gtltstextfieldgt2ltstextareagt文本域输入框使用ltst...

struts2面试题(自己总结)

Struts2面试题1struts2工作流程Struts2框架本身大致可以分为3个部分核心控制器FilterDispatcher业务控制器Action和用户实现的企业业务逻辑组件核心控制器FilterDispa...

Struts2开发总结

Struts2项目开发总结注Struts2版本Struts216数据库Oracle9i所须架包commonslogging104jarcommonsfileupload121jarfreemarker2313j...

struts2课程知识点总结

struts2课程知识点总结bywanggc1actionastruts2环境配置包括5个基本jar包webxml中配置过滤器strutsxml文件配置编写actionb得到表单数据接受参数两种方法1getse...

struts2常用标签总结(35篇)