Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 353|回复: 0

[struts学习]学习Struts 2.0系列(3)

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-10 23:53:10 | 显示全部楼层 |阅读模式
    来自:http://www.blogjava.net/max/arcHive/2006/10/25/77157.HTML

        有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的配置

    在浏览器地址栏中键入http://localhost:8080/Struts2_Action/HelloWorld.action,可以看到如图1所示页面。
    图1 HelloWorld输出页面

    参考JavaDoc,可知ActionSupport类实现了接口:

    com.opensymphony.xwork2.Action
    com.opensymphony.xwork2.LoaleProvider
    com.opensymphony.xwork2.TextProvider
    com.opensymphony.xwork2.Validateable
    com.opensymphony.xwork2.ValidationAware
    com.uwyn.rife.continuations.ContinuableObject
    java.io.Searializable
    java.lang.Cloneable
    默认情况下,当请求HelloWorld.action发生时,Struts运行时(Runtime)根据struts.xml里的Action映射集(Mapping),实例化tutoiral.HelloWorld类,并调用其execute方法。当然,我们可以通过以下两种方法改变这种默认调用。这个功能(Feature)有点类似Struts 1.x中的LookupDispathAction。

    在classes/sturts.xml中新建Action,并指明其调用的方法;
    访问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.jsp
    </
    result
    >


    </
    action
    >
    例2 classes/struts.xml中AlaisHelloWorld Action的配置

    实现方法二,使用http://localhost:8080/Struts2_Action/HelloWorld!aliasAction.action地址来访问HelloWorld Action。 在浏览器地址栏中键入http://localhost:8080/Struts2_Action/AliasHelloWorld.actionhttp://localhost:8080/Struts2_Action/HelloWorld!aliasAction.action,可以看到如图2所示页面。
    图2 自定义Action调用方法页面 通过上面的两个例子,细心的朋友应该可能会发现classes/tutorial/HelloWorld.java中Action方法(execute和aliasAction)返回都是SUCCESS。这个属性变量我并没有定义,所以大家应该会猜到它在ActionSupport或其父类中定义。没错,SUCCESS在接口com.opensymphony.xwork2.Action中定义,另外同时定义的还有ERROR, INPUT, LOGIN, NONE。 此外,我在配置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.vm
    </
    result
    >


    </
    action
    >
    例3 classes/struts.xml中VMHelloWorld Action的配置

    新建HelloWorld.vm,内容如下所示:


    <
    html
    >

       
    <
    head
    >

         
    <
    title
    >
    Velocity
    </
    title
    >

         
    <
    meta
    http-equiv
    ="content-type"
      content
    ="text/html; charset=UTF-8"
    >

       
    </
    head
    >

       
    <
    body
    >

         
    <
    h2
    >
    Message rendered in Velocity: $message
    </
    h2
    >

       
    </
    body
    >


    </
    html
    >
    例3 HelloWorld.vm
    在浏览器地址栏中键入http://localhost:8080/Struts2_Action/VMHelloWorld.action,页面输出如下图3所示。
    图3 HelloWorld.vm的输出页面

      
       
       
       
        要运行例3需要在WEB-INF/lib中添加以下几个包:
          
          commons-collections-3.2.jar
          velocity-1.4.jar
          velocity-tools-view-1.2.jar
          avalon-logkit-2.1.jar
          
       
       
      
    前面,我花了不少的时间讨论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;


    public

    class
      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
    >
    Login
    </
    title
    >


    </
    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.jsp
    </
    result
    >


    </
    action
    >
    例4 classes/struts.xml中Login Action的配置

    运行Tomcat,在浏览器地址栏中键入http://localhost:8080/Struts2_Action/Login.jsp,出现如图4所示页面。


    图4 Login.jsp输出页面

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


    图5 Login成功页面

    在浏览器地址栏中键入http://localhost:8080/Struts2_Action/Login.jsp,分别在User name中输入“Scott”和“password”,点击“Submit”按钮,出现如图6所示页面。


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


    package
      tutorial;


    import
      com.opensymphony.xwork2.ActionSupport;


    public

    class
      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
    >
    Login
    </
    title
    >


    </
    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.jsp
    </
    result
    >


    </
    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方式。

      非IoC方式 要获得上述对象,关键Struts 2.0中com.opensymphony.xwork2.ActionContext类。我们可以通过它的静态方法getContext()获取当前Action的上下文对象。 另外,org.apache.struts2.ServletActionContext作为辅助类(Helper Class),可以帮助您快捷地获得这几个对象。  
       
       HttpServletRequest request = ServletActionContext.getRequest();
       HttpServletResponse response = ServletActionContext.getResponse();
       HttpSession session = request.getSession();
       如果你只是想访问session的属性(Attribute),你也可以通过ActionContext.getContext().getSession()获取或添加session范围(Scoped)的对象。
      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;


    public

    class
      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("<br>Response Buffer Size: ");
            sb.append(response.getBufferSize());
            sb.append("<br>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;


    public

    class
      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("<br>Response Buffer Size: ");
            sb.append(response.getBufferSize());
            sb.append("<br>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.jsp
    </
    result
    >


    </
    action
    >


    <
    action
    name
    ="IoCServlet"
      class
    ="tutorial.IoCServlet"
    >

         
    <
    result
    >
    /Servlet.jsp
    </
    result
    >


    </
    action
    >
    例6 classes/struts.xml中NonIocServlet和IoCServlet Action的配置 运行Tomcat,在浏览器地址栏中键入http://localhost:8080/Struts2_Action/NonIoCServlet.action?msg=Hello%20World!http://localhost:8080/Struts2_Action/IoCServlet.action?msg=Hello%20World!,出现如图7所示页面。

    图7 Servlet.jsp的输出页面



      
       
       
       
        在Servlet.jsp中,我用了两次property标志,第一次将escape设为false为了在JSP中输出<br>转行,第二次的value中的OGNL为“#session.msg”,它的作用与session.getAttribute("msg")等同。
    关于property或其它标志,可以参考我的上一篇文章《常用的Struts 2.0的标志(Tag)介绍 》。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-26 13:17 , Processed in 0.319506 second(s), 38 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表