文章目录
- 1. struts核心配置文件详解
- 1.1. 包(package)
- 1.1.1. 属性
- 1.1.2. 范例
- 1.1.3. 引入另一个包中的action
- 1.1.4. 包含另外一个包(include)
- 1.2. 配置处理结果(result)
- 1.2.1. 类型
- 1.2.2. 局部结果
- 1.2.3. 配置全局结果
- 1.1. 包(package)
struts核心配置文件详解
包(package)
- 在核心配置文件中需要配置
<package>
- 元素可以把逻辑上相关的一组Action、Result、Intercepter等元素封装起来,形成一个独立的模块,package可以继承其他的package,也可以作为父包被其他的package继承
属性
name
- 这是一个必填的属性,指定包的名字,便于其他的包引用,因为其他的包可以继承这个包
extends
: 该属性是一个选择属性,表示继承其他的包,但是我们一般都会继承struts-default- 如果我们学到了处理json数据的时候,我们将会继承处理json的包
namespace
:该属性是一个可选属性,指定该包的命名空间,默认的是“/”,以为一个配置文件中可能有相同名字的action,如果配置不同的namespace,那么就可以配置相同的action的名字- namespace配置的是包的命名空间,同一个命名空间里面不能有同名的Action,当然不同的命名空间里面是可以有同名的Action的。类似于Java的包的功能,namespace可以有效的防止action重名的冲突,因为配置了namespace后,在访问action的时候就需要添加namespace来作为action的前缀。如果不配置namespace,表示是默认的namespace,那么访问的时候不需要添加namespace前缀。
- 比如有一个项目为Web1,在struts.xml的
<package namespace = "/student">
,这个包的下面有一个<action name ="add">
,那么我们要访问这个action使用的url为:http://localhost:8080/Web1/student/add.action
abstract
:这是一个可选属性,表示这个包是否是抽象的,抽象包不能包含action定义
范例
代码语言:javascript复制<!—指定了继承自strtus-default这个类,namespace指定了命名空间,那么当其中的action访问的时候要必须使用如下:http://localhost:8080/web1/user/*--!>
<package name="Login" extends="struts-default" namespace="/user"></package>
引入另一个包中的action
- 需求: 前面我们都是跳转到指定的视图,但是我们也是可以跳转到指定的action,但是这个要跳转的action和当前的action不是一个包中的。
- 此时我们就需要在当前包中引入另外一个包中的action,那么我们可以如下设置
<param name="namespace">
中的值为另外一个包的namespace<param name="actionName">
中的值为需要跳转到的action名字
<package name="Login" extends="struts-default" namespace="/">
<action name="login" class="com.action.LoginAction">
<result name="success" type="chain">
<!-- namespace指定另外一个包中的namespace,actionName指定action的名字 -->
<param name="namespace">/user</param>
<param name="actionName">regist</param>
</result>
</action>
</package>
<package name="Regist" extends="struts-default" namespace="/user">
<action name="regist" class="com.action.RegistAction">
<result name="success">JSP/success.jsp</result>
</action>
</package>
包含另外一个包(include)
- 一个项目中的配置文件中可能需要定义很多个package和action,那么都写在一个xml文件中,不免有些混乱,因此需要使用include包含其他的配置文件,相当于jsp文件中的
<jsp:include>
,要注意的是配置文件都要放在项目的src目录下<include file=”user.xml”></include>
配置处理结果(result)
- 我们在包中定义的
<result name="" type="">value</result>
,这个是用来根据action方法返回的字符串,跳转到指定的视图或者其他的action。- name指定的是action方法返回的结果。
- type 指定的是跳转的类型,默认的是dispatcher,相当于Servlet中的RequestDispatcher,地址栏中的url不会改变
- 如果一个action方法中可能返回的值是多个,比如如果测试成功返回success,测试失败返回input,出现异常返回error,那么此时就需要用到多个
<result>
标签来定义这些返回值跳转的视图
<action name="login" class="com.controller.LoginAction">
<result name="success">/JSP/success.jsp</result>
<result name="login">/JSP/login.jsp</result>
</action>
类型
- dispatcher
- 表示采用的跳转方式为转发,这个和Servlet中的RequestDispathcher是一个原理,地址栏的url是不会改变的
- dispatcher 结果类型是在Action与JSP页面之中的一种默认的跳转发方式,相当于之间的Servlet中的转发(RequestDispatcher)
- redirect
- 用于跳转到其他的页面,但是这个地址栏的url是改变的
- 这个结果类型主要用于重定向到指定的视图资源,这个和dispatcher比较相似,但是这个地址改变了。相当于Servlet中的sendirect()这个方法。
- chain
- Action链式处理结果类型
- 很多时候,当一个Action处理完之后并不想转发到视图资源,而是想要跳转到指定的Action继续未完成的处理,这时就需要使用chain,使得两个Action成为链式处理。
- 范例如下: 其中中的value要写成指定的标签中的name值,如果不是一个包中的,还要引入另外一个包中的action,看上面的内容 <package name="Login" extends="struts-default" namespace="/"> <action name="regist" class="com.action.regist"> <result name="success" type="chain">login</result> </action> <action name="login" class="com.action.LoginAction"> <result name="success">/JSP/success.jsp</result> <result name="login">/JSP/login.jsp</result> </action> </package>
- freemaker
- 用于与FreeMaker整合的结果类型
- httpheader
- 用于控制特殊的HTTP行为的结果类型
- redirectAction
- 用于直接跳转到其他Action的结果类型
- 上面说个redirect是用于重定向到指定的视图资源的,那么这个是用于重定向到指定的Action类的,这个和chain类型非常相似,不过一个是重定向,一个是转发,当然其中的request中的内容会丢失。
- stream
- 用于浏览器返回一个InputStream的结果类型(一般用于下载)
- velocity
- 用于与Velocity整合的结果类型
- xslt
- 用于与XML/XSTL整合的结果类型
- plainText
- 用于显示某个页面的原始代码的结果类型
局部结果
- 配置局部结果就是在作为的子标签配置,就是上面的配置方式,但是这种局部配置只针对自己的父标签的action起作用。如下:
<!-- name指定了包的名称,extends指定继承的类,namespace指定url路径,这里使用/表示在根路径下就可以直接访问 -->
<package name="Login" extends="struts-default" namespace="/">
<action name="login" class="com.controller.LoginAction">
<result name="success">/JSP/success.jsp</result>
<result name="login">/JSP/login.jsp</result>
</action>
</package>
配置全局结果
- 当我们需要一个视图可能这个package中action都需要,如果一个action中定义一个这样的result难免有些多余,现在我们使用只需要在元素内定义一次即可,一旦有返回值满足即可调用这个视图。比如我们定义一个错误处理的界面,因为这个处理视图是一样的,只需要配置全局result即可。
<package name=”Login” extends=”struts-default” namespace=”/user”>
<global-results >
<!—只要执行action的类返回error就会跳转到error.jsp--!>
<result name=”error”>error.jsp</result>
</global-results>
<action name=”login”class=”com.action.LoginAction”>
<result name=”success”>success.jsp</result>
</action>
</package>
- 根据上面的配置,如果此时login这个action返回的字符串为error,那么此时的全局配置结果就起作用了,就会跳转到error.jsp页面
- 但是我们一个action处理错误的页面和特殊,虽然返回的是error,但是我就想跳转到其他的页面,那么可以在这个action的标签下重新定义一个结果,此时的局部结果就会覆盖全局结果