Struts.xml的配置文件的讲解

发表时间:2017-05-16 15:41:20 浏览量( 21 ) 留言数( 0 )

学习目标:

1、了解Struts.xml配置文件的意义

2、了解Struts.xml的通配符的使用


学习过程:

一、Strust2原理

一个请求在Struts2框架中的处理大概分为以下几个步骤

1 客户端初始化一个指向请求

2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助

3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action

4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy

5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类

6 ActionProxy创建一个ActionInvocation的实例。

7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper 

attcontent/70a8f989-2dd7-4135-a0d6-275bed5b9cf7.png

上面的几个步骤大家务必要好好理解,我们在后面的章节中会深入讲解每一个模块。

二、Struts2的配置文件的讲解

上一节中我们都是从示例项目中复制过来的,这里我们也可以自己建立一个Action,并在配置文件中配置这个Action的信息。

首先在example包中建立一个MyAction类。作为MVC三层框架的控制层他的主要任务就是两个,获得视图层的输入,和把数据传回给视图层,当然还有一个就是调用模型层,这步相对比较简单。我们先看看代码:

public class MyAction {
	private String message;//定义变量,并赋予get/set方法。

	//action的方法,返回一般就是字符串。
	public String hi() {
		//1、获得信息
		System.out.println("获得视图层的message信息:"+message);
		//2、修改信息
		message="新的信息";

		return "success";
	}

	//message的get/set方法
	public String getMessage() {
		return message;
	}
	public void setMessage(String message) {
		this.message = message;
	}

}


接下来在struts.xml配置文件配置这个Action

 <!-- 是否是开发模式  true  部署前真正运行前一定要改为false -->
    <constant name="struts.devMode" value="true" />

    <!-- 包  name 必须要唯一     namespace 访问路径  -->
    <package name="mypackage" namespace="/hello" extends="struts-default">
         <!-- name 访问路径   class 实现类  method 实现方法  不写默认执行execute方法  -->
        <action name="hi"  class="example.MyAction" method="hi">
            <!-- result name 对应程序返回的字符串值,如果不写默认就是sucess -->
            <result >/hello.jsp</result> 
            <result name="error">/index.jsp</result>   
        </action>      
    </package>

大家要注意看上面的注释说明。

回到index.jsp页面我们写一个超链接

<a href="hello/hi.action?message=abc">测试action</a>

在WebRoot目录下新建hello.jsp页面在body中添加一下代码

 Action 传回来的数据:${message }

现在可以在此部署和启动项目。在主页中点击超链接。后台应该输出:

获得视图层的message信息:abc

证明后台可以获得页面传过来的值,

同时hello.jsp页面也可以显示:

Action 传回来的数据:新的信息

说明页面也可以拿到action修改后的值。

说明我们的控制层是可以正常工作了。

三、通配符的使用

每一个方法都得对应一个action,有没有好一点的方法呢?可以有两种方法,一种是使用通配符的方式,另外一种可以使用注解,基本可以实现“零配置”,就是不需要配置了,注解的方式我们以后在讲,下面可以先简单讲讲通配符的方式。我个人觉得:实际开发使用注解的方式比较好,方便以后的维护;学习可以使用完整的XML的方式;通配符的方式了解一下即可。

要使用通配符,实现必须把命名规范一下,如何规范看个人需求了。比如我们新建一个GoodsAction类,代码如下:

public class GoodsAction extends ActionSupport{
	public String addgoods(){
		return SUCCESS;
	}
	
	public String listgoods(){
		
		return SUCCESS;
	}
	public String updategoods(){
		
		return SUCCESS;
	}
	public String delgoods(){
		return SUCCESS;
	}
}

其对应action配置文件是:

<package name="test" namespace="/" extends="struts-default">
		<action name="addgoods" class="com.action.GoodsAction" method="addgoods">
			<result>/goodsadd.jsp</result>
		</action>
		
		<action name="listgoods" class="com.action.GoodsAction" method="listgoods">
			<result>/goodslist.jsp</result>
		</action>
		
		<action name="updategoods" class="com.action.GoodsAction" method="updategoods">
			<result>/goodsupdate.jsp</result>
		</action>
		
		<action name="delgoods" class="com.action.GoodsAction" method="delgoods">
			<result>/goodsdel.jsp</result>
		</action>
		
</package>

基本上就是一个方法对应一个action。这样写确实很累人,但是大家有没有发现我们是有一个命名规范的:

<action name="(这个值是什么)goods" class="com.action.GoodsAction" method="(这个值就是什么)goods">
	<result>/goods(这个值就是什么).jsp</result>
</action>

所以我们action配置文件配置文件就可以这样写一句就可以了。

<package name="test"  namespace="/" extends="struts-default">
	<action name="*goods" class="com.action.GoodsAction" method="{1}goods">
		<result>/goods{1}.jsp</result>
	</action>
</package>

第一个星号就用{1}引用,第二个星号就用{2}引用,以此类推。