zoukankan      html  css  js  c++  java
  • [置顶] 通过实例学习Struts2 (1)

    前言

    一直用Struts1 , 现在新的项目要转向Struts2了, 先研究学习一下,做点技术储备。

    我一直认为计算机软件行业是一个实践性非常强的行业,书读了多少都不管用, 一定要卷起袖子,亲自动手,才能学到一门技术的精髓,才能谈得上精通。

    否则浮在表面,只懂概念,夸夸奇谈,一进入真正的项目就傻眼了。

    但是自己完全从零开始来学习一个技术还是太慢了,一定要找到一个切入点, 就像打仗一样,集中优势兵力,从一点突破,向纵深发展,迂回包抄,各个歼灭。

    这个切入点就是优秀的源代码, 看看大牛们是怎么做的,然后模仿学习,能极大的减少你学习的时间。

    现在市面上有很多讲Struts2的书籍,Struts2权威, 大全,指南, 鱼龙混杂, 我的观点是先不要急着读他们,先找一本小册子了解一下基本知识,然后找优秀的Struts2项目代码学习, 在学习思考,不仅仅要知道What, How, 要多问自己几个Why , 假想一下如果让你去设计,你会怎么做,然后和Struts 的设计思想对比, 这样才能真正的提高。

    至于那些“权威/大全/指南” , 我更多的会用来查找技术细节,作为参考书。


    基于这个思路, 先在网上搜索了一本InfoQ的书 <<深入浅出Struts2>> , 还凑合,很快就能翻完,建立了一个基本印象。

    至于优秀的Struts2项目代码,没有找到合适的,决定拿struts2 中自带的应用来研究学习,毕竟是官方出品,差不到哪儿去。

    哪位同学知道更好的使用Struts2的项目源码,请不吝赐教。


    建立环境

    废话说了这么多,赶紧开工

    先来准备环境:
    1. 从Struts2官网下载源码: http://struts.apache.org/release/2.1.x/, 写这篇文章的时候版本是struts-2.3.15.1, 注意下载那个Full Distribution, 会包含源码和例子
    2. 开发工具当然少不了, 从http://www.eclipse.org/downloads/ 下载一个 “Eclipse IDE for Java EE Developers,”   这个版本可以和Web Server和 Application Server集成
    3. 用Tomcat做Web服务器吧 : http://tomcat.apache.org/  ,我下载的版本是7.0.42


    把下载的struts2 解压开,里边有个struts-2.3.15.1/apps  目录, 其中就是我们要的所有项目例子

    这里的WAR包都是直接可以放到Tomcat中运行的,但是为了研究, 我们需要把它解开, 别告诉我你不知道怎么解压开WAR 文件啊 :-)

    从名称来看struts2-blank.war最简单, 解压开大概是这个样子


    启动Eclipse 启动,在Preferences -> Server -> Runtime Enviroment  中添加一个Apache Tomcat 7 的 Server runtime , 具体过程就不说了,相信各位同学都能轻松搞定


    建立一个Dynamic Web project ,名称就叫做struts2-blank 吧,然后重要的步骤来了:

    (1) 把上面图片中的所有文件都Copy到 新建项目的WebContent下, 如果Eclipse 提示是否覆盖文件的话,就选择“是”

    (2) 然后把WEB-INF/src/java 下的所有文件都copy 到 struts-blank项目的 src 目录下 ------ 这是真正的源代码

    (3) 删除WEB-INF/src 目录, 清空WEB-INF/classes 目录    ---- 这些目录没用了

    最好系统长这个样子:


    建立一个基于Tomcat7 的Server ,用来部署项目, 然后把struts2-blank 这个web 项目加到Server 中, 启动server , 就能看到tomcat server 在启动, 然后就是struts2 启动的log 了

    在浏览器中运行 http://localhost:8080/struts2-blank/   就能看到最最简单的界面了:

    看起来费了很大的劲, 实际上还是挺简单的, 之所以要建立一个Eclipse 环境,主要是为了看源代码方便。

    对于Struts2自带的其他例子, 各位同学如法炮制即可

    Struts2 blank project

    终于可以开始看源码了, 首先引起我注意的就是struts.xml , 是直接放在Eclipse 项目的src 目录下,这就意味着运行时Eclipse 会自动把它copy到WEB-INF/classes 目录下, 和编译过的java class文件放在一起, 而在struts1 中,配置文件叫做struts-config.xml , 是直接放在WEB-INF 目录下的, 这是一个很大的区别。

    打开这个文件瞧一瞧:

        <constant name="struts.devMode" value="true" />  <--- 肯定是指定开发模式

        <package name="default" namespace="/" extends="struts-default">

            <default-action-ref name="index" />  <--- 指定缺省的Action引用, 在下面定义
            <global-results>
                <result name="error">/error.jsp</result>  <--- Global result, Action的结果如果是error,就可以用这个result
            </global-results>

            <global-exception-mappings>
                <exception-mapping exception="java.lang.Exception" result="error"/>  <--- 这个功能不错, 把所有的代码异常都映射到error这个result
            </global-exception-mappings>

            <action name="index">  
                <result type="redirectAction">  <--- 调用另外一个Action  : "/example/HelloWorld" ,  namespace其实指的就是url
                    <param name="actionName">HelloWorld</param>
                    <param name="namespace">/example</param>
                </result>
            </action>
        </package>

        <include file="example.xml"/>  <--- 不错,可以include 别的文件,模块化更好,更容易支持团队开发


    顺藤摸瓜,再来看看example.xml
        <package name="example" namespace="/example" extends="default"> <---注意namespace是/example, 即这个package下面的所有action 调用都得这么写: 
                                                                        <---http://xxxx/structs-blank/example/xxxx
    
            <action name="HelloWorld" class="example.HelloWorld">   <--- 很明显, 这里的Action 实现类是HelloWorld, 可以猜测到,执行成功的话会调用
                                                                    <--- HelloWorld.jsp
                 <result>/example/HelloWorld.jsp</result>
            </action>
    
          ......
        </package>


    赶紧瞄一眼HelloWorld.java
    public class HelloWorld extends ExampleSupport {
        //毫无疑问,这个方法会被调用,设置一个消息的key (HelloWorld.message) 然后返回sucess, 
        //在package.properties中能看到Helloworld.message , 但是struts2到底是怎么调用它的呢?先别着急,
        //记下问题, 先看完整个流程再说
        public String execute() throws Exception {  
            setMessage(getText(MESSAGE));          
            return SUCCESS;                         
        }
    
        /**
         * Provide default valuie for Message property.
         */
        public static final String MESSAGE = "HelloWorld.message";
    
        /**
         * Field for Message property.
         */
        private String message;
    
        /**
         * Return Message property.
         *
         * @return Message property
         */
        public String getMessage() {
            return message;
        }
    
        /**
         * Set Message property.
         *
         * @param message Text to display on HelloWorld page.
         */
        public void setMessage(String message) {
            this.message = message;
        }
    }

    
    

    在HelloWorld.jsp中,有这么一句  <h2><s: property value=" message"/></h2>  , 可以猜测这里的message 应该和Action 中的getMessage()有关联, 要不然struts2如何拿到message 的值?


    这样,基本的流程就走完了, 我们看到了struts2的Action定义是在struts.xml 中(以及其他被include的xml 文件), Action 的execute方法会被调用, jsp中可以引用Action中设置的属性的值。

    今天就到此为止吧, 明天再仔细看一下其他的分支。







  • 相关阅读:
    Kafka官方文档V2.7
    提交pr记录
    用Go语言来运行简单的hello world
    Mybatis学习记录-最简单的mybatis工程
    Flink CDC 实践记录
    CarbonDataDDL翻译003
    CarbonData使用案例
    CarbonData快速开始001
    如何构建数据仓库分层
    使用mybatis-plus的自动生成器生成代码
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3331127.html
Copyright © 2011-2022 走看看