[置顶] 通过实例学习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 别的文件,模块化更好,更容易支持团队开发
<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中设置的属性的值。
今天就到此为止吧, 明天再仔细看一下其他的分支。
[置顶] 通过实例学习Struts2 (1)的更多相关文章
- 在UWP中页面滑动导航栏置顶
最近在研究掌上英雄联盟,主要是用来给自己看新闻,顺便copy个界面改一下段位装装逼,可是在我copy的时候发现这个东西 当你滑动到一定距离的时候导航栏会置顶不动,这个特性在微博和淘宝都有,我看了@ms ...
- WinFrom窗体始终置顶
调用WindowsAPI使窗体始终保持置顶效果,不被其他窗体遮盖: [DllImport("user32.dll", CharSet = CharSet.Auto)] privat ...
- winform窗体置顶
winform窗体置顶 金刚 winform 置顶 今天做了一个winform小工具.需要设置置顶功能. 网上找了下,发现百度真的很垃圾... 还是必应靠谱些. 找到一个可以链接. https://s ...
- 自定义置顶TOP按钮
简述一下,分为三个步骤: 1. 添加Html代码 2. 调整Css样式 3. 添加Jquery代码 具体代码如下: <style type="text/css"> #G ...
- ahk之路:利用ahk在window7下实现窗口置顶
操作系统:win7 64位 ahk版本:autohotkey_L1.1.24.03 今天安装了AutoHotkey_1.1.24.03.SciTE.PuloversMacroCreator,重新开始我 ...
- Qt中让Qwidget置顶的方法
一般来是说窗体置顶和取消只要 setWindowFlags(Qt::WindowStaysOnTopHint); setWindowFlags(Qt::Widget); 要 ...
- js之滚动置顶效果
0.js获取高度 ? 1 2 3 4 5 6 document.all // 只有ie认识 document.body.clientHeight // 文档的高,屏幕 ...
- Javascript笔记----实现Page页面右下角置顶按钮.
从用博客开始,发现博客园中很多博友的博客中在Page右下角都有个图标,不论屏幕怎么拉伸,都始终停留在右下角.点击后页面置顶.后面想想写一个Demo来实现这种效果吧. 一. 图标右下角固定. 1.SS ...
- JavaScript学习笔记-元素在滚动条滑动一定高度后自动置顶
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
随机推荐
- 构建混合云:配置Azure site to site VPN连接(1)
用户在构建自己云计算解决方案的时候,往往会选择私有云或者公有云来做部署,但在一些场景下,用户更加希望通过混合云的方案来满足自己的业务需求.Azure为混合云的部署提供多种不同的连接方案,最常见的是 ...
- 【python】bytearray和string之间转换,用在需要处理二进制文件和数据流上
最近在用python搞串口工具,串口的数据流基本读写都要靠bytearray,而我们从pyqt的串口得到的数据都是string格式,那么我们就必须考虑到如何对这两种数据进行转换了,才能正确的对数据收发 ...
- Java Script 中 ==(Equal) 和 === (Identity Equal) 的区别和比较算法逻辑
判断两个变量是否相等在任何编程语言中都是非常重要的功能. JavaScript 提供了 == 和 === 两种判断两个变量是否相等的运算符,但我们开始学习的时候 JavaScript 的时候,就被一遍 ...
- css 优先级
css优先级的四大原则: 原则一: 继承不如指定 如果某样式是继承来的永远不如具体指定的优先级高.例子1:CODE:<style type="text/css"> &l ...
- [Linux]shell编程基础/linux基础入门
声明执行程序 #!/bin/bash 用来告诉系统使用/bin/bash 程序来执行该脚本.譬如python 脚本,可以这样写: #!/usr/bin/python 赋值和引用 赋值公式: 变量名 ...
- Redis 实践笔记
本文来自:http://www.cnblogs.com/me-sa/archive/2012/03/13/redis-in-action.html 最近在项目中实践了一下Redis,过程中遇到并解决了 ...
- 怎样在xcode中使用storyboard
StoryBoard是iOS 5的新特征,目的是取代历史悠久的NIB/XIB,对于已经习惯了xib文件的孩子们来说,StoryBoard还不是那么熟悉.经过两天的研究,有了一些心得,在此分享. 一.怎 ...
- JVM系列文章(三):Class文件内容解析
作为一个程序猿,只知道怎么用是远远不够的.起码,你须要知道为什么能够这么用.即我们所谓底层的东西. 那究竟什么是底层呢?我认为这不能一概而论.以我如今的知识水平而言:对于Web开发人员,TCP/IP. ...
- C#核编之System.Console类
顾名思义,Console类封装了基于控制台的输入输出和错误流的操作,下面列举一些System.Console类常用的成员的,这些成员能为简单的命令行程序添加一些"情趣",例如改变背 ...
- sublime text 2 安装
下载 http://pan.baidu.com/s/1eRemu0y http://jingyan.baidu.com/album/ff4116259b057c12e48237b8.html?pici ...