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

Struts2 学习 第一章 struts2中Action类的使用

2010-03-30 16:02 381 查看
在Struts2的学习中,越来越感觉它的强大。

其实我个人不是很喜欢学习新的框架,我个人比较喜欢学习框架中的设计方式和原理。

但是Struts2带来的和Struts一的架构设计是完全不同的,虽然是基于WebWork。但是里面确实有很多值得学习的地方吧。

废话少说,首先我们来看看Struts2中Action给我们带来的灵活吧。

早在Struts1的时代,我们总是使用ActionForm和Action来进行同步开发。ActionForm给我的感觉就是四不像啊。

虽然是可以接受页面的值,但是使得程序中多了N个ActionForm的类。

而在Struts2中Action类可以直接使用纯正的JavaBean做为属性来进行赋值。

public class LoginAction {

private String username;
private String userpasswd;

public String getUsername() {
return username;
}

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

public String getUserpasswd() {
return userpasswd;
}

public void setUserpasswd(String userpasswd) {
this.userpasswd = userpasswd;
}

public String execute() throws Exception {
// TODO Auto-generated method stub
return “success”;
}

---------------------------------------------------------------------------------------
Struts.xml 配置文件

<package name="default" extends="struts-default">
<action name="login" class="ch01.LoginAction" >
<result name="input">/ch01/login.jsp</result>
<result name="success">/ch01/result.jsp</result>
</action>
</package>

---------------------------------------------------------------------------------------
就这样的一个Action就直接可以运行。

当然,这是最简单的Action了。在使用Struts2的中Action的时候可以有两种方法

第一种:直接让上面的Action去实现Struts2框架Action接口。里面会提供几个常量和一个抽象的execute方法。这个就是所有Action的原始接口。

第二种:让上面的Action去继承Struts2框架的ActionSupport(com.opensymphony.xwork2.ActionSupport)这个类提供了Struts2的一些特殊的功能。

其中最有用的功能就是校验属性值,然后提供错误信息。

public class LoginAction extends ActionSupport {

private String username;
private String userpasswd;

public String getUsername() {
return username;
}

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

public String getUserpasswd() {
return userpasswd;
}

public void setUserpasswd(String userpasswd) {
this.userpasswd = userpasswd;
}

@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return this.SUCCESS;
}


@Override
public void validate() {
if(null == this.getUserpasswd() || "".equals(this.getUserpasswd().trim())){
this.addFieldError(userpasswd, "userpasswd is required");
}
if(null== this.getUsername() || "".equals(this.getUsername().trim())){
this.addFieldError(username, "username is required");
}
}


}

------------------------------------------------------------------------

在这里的validate方法在调用Action类的时候会最先执行,等同原来Struts1中ActionForm中的reset方法。

如果检验出错误可以调用this.addFieldError的方法给框架添加错误信息。然后在页面中可以直接显示出来。当然前提条件是你在struts.xml中配置<result name="input">...</result>

------------------------------------------------------------------------
login.jsp

Action验证用户姓名和密码是否为空!<br/>
<s:form action="login" >
<s:textfield name="username" label="姓名:"></s:textfield><br/>
<s:password name="userpasswd" label="密码:"></s:password><br/>
<s:submit value="提交"></s:submit>
</s:form>

Struts2 学习 第二章 struts2中Action类的高级用法

首先我们接着把上次的Action的使用讲完。

如果我们要想让struts2中的Action像struts1的中dispatchAction一样灵活方便。

其实可以通过更加简便的方式。

public class UserAction extends ActionSupport {

public String getUser(){
System.out.println("getUser method");
return this.SUCCESS;
}


public String delUser(){
System.out.println("delUser method");
return this.SUCCESS;
}


@Override
public String execute() throws Exception {
System.out.println("execute method");
return this.SUCCESS;
}

你可以看到,在这个普通的Struts2的Action中。我提供了getUser 和 delUser的方法。

条件是这两个方法的返回值必须是String类型。这里的返回值对应<result>标签name属性的值。

而在配置文件中,就必须提供对应的配置。

struts.xml
-----------------------------------------------------------------------------------

<package name="default" extends="struts-default">
<action name="deluser" method="delUser" class="ch02.UserAction">
<result>/ch01/result.jsp</result>
</action>
<action name="getuser" method="getUser" class="ch02.UserAction">
<result>/ch01/result.jsp</result>
</action>
</package>

-----------------------------------------------------------------------------------

其中红色字体的部分表示的意思为:

name表示在页面调用这个Action的时候使用的名称;

method则表示是调用UserAction中的delUser方法。

就是通过这样的配置来达到了DispatcheAction的作用。

当然咯,在一个Action中的操作肯定不止一两个方法。当方法过多的时候,在配置文件中就会产生

对同一个Action的过多配置。所以Struts2引入了通配符的表达式。

所以在配置Action的配置的时候,我们就可以简写成如下的形式。

--------------------------------------------------------------------------------
<action name="*User" method="{1}User" class="ch01.UserAction">
<result>/ch01/result.jsp</result>
</action>
-------------------------------------------------------------------------------

在这里name中的 “ * ”号表示通配符,表示统配所有的字符可以是0->多个字符。

而method中的" {1} " 表示接受通配符中的第一个“ * ”号的值。

所以我们就可以简单的理解成。

delUser.action 就是调用 delUser 方法

getUser.action 就是调用 getUser 方法

*User.action 就是调用 {1}User 方法

当然了通配符的使用还可以写成不同的形式:

--------------------------------------------------------------------------------
<action name="*/*" method="{2}User" class="ch01.UserAction">
<result>/{1}/result.jsp</result>
<result name="input">/{1}/input.jsp</result>
</action>
-------------------------------------------------------------------------------

这个意思就是 ch02/del.action ,就是调用 delUser方法 ,跳转到/ch02/result.jsp页面中咯。

哈哈,简单吧。

所以使用Struts2来开发web项目还是大有可为的。

下一章,Banseon讲解在Action中如何获得作用域对象。

Struts2 学习 第三章 struts2中Action类如何获得作用域对象

现在有点喜欢Struts2这个框架了。

在struts1中我们的Action的execute方法中是将请求和响应当做参数传递给了Action。

而在Struts2中Action的execute方法是没有任何的参数。

哪我们如何去获得作用域对象,没有作用域对象就没有办法操作里面的数据。

到这里我们先不要着急,首先我们来讲解一下Struts2中Action的运行过程。

当Struts2的过滤器启动的时候,首先就会初始化一个叫做ServletActionContext的类。

它掌管着所有的作用域对象。

import org.apache.struts2.ServletActionContext;

public class ContextAction implements Action {


public String execute() throws Exception {
//获得请求
HttpServletRequest _request = ServletActionContext.getRequest();
//获得会话
HttpSession _session = _request.getSession();
//获得上下文对象
ServletContext _application = ServletActionContext.getServletContext();
}

}
-------------------------------------------------------------------------------

所以一个普通的Action类就可以通过这种方式得到所有的作用域对象。

当然这是Strtus2中才能使用的特性。

-------------------------------------------------------------------------------

而在原来的webwork中又是如何得到作用域对象的?

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;

public class ContextAction implements Action {

public String execute() throws Exception {

ActionContext ctx = ActionContext.getContext();//得到Struts2的上下文
Map request = (Map)ctx.get("request");//得到request
Map session = ctx.getSession();//得到会话
Map application = ctx.getApplication();//得到应用程序


request.put("welcome", "欢迎进入Struts2的世界!");
session.put("hello", "hi,banseon welcome!");

Integer count = (Integer)application.get("count");
if(null == count){
count =1;
}else
count++;
application.put("count", count);
return SUCCESS;
}
}
------------------------------------------------------------------------------------------------

想必看到这里大家可能就有点糊涂了。其实webwork框架把作用域对象封装到

ActionContext中直接将request,session,Application还原成了Map集合并封装到

该类中。并为此提供了request.getSession(),request.getApplication()等方法。

如何我们使用其他比较方便。但是对于我们使用JAVAEE中request,session,application

的习惯有很大的不同。所以Strtus2就在相应的jar中做出了调整所以ServletActionContext。

就因此而来了。

当然,这两种用法都是可以直接来操作作用域对象。

怎么使用就看仁者见仁。

下一章,我们就谈谈如何使用Struts2中的内置接口来获得作用域对象吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐