Struts2 作为传统 WebWork 的继承者,融合 Struts1, 使得它成为高度成熟的框架。POJO 与 OGNL 两大特性也使得它成为简单易用的框架,成为现在初学者的入手框架。其中 Struts 的配置文件 struts.xml 是领悟 Struts2 的核心。本文首先介绍 Struts2 的基本配置以免初学者感觉突兀,第二部分的路径部分为主要要讲解的内容 ( 本人实践多次的经验 )。
一、如何学习Struts2框架
1、入手
官网下载
所有我们所要学习的目标,我们都要找到其最原始的地方,通常都有其自己的官网。Struts2 官网地址:http://struts.apache.org/, 下载 zip 包到本地,解压后目录如下
目录介绍
- apps为利用 Struts2 框架写的项目,后缀都是 war, 所以可以把他们放到 Tomcat 的 webapps 目录下直接运行。
- docs为 Struts2 框架的文档教程。
- lib为 Struts2 框架的所有用到的 jar 包,有很多,但是我们的项目用不到那么多的。只需要核心的几个。
- src为 Struts2 框架的源码。
2、使用 Struts2 框架
使用框架实际上就是利用他们提供的依赖,使用他们的接口。所以我们只需将所用的框架的依赖添加到自己项目里,然后配置使用。
手动添加 jar 包
对于 Struts2 的依赖包都在 lib 文件夹里,但是 lib 下有很多包,当然不是每一个都加入项目。我们可以打开 apps 目录下的 struts2-blank.war 文件,直接解压缩得到文件夹,打开 WEB-INF\lib
目录,下面的包就是核心的几个需要包:
把他们复制到自己的 web 项目 WEB-INF/lib
目录下面就可以用了。
Maven 管理 jar 包
用 Maven 管理则很简单,只需要在 dependencies 里加入
1 | <dependency> |
3、Struts2 配置
web.xml 里配置
1 |
|
在 web 配置里加入了全局 action 拦截器。
struts.xml 配置
下面为我学习记录的:
1 |
|
简单说明
1、DOCTYPE 是 xml 里的申明,使得本 xml 可以使用配置里的 dtd
2、
3、
4、
5、
6、
二、web访问路径(重点)
1. 路径配置说明
关于 web 路径配置的地方有三处:
- web.xml 里的
<welcome-file-list>
, 这个是所有 java web 都有的。 - web.xml 里的 struts 拦截器设置的
<filter-mapping>
匹配配置。 - struts.xml 里的常量
constant name="struts.action.extension
。
下面分别说明:
2. welcom-file-list
对于 web.xml 里的这个标签主要配置的是 web 项目的主页面。也就是当我们访问一个项目的根目录时所显示的界面。
举个例子:我们的项目名叫 hellotest, 我们配置 tomcat 时会有两种配置方法:
一种是将 tomcat 的 webapps 作为服务器根目录,这时我们的访问我们项目的根目录为http://localhost:8080/hellotest
,
另一种方法是将我们的项目就作为 tomcat 服务器根目录了,那我们访问我们项目的根目录为 http://localhost:8080
。通常我们用后一种tomcat 配置方法,因为这样可以与实际运行情况相符。那么不管哪一种配置方法,访问了我们项目的根目录,我们都没有指定访问哪个页面为什么还是会有界面显示呢?因为 tomcat 默认将项目的 index.html, index.htm, index.jsp 作为访问项目根目录而显示的界面。与在web.xml 里配置如下这种情况一样:
1 | <welcome-file-list> |
这个是写在 web.xml 里的,上面的代码与默认配置是一样的,也就是说不写上面的这些代码也会有效果的。那它有什么用呢?它通常做为用户想自定义自己项目根目录访问界面的,比如我的项目下有 index.jsp 和hello.jsp, 而我就是想让 hello.jsp 作为默认界面,那我们就这么配置:
1 | <welcome-file-list> |
当我们访问项目根目录,比如: http://localhost:8080
时,显示的界面将会是 hello.jsp 的界面,而不会是 index.jsp. 因为当我们配置了该标签,就覆盖了默认的设置了,其所隐含的真正路径是: http://localhost:8080/hello.jsp
3.web.xml 里 struts 拦截器设置
通常的配置:
1 | <filter-mapping> |
这里的意思是以 action 为后缀的访问路径和没有后缀的访问路径都会被 struts 的拦截器拦截,进入 action 里处理后再返回出视图,是的,没错,没有后缀的也会拦截的,struts 默认拦截的有两个的,一个是 action 后缀,一个就是没有后缀的。举个例子:
- 当访问url为
http://localhost:8080/add.action
这个为以action结尾的访问路径,将会进入继承actionsupport的类里处理,然后返回出视图。 - 还有这样
http://localhost:8080/index
这个是没有后缀的访问路径,也会进入struts的拦截器里。 - 而
http://localhost:8080/index.jsp
以及http://localhost:8080/hello.html
等都不会进入struts的拦截器的,直接由tomcat返回页面视图的。
我们举个更实际点的例子吧:
- 假设我们的项目根目录下有 index.jsp 和 hello.jsp,所有其他配置好后都默认,也就是说 Struts 拦截 action 后缀和无后缀的 url 路径。
- 在 struts.xml 里配置如下的包:
1 | <package name="default" extends="struts-default" namespace="/"> |
当我们
(1) 访问http://localhost:8080
返回index.jsp视图
(2) 访问 http://localhost:8080/index.jsp
返回index.jsp视图
(3) 访问 http://localhost:8080/hello.jsp
返回hello.jsp视图
(4) 访问 http://localhost:8080/index
返回hello.jsp
(5) 访问 http://localhost:8080/index.action
返回hello.jsp
(1)、(2)、(3)访问机制是一样的,是直接由tomcat直接返回视图;(4)和(5)的机制相同但是与前面的不同,(4)、(5)是被struts拦截后通过配置文件的配置后返回视图的。
4. struts.xml 里的常量配置
其配置示例:
1 | <constant name="struts.action.extension" value="action,do,"/> |
它的作用是让 struts 拦截哪些后缀结尾的 url 的。
当我们新建好项目时,struts.xml 里没有任何东西的,所以默认的拦截是 action和 没有后缀 的 url 路径。但是
若按如下配置:
1 | <constant name="struts.action.extension" value="action"/> |
那么它将只会拦截 action 结尾的 url 路径了。
当我们写下:
1 | <constant name="struts.action.extension" value=","/> |
那么它将只会拦截 没有后缀 的 url 路径了。
当我们写下:
1 | <constant name="struts.action.extension" value="action,do,"/> |
那么它将会拦截 action, do 结尾的 url 以及没有后缀 的 url 路径。
当写下:
1 | <constant name="struts.action.extension" value="action,do"/> |
那么它将只会拦截 action 和 do 结尾的 url 路径了,没有后缀的将不会拦截。
在 Struts 中如果我们没有配置拦截后缀,则默认是所有的 .action
后缀的访问 url 将被 Struts 框架拦截,然后通过 action 返回视图。而所有的 .jsp
和 .html
将直接通过 url 是可访问的。
三、实践理解路径控制—-设置主页
方法有三种:
什么都不用做,只要项目目录有 index.html 或者 index.htm 或者 index.jsp,那么这三中页面就会默认被配置为根目录下主页。
配置 web.xml 里的 welcome-file-list, 想让哪个界面作为主页都可以。配置后会覆盖默认 tomcat 的默认首页设置。
通过 struts.xml 里的配置来设置主页。
这里简单介绍下:
拦截:因为要用 struts 来配置,所以要使 url 进入 action, 也就是说要拦截 tomcat 默认设置的 .html, .htm, .jsp 后缀的访问 url, 所以要将控制后缀常量设置为:
1 | <constant name="struts.action.extension" value="action,html,htm,jsp,"/> |
这样我们就拦截了主页默认的 index.html 或者 index.jsp 后缀 index.htm.
配置:然后配置 package 如下:
1 | <package name="default" extends="struts-default" namespace="/"> |
这里的 default-action-ref
是包的默认 action,也就是说当拦截了的路径匹配到了包后没有匹配到action则此默认的action就作为视图返回的路径了。
访问思考:所以当我们访问 http://localhost:8080
时,经过tomcat的默认配置,隐含的实际访问路径为:http://localhost:8080/index.jsp
但是此时的 jsp 后缀 url 都会被 struts 拦截,所以就进 struts.xml 里的路径映射,因为只有一级路径所以映射到 default 包,而这个包里没有配置 index.jsp 名称,所以进入本包的默认 action, 则返回视图 /index.jsp。所以最后显示了主页 index.jsp。
四、总结
做一个web网站,最重要有三个:一是前端,二是后台,而第三个就是逻辑控制了;这个逻辑控制比较大,它包括了前后台的数据传输,用户与前端、后台的交互(如:资源访问)等。而最不好控制的就是暴露给用户的路径逻辑了,因为你不知道用户在浏览器里输入什么路径的,所以很多情况下我们都要在后台严格控制资源的访问权限,这些控制并不是可以通过写代码那么好实现的,通常要有一定的框架思维和全局观念,这也就是我们通常用框架的原因,解决逻辑控制,尤其是路径控制访问!
- 通常 web.xml 中的 welcome-list 无须设置,因为我们项目几乎都应该含有index的页面的。
- 如果我们设置了 jsp 后缀的也拦截的话,一定记住要对每个 jsp 界面都应该设置对应的 action。
- 通常我们会在 html 里引用其他的页面,比如超链接等,这时要写的链接大家一定要注意是不是被你拦截的页面,如果拦截则一定要按照
PackageName/ActionName
这样配置。