处理HTTP请求

作为MVC框架,struts2的核心功能之一就是处理HTTP请求,解析请求参数,封装进Model里,传递给Action。struts2框架中,实际上是框架的拦截器自动将请求参数的值传入Action或相应的Model。

struts2的Action和数据结合有三种写法,下面以登录表单为例,一一进行介绍。

直接将Action作为Model

LoginAction.java

package com.gacfox.action;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport
{

    private String username;
    private String password;

    public String getUsername()
    {
        return username;
    }

    public void setUsername(String username)
    {
        this.username = username;
    }

    public String getPassword()
    {
        return password;
    }

    public void setPassword(String password)
    {
        this.password = password;
    }

    public String login()
    {
        if(this.username.equals("admin") && this.password.equals("123"))
        {
            return "success";
        }
        else
        {
            return "error";
        }
    }
}

login.jsp

<form action="${pageContext.request.contextPath}/login.action" method="post">
  用户名<input type="text" name="username" /><br />
  密码<input type="password" name="password" /><br />
  <input type="submit" value="注册" />
</form>

将Action直接作为Model,或者可以理解为框架将请求参数直接传入Action的属性中。实际开发中,我们都会定义实体类来封装数据,但是有时候我们需要单独读取某个HTTP请求参数,或是表单结构和实体类有区别,需要一个FormBean,此时可以把Action作为FormBean使用,省去再定义一个类的麻烦。

注意,表单的name字段(也就是请求参数的键)和Action的属性名相同。

Action和Model分离

LoginAction.java

package com.gacfox.action;

import com.gacfox.domain.User;
import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport
{
    private User user;

    public User getUser()
    {
        return user;
    }

    public void setUser(User user)
    {
        this.user = user;
    }

    public String login()
    {
        if(user.getUsername().equals("admin") && user.getPassword().equals("123"))
        {
            return "success";
        }
        else
        {
            return "error";
        }
    }
}

login.jsp

<form action="${pageContext.request.contextPath}/login.action" method="post">
  用户名<input type="text" name="user.username" /><br />
  密码<input type="password" name="user.password" /><br />
  <input type="submit" value="注册" />
</form>

这种写法将数据封装进了Model(User类),注意表单name属性的写法。这种情况下,框架通过name属性,得知应该传入参数的对象是Action的user属性。

模型驱动写法

package com.gacfox.action;

import com.gacfox.domain.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class LoginAction extends ActionSupport implements ModelDriven<User>
{
    private User user = new User();

    public User getUser()
    {
        return user;
    }

    public void setUser(User user)
    {
        this.user = user;
    }

    public String login()
    {
        if(user.getUsername().equals("admin") && user.getPassword().equals("123"))
        {
            return "success";
        }
        else
        {
            return "error";
        }
    }

    @Override
    public User getModel()
    {
        return user;
    }
}
<form action="${pageContext.request.contextPath}/login.action" method="post">
  用户名<input type="text" name="username" /><br />
  密码<input type="password" name="password" /><br />
  <input type="submit" value="注册" />
</form>

这种写法Action实现了ModelDriven接口,通过泛型传入了模型类,同时实现了一个getModel()方法,返回Model对象的实例。

静态参数注入和动态参数注入

上面例子代码中,我们通过提交表单发起带参数HTTP请求,struts2自动解析请求并封装数据,这个过程称为动态参数注入。除此之外,struts2还支持静态参数注入,简单地说就是通过配置文件把参数值传递给Action。下面是静态参数注入的例子。

struts.xml

<action name="test" class="com.gacfox.action.TestAction" method="printName">
  <param name="name">aaa</param>
</action>

TestAction.java

package com.gacfox.action;

public class TestAction
{
    private String name;

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public String printName()
    {
        System.out.println(this.name);
        return null;
    }
}

用浏览器访问http://localhost:8080/struts2_demo1/test.action,注意URL中没有包含参数,此时配置文件中的参数会赋予Action的name属性,程序输出aaa。但是,一旦HTTP请求的URL包含了参数,例如http://localhost:8080/struts2_demo1/test.action?name=bbb,动态参数注入就会覆盖掉静态参数注入,此时会输出bbb

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。