Struts2_6_ ActionWildcard_通配符配置

来源:互联网 发布:淘宝私人定制怎么进 编辑:程序博客网 时间:2024/06/04 00:39

6_ ActionWildcard_通配符配置

部署Struts2_0600_ActionWildcard  ,访问 http://localhost:8080/Struts2_0600_ActionWildcard/

 

我们来看下一个项目,首先要明白一个单词 WildCard 是什么意思,通配符,用通配符来做配置,我已经部署上了,访问的首页如下:

6_ <wbr>ActionWildcard_通配符配置

使用通配符我们可以将配置量降低到最低,我一点添加学生,大家看地址栏,如下图所示,

6_ <wbr>ActionWildcard_通配符配置

它是actions下面的Studentadd,所以一定有一个namespace叫做 actions,它下面有一个action叫Studentadd ,那我们到struts.xml配置文件里面看一下

6_ <wbr>ActionWildcard_通配符配置

大家看,里面没有对应的action叫Studentadd的,我们确实有一个namespace叫 actions的,不过了它没有对应的action的名字叫Studentadd的,这个名字没有,但是它有一个叫Student* 的action,大家知道这个 * 代表什么啊?*代表所有的,就是说在这个后面额什么都可以跟它匹配上,所以你叫Studentadd ,和其是匹配的,所以Struts 2 在找的时候,没有Studentadd,但是有一个Student* 可以与之相匹配,于是就找到了这个action了,找到之后,它要去看调用那个class,调用com.bjsxt.struts2.action.StudentAction  这个处理类,所以我们调用的是StudentAction.java这个Action ,如下图所示

6_ <wbr>ActionWildcard_通配符配置

这个Action中就两个方法,一个叫 add()一个叫delete()方法,返回值全是SUCCESS,不过调用的是它的那个方法了,后面的method=”{1}”这就是通配符, 这是 *号加通配符的写法,method等于大括号 1,大括号1就代表你前面如果你有8个*号,它就会给你排个顺序,大括号1代表第一个星号,

刚刚我们调用的是叫做Studentadd,结果到后台一匹配没有直接的能够匹配上的,它会找带 星 的可以匹配的,即 Student* ,而这个 * 就刚好匹配上了 add这三个字母了,而这个* ,又是第一个星,所以这个1 代表的就是 add ,

如果我点击的删除学生,那么那个 * 对应的就是delete,而那个 {1}代表的就是delete, 所以大家会发现这个* 和{1}的内容是根据我们往里面传的值 来往里面填就可以了,这就是通配符匹配,关键是下面,

<result>/Student{1}_success.jsp</result>

6_ <wbr>ActionWildcard_通配符配置

大家在这里就需要小心了,刚才我们说过,这个{1} 代表的是Student 后面加什么酒代表什么,我后面加的是 add,那么对应的JSP页面的名字是不是就应该是 Studentadd_success.jsp 这个页面啊?是的。当然如果你要是delete了,返回的就应该是Studentdelete_success.jsp页面,

而如果原来我们要配置的话,是不是要配置两个result啊,现在了一个result 配置,可以返回不同的结果页面,你很可能要配置多个action了,但是如果我们要是用了通配符,你会发现简单了,只要是 通配符匹配的,和我们 {1} 对应上的,到时后你就照猫画虎替换着去找就可以,

可能有的人会有疑问,这个不是矛盾吗?我直接Student 后面action,然后感叹号 add,感叹号delete,不是也可以搞定吗,如果是那样的话,那么这个result的值就不能够唯一的确定了,所以了用通配符匹配还是有它的好处的,你的配置会非常的简便,

那么JSP的命名规则是不是要一样的了?那是当然的,则个问题就是 “约定优于配置” 原则 ,这个原则的意思就是 我们一定要约定好,我们的Student  的方法都叫add ,都叫delete, 你不可以给我起别的名字 不能叫做 addStudent ,不能叫deleteStudent,你的delete必须要写全了,布恩那个写del 这个叫做开发的约定,你建立一个新的模块,你也要这么建,Useradd  Userdelete 写全了,这个就叫做开发约定,一个成熟的项目组, 你的项目经理这件事情 他一定会规定你的,项目的名字怎么去,项目里面 Action的名字怎么定,Action里面增删改查的方法怎么定,他一定会约定你的,所以这个叫做约定优于配置,如果你的约定能够约定的非常不错的话,你的配置就会做到相当的简洁。

大家可以看一下下面的这个配置,如下图所示:

6_ <wbr>ActionWildcard_通配符配置

它说action name等于 星下划线星(*_*),中间有个下划线就可以区分出来两个星号,所以下划线还是有好处的,class等于com.bjsxt.struts2.action.{1}Action , 那么问大家,根据这个配置的话,如果我们在这里访问 添加老师 这样的一个action

叫Teacher_add ,请告诉我拟访问的是那个类文件? *_* ,第一个星(*)叫大括号1  {1} ,后面我就不说大括号了,我就说第一个 星就叫 1,第二个星就叫 2,

我这么 http://localhost:8080/Struts2_0600_ActionWildcard/actions/Teacher_add 一访问,是不是就把 Teacher 匹配到第一个 * 了,把add 匹配到第二个* 了,所以这个 1 就变成了 Teacher ,所以这个地方你一定要小心的是 这个Teacher的第一个字母T 你一定要大写了。原因是后面是TeacherAction ,得找到 TeacherAction.java这个类,

如下图所示就是我们的TeacherAction.java这个类

6_ <wbr>ActionWildcard_通配符配置

然后它会调用那个方法了,我们来看配置,后面有method=”{2}”  ,就是说你访问过去的时候,它默认的会帮我调匹配第二个星号的 那部分内容,那么大家想想看,它默认的是 会不会帮我调 add?没错啊,它会帮我调 add ,如果没写,它也会调,这是Struts 2 智能的地方,但是为了精确起见,大家最好还是把method=”{2}” ,给配置上,

好我们再说一下,这就是最简化的配置了,

6_ <wbr>ActionWildcard_通配符配置

是说当你 在地址栏http://localhost:8080/Struts2_0600_ActionWildcard/actions/Teacher_add   Teacher_add ,这么来访问的时候,它会把Teacher对应到 struts.xml配置文件action的name=”*_*” ,中的第一个 *号 ,把add对应到 第二个 * 号,所以它会访问 1的action,即TeacherAction ,所以了他会调用2 的那个方法,即add()方法,而且它返回的结果是什么了?

是Teacher_add_success.jsp页面,应该是Teacher Add Success! 。这个没有问题吧。

如果我还需要添加新的内容了,这样的配置到底有什么好处了?好处就在于只要我们约定好了之后,你会发现我们的配置文件里面就

6_ <wbr>ActionWildcard_通配符配置

这么一句话,其他的没有了。而且我要添加新方法的时候,这个留给大家来完成。

如果我想添加一个delete()方法的话,我就可以在TeacherAction.java中添加

public String delete() {

return SUCCESS ;

}

那么同样的我只需要添加 Teacher_delete_success.jsp页面就可以了,配置文件我们还需要改吗?不需要,你访问的时候只要按照我们的约定,Teacher_delete ,来访问就可以了。而且最牛的是,我如果还想添加一个新的 类,比如我们再添加一个新的课程类,那你就直接写一个 CourseAction.java类,里面只要写add(),delete()等方法,按约定来就可以了,同样的反馈回来的页面也按照约定来,即 Course_add_success.jsp ,Course_delete_success.jsp ,配置文件还需要改吗?不需要。所以配置来配置区,你会发现Struts 2 怎么就这么简单啊?最后的结论就是 ,如果我们能够约定好的话,我们的配置文件就可以简化到如下图所示的一句话:

6_ <wbr>ActionWildcard_通配符配置

我的项目组你就可以去做了,剩下的事情就是我要检查你们的约定对不对就可以 了。合格就叫做约定优于配置,真正做项目开发一定是这样的,所以了有些乱七八糟的配置你要我忘了它,没有事的。

在这里了有个小问题就是这样的配置在寻找Action的时候了,它是如何来寻找的了?比如说有一个Action叫做 Student_add ,还有一个Action叫Student* ,还有一个Action叫 * _* ,如果你访问的时候,你用 Studentadd 来访问,你会发现这三个Action都能够匹配,我的意思是说 ,还有一个 action你的配置叫 ,Studentadd,即

<action name=”Student_add” ></action>

我们在前面说过,这个是能够匹配的,下面的 *_*可以匹配吗?可以。如下图所示:

6_ <wbr>ActionWildcard_通配符配置

那这个时候我们到底用哪个?它匹配出来到底是那个Action的返回结果了?

它首先匹配最精确的,如果大家没有把握自己试试就可以了。

 

那么如果有两个 * 号,三个*号,那匹配那个了?注意这个时候就是前后顺序了。这个时候就是前后顺序了,只要包括星号的,就表示是同一个等级,意思就是说 如果 Student*  和*_*都能够匹配,如下图所示

6_ <wbr>ActionWildcard_通配符配置

哪怕你把  *_*  这个action 配置到 Student* 上面,如下图所示:

6_ <wbr>ActionWildcard_通配符配置

 

结论就是那个action的配置在前面就调用那个。这个实验我也没有做过,只要大家确认知道这一点就可以了。建议大家有时间可以做一下,主要是为了熟悉熟悉操作,并不是熟悉这么一个规则,这个规则大家可以忘掉,主要是因为太正常了,你只要按照正常人的思维去想就可以了。

这就是 通配符的相关知识,使用通配符可以将配置量降到最低,如果大家遵循 约定优于配置的 原则,那么你的最后的配置 就可以做到 三行代码搞定了。当然了实际当中没有那么简单,因为有些模块需要单独的做一些配置,配置一些过滤器啊,配置一些拦截器啊,这个时候你就可以做一些精确的配置,然后用一种通用的配置匹配所有的就可以了。

来源: <http://blog.sina.com.cn/s/blog_5e3c5e230100fcd7.html>

 

0 0