17xie > Struts 2权威指南 > 2.4 实现控制器
背景:                 
[本书目录] [图书首页] [本书讨论区]  
链接地址:http://www.17xie.com/read-100645.html    注册17xie 一起来写书 实现您的出书梦想!

2.4  实现控制器

前面介绍MVC框架时,已经指出:MVC框架的核心就是控制器。当用户通过2.2节的页面提交用户请求时,该请求需要提交给Struts 2的控制器处理。Struts 2的控制器根据处理结果,决定将哪个页面呈现给客户端。

2.4.1  实现控制器类

Struts 2下的控制器不再像Struts 1下的控制器,需要继承一个Action父类,甚至可以无需实现任何接口,Struts 2的控制器就是一个普通的POJO。

实际上,Struts 2的Action就是一个包含execute方法的普通Java类,该类里包含的多个属性用于封装用户的请求参数。下面是处理用户请求的Action类的代码:

//Struts 2的Action类就是一个普通的Java类

public class LoginAction

{

                                 //下面是Action内用于封装用户请求参数的两个属性

                                  private String username;

                                  private String password;

                                  //username属性对应的getter方法

                                  public String getUsername()

                                 {

                                  return username;

                                  }

                                 //username属性对应的setter方法

                                  public void setUsername(String username)

                                  {

                                  this.username = username;

                                  }

                                  //password属性对应的getter方法

                                  public String getPassword()

                                 {

                                  return password;

                                  }

                                 //password属性对应的setter方法

                                  public void setPassword(String password)

                                 {

                                  this.password = password;

                                  }

                                 //处理用户请求的execute方法

                                 public String execute() throws Exception

                                 {

                                    //当用户请求参数的username等于scott,密码请求参数为tiger时,返回success

                                      字符串

                                    //否则返回error字符串

                                  if (getUsername().equals("scott")

                                        && getPassword().equals("tiger") )

                                    {

                                   return "success";

                                  }

                                    else

                                    {

                                   return "error";

                                  }

                                  }

}

上面的Action类是一个再普通不过的Java类,该类里定义了两个属性:username和password,并为这两个属性提供了对应的setter和getter方法。除此之外,该Action类里还包含了一个无参数的execute方法——这大概也是Action类与POJO唯一的差别。实际上,这个execute方法依然是一个很普通的方法,既没有与Servlet API耦合,也没有与Struts 2 API耦合。

 提示  表面上看起来,该Action的两个属性只提供了对应的setter和getter方法,很难理解请求参数在什么时候赋值给该Action的属性,事实上,因为Struts 2的拦截器机制,它们负责解析用户的请求参数,并将请求参数赋值给Action对应的属性。

2.4.2  配置Action

上面定义了Struts 2的Action,但该Action还未配置在Web应用中,还不能处理用户请求。为了让该Action能处理用户请求,还需要将该Action配置在struts.xml文件中。

前面已经介绍过了,struts.xml文件应该放在classes路径下,该文件主要放置Struts 2的Action定义。定义Struts 2 Action时,除了需要指定该Action的实现类外,还需要定义Action处理结果和资源之间的映射关系。下面是该应用的struts.xml文件的代码:

<?xml version="1.0" encoding="GBK"?>

<!-- 指定Struts 2配置文件的DTD信息 -->

<!DOCTYPE struts PUBLIC

        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

        "http://struts.apache.org/dtds/struts-2.0.dtd">

<!-- struts是Struts 2配置文件的根元素 -->

<struts>

                                 <!-- Struts 2的Action必须放在指定的包空间下定义 -->

                                 <package name="strutsqs" extends="struts-default">

                                    <!-- 定义login的Action,该Action的实现类为lee.Action类 -->

                                  <action name="Login" class="lee.LoginAction">

                                        <!-- 定义处理结果和资源之间映射关系。 -->

                                   <result name="error">/error.jsp</result>

                                   <result name="success">/welcome.jsp</result>       

                                  </action>

                                  </package>

</struts>

上面映射文件定义了name为login的Action,即:该Action将负责处理向login.action URL请求的客户端请求。该Action将调用自身的execute方法处理用户请求,如果execute方法返回success字符串,请求将被转发到/welcome.jsp页面;如果execute方法返回error字符串,则请求被转发到/error.jsp页面。

2.4.3  增加视图资源完成应用

经过上面步骤,这个最简单的Struts 2应用几乎可以运行了,但还需要为该Web应用增加两个JSP文件,两个JSP文件分别是error.jsp页面和welcome.jsp页面,将这两个JSP页面文件放在Web应用的根路径下(与WEB-INF在同一个文件夹下)。

这两个JSP页面文件是更简单的页面,它们只是包含了简单的提示信息。其中welcome.jsp页面的代码如下:

<%@ page language="java" contentType="text/html; charset=GBK"%>

    <head>

        <title>成功页面</title>

    </head>

   

        您已经登录!

   

上面的页面就是一个普通的HTML页面,登录失败后进入的error.jsp页面也与此完全类似。

在如图2.1所示页面的“用户名”输入框中输入scott,在“密码”输入框中输入tiger,页面将进入welcome.jsp页面,将看到如图2.2所示的页面。

文本框:  
图2.2  登录成功页面

对于上面的处理流程,可以简化为如下的流程:用户输入两个参数,即username和password,然后向login.action发送请求,该请求被FilterDispatcher转发给LoginAction处理,如果LoginAction处理用户请求返回success字符串,则返回给用户welcome.jsp页面;如果返回error字符串,则返回给用户error.jsp页面。

图2.3显示了上面应用的处理流程。

图2.3  HelloWorld应用的处理流程


字数:13176    最后更新:7个月以前 [04-22 10:55]happyskynet 修改
本页编辑者:happyskynet  
[前一页]:2.3 创建Struts 2的We…  [后一页]:2.5 改进控制器
[在本页中加入书签] [收藏本书] [推荐本书]
  17xie论坛 > 本书讨论区 > 本页评论   (共0条)
发表评论

用户名称 匿名发表
评论内容
验证码

关于我们 | 版权声明 | 免责声明 | 诚聘英才 | 联系我们 | 合作伙伴 | 友情链接 | 广告合作 | 提交意见
Copyright © 2007 17xie.com 互联网协同写书平台 京ICP备08002671号