Struts2核心配置文件(package)

2019-12-31 14:46:22 浏览数 (1)

文章目录

  1. 1. struts核心配置文件详解
    1. 1.1. 包(package)
      1. 1.1.1. 属性
      2. 1.1.2. 范例
      3. 1.1.3. 引入另一个包中的action
      4. 1.1.4. 包含另外一个包(include)
    2. 1.2. 配置处理结果(result)
      1. 1.2.1. 类型
      2. 1.2.2. 局部结果
      3. 1.2.3. 配置全局结果

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名字
代码语言:javascript复制

<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>标签来定义这些返回值跳转的视图
代码语言:javascript复制
<action name="login" class="com.controller.LoginAction">
	<result name="success">/JSP/success.jsp</result>
	<result name="login">/JSP/login.jsp</result>
</action>

类型

  1. dispatcher
    • 表示采用的跳转方式为转发,这个和Servlet中的RequestDispathcher是一个原理,地址栏的url是不会改变的
    • dispatcher 结果类型是在Action与JSP页面之中的一种默认的跳转发方式,相当于之间的Servlet中的转发(RequestDispatcher)
  2. redirect
    • 用于跳转到其他的页面,但是这个地址栏的url是改变的
    • 这个结果类型主要用于重定向到指定的视图资源,这个和dispatcher比较相似,但是这个地址改变了。相当于Servlet中的sendirect()这个方法。
  3. 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>
  4. freemaker
    • 用于与FreeMaker整合的结果类型
  5. httpheader
    • 用于控制特殊的HTTP行为的结果类型
  6. redirectAction
    • 用于直接跳转到其他Action的结果类型
    • 上面说个redirect是用于重定向到指定的视图资源的,那么这个是用于重定向到指定的Action类的,这个和chain类型非常相似,不过一个是重定向,一个是转发,当然其中的request中的内容会丢失。
  7. stream
    • 用于浏览器返回一个InputStream的结果类型(一般用于下载)
  8. velocity
    • 用于与Velocity整合的结果类型
  9. xslt
    • 用于与XML/XSTL整合的结果类型
  10. plainText
    • 用于显示某个页面的原始代码的结果类型

局部结果

  • 配置局部结果就是在作为的子标签配置,就是上面的配置方式,但是这种局部配置只针对自己的父标签的action起作用。如下:
代码语言:javascript复制
<!-- 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即可。
代码语言:javascript复制
<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的标签下重新定义一个结果,此时的局部结果就会覆盖全局结果

0 人点赞