(2)简单体验---helloworld、namespace简单解读、Action简单解读

一、为什么用struct2
设计模式就是将简单的问题复杂化,这样设计的好处是扩展性。
struct2经过structfilter中转,才能确定是哪个页面(展现),这样就可以将请求结果(视图),这样就将请求和展现分离开,可以方便视图的改变(只需在struct2中配置应该去哪个页面即可)
struct2就是解决将请求和展现分隔开
二、配置
①引入jar包
下载struct2教程:http://jingyan.baidu.com/article/59a015e340f867f79488659e.html
这里写图片描述
②将web.xml中添加:
这部分可以在 E:\struts-2.1.8.1-all\struts-2.1.8.1\apps\struts2-blank-2.1.8.1\WEB-INF中找到,复制过来即可。

 <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

③配置structs.xml
在src根目录下

<struts>
    <constant name="struts.devMode" value="true" /><!-- 开启使用开发模式,详细错误提示,否则得重新部署,才能将修改改动-->
    <package name="default" namespace="/" extends="struts-default">
       <action name="second" class="com.model.HelloAction">
          <result >
             /Hello.jsp
          </result>
       </action>

    </package>

</struts>

④写控制器Action

public class HelloAction extends ActionSupport{
//每次执行Action都是新建的实例,构造函数都会执行
    public HelloAction(){
        System.out.println("构造函数执行。。。。。");
    }

    public String execute() throws Exception {


         return "success";
    }

}

Hello.jsp在WebRoot根目录下。
部署项目,然后在浏览器地址栏输入:http://localhost:8080/struct_helloworld01/second
执行过程:
因为web.xml中配置了strut的过滤器,所以会在struct.xml中找命名空间(namespace),然后找对应的action执行,然后去往相应的页面。
就本例而言:namespace是”/” 。 action 是second

三、对namespace解读
package: 在Java中,包是避免action重名,在struct2中一样,不能重名
比如前台可以有action name=”index” 在后台中也有action name=”index”,则可以将前台的action设置在front包下,后台的action设置在behind包下。

    1、namespace 必须以"/"开头 
    2、namespace 可以为空,当用户输入一个地址后,http://localhost:8080/struct_namespace/front/hello.action
    若front名称空间下没有这个hello.action ,【有则访问】则在namespace="" 下寻找是否有hello.action ,若此时还没有,则会报错。

structs:代表项目,package:代表业务模块,action:代表某个模块中的组件。

一个structs元素,可以包含多个package子元素。一个package包可以包含多个action子元素
structs:代表项目,package:代表业务模块,action:代表某个模块中的组件。
 由于一个项目包含多个包,若所有的package都放在一个包中,必然会导致大家争用这个配置文件,在实际开发中,一般将每个package放在一个单独的文件中,比如struct-xxx.xml
 最后由struct.xml来引入这些子文件即可     

四、对Action解读
对action来说,可以选择不同的类,class="com.model.HelloAction" 这个类也决定了它在哪个Action中执行。比如在BBS开发中有模块、帖子、回复实体,那么可以创建sortAction、topicAction、responseAction,和servlet中写控制器是一样的思想。一个业务模块对应一个package,对应一个class。
对于Action,在action中可以指定用这个类的哪个方法method="add" (当然也可以动态指定,以后再说)。
若不在action中指定,也不在jsp(目前的视图是jsp)中动态指定,则会默认执行excute方法。当然我们可以对excute方法进行重写,也可以指定通俗易懂的方法名,但是返回值必须是string类型。而且可以指定不同的返回值,比如登录,进行数据验证可以到登录错误界面,也可以进入用户的主页面。从这里也可以看出,一个method可以有多个返回值,返回值在struct.xml中的result标签接收,进行匹配。result的默认name为”success”,可以指定其他的名称。

 <result name="success">/mainFrame.jsp </result>
 <result name="error">/>/login.jsp </result>                    
public String add(){
        if(用户名、密码错误)
            return "error";
        return "success";
    }

    public String excute(){
        // TODO Auto-generated method stub
        return "success";
    }

上面提到method动态指定:就是在struct.xml中不指定,在jsp页面提交请求时才指定。用!

<action name="second" class="com.model.HelloAction">//这里先不指定用哪种方法
在jsp页面:
比如一个超链接:
<a href="front/hello!add"></a>
posted @ 2017-11-06 16:10  测试开发分享站  阅读(117)  评论(0编辑  收藏  举报