传智播客 struts2 应用示例开发与namespace总结

来源:互联网 发布:wifi网络破解器 编辑:程序博客网 时间:2024/06/06 00:28

 

    创建struts2的应用,首先应如前面所示要搭建好环境。jar包的导入和web.xml配置这里不在写出来。现在就来看第一个应用的struts.xml这个配置文件:
      <struts>
            <package name="hello" namespace="/test" extends="struts-default">
                  <action name="sayHello" class="com.yxb.struts.HelloWorld" method="execute">
                        <result name="success">/WEB-INF/page/index.jsp</result>
                  </action>
            </package>
      </struts>
    如上所示,struts2中是采用<package>元素来管理Action的,包的作用和java中的类包是非常类似的,它主要用于管理一组业务功能相关的action。在实际应用中,我们应该把一组业务功能相关的Action放在同一个包下。配置包时必须指定name属性,该name属性值可以任意取名,但必须唯一,它不对应java的类包,如果其它包要继承该包,必须通过该属性进行引用。包的namespace属性用于定义该包的命名空间,命名空间作为访问该包下Action的路径的一部分,如访问上面例子的Action,访问路径为:/test/sayHello.action。 namespace属性可以不配置,如果不指定该属性,默认的命名空间为空字符串。配置namespace有什么好处呢?就名称空间而言可以有效防止名字重复,即请求路径一样,这样就会导致错误。第二个就是当有名称空间时,可以减少配置的书写量,因为相同路径的action请求可以放置在同一个名称空间下,这样就不用每次都写出名称空间值所代表的路径。除了上述两个属性,通常每个包都应该继承struts-default包, 因为Struts2很多核心的功能都是拦截器来实现。如:从请求中把请求参数封装到action、文件上传和数据验证等等都是通过拦截器实现的。 struts-default定义了这些拦截器和Result类型。因此,当包继承了struts-default才能使用struts2提供的核心功能。struts-default包是在struts2-core-2.x.x.jar文件中的struts-default.xml中定义。 struts-default.xml也是Struts2默认配置文件。 Struts2每次都会自动加载 struts-default.xml文件。细心点其实可以发现struts-default.xml的name为struts-default包有一个属性abstract="true",这表示该包为抽象包,抽象包中不能包含action,抽象包是专门用来被其它包来继承的。
    接下来就是<action>元素的配置,其中name属性为访问时路径的一部分,class为类的全限定名,最后就是一个method属性,表示应该被调用的方法。里面的<result>元素和struts1的forward元素一样,相当于视图的配置。接下来就是Action和JSP的代码片断:
      public class HelloWorld {
          private String message;
 
          public String getMessage() {
              return message;
          }

          public String execute(){
              message ="Hello World! 北京时间:";
              return "success";
          }
      }
JSP页面的<body>里面的内容:
      ${message}<%=new java.util.Date() %>
    写完以后,部署成功后,在浏览器中输入相应的URL(如.../test/sayHello.action)就会显示出消息和时间。其中execute方法要求必须是返回一个字符串,因为struts2根据这个返回的字符串来决定调用哪个视图。从编码过程来看,Action类是完全的POJO类,没有依赖任何类或者接口。
    在struts2中,Action的名称的搜索时遵循一定原则的,下面就是struts2在请求到来后,怎么去找到合适的action进行调用,总结如下(获得请求路径的URI,例如url是:http://server/struts2/path1/path2/path3/test.action):
      1.首先寻找namespace为/path1/path2/path3的package,如果不存在这个package则执行步骤2;如果存在这个package,则在这个package中寻找名字为test的action,当在该package下寻找不到action 时就会直接跑到默认namaspace的package里面去寻找action(默认的命名空间为空字符串""),如果在默认namaspace的package里面还寻找不到该action,页面提示找不到action。
      2.寻找namespace为/path1/path2的package,如果不存在这个package,则转至步骤3;如果存在这个package,则在这个package中寻找名字为test的action,当在该package中寻找不到action 时就会直接跑到默认namaspace的package里面去找名字为test的action ,在默认namaspace的package里面还寻找不到该action,页面提示找不到action。
      3.寻找namespace为/path1的package,如果不存在这个package则执行步骤4;如果存在这个package,则在这个package中寻找名字为test的action,当在该package中寻找不到action 时就会直接跑到默认namaspace的package里面去找名字为test的action ,在默认namaspace的package里面还寻找不到该action,页面提示找不到action。
      4.寻找namespace为/的package,如果存在这个package,则在这个package中寻找名字为test的action,当在package中寻找不到action或者不存在这个package时,都会去默认namaspace的package里面寻找action,如果还是找不到,页面提示找不到action。
    总的来说,就是相当于是最大匹配原则,如果一直没有匹配的,则一级一级往上找,直至根目录。如果在某处出现了匹配路径,则去那个名称空间下找action,这个时候如果找不到,就直接跳到默认package中去找了。如果仍然找不到,那就只能报错了。所以说,这个寻找过程是先匹配大的名称空间,有匹配了才去找相应的action,如果在匹配的名称空间没有需要的action,则直接跳到默认包中找,不会再次跳回去匹配名称空间了。

原创粉丝点击