一)struts.xml与struts-config.xml文件的区别?
1)struts-config.xml文件是struts1的配置文件。2)struts.xml是struts2配置文件。
Struts1是由apache基金会jakarta项目组2004年开发完成的一个开源项目,也是第一个广泛流行的mvc框架,他可以很好的提高Web项目开发效率,主要使用了servlet和jsp技术来实现,把servlet、jsp、标签库等技术整合起来到整个框架中。之后其他mvc架构大行其道,而WebWork尤为优秀,在某些方面比struts1更为强大好用。而struts2则是将struts1和WebWork框架的集合体,是一个全新的mvc框架,核心是WebWork,struts1是外衣。
二)struts.xml文件解析
看一个简单的struts.xml配置文件
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >
<struts><!-- include节点是struts2中组件化的方式 可以将每个功能模块独立到一个xml配置文件中 然后用include节点引用 -->
<include file="struts-default.xml"></include>
<!-- package提供了将多个Action组织为一个模块的方式
package的名字必须是唯一的 package可以扩展 当一个package扩展自
另一个package时该package会在本身配置的基础上加入扩展的package
的配置 父package必须在子package前配置
name:package名称
extends:继承的父package名称
abstract:设置package的属性为抽象的 抽象的package不能定义action 值true:false
namespace:定义package命名空间 该命名空间影响到url的地址,例如此命名空间为/test那么访问是的地址为http://localhost:8080/struts2/test/XX.action
-->
<package name="com.kay.struts2" extends="struts-default" namespace="/test">
<interceptors>
<!-- 定义拦截器 -->
<interceptor name="timer" class="com.kay.timer"></interceptor>
<interceptor name="logger" class="com.kay.logger"></interceptor>
<!-- 定义拦截器栈 -->
<interceptor-stack name="mystack">
<interceptor-ref name="timer"></interceptor-ref>
<interceptor-ref name="logger"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 定义默认的拦截器 每个Action都会自动引用
如果Action中引用了其它的拦截器 默认的拦截器将无效 -->
<default-interceptor-ref name="mystack"></default-interceptor-ref>
<!-- 全局results配置 -->
<global-results>
<result name="input">/error.jsp</result>
</global-results>
<!-- Action配置 一个Action可以被多次映射(只要action配置中的name不同) -->
<action name="hello" class="com.kay.struts2.Action.LoginAction">
<!-- 引用拦截器 -->
<interceptor-ref name="timer"></interceptor-ref>
<!-- 节点配置 -->
<result name="success" type="dispatcher">/talk.jsp</result>
<!-- 参数设置 name:对应Action中的get/set方法 -->
<param name="url">http://www.sina.com</param>
</action></ package ></ struts >
三)为什么要使用struts2框架?
1.struts有什么功能?
1)Struts提供了一个过滤器调度程序,程序员不必再自行编写一个。
2)Struts使用了一个基于XML的配置文件来匹配URI和动作。因为XML文档是文本文件,所以对应用程序的许多改动都用不着重新编译有关代码即可生效。
3)对动作类进行实例化和提取用户输入去填充各有关动作属性的工作都由Struts负责。如果程序员没有指定一个动作类,Struts将对一个默认的动作类进行实例化。
4)Struts可以对用户输入提供一些基本的合法性验证,并在遇到不合法的输入时自动地把用户重定向到相关的输入表单。输入验证是一个可选环节,并且可以选择以编程方式或申明方式来实现。在此基础上,Struts还提供了许多种内建的输入验证程序。
5)Struts负责调用动作方法,而程序员可以通过配置文件轻而易举地改变某个动作的方法。
6)Struts负责检查各个动作的结果和执行该结果。最常见的结果类型是Dispatcher,其含义是把控制权转交给一个JSP页面。此外,Struts还支持其他一些结果类型供程序员做其他事情,比如生成一个PDF文件,重定向到一个外部资源,发送一条消息等等。
7)Struts还提供一些其他功能,比如用来显示数据的定制标签、数据转换、支持Ajax、支持国际化和本地化、可以通过插件对Struts进行扩展等等。
2.为什么要使用?
1.它是建立在MVC这种优秀开发模式上,主要是提供一个好的控制器和一套定制的标签库上,并且着力点主要在在C和V上,因此,它天生就有MVC所带来的一系列优点。如:结构层次分明,高可重用性,增加了程序的健壮性和可伸缩性,便于开发与设计分工,提供集中统一的权限控制、校验、国际化、日志等等;
2.其次,它是个开源项目得到了众多程序大师和高手持续而细心的呵护,并且经受了实战的检验,使其功能越来越强大,体系也日臻完善;
3.是它对其他技术和框架显示出很好的融合性。
四)11个常用标签配置介绍
1)<include> 2)<constant> 3)<package>
4)<action>与<result> 5)<exception-mapping><global-exception_mapping>
6)<default-class-ref> 7)<default-action-ref> 8)<default-interceptor>
9)<interceptors> `10)<interceptor-ref> 11)<global-result>
1、<include>
利用include标签,可以将一个struts.xml配置文件分割成多个配置文件,然后在struts.xml中使用<include>标签引入其他配置文件。
比如一个网上购物程序,可以把用户配置、商品配置、订单配置分别放在3个配置文件user.xml、goods.xml和order.xml中,然后在struts.xml中将这3个配置文件引入:
struts.xml:
1
2
3
4
5
6
7
8
9
10
|
<?
xml
version="1.0" encoding="UTF-8"?>
<!
DOCTYPE
struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
<
struts
>
<
include
file="user.xml"/>
<
include
file="goods.xml"/>
<
include
file="order.xml"/>
</
struts
>
|
user.xml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?
xml
version="1.0" encoding="UTF-8"?>
<!
DOCTYPE
struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
<
struts
>
<
package
name="wwfy" extends="struts-default">
<
action
name="login" class="wwfy.user.LoginAction">
<!--省略Action其他配置-->
</
action
>
<
action
name="logout" class="wwfy.user.LogoutAction">
<!--省略Action其他配置-->
</
action
>
</
package
>
</
struts
>
|
2、<constant>
struts.xml中通过<constant>标签可以进行配置所有在struts.properties文件中定义的属性:
1
2
3
4
5
6
7
8
9
10
11
12
|
<?
xml
version="1.0" encoding="UTF-8"?>
<!
DOCTYPE
struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
<
struts
>
<!--设置开发模式-->
<
constant
name="struts.devMode" value="true"/>
<!--设置编码形式为GB2312-->
<
constant
name="struts.i18n.encoding" value="GB2312"/>
<!--省略其他配置信息-->
</
struts
>
|
3、<package>
1、包属性介绍
在Struts2框架中是通过包来管理action、result、interceptor、interceptor-stack等配置信息的。包属性如下:
属性 | 是否必需 | 描述 |
name | 是 | 包名,作为其它包应用本包的标记 |
extends | 否 | 设置本包继承其它包 |
namespace | 否 | 设置包的命名空间 |
abstact | 否 | 设置为抽象包 |
2、extends属性的详解
- 当一个包通过配置extends属性继承了另一个包的时候,该包将会继承父包中所有的配置,包括action、result、interceptor等。
- 由于包信息的获取是按照配置文件的先后顺序进行的,所以父包必须在子包之前被定义。
- 通常我们配置struts.xml的时候,都继承一个名为“struts-default.xml”的包,这是struts2中内置的包。
3、namespace的详解
namespace主要是针对大型项目中Action的管理,更重要的是解决Action重名问题,因为不在同一个命名空间的Action可以使用相同的Action名的。
1)如果使用命名空间则URL将改变
比如我们有一下配置文件
1
2
3
4
5
|
<
package
name="wwfy" extends="struts-default">
<
action
name="login" class="wwfy.action.LoginAction">
<
result
>/success.jsp</
result
>
</
action
>
</
package
>
|
则此配置下的Action的URL为http://localhost:8080/login.action
假如为这个包指定了命名空间
1
2
3
4
5
|
<
package
name="wwfy" extends="struts-default" namespace="/user">
<
action
name="login" class="wwfy.action.LoginAction">
<
result
>/success.jsp</
result
>
</
action
>
</
package
>
|
则此配置下的Action的URL为http://localhost:8080/user/login.action
2)默认命名空间
Struts2中如果没有为某个包指定命名空间,该包使用默认的命名空间,默认的命名空间总是""。
3)指定根命名空间
当设置了命名空间为“/”,即指定了包的命名空间为根命名空间时,此时所有根路径下的Action请求都会去这个包中查找对应的资源信息。
假若前例中路径为http://localhost:8080/login.action则所有http://localhost:8080/*.action都会到设置为根命名空间的包中寻找资源。
4、<action>与<result>
1)<action>属性介绍
属性名称 | 是否必须 | 功能描述 |
name | 是 | 请求的Action名称 |
class | 否 | Action处理类对应具体路径 |
method | 否 | 指定Action中的方法名 |
converter | 否 | 指定Action使用的类型转换器 |
如果没有指定method则默认执行Action中的execute方法。
2)<result>属性介绍
属性名称 | 是否必须 | 功能描述 |
name | 否 | 对应Action返回逻辑视图名称,默认为success |
type | 否 | 返回结果类型,默认为dispatcher |
3)通配符的使用
随着result的增加,struts.xml文件也会随之变得越来越复杂。那么就可以使用通配符来简化配置:
例如下面这个案例:
Action为Test.java
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public
class
Test {
public
String test1(){
return
"result1"
;
}
public
String test2(){
return
"result2"
;
}
public
String test3(){
return
"result3"
;
}
}
|
struts.xml中配置为
1
2
3
4
5
|
<
package
name="wwfy" extends="struts-default">
<
action
name="test*" class="wwfy.action.test{1}">
<!--action中的test会转发到相应的页面或者结果元素上面-->
<
result
name="result{1}">/result{1}.jsp</
result
>
</
action
>
</
package
>
|
4)访问Action方法的另一种实现方式
在Struts2中如果要访问Action中的指定方法,还可以通过改变URL请求来实现,将原本的“Action名称.action”改为“Action名称!方法名称.action”在struts.xml中就不需要指定方法名了。
5、<exception-mapping>与<global-exception-mapping>
这两个标签都是用来配置发生异常时对应的视图信息的,只不过一个是Action范围的,一个是包范围的,当同一类型异常在两个范围都被配置时,Action范围的优先级要高于包范围的优先级.这两个标签包含的属性也是一样的:
属性名称 | 是否必须 | 功能描述 |
name | 否 | 用来表示该异常配置信息 |
result | 是 | 指定发生异常时显示的视图信息,这里要配置为逻辑视图 |
exception | 是 | 指定异常类型 |
两个标签的示例代码为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?
xml
version="1.0" encoding="UTF-8"?>
<!
DOCTYPE
struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
<
struts
>
<
package
name="default" extends="struts-default">
<
global-exception-mappings
>
<
exception-mapping
result="逻辑视图" exception="异常类型"/>
</
global-exception-mappings
>
<
action
name="Action名称">
<
exception-mapping
result="逻辑视图" exception="异常类型"/>
</
action
>
</
package
>
</
struts
>
|
6、<default-class-ref>
当我们在配置Action的时候,如果没有为某个Action指定具体的class值时,系统将自动引用<default-class-ref>标签中所指定的类。在Struts2框架中,系统默认的class为ActionSupport,该配置我们可以在xwork的核心包下的xwork-default.xml文件中找到。
有特殊需要时,可以手动指定默认的class
1
2
3
4
5
6
7
|
package
wwfy.action;
public
class
DefaultClassRef {
public
void
execute(){
System.out.println(
"默认class开始执行……"
);
}
}
|
在struts.xml中配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?
xml
version="1.0" encoding="UTF-8"?>
<!
DOCTYPE
struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
<
struts
>
<
package
name="wwfy" extends="struts-default">
<!-- 指定默认class为Test -->
<
default-class-ref
class="wwfy.action.DefaultClassRef"/>
<
action
name="test1">
<
result
>/index.jsp</
result
>
</
action
>
</
package
>
</
struts
>
|
7、<default-action-ref>
如果在请求一个没有定义过的Action资源时,系统就会抛出404错误。这种错误不可避免,但这样的页面并不友好。我们可以使用<default-action-ref>来指定一个默认的Action,如果系统没有找到指定的Action,就会指定来调用这个默认的Action。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?
xml
version="1.0" encoding="UTF-8"?>
<!
DOCTYPE
struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
<
struts
>
<
package
name="wwfy" extends="struts-default">
<
default-action-ref
name="acctionError"></
default-action-ref
>
<
action
name="acctionError">
<
result
>/jsp/actionError.jsp</
result
>
</
action
>
</
package
>
</
struts
>
|
8、<default-interceptor-ref>
该标签用来设置整个包范围内所有Action所要应用的默认拦截器信息。事实上我们的包继承了struts-default包以后,使用的是Struts的默认设置。我们可以在struts-default.xml中找到相关配置:
1
|
<
default-interceptor-ref
name="defaultStack"/>
|
在实际开发过程中,如果我们有特殊的需求是可以改变默认拦截器配置的。当一旦更改这个配置,“defaultStack”将不再被引用,需要手动最加。
9、<interceptors>
通过该标签可以向Struts2框架中注册拦截器或者拦截器栈,一般多用于自定义拦截器或拦截器栈的注册。该标签使用方法如下:
1
2
3
4
5
6
|
<
interceptors
>
<
interceptor
name="拦截器名" class="拦截器类"/>
<
interceptor-stack
name="拦截器栈名">
<
interceptor-ref
name="拦截器名">
</
interceptor-stack
>
</
interceptors
>
|
10、<interceptor-ref>
通过该标签可以为其所在的Action添加拦截器功能。当为某个Action单独添加拦截器功能后,<default-interceptor-ref>中所指定的拦截器将不再对这个Action起作用。
11、<global-results>
该标签用于设置包范围内的全局结果集。在多个Action返回相同逻辑视图的情况下,可以通过<global-results>标签统一配置这些物理视图所对应的逻辑视图。
1
2
3
4
5
6
7
8
9
10
11
12
|
<?
xml
version="1.0" encoding="UTF-8"?>
<!
DOCTYPE
struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
<
struts
>
<
package
name="wwfy" extends="struts-default">
<
global-results
>
<
result
name="test">/index.jsp</
result
>
</
global-results
>
</
package
>
</
struts
>
|