Struts2实现零配置

零配置并不是没有配置,而是通过约定大于配置的方式,大量通过约定来调度页面的跳转而使得配置大大减少。一、Convention Plugin介绍从2.1版本开始,用Convention-Plugin替换Codebehind-Plugin来实现Struts2的零配置包命名习惯来指定Action位置命名习惯制定结果(支持JSP,FreeMarker等)路径类名到URL的约定转换包名到命名空间(namespace)的约定转换遵循SEO规范的链接地址(即:使用my-action来替代MyAction)基于注解的Action名基于注解的拦截器(Interceptor)基于注解的命名空间(Namespace)基于注解的XWork包默认action以及默认的结果比如:/products 将会尝试寻找com.example.actions.Products 或 com.example.actions.products.Index进行处理)二、了解下convention-plugin的约定:1. 默认所有的结果页面都存储在WEB-INF/content下,你可以通过设置struts.convention.result.path这个属性的值来改变到其他路径。如: 则将路径配置到了WEB-INF/page 下。2. 默认包路径包含action,actions,struts,struts2的所有包都会被struts作为含有Action类的路径来搜索。你可以通过设置struts.convention.package.locators属性来修改这个配置。如: 则定义了在项目中,包路径包含web和action的将被视为Action存在的路径来进行搜索。3. 接着,Convention从前一步找到的package以及其子package中寻找 com.opensymphony.xwork2.Action 的实现以及以Action结尾的类:com.example.actions.MainActioncom.example.actions.products.Display (implements com.opensymphony.xwork2.Action)com.example.struts.company.details.ShowCompanyDetailsAction4.命名空间。从定义的.package.locators标示开始到包结束的部分,就是命名空间。举个例子:Com.ustb.web.user.userAction的命名空间是:”/user”。Com.ustb.web.user.detail.UserAction的命名空间是:”/user/detail”5. Convention通过如下规则确定URL的具体资源部分:去掉类名的Action部分。然后将将每个分部的首字母转为小写,用’-’分割,你可以设置struts.convention.action.name.separator 如 还是举个例子:UserAction->user UserDetailAction ->user-detail。结合上面的。对于com.ustb.web.user.detail.UserDetailAction,映射的url就是/WEB-INF/content/user/detail/user-detail.jsp6. struts支持.jsp .html .htm .vm格式的文件。下面是actiong和结果模版的映射关系:URLResultFile that could matchResult Type/hellosuccess/WEB-INF/content/hello.jspDispatcher/hellosuccess/WEB-INF/content/hello-success.htmDispatcher/hellosuccess/WEB-INF/content/hello.ftlFreeMarker/hello-worldinput/WEB-INF/content/hello-world-input.vmVelocity/test1/test2/helloerror/WEB-INF/content/test/test2/hello-error.htmlDispatcher 三、 Convention的Annotation(Action注释)1) 与Action相关的两个Annotation是@Action 和@Actions2) @Action中可指定一个value属性。类似于指定属性值3) @Action中还可以指定一个params属性,该属性是一个字符串数组,用于该Acion指定的参数名和参数值。params属性应遵守如下格式:{“name1”,”value1”,”name2”,”value2”}4) @Actions 也用于修饰Action类里的方法,用于将该方法映射到多个URL.@Actions用于组织多个@Action.因此它可将一个方法映射成多个逻辑Action。如:package com.fun.actions; import org.apache.struts2.convention.annotation.Action;import org.apache.struts2.convention.annotation.Actions; import com.fun.service.LoginService;import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport { private String str; @Actions({ @Action(value="login1",params={"str","这是已经注入的了!"}), @Action(value="login2") }) public String login(){ return "str"; } @Action(value="ggg") public String abc(){ return "abc"; } public String getStr() { return str; } public void setStr(String str) { this.str = str; } }我们可以通过/login1.action访问,而在访问时,str这个属性已经有值,为str=”这是已经注入的!” 返回的视图是login1-str.jsp当我们用/login2.action访问时,str的值为null。返回的视图为 login2-str.jsp而我们通过/ggg.action调用的是abc()方法,返回的视图为/ggg-abc.jsp 例子:package com.example.web; import com.opensymphony.xwork2.Action;import com.opensymphony.xwork2.ActionSupport; public class HelloAction extends ActionSupport {@Action("action1")public String method1() {return SUCCESS;} @Action("/user/action2")public String method2() {return SUCCESS;}}方法名默认调用路径默认映射路径method1/hello!method1.action ./WEB-INF/content/hello.jspmethod2/hello!method2.action./WEB-INF/content/hello.jsp通过@Action注释后方法名@Action注释后调用路径@Action注释 后映射路径method1/action1!method1.action./WEB-INF/content/action1.jspmethod1/user/action2!method2.action/WEB-INF/content/user/action2.jsppackage com.example.web; import com.opensymphony.xwork2.ActionSupport;import org.apache.struts2.convention.annotation.Action;import org.apache.struts2.convention.annotation.Actions; public class HelloAction extends ActionSupport {@Actions({@Action("/different/url"),@Action("/another/url")})public String method1() {return “error”;}我们可以通过:/different/url!method1.action 或 /another/url!method1.action 来调用method1 方法。对应的映射路径分别是/WEB-INF/content/different/url-error.jsp; /WEB-INF/content/another/url-error.jsppackage com.example.web; import com.opensymphony.xwork2.ActionSupport;import org.apache.struts2.convention.annotation.Action;import org.apache.struts2.convention.annotation.Actions; public class HelloAction extends ActionSupport {@Action("/another/url")public String method1() {return “error”;}我们调用method1方法可以通过两种方式:1 /hello!method1.action映射 url:/WEB-INF/content/hello-error.jsp 2 /another/url!method1.action 映射 url:/WEB-INF/content/another/url-error.jsp可见,两种方式均可对method1方法进行调用,唯一的区别就是,两种调用的映射是不一样的,所以,想跳转到不同的界面,这是一个非常好的选择。package com.example.web; import com.opensymphony.xwork2.ActionSupport;import org.apache.struts2.convention.annotation.Action;import org.apache.struts2.convention.annotation.Actions;@Namespace("/other")public class HelloWorld extends ActionSupport { public String method1() { return “error”; } @Action("url") public String method2() {return “error”; } @Action("/different/url") public String method3() {return “error”; }}通过 /other/hello-world!method1.action 访问method1 方法。通过 /other/url!method2.action 访问method2 方法通过 /different /url!method3.action 访问method3 方法 与@Action 注释不同的是,该注释覆盖了默认的namespace(这里是’/’),此时再用hello!method1.action 已经不能访问method1 了. 四、与Result配置相关的Annotation1)@ResultPath @Result 和Results2)@Results用于组织多个@Result因此它只需指定一个value属性值,该value属性值为多个@Result3)@Result相当于struts.xml文件中的元素的做哟欧诺个。使用@Result必须指定一个name属性,相当于另外,它还有几个可选的属性。 ☆ type 相当于指定返回视图资源的类型 ☆ location 相当于…..中间部分,用于指定实际视图位置 ☆ params:该属性相当于元素里多个子元素的作用,用于为该Result指定参数值。该属性应满足{“name1”,”value1”,”name2”,”value2”}格式4)@Result有以下两种用法1 Action级的Result映射:以@Actions组合多个@Action后修饰的Action类。这种Result映射对该Action里的所有方法都有效。2方法级Result映射:将多个@Result组成数组后作为@Action的results属性值。这种Result映射仅对被修饰的方法有效。5)@ResultPath则用于修饰包和Action类,用于改变被修饰Action所对应的物理视图资源的根路径。举例说:默认情况下,Convention都会到WEB-INF/content路径下找物理视图资源,一旦我们使用@ResultPath(“/abc”)修饰该Action,系统将回到abc目录下寻找物理视图资源。举例:在默认情况下,Convention都会到WEB-INF/content路径下需找物理视图资源,一旦我们使用@ResultPath(“/abc”)修饰该Action,系统会到abc目录下寻找物理视图资源。1 全局的(global)。 全局results可以被action类中所有的action分享,这种results在action类上使用注解进行声明。package com.example.actions; import com.opensymphony.xwork2.ActionSupport;import org.apache.struts2.convention.annotation.Action;import org.apache.struts2.convention.annotation.Actions;import org.apache.struts2.convention.annotation.Result;import org.apache.struts2.convention.annotation.Results; @Results({ @Result(name="failure", location="/WEB-INF/fail.jsp")})public class HelloWorld extends ActionSupport { public String method1() { return “failure”; } @Action("/different/url") public String method2() { return “failure”; } }当我们访问 /hello -world !method1.action 时,返回 /WEB-INF/fail.jsp 当我们访问 /hello -world !method2.action 时,返回 /WEB-INF/fail.jsp 当我们访问 /different/url!method2.action 时,返回 /WEB-INF/fail.jsp 2 本地的(local)。 本地results只能在action方法上进行声明。package com.example.actions; import com.opensymphony.xwork2.ActionSupport;import org.apache.struts2.convention.annotation.Action;import org.apache.struts2.convention.annotation.Actions;import org.apache.struts2.convention.annotation.Result;import org.apache.struts2.convention.annotation.Results; public class HelloWorld extends ActionSupport { @Action(value="/other/bar",results={@Result(name = "error", location = "www.baidu.com",type="redirect")}) public String method1() { return “error”; }}当我们调用 /hello -world !method1.action 时,返回 /WEB-INF/content/hello-error.jsp 当我们调用 /other/bar!method1.action 时,返回 www.baidu.com 五、与包和命名空间相关的Annotation: @Namespace:修饰Action类或其所在的包。该Annotation中指定一个value属性值,用于指定被修饰的Action所在的命名空间 @Namespaces:修饰Action类或其所在的包,用于组合多个@Namespace @ParentPackage: 用于指定被修饰的Action所在包的夫包。六、异常处理相关的Annotation @ExceptionMappings 用于组织多个@ExceptionMapping,因此它只需指定一个value属性值,该value属性值为多个@ExceptionMapping。 @ExceptionMapping 用于定义异常类和物理视图之间的对应关系,也相当于struts.xml文件里mapping../>元素的作用 使用时,必须注意以下两个属性: exception: 用于指定异常类 result : 用于指定逻辑视图@ExceptionMpping有如下两种用法 Action级的异常定义:以@ExceptionMappings组合多个@ExceptionMapping后修饰的Action类。这种异常定义对Action中的所有方法有效 方法级的异常定义:将多个@ExceptionMapping组成数组后作为@Action的exceptionMappings属性值,这种异常定义仅对被修饰的方法有效。 七、拦截器配置相关的Annotation 与拦截器配置的Annotation有@InterceptorRef、@InterceptorRefs和@DefaultInterceptorRef@InterceptorRefs用于组织多个@InterceptorRef,因此它只需要指定一个value属性值,该value属性值为多个@InterceptorRef@InterceptorRef用于为指定Action引用lanjieq或者是拦截器栈。也就相当于strut.xml中位于元素内部的子元素的作用。使用@InterceptorRefAnnotation时,必须制定一个value属性,用于指定所引用的拦截器或拦截器栈的名字。相当于子元素里name属性的作用。 八、Action链的约定如果希望一个Action处理结束后不是进入一个试图页面,而是进行另一个Action形成的Action链。通过Convention插件则只需遵守如下三个约定即可。1) 第一个Action返回的逻辑视图字符串没有对应的视图资源2) 第二个Action与第一个Action处在同一个包下3) 第二个Action影射的URL为:firstActionURL+resultCODE如,第一个Action为OneAction,里面有个方法返回为“two”,那么就得保证,WEB-INF/content/下没有one.jsp或one-two.jsp 对于第二个action 它的名字应该是OneTwoAction,而对应的url应该是:“one-two.action”注意:由于Convention插件根据Action和jsp页面来动态生成映射的,因此不管是Acion的改变,还是JSP页面的改变都需要Convention插件重新加载映射。那么只要我们为struts2应用配置如下两个常量就可以了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值