随笔-34  评论-1965  文章-0  trackbacks-0

有struts 1.x经验的朋友都知道action是struts的核心内容,当然struts 2.0也不例外。不过,struts 1.x与struts 2.0的action模型很大的区别。

  struts 1.x stuts 2.0
接口 必须继承org.apache.struts.action.action或者其子类 无须继承任何类型或实现任何接口
表单数据 表单数据封装在formbean中 表单数据包含在action中,通过getter和setter获取

虽然,理论上struts 2.0的action无须实现任何接口或继承任何类型,但是,我们为了方便实现action,大多数情况下都会继承com.opensymphony.xwork2.actionsupport类,并重载(override)此类里的string execute()方法。具体的实现,如例1所示:

<% @ page contenttype = " text/html; charset=utf-8 " %>
<% @ taglib prefix = " s " uri = " /struts-tags " %>
< html >
< head >
   
< title > hello world! title >
head >
< body >
   
< h2 >< s:property value ="message" /> h2 >
body >
html >
例1 helloworld.jsp

package tutorial;

import java.text.dateformat;
import java.util.date;

import com.opensymphony.xwork2.actionsupport;

public class helloworld extends actionsupport {
   
private string message;
   
   
public string getmessage() {
       
return message;
   }

   
   @override 
   
public string execute() {
       message
= " hello world, now is " dateformat.getinstance().format( new date());
       
return success;
   }

}
例1 classes/tutorial/helloworld.java

< package name ="actiondemo" extends ="struts-default" >
   
< action name ="helloworld" class ="tutorial.helloworld" >
       
< result > /helloworld.jsp result >
   
action >
package >
例1 classes/struts.xml中helloworld action的配置

在浏览器地址栏中键入,可以看到如图1所示页面。

图1 helloworld输出页面
图1 helloworld输出页面

参考javadoc,可知类实现了接口:
  • com.uwyn.rife.continuations.continuableobject

默认情况下,当请求helloworld.action发生时,struts运行时(runtime)根据struts.xml里的action映射集(mapping),实例化tutoiral.helloworld类,并调用其execute方法。当然,我们可以通过以下两种方法改变这种默认调用。这个功能(feature)有点类似struts 1.x中的lookupdispathaction。

  1. 在classes/sturts.xml中新建action,并指明其调用的方法;
  2. 访问action时,在action名后加上“!xxx”(xxx为方法名)。

实现方法请参考例2:

在classes/tutorial/helloworld.java中加入以下方法:
public string aliasaction() {
    message
="自定义action调用方法";
   
return success;
}
例2 classes/tutorial/helloworld.java代码片段

实现方法一,在classes/sturts.xml中加入下面代码:
<action name="aliashelloworld" class="tutorial.helloworld" method="aliasaction">
   
<result>/helloworld.jspresult>
action>
例2 classes/struts.xml中alaishelloworld action的配置

实现方法二,使用地址来访问helloworld action。

在浏览器地址栏中键入或 ,可以看到如图2所示页面。

图2 自定义action调用方法页面
图2 自定义action调用方法页面

通过上面的两个例子,细心的朋友应该可能会发现classes/tutorial/helloworld.java中action方法(execute和aliasaction)返回都是success。这个属性变量我并没有定义,所以大家应该会猜到它在actionsupport或其父类中定义。没错,success在接口com.opensymphony.xwork2.action中定义,另外同时定义的还有, , ,

此外,我在配置action时都没有为result定义名字(name),所以它们默认都为success。值得一提的是struts 2.0中的result不仅仅是struts 1.x中forward的别名,它可以实现除forward外的很激动人心的功能,如将action输出到freemaker模板、velocity模板、jasperreports和使用xsl转换等。这些都过result里的type(类型)属性(attribute)定义的。另外,您还可以自定义result类型。

下面让我们来做一个velocity模板输出的例子,首先在classes/struts.xml中新建一个action映射(mapping),将其result类型设为velocity,如以下代码所示:
<action name="vmhelloworld" class="tutorial.helloworld">
   
<result type="velocity">/helloworld.vmresult>
action>
例3 classes/struts.xml中vmhelloworld action的配置

新建helloworld.vm,内容如下所示:
<html>
 
<head>
   
<title>velocitytitle>
   
<meta http-equiv="content-type" content="text/html; charset=utf-8">
 
head>
 
<body>
   
<h2>message rendered in velocity: $messageh2>
 
body>
html>
例3 helloworld.vm

在浏览器地址栏中键入,页面输出如下图3所示。

图3 helloworld.vm的输出页面
图3 helloworld.vm的输出页面
要运行例3需要在web-inf/lib中添加以下几个包:

    前面,我花了不少的时间讨论action的输出。我老板有句名言——程序无非就是输入、操作和输出。因此,现在我们要讨论一下输入——表单输入。

    使用struts 2.0,表单数据的输入将变得非常方便,和普通的pojo一样在action编写getter和setter,然后在jsp的ui标志的name与其对应,在提交表单到action时,我们就可以取得其值。

    让我们看一个例子,新建login action,它通过login.jsp的表单获得用户名和密码,验查用户名是否为“max”,密码是否则为“secret”。如果,两者都符合,就在helloworld中显示“welcome, max”,否则显示“invalid user or password”。

    package tutorial;

    import com.opensymphony.xwork2.actionsupport;

    publicclass login extends actionsupport {
       
    private string name;
       
    private string password;
       
    private string message;
       
       
    public string getname() {
           
    return name;
       }

       
       
    publicvoid setname(string name) {
           
    this.name = name;
       }

       
       
    public string getpassword() {
           
    return password;
       }

       
       
    publicvoid setpassword(string password) {
           
    this.password = password;
       }

       
       
    public string getmessage() {
           
    return message;
       }


       @override
       
    public string execute() {
           
    if("max".equals(name) &&"secret".equals(password)) {
               message
    ="welcome, " name;
           }
    else{
               message
    ="invalid user or password";
           }

           
    return success;
       }

    }
    例4 classes/tutorial/login.java

    <%@ page contenttype="text/html; charset=utf-8" %>
    <%@ taglib prefix="s" uri="/struts-tags"%>
    <html>
    <head>
       
    <title>logintitle>
    head>
    <body>
    <s:form action="login" method="post">
       
    <s:textfield name="name" label="user name"/>
       
    <s:password name="password" label="password"/>
       
    <s:submit value="submit"/>
    s:form>
    body>
    html>
    例4 login.jsp

    <action name="login" class="tutorial.login">
       
    <result>/helloworld.jspresult>
    action>
    例4 classes/struts.xml中login action的配置

    运行tomcat,在浏览器地址栏中键入,出现如图4所示页面。

    图4 login.jsp输出页面
    图4 login.jsp输出页面

    分别在user name中输入“max”和“secret”,点击“submit”按钮,出现如图5所示页面。

    图5 login成功页面
    图5 login成功页面

    在浏览器地址栏中键入,分别在user name中输入“scott”和“password”,点击“submit”按钮,出现如图6所示页面。

    图6 login失败页面
    图6 login失败页面 

    struts 2.0更厉害的是支持更高级的pojo访问,如user.getpassword()。我们可以用另一写法实现例4。首先,将name和password从login类中分离出来,到新建类user中。这样对我们开发多层系统尤其有用。它可以使系统结构更清晰。

    package tutorial;

    import com.opensymphony.xwork2.actionsupport;

    publicclass loginx extends actionsupport {
       
    private user user;
       
    private string message;
       
       
    publicvoid setuser(user user) {
           
    this.user = user;
       }

       
       
    public user getuser() {
           
    return user;
       }

       
       
    public string getmessage() {
           
    return message;
       }

       
       @override
       
    public string execute() {        
           
    if("max".equals(user.getname()) &&"secret".equals(user.getpassword())) {
               message
    ="welcome, " user.getname();
           }
    else{
               message
    ="invalid user or password";
           }

           
    return success;
       }

    }
    例5 classes/tutorial/loginx.java

    <%@ page contenttype="text/html; charset=utf-8" %>
    <%@ taglib prefix="s" uri="/struts-tags"%>
    <html>
    <head>
       
    <title>logintitle>
    head>
    <body>
    <s:form action="loginx" method="post">
       
    <s:textfield name="user.name" label="user name"/>
       
    <s:password name="user.password" label="password"/>
       
    <s:submit value="submit"/>
    s:form>
    body>
    html>
    例5 loginx.jsp

    <action name="loginx" class="tutorial.loginx">
       
    <result>/helloworld.jspresult>
    action>
    例5 classes/struts.xml中的loginx action配置 

    很多时候我的同事会问我:“如果我要取得servlet api中的一些对象,如request、response或session等,应该怎么做?这里的execute不像struts 1.x的那样在参数中引入。”开发web应用程序当然免不了跟这些对象打交道。在strutx 2.0你可以有两种方式获得这些对象:非ioc(控制反转inversion of control)方式和ioc方式。

    1. 非ioc方式

      要获得上述对象,关键struts 2.0中类。我们可以通过它的静态方法getcontext()获取当前action的上下文对象。 另外,作为辅助类(helper class),可以帮助您快捷地获得这几个对象。

      • httpservletrequest request = servletactioncontext.getrequest();
      • httpservletresponse response = servletactioncontext.getresponse();
      • httpsession session = request.getsession();

      如果你只是想访问session的属性(attribute),你也可以通过actioncontext.getcontext().getsession()获取或添加session范围(scoped)的对象。

    2. ioc方式

      要使用ioc方式,我们首先要告诉ioc容器(container)想取得某个对象的意愿,通过实现相应的接口做到这点。具体实现,请参考例6 iocservlet.java。
    package tutorial;

    import javax.servlet.http.httpservletrequest;
    import javax.servlet.http.httpservletresponse;
    import javax.servlet.http.httpsession;

    import org.apache.struts2.servletactioncontext;

    import com.opensymphony.xwork2.actioncontext;
    import com.opensymphony.xwork2.actionsupport;

    publicclass noniocservlet extends actionsupport {
       
    private string message;
       
       
    public string getmessage() {
           
    return message;        
       }

       
       @override
       
    public string execute() {    
           actioncontext.getcontext().getsession().put(
    "msg", "hello world from session!");
           
           httpservletrequest request
    = servletactioncontext.getrequest();
           httpservletresponse response
    = servletactioncontext.getresponse();        
           httpsession session
    = request.getsession();
           
           stringbuffer sb
    =new stringbuffer("message from request: ");
           sb.append(request.getparameter(
    "msg"));
           sb.append(
    "
    response buffer size:
    ");
           sb.append(response.getbuffersize());
           sb.append(
    "
    session id:
    ");
           sb.append(session.getid());
           
           message
    = sb.tostring();
           
    return success;
       }

    }
    例6 classes/tutorial/noniocservlet.java

    package tutorial;

    import java.util.map;

    import javax.servlet.http.httpservletrequest;
    import javax.servlet.http.httpservletresponse;
    import javax.servlet.http.httpsession;

    import org.apache.struts2.interceptor.servletrequestaware;
    import org.apache.struts2.interceptor.servletresponseaware;
    import org.apache.struts2.interceptor.sessionaware;

    import com.opensymphony.xwork2.actioncontext;
    import com.opensymphony.xwork2.actionsupport;

    publicclass iocservlet extends actionsupport implements sessionaware, servletrequestaware, servletresponseaware {
       
    private string message;
       
    private map att;
       
    private httpservletrequest request;
       
    private httpservletresponse response;    
       
       
    public string getmessage() {
           
    return message;        
       }

       
       
    publicvoid setsession(map att) {
           
    this.att = att;
       }

       
       
    publicvoid setservletrequest(httpservletrequest request) {
           
    this.request = request;
       }

       
       
    publicvoid setservletresponse(httpservletresponse response) {
           
    this.response = response;
       }

       
       @override
       
    public string execute() {        
           att.put(
    "msg", "hello world from session!");
           
           httpsession session
    = request.getsession();
           
           stringbuffer sb
    =new stringbuffer("message from request: ");
           sb.append(request.getparameter(
    "msg"));
           sb.append(
    "
    response buffer size:
    ");
           sb.append(response.getbuffersize());
           sb.append(
    "
    session id:
    ");
           sb.append(session.getid());
           
           message
    = sb.tostring();
           
    return success;
       }

    }
    例6 classes/tutorial/iocservlet.java

    <%@ page contenttype="text/html; charset=utf-8" %>
    <%@ taglib prefix="s" uri="/struts-tags"%>
    <html>
    <head>
       
    <title>hello world!title>
    head>
    <body>
       
    <h2>
           
    <s:property value="message" escape="false"/>
           
    <br>message from session: <s:property value="#session.msg"/>
       
    h2>
    body>
    html>
    例6 servlet.jsp

    <action name="noniocservlet" class="tutorial.noniocservlet">
       
    <result>/servlet.jspresult>
    action>
    <action name="iocservlet" class="tutorial.iocservlet">
       
    <result>/servlet.jspresult>
    action>
    例6 classes/struts.xml中noniocservlet和iocservlet action的配置

    运行tomcat,在浏览器地址栏中键入 或,出现如图7所示页面。


    图7 servlet.jsp的输出页面 
    图7 servlet.jsp的输出页面

    在servlet.jsp中,我用了两次property标志,第一次将escape设为false为了在jsp中输出
    转行,第二次的value中的ognl为“#session.msg”,它的作用与session.getattribute("msg")等同。
    关于property或其它标志,可以参考我的上一篇文章《常用的struts 2.0的标志(tag)介绍 》。
    posted on 2006-10-25 12:10 max 阅读(99189) 评论(118)     所属分类: struts 2.0系列
    评论共2页: 1   

    评论:
    # re: struts 2.0的action讲解[未登录] 2007-03-27 16:22 |
    我用自己定义的方法怎么没能把值传到jsp上?用execute这个方法就行.
    我的方法(在action中)
    public string show()
    {
    return success;
    }
    struts.xml中配置如下.

    showall.jsp

    我的action继承actionsupport这个类  回复  
      
    # re: struts 2.0的action讲解 2007-03-27 23:12 | max
    @michael
    原因你把result的类型(type)设为了"redirect", 而且名称(name)也不对。如果action方法返回success时,name应为success。  回复  
      
    # re: struts 2.0的action讲解 2007-03-27 23:14 | max
    @jintian
    对不起,我忘记把user类的代码贴上去了,其实就和seed说的一样。
    @seed
    谢谢  回复  
      
    # re: struts 2.0的action讲解 2007-04-04 15:00 |
    好文章,看了很有收获,继续看下去  回复  
      
    # re: struts 2.0的action讲解[未登录] 2007-04-10 19:54 |
    请问一下:
    1、
    如果有多个action,那怎么知道这个message是哪个action里的?

    2、表达式的问题,有${表达式}、带有#的表达式(如上文中的#session.msg),还有%开始的表达式,这些好像都是取出里面的值,请问这些$、#、%开头的表达式有什么不同?各自在什么情况下使用?

    3、ioc方式不是要注入吗?那httpservletrequest request;httpservletresponse response这两个怎么注入实例呢?不用写关联配置吗?

    可以帮我解惑一下吗?谢谢!!  回复  
      
    # re: struts 2.0的action讲解 2007-04-12 23:49 |
    我是struts新手,struts 1.*也没怎么接触过,打算直接学struts 2.0,希望不会有太大困难,看了你的文章得到很大帮助,感谢你的辛勤工作,写出这么好的介绍文章,希望能看到更多关于介绍struts 2.0的文章,^_^  回复  
      
    # re: struts 2.0的action讲解 2007-04-13 09:42 | max
    @yang
    1、你的“多个action”是什么意思?

    2、ognl中的${...}可以在定义action的result时,传递变量,如/deletebook.action?isbn=${isbn}。也可以在国际化时引用变量;
    #用于在页面上引用actioncontext的值,也可以构造映射(map)等,如#request.xxx;
    %{...}在标签属性中引用变量,如

    3、ioc也有人叫di(依赖注入),httpservletrequest request和httpservletresponse response可以通过拦截器注入,详情请参考《struts 2的基石——拦截器(interceptor)》。  回复  
      
    # re: struts 2.0的action讲解 2007-04-13 17:12 |
    终于找到价值的struts2的资料了,谢谢楼主,呵呵,希望能够给出更多的关于这个主题的内容,谢谢,呵呵!!  回复  
      
    # re: struts 2.0的action讲解 2007-04-16 14:10 |
    楼主你好,目前正在struts2的学习中,遇到了一个问题,希望有时间指导一下。
    我在action中把值set到变量里了(比如,user.setpassword("dddd")),但是在页面为获得我想要的值
    不明白为什么?请高手指点!  回复  
      
    # re: struts 2.0的action讲解 2007-04-16 22:40 | max
    @hermit
    我不是很明白你什么问题,能否详细一点?  回复  
      
    # re: struts 2.0的action讲解 2007-04-17 09:40 |
    max ,我昨天问的问题已经解决了,晚上自习看了一下,是我的属性名没有对应上,其实我是做一个修改页面,获得数据库信息传到页面上,页面form对应的就是user中的属性,由于我的password属性,和user类中不同名,所以信息没有传到页面。但是以前1.x的版本这种情况就会报错了,2.0没有报错所以没有发现。呵呵,谢谢楼主关注,也非常感谢你提供了这么多structs2的相关介绍,帮助很大。继续关注你的blog,希望还可以看到更多更好的文章。  回复  
      
    # re: struts 2.0的action讲解 2007-04-23 10:27 |
    我想得到cookies怎么办  回复  
      
    # re: struts 2.0的action讲解 2007-04-24 14:18 |
    请问, web.xml设置时,如何添加filter, 对encoding进行制定。。

    是否跟以前一样? 自己做一个filter, 然后读取web.xml的设置?  回复  
      
    # re: struts 2.0的action讲解 2007-04-25 09:23 | max
    @javachicken
    先在action中拿到httpservletrequest的对象(请参考《struts 2.0的action讲解》),然后调用request.getcookies()。  回复  
      
    # re: struts 2.0的action讲解 2007-04-25 09:25 | max
    @ddd
    我认为不必如此麻烦,关键找出乱码的原因。  回复  
      
    # re: struts 2.0的action讲解 2007-04-25 11:13 |
    请问:我在那个iocservlet里面没有看到session.setattribute("msg","hello world from session!");,是怎么把msg放到session里面的?
    这个map att是起什么作用?  回复  
      
    # re: struts 2.0的action讲解 2007-04-25 13:30 |
    @max
    乱码出现的地方:

    在页面上输入的时候, 还不乱码,进入action(java类)后, 就乱了。。

    通过debug看。。。  回复  
      
    # re: struts 2.0的action讲解 2007-04-25 13:46 |
    @do

    因为它作为setter setsession的变量, 是会被自动运行的。。

    setter是ioc(di)的必须

      回复  
      
    # re: struts 2.0的action讲解 2007-04-28 14:57 |
    在struts.xml中,两个package中的action如何通信?



    mser




    hello.jsp



    login.action在user包中,mser.action在muser包中,像以上的调用,会不会出错呢?login.action可以连接到mser.action?请高手指教  回复  
      
    # re: struts 2.0的action讲解 2007-04-28 15:10 |
    请教楼主:

    实现方法二,使用!aliasaction.action地址来访问helloworld action

    这个办法我不行嘛,我用的是get方式提交。  回复  
      
    # re: struts 2.0的action讲解 2007-05-10 17:05 |
    struts2怎样控制action实例在session还是在request里面。struts1是在struts-config里面配置action时,指定scope。struts2怎样控制?  回复  
      
    # re: struts 2.0的action讲解 2007-05-11 09:26 | max
    @jiajia
    你的“action实例”是指什么?我的理解是:在struts 1.x中action是singleton的,在struts-config配置是form bean的scope。

    在struts 2 中可以使用setattribute的方法控制对象的scope。
      回复  
      
    # re: struts 2.0的action讲解 2007-05-11 10:20 |
    @max
    你的理解是对的,一般要往request或session里面放东西是会用到setattribute方法,如果要action实例在session里面,用你说的setattribute方法怎么控制对象的scope,能给个例子吗?  回复  
      
    # re: struts 2.0的action讲解 2007-05-18 08:54 |
    好呀,今后跟您混了.

    太详细了.好......................  回复  
      
    # re: struts 2.0的action讲解 2007-05-23 22:28 |
    请问楼主,我的问题与jiajia类似
    在struts2中,我可以不调用request.setattribute(xx,xxx)
    比如说
    publicclass loginx extends actionsupport {
    private string message;

    public string getmessage() {
    return message;
    }

    public string execute() {
    message ="welcome, " user.getname();
    return success;
    }
    }
    页面就可以直接获取${message},请问这默认是request级别的吗?
    如果是session级别的,是不是要在取得session后
    在代码中明确写入,session.setattribute(xx.xxxx)


      回复  
      
    # re: struts 2.0的action讲解 2007-05-24 10:26 | max
    @想飞就飞
    这些值是放在actioncontext中的,所以不是request或session等。  回复  
      
    # re: struts 2.0的action讲解 2007-05-25 03:33 |
    我是javaee的初学者,刚刚接触struts,在上面的login的例子中,struts2 的功能是不是取代了jsp servlet javabean jdbc中前两个的功能,使jsp servlet这两种东西开发和维护起来更方便,并且把对jsp和servlet的配置从以前的web.xml中分离出来,转换成了action放在struts.xml中,至于从数据库中获得数据还得用以前的 preparedstatement 结合javabean的方法来实现!


    我这种理解对吗!
    在线等回复!!  回复  
      
    # re: struts 2.0的action讲解 2007-05-25 09:52 | max
    @xiaohong
    1、在jsp中,无论是jsp或struts或者其它框架,其最终起作用的都是servlet;
    2、访问数据库是需要通过jdbc,但是由于直接使用jdbc过于繁锁,所以现在有很orm框架帮助开发者访问数据库,如ibatis、hibernate、jdo和toplink等。  回复  
      
    # re: struts 2.0的action讲解 2007-05-31 17:46 |
    按照您的提点我写了一个test

    在实现执行非默认 action的时候出错了,希望能指点下!
    表单页面


    user:


    pass:





    struts.xml





    /${template}





    这个是您说的第二种方法,结果报错说 找不到action
    第一种方法执行通过
    帮忙解决下 谢谢了,不胜感激  回复  
      
    # re: struts 2.0的action讲解 2007-06-04 23:35 | max
    @wangchb
    检查一下你form实际提交路径是否为!myfunction.action。  回复  
      
    # re: struts 2.0的action讲解[未登录] 2007-06-05 16:26 |
    初学者,感谢你的无私奉献!  回复  
      
    # re: struts 2.0的action讲解 2007-06-21 16:04 |
    struts1.2时有一个forward的action,解决的是不用编写action类达到跳转页面的目的,那么struts2应该怎么做呢?  回复  
      
    # re: struts 2.0的action讲解[未登录] 2007-06-29 11:40 |
    如何实现 struts2 velocity 1.5 的配置?  回复  
      
    # re: struts 2.0的action讲解[未登录] 2007-07-05 16:50 |
    2 wangchb:
    检查一下struts.xml里有没有

    把false改成true  回复  
      
    # re: struts 2.0的action讲解 2007-07-09 13:45 |
    怎么vmhelloworld用不起啊 ,咋会说找不到模板喃helloworld.vm。其他两个都用得起
    我完全按照楼主的说法做的啊,也下了4个相应的包,只
    不过有些版本比较高而已,郁闷。  回复  
      
    # re: struts 2.0的action讲解 2007-07-09 15:12 |
    我想楼主所说的那4个包有点问题,或者还不够,总之我又糊里糊涂地下了许多包,把它拷到web-inf/lib下,这次竟然通过了,有意思,哈哈。当然我弄不清楚哪些是必须的,哪些不是,郁闷。有时下多了不行,有时下少了也不行。哎郁闷死了。  回复  
      
    # re: struts 2.0的action讲解 2007-07-09 23:53 | max
    @yiwuyun
    sorry for that  回复  
      
    # re: struts 2.0的action讲解 2007-07-10 19:37 |
    实现方法二,使用!aliasaction.action地址来访问helloworld action。

    上面方法不行 max  回复  
      
    # re: struts 2.0的action讲解 2007-07-10 19:44 |
    这个可以
    在浏览器地址栏中键入

    下面这个不行
    使用!aliasaction.action地址来访问helloworld action  回复  
      
    # re: struts 2.0的action讲解 2007-07-20 09:48 |
    非常好的文章!受宜  回复  
      
    # re: struts 2.0的action讲解 2007-07-24 17:42 |
    实例 helloworld.vm少了commons-digester-1.8.jar包了
    但是我还是不知道.vm文件的好处,对这个并不了解。
    谢谢楼主的文章~~~~~~  回复  
      
    # re: struts 2.0的action讲解 2007-07-25 18:42 |
    "虽然,理论上struts 2.0的action无须实现任何接口或继承任何类型,但是,我们为了方便实现action,大多数情况下都会继承com.opensymphony.xwork2.actionsupport类,并重载(override)此类里的string execute()方法。"

    max兄,重载是overload,重写是override,两者的区别不用多说,接触java的朋友自然明白。

    我想这多半是max兄的笔误,但还是指出,以免一些朋友产生误会,毕竟您的struts2系列文章影响很大,好多人都是看着您的文章进入struts2的世界的,所以严格律己是必要的,这样才能更好的造福人群。  回复  
      
    # re: struts 2.0的action讲解[未登录] 2007-07-26 20:03 |
    发给我点struct2.0的学习资料吧,,谢谢啦,,
    pxcong007@126.com  回复  
      
    # re: struts 2.0的action讲解 2007-07-28 21:02 |
    @明人
    哈哈max兄没有笔误,你去看看java自动生成的源文件就知道了。它就是@override.  回复  
      
    # re: struts 2.0的action讲解[未登录] 2007-07-31 09:55 |
    例3中我导入以下几个包,但是不成功。
    avalon-logkit-2.2.1.jar
    commons-collections-3.2.jar
    velocity-1.5.jar
    velocity-tools-view-1.3.jar

    页面提示:
    type exception report

    message

    description the server encountered an internal error () that prevented it from fulfilling this request.

    exception

    javax.servlet.servletexception: filter execution threw an exception


    root cause

    java.lang.noclassdeffounderror: org/apache/commons/lang/stringutils
    org.apache.velocity.runtime.resource.resourcemanagerimpl.initialize(resourcemanagerimpl.java:165)
    org.apache.velocity.runtime.runtimeinstance.initializeresourcemanager(runtimeinstance.java:594)
    org.apache.velocity.runtime.runtimeinstance.init(runtimeinstance.java:241)
    org.apache.velocity.runtime.runtimeinstance.init(runtimeinstance.java:534)
    org.apache.velocity.app.velocityengine.init(velocityengine.java:144)
    org.apache.struts2.views.velocity.velocitymanager.newvelocityengine(velocitymanager.java:473)
    org.apache.struts2.views.velocity.velocitymanager.init(velocitymanager.java:243)
    org.apache.struts2.dispatcher.velocityresult.doexecute(velocityresult.java:130)
    org.apache.struts2.dispatcher.strutsresultsupport.execute(strutsresultsupport.java:178)
    com.opensymphony.xwork2.defaultactioninvocation.executeresult(defaultactioninvocation.java:348)
    com.opensymphony.xwork2.defaultactioninvocation.invoke(defaultactioninvocation.java:253)
    com.opensymphony.xwork2.interceptor.defaultworkflowinterceptor.dointercept(defaultworkflowinterceptor.java:221)
    com.opensymphony.xwork2.interceptor.methodfilterinterceptor.intercept(methodfilterinterceptor.java:86)
    com.opensymphony.xwork2.defaultactioninvocation$2.doprofiling(defaultactioninvocation.java:224)
    com.opensymphony.xwork2.defaultactioninvocation$2.doprofiling(defaultactioninvocation.java:223)
    。。。。
    请高手相告我错在哪了,谢谢  回复  
      
    # re: struts 2.0的action讲解 2007-07-31 23:36 | max
    @lf
    使用struts 2.0.8ga版本,至少需要以下包:
    commons-logging-1.1.jar
    freemarker-2.3.8.jar
    ognl-2.6.11.jar
    readme.txt
    struts2-core-2.0.8.jar
    xwork-2.0.3.jar  回复  
      
    # re: struts 2.0的action讲解[未登录] 2007-08-01 08:46 |
    @max
    你所说的包除了readme.txt外,我都有了,我的问题是实现例3时我所导入的包是否有错或者差了哪些包,具体问题提示已在前2楼的发言中说明了,请指教。
    另这个readme.txt是什么东东哦,能否一起告知,谢谢。  回复  
      
    # re: struts 2.0的action讲解 2007-08-01 17:02 |
    @lf
    你的问题我知道,还需要导入
    common-lang
    common-collection
    common-digester
    的jar包
    avalon-logkit-2.2.1.jar 好像找不到下载的,不过我也没有用到  回复  
      
    # re: struts 2.0的action讲解[未登录] 2007-08-03 11:44 |
    请问下,一个action执行后怎么返回到令一个action中

    /list.action


    list.jsp

    这样页面报错,说找不到list.action,我单独访问list.action是没有问题的.   回复  
      
    # re: struts 2.0的action讲解[未登录] 2007-08-03 21:32 |
    我写的



    为什么生成以后就是
    而不是期望的

    请问各位该怎么解决呢
    上面有人问过但是没人回答哦  回复  
      
    # re: struts 2.0的action讲解 2007-08-05 11:28 |
    @jht
    avalon-logkit-2.2.1.jar

    我也找不到这个包的下载地址  回复  
      
    # re: struts 2.0的action讲解 2007-08-05 11:30 |
    谁有avalon-logkit-2.2.1.jar 这个包,传一个吧,先谢谢了~~

    hncj_l.h.x@163.com

      回复  
      
    # re: struts 2.0的action讲解 2007-08-07 14:01 |
    请问max
    如何 避免 在未提交前就进行验证器验证  回复  
      
    # re: struts 2.0的action讲解 2007-08-17 11:36 |
    为什么我的velocity模板输出的例子,输出报错,上面所说的包都已经导入了
    错误内容如下,
    java.lang.noclassdeffounderror: org/apache/velocity/context/context
    java.lang.class.getdeclaredmethods0(native method)
    java.lang.class.privategetdeclaredmethods(class.java:2365)
    java.lang.class.getdeclaredmethods(class.java:1763)
    com.opensymphony.xwork2.inject.containerimpl.addinjectors(containerimpl.java:103)
    com.opensymphony.xwork2.inject.containerimpl$1.create(containerimpl.java:84)
    com.opensymphony.xwork2.inject.containerimpl$1.create(containerimpl.java:82)
    com.opensymphony.xwork2.inject.util.referencecache$callablecreate.call(referencecache.java:155)
    java.util.concurrent.futuretask$sync.innerrun(futuretask.java:269)
    java.util.concurrent.futuretask.run(futuretask.java:123)
    com.opensymphony.xwork2.inject.util.referencecache.internalcreate(referencecache.java:81)
    com.opensymphony.xwork2.inject.util.referencecache.get(referencecache.java:121)
    com.opensymphony.xwork2.inject.containerimpl.inject(containerimpl.java:452)
    com.opensymphony.xwork2.inject.containerimpl$6.call(containerimpl.java:492)
    com.opensymphony.xwork2.inject.containerimpl$6.call(containerimpl.java:491)
    是说org/apache/velocity/context/context这个类找不到,可导入的velocity-1.4.jar中明明有这个类。
    请max大哥指教  回复  
      
    # re: struts 2.0的action讲解 2007-08-30 11:15 |
    有谁可以提供
    commons-collections-3.2.jar
    velocity-1.4.jar
    velocity-tools-view-1.2.jar
    avalon-logkit-2.1.jar
    这几个包吗?  回复  
      
    # re: struts 2.0的action讲解[未登录] 2007-09-05 13:57 |
    请问怎么样在框架页面中实现国际化啊?  回复  
      
    # re: struts 2.0的action讲解 2007-09-08 19:10 |
    从页面中提交user的数据到action中 action 像你所示例的一样写:
    public class helloworld extends actionsupport {
    private string name;
    private user user;

    public user getuser()
    {
    return user;
    }
    public void setuser()
    {
    this.user = user;
    }

    public string getname() {
    return name;
    }

    public void setname(string name) {
    this.name = name;
    }

    public string execute() {
    name = "hello, " name "!";
    return success;
    }
    }

    但运行到action是报一个错,错误信息如下:
    2007-9-8 18:42:23 com.opensymphony.xwork2.util.instantiatingnullhandler nullpropertyvalue
    严重: could not create and/or set value back on to object
    ognl.nosuchpropertyexception: tutorial.helloworld.user [java.lang.illegalaccessexception: class ognl.ognlruntime can not access a member of class tutorial.helloworld with modifiers "private"]
    at ognl.ognlruntime.setfieldvalue(ognlruntime.java:1125)
    at ognl.objectpropertyaccessor.setpossibleproperty(objectpropertyaccessor.java:77)
    at ognl.objectpropertyaccessor.setproperty(objectpropertyaccessor.java:132)
    at com.opensymphony.xwork2.util.ognlvaluestack$objectaccessor.setproperty(ognlvaluestack.java:68)
    at ognl.ognlruntime.setproperty(ognlruntime.java:1629)

    我在action 中使用public修饰user对象就可以了!
    public user user;
    是不是必须使用public 修饰javabean 呢?而你的示例代码中却是使用private修饰的.
    后来我尝试初始化user, 代码修改为: private user user = new user();运行没问题.
    为什么private user user;却不行?为什么public user user; 和 private user user = new user();可以运行通过?

    max 大哥,请你解释一下,表单数据如何被封装为pojo的过程!?
    我的邮箱:yezichen2@163.com  回复  
      
    # re: struts 2.0的action讲解 2007-09-13 23:13 |
    真是很好  回复  
      
    # re: struts 2.0的action讲解 2007-10-03 00:14 |
    辛苦了,老兄!  回复  
      
    # re: struts 2.0的action讲解 2007-10-18 23:02 |
    楼主辛苦,正在学习中......  回复  
      
    # re: struts 2.0的action讲解 2007-10-23 13:11 |
    mark  回复  
      
    # re: struts 2.0的action讲解 2007-11-11 11:06 |
    楼主幸苦了,希望看到你更优秀的文章  回复  
      
    # re: struts 2.0的action讲解[未登录] 2007-11-22 22:52 |
    我想问一下,就是我想在
    velocity中使用struts2.0的标签
    那我该怎样来实现呢!
    如果有时间的话给点提示,谢谢~~!  回复  
      
    # re: struts 2.0的action讲解 2007-11-26 10:00 |
    你好。。。我的action无法传递两个参数
    比如我要传username,和password

    在另一页显示它们的值  回复  
      
    # re: struts 2.0的action讲解 2007-11-26 11:12 |
    终于解决了。。。原来get和set都要有和变量名相同的部份
    如private pwd;
    那么就要setpwd;和getpwd而不能setpppp
    真是太不可思议了
    以前没有弄过struts现在直接学struts2.0
    看了max兄的教程学了不少东西。。
    谢谢  回复  
      
    # re: struts 2.0的action讲解 2007-11-27 11:58 |
    avalon-logkit 1.1 说明以及jar包的下载地址:

    logkit is a logging api for java. it can be used directly or as a hidden implementation behind the logging abstractions in either jakarta's avalon-framework or commons-logging.

    this release adds more rotation strategies and output targets.

    avalon-phoenix 4.0

    after nearly a year since its first alpha release, phoenix is complete. you can view phoenix as one of a number of things:

    * a server for servers
    * a container for unrestricted components
    * a micro-kernel

    the idea is that other servers sit on top of phoenix. these could be ejb, mail (refer jakarta james), http, etc.

    phoenix has jmx capability via mx4j. phoenix is configurable via xml, allowing replacement of its components.

    applications for phoenix are distributed in server archives (sar files) apps are laced together using xml allowing replacement of components post development.

    background

    all avalon projects honor some central designs and patterns:

    * component orientated programming
    * inversion of control
    * separation of concerns
    * interface and implementation separation
    * minimalization of use of static.

    the avalon team are continuing development of logkit and phoenix as well as other containers for different deployment needs and scenarios. the avalon project also comprises several reusable jars for server side
    development as well as example applications for phoenix.

    links

    logkit - logkit/" target="_new">logkit/
    phoenix - phoenix/" target="_new">phoenix/

    avalon project -
    framework - framework/

    avalon's patterns (a good starting point) - framework/guide-patterns-in-avalon.html
    avalon-framework's lifecycle interfaces (another good starting point) - framework/reference-the-lifecycle.html

    - the avalon team.   回复  
      
    # re: struts 2.0的action讲解 2007-12-03 15:40 |
    我的那个ioc 和 非ioc 那个 ,效果是出来了.但控制台 打印 :
    --------------------------------------
    严重: parametersinterceptor - [setparameters]: unexpected exception caught setti
    ng 'msg' on 'class demo.action.iocservletnonaction: error setting expression 'ms
    g' with value '[ljava.lang.string;@57ae58'
    ----------------------------------------------
    不知道到 max 遇到这个问题没有.  回复  
      
    # re: struts 2.0的action讲解 2008-01-08 15:47 |
    最近正在学习struts2.0,今天看了楼主的struts2.0资料总结,帮助很大的!总结的挺细致!支持!  回复  
      
    # re: struts 2.0的action讲解 2008-01-11 14:34 |
    最近正在学习struts2.0,今天看了楼主的struts2.0资料总结,帮助很大的!总结的挺细致!我的第一个事例也做完了,谢谢! 支持!  回复  
      
    # re: struts 2.0的action讲解 2008-01-11 14:44 |
    avalon-logkit-2.1.jar
    backport-util-concurrent-3.0.jar
    commons-collections-3.2.jar
    commons-collections.jar
    commons-dbcp-1.1.jar
    commons-digester-1.8.jar
    commons-fileupload-1.1.1.jar
    commons-io-1.1.jar
    commons-lang-2.2.jar
    commons-logging-1.1.jar
    commons-pool-1.1.jar
    dwr.jar
    freemarker-2.3.8.jar
    ibatis-2.3.0.677.jar
    msbase.jar
    mssqlserver.jar
    msutil.jar
    ognl-2.6.11.jar
    retrotranslator-runtime-1.2.0.jar
    retrotranslator-transformer-1.2.0.jar
    spring.jar
    struts2-core-j4-2.0.6.jar
    struts2-spring-plugin-j4-2.0.6.jar
    velocity-1.5.jar
    velocity-tools-view-2.0-beta1.jar
    xwork-j4-2.0.1.jar
    这是我的一个项目 struts2 spring ibatis,和velocity以及要dwr的集合。
    我用了以上的包,基本目的能达到,但是有人说我用的包太多,想请高手指教。我是一个刚刚学struts2的新手,第一次作开发,现谢谢!  回复  
      
    # re: struts 2.0的action讲解 2008-01-18 17:34 |
    我想问一下 关于 struts2访问地址的问题

    他们访问地址都是 *.action 的形式结尾.
    我现在想把*.action 改成 *.html 不知道怎么处理.
    因为 struts1.*都是修改web文件就可以
    struts2好像不可以我试过 ....

    请您 -----帮我回复----- 一下 谢谢  回复  
      
    # re: struts 2.0的action讲解 2008-02-22 17:30 |
    感谢max!  回复  
      
    # re: struts 2.0的action讲解 2008-03-08 20:01 |
    it seems that there is no datepicker tag, just datetimepicker.  回复  
      
    # re: struts 2.0的action讲解 2008-04-01 10:34 |
    兄弟 你太好了 学习ing...  回复  
      
    # re: struts 2.0的action讲解 2008-04-11 10:01 |
    我想问下。。。我在action中把个bean存入session中。。。为什么取不出来???
    存的时候是
    private map session;
    session.put(名称,bean);
    取的时候是
    this.bean = (强制转换)session.get(名称);

    请问错在哪啊???  回复  
      
    # re: struts 2.0的action讲解 2008-05-08 17:04 |
    我的user怎么点不出来getpassword().....
    高手指点下 谢谢  回复  
      
    # re: struts 2.0的action讲解 2008-06-02 10:37 |
    楼主,读了你的很多篇struts2的介绍,感觉写得很容易看懂,昨天去书店看了本李刚写的介绍struts2的书,洋洋洒洒写了估计有1000多页吧,看得我云里雾里,现在的java方面的书啊,尤其是国内出版的,根本没自己的东西,网上copycopy,找国外的技术手册翻译翻译,作者可能几个月就能出本1000多页的书,劝大家买书时看仔细了,别浪费银子和时间。  回复  
      
    # re: struts 2.0的action讲解 2008-06-10 12:55 |
    楼主,你好,
      请教一下,为什么我用
    httpservletresponse response = servletactioncontext.getresponse();
    response.getwriter().println(str);

    不能输出一段javascript或string字符串到目标页去,我以前用struts1是可以的,但现用struts2,不行了,而且如果我加了上面的代码,展示的jsp页面也会出现乱码,把response相关代码去掉,jsp页面不会乱码的。
    请帮一下了,我的代码如下:

    package example;

    import javax.servlet.http.httpservletresponse;

    import org.apache.struts2.servletactioncontext;

    import com.opensymphony.xwork2.actionsupport;


    public class login extends actionsupport {


    public string execute() throws exception {
    string str = "";
    str = "";
    httpservletresponse response = servletactioncontext.getresponse();
    response.getwriter().println(str);
    return success;
    }


    } 


    jsp页面:
    <%@ page contenttype="text/html; charset=utf-8" %>
    <%@ taglib prefix="s" uri="/struts-tags" %>


    sign on




    中文用户名:
    密码:





      回复  
      
    # re: struts 2.0的action讲解 2008-06-10 14:54 |
    return success;
    改成
    return null;

    是可以了  回复  
      
    # re: struts 2.0的action讲解 2008-08-26 20:54 |
    落伍了啊,max兄06年就接处了struts2.0,而我到08年4月份才接处到.  回复  
      
    # re: struts 2.0的action讲解 2008-09-03 11:41 |
    我要那些用到的包啊  回复  
      
    # re: struts 2.0的action讲解 2008-09-03 11:54 |
    commons-digester-1.8.jar
    貌似还要这个包才行 否则vmlocity例子有问题  回复  
      
    # re: struts 2.0的action讲解[未登录] 2008-09-09 15:39 |
    multiple operations have reported errors.

    楼主知道这个错误是什么么?  回复  
      
    # re: struts 2.0的action讲解 2008-11-07 00:18 |
    真是一篇好文章,谢谢  回复  
      
    # re: struts 2.0的action讲解 2009-01-24 17:01 |
    不错,控制反转有点难……  回复  
      
    # re: struts 2.0的action讲解 2009-02-20 15:56 |
    你老板说的也是扯淡

    写的程序无非就是对数据库的增删改查  回复  
      
    # re: struts 2.0的action讲解 2009-02-24 16:17 |
    李刚就是你吧!《struts2权威指南》的作者。  回复  
      
    # re: struts 2.0的action讲解 2009-03-06 17:16 |
    问个问题:
    如何才能通过jsp页面用struts标签取得message?
      回复  
      
    # re: struts 2.0的action讲解 2009-03-06 17:30 |
    呵呵,自己回答吧,刚犯了一个小错误。



      回复  
      
    # re: struts 2.0的action讲解 2009-03-06 17:31 |
    @xuxu
    你也是扯蛋,你说的只是一部分;

    程序真的无非就是输入、处理、输出!

    程序最终也真的无非就是抽象……  回复  
      
    # re: struts 2.0的action讲解 2009-03-10 15:22 |
    fdsafdsa  回复  
      
    # re: struts 2.0的action讲解 2009-03-10 15:22 |
    @fdsa
    fdssafdsafsadfds  回复  
      
    # re: struts 2.0的action讲解 2009-03-26 19:39 |
    actioncontext.getcontext().getsession()获取并不是是httpsession而是一个hashmap对象实例
      回复  
      
    # re: struts 2.0的action讲解 2009-04-23 12:01 |
    自定义类  回复  
      
    # re: struts 2.0的action讲解 2009-09-09 22:47 |
    asdfasdf
      回复  
      
    # re: struts 2.0的action讲解 2009-09-09 22:49 |
    我想用struts2.0架构做一个东西,我有一个数据库,里面有好几个表,我要对表进行查询然后指定要删除的记录。现在的问题是,我查询后怎么写代码可以把记录都列出来,因为查询条件不同的话是不能预知记录条数的。。我的信箱tarbaobao@163.com。谢谢  回复  
      
    # re: struts 2.0的action讲解[未登录] 2009-12-11 12:17 |
    user是一个实体类,这样写实实现对象模型@jintian
      回复  
      
    # re: struts 2.0的action讲解 2010-11-10 23:29 |
    max的功底真的从代码都看出来了。第一次看到这么规范的代码。。。具有美感  回复  
      
    # re: struts 2.0的action讲解 2011-03-08 12:47 |
    @jintian
    user 类当然是自己创建的啊, 是把属性: name和password 封装到user类中去了, 封装这个思想你明白?  回复  
      
    # re: struts 2.0的action讲解 2011-05-11 14:20 |
    楼主,你好。我正在用struts2做毕设 关于action类遇到个很不解的地方希望你指导:
    在提交表单内容后,即是在action类中包含的bean中已经getter 和setter,服务器总会报错,提示“ognl.ognlexception: target is null for setproperty(null, "property", [ljava.lang.string:@2312]”,其中property为bean的一个属性值。并不是所有属性值都不能传递,仅有个别属性值会出现这样的情况。
    网上搜到一个解决方法是将action中的bean类设置为public,然后问题解决。但是不明白在同一个包中有的action类bean类为private会出现上述问题,而有的action类包含的bean类同为private却不会出现问题,很困惑,请博主指教。(注:action包中只含有action类,所有bean类统一放在另外的一个包中)
    qq 272253421 望指教  回复  
      
    评论共2页: 1   

    只有注册用户后才能发表评论。


    网站导航:
                  
     
    网站地图