struts2接数据的三种方式

Struts2作为WEB框架,必不可少的需要请求中取值。(我在这里说是从请求中取值对于一些读者可能有些晦涩,其实如果我说从页面取值可能就好理解一点了,但除了从已经存在的页面里面能够给后台传值,在地址栏里也可以传,甚至在java代码里也是可以的。)

这里就谈谈struts如何从请求中取值。

我介绍三种方式:

三种取值方式:
1,使用默认的action的传递方式。
2,自定义一个vo,在action中使用这个vo
3,使用ModelDriven的方式。

一、使用默认的action的传递方式

如果我们的请求里面带有两个参数userName和passWord的话,我们只需要在Action里有这两个私有属性就可以了。

请看我的Action:

Java代码 复制代码 收藏代码
  1. package study.getValue;
  2. import com.opensymphony.xwork2.Action;
  3. /**
  4. * 在Action中定义请求里面传过来的值,
  5. * 并且定义所有的Setter和Getter
  6. * 这样可以直接在功能方法里面直接使用这些值。
  7. * @author arne3166
  8. * @version [0100, 2010-9-30]
  9. */
  10. public class LoginAction
  11. {
  12. private String userName;//页面里面的userName
  13. private String passWord;//页面里面的passWord
  14. //必须的setter和getter方法
  15. public String getUserName();
  16. public void setUserName(String userName);
  17. public String getPassWord();
  18. public void setPassWord(String passWord);
  19. //业务逻辑
  20. public String execute()
  21. {
  22. if (null!= userName &&null != passWord
  23. && userName.equals("arne3166") && passWord.equals("111111"))
  24. {
  25. return Action.SUCCESS;
  26. }
  27. else
  28. {
  29. return Action.ERROR;
  30. }
  31. }
  32. }
package study.getValue;
import com.opensymphony.xwork2.Action;
/**
 * 在Action中定义请求里面传过来的值,
 * 并且定义所有的Setter和Getter
 * 这样可以直接在功能方法里面直接使用这些值。
 * @author  arne3166
 * @version  [0100, 2010-9-30]
 */
public class LoginAction
{
    private String userName;//页面里面的userName
    private String passWord;//页面里面的passWord
    //必须的setter和getter方法
    public String getUserName();
    public void setUserName(String userName);
    public String getPassWord();
    public void setPassWord(String passWord);    
    //业务逻辑   
    public String execute()
    {
        if (null!= userName && null != passWord
            && userName.equals("arne3166") && passWord.equals("111111"))
        {
            return Action.SUCCESS;
        }
        else
        {
            return Action.ERROR;
        }
    }
}

在struts .xml里面的配置

Xml代码 复制代码 收藏代码
  1. <action name="loginput">
  2. <result>/page/getValue/login_input.jsp</result>
  3. </action>
  4. <actionname="login"class="study.getValue.LoginAction">
  5. <resultname="success">/page/getValue/success.jsp</result>
  6. <resultname="error">/page/getValue/fail.jsp</result>
  7. </action>

看jsp是怎么写的:

Html代码 复制代码 收藏代码
  1. <form action="login.action"><!-- name="userName" 和 name="passWord"同Action里面的私有属性对上 -->
  2. 用户名:<inputname="userName"type="text"/>用户密码<inputname="passWord"type="password"/>
  3. <inputtype="submit"value="提交"/>
  4. </form>
<form action="login.action"><!-- name="userName" 和 name="passWord"同Action里面的私有属性对上 -->
用户名:<input name="userName" type="text"/>用户密码<input name="passWord" type="password"/>
<input type="submit" value="提交"/>
</form>

页面视图

访问路径
http://localhost:8080/struts0100/loginput.action



结果页面

Html代码 复制代码 收藏代码
  1. <!--成功页面 success.jsp-->
  2. <body>
  3. Welcome arne3166!
  4. </body>
  5. <!--失败页面 fail.jsp-->
  6. <body>
  7. You are not the right user!
  8. </body>
<!--成功页面 success.jsp-->
<body>
Welcome arne3166!
</body>

<!--失败页面 fail.jsp-->
<body>
You are not the right user!
</body>

效果:当在页面输入arne3166作为用户名并且密码是111111时

否则



二、自定义一个vo,在action中使用这个vo

区别于以上的方式,Struts2中允许将页面的值封装起来,放到一个ValueObject(VO)中。就比如上面的例子中的userName和passWord,完全可以放到一个User类中。这样做的好处是,避免如果Action中如果有好多这样的值的话,太多的setter和getter会使得Action看起来比较臃肿的毛病。

看看我们是怎么做的

首先定义User

Java代码 复制代码 收藏代码
  1. package study.getValue.vo;
  2. public class User
  3. {
  4. //页面中的值的封装
  5. private String userName;
  6. private String passWord;
  7. //所有的setter和getter
  8. public String getUserName();
  9. public void setUserName(String userName);
  10. public String getPassWord();
  11. public void setPassWord(String passWord);
  12. }
package study.getValue.vo;
public class User
{
    //页面中的值的封装
    private String userName;
    private String passWord;
    //所有的setter和getter
    public String getUserName();
    public void setUserName(String userName);
    public String getPassWord();
    public void setPassWord(String passWord);
}

再看Action被简化成了什么样子

Java代码 复制代码 收藏代码
  1. package study.getValue;
  2. import com.opensymphony.xwork2.Action;
  3. import study.getValue.vo.User;
  4. /**
  5. *
  6. * 在Action中定义请求里面传过来Vo,
  7. * 并且定义VO的Setter和Getter
  8. * 使用页面参数的时候像使用Vo的属性一样。
  9. * @author arne3166
  10. * @version [0100, 2010-9-30]
  11. */
  12. public class VoLoginAction
  13. {
  14. //将vo作为私有属性
  15. private User u;
  16. //setter和getter必不可少
  17. public User getU();
  18. public void setU(User u);
  19. public String execute()
  20. {
  21. String userName = u.getUserName();
  22. String passWord = u.getPassWord();
  23. if (null!= userName &&null != passWord
  24. && userName.equals("arne3166") && passWord.equals("111111"))
  25. {
  26. return Action.SUCCESS;
  27. }
  28. else
  29. {
  30. return Action.ERROR;
  31. }
  32. }
  33. }
package study.getValue;
import com.opensymphony.xwork2.Action;
import study.getValue.vo.User;
/**
 *
 * 在Action中定义请求里面传过来Vo,
 * 并且定义VO的Setter和Getter
 * 使用页面参数的时候像使用Vo的属性一样。
 * @author  arne3166
 * @version  [0100, 2010-9-30]
 */
public class VoLoginAction
{
    //将vo作为私有属性
    private User u;
    //setter和getter必不可少
   public User getU();
    public void setU(User u);
    public String execute()
    {
        String userName = u.getUserName();
        String passWord = u.getPassWord();
        if (null!= userName && null != passWord
            && userName.equals("arne3166") && passWord.equals("111111"))
        {
            return Action.SUCCESS;
        }
        else
        {
            return Action.ERROR;
        }
    }
}

这样做了,页面任然用原来的当然是不行的,注意到Action中的user对象的引用是u,那么,在页面里面userName也需要修改成u.userName,passWord也应当修改成u.passWord

Html代码 复制代码 收藏代码
  1. <!--login_input_vo.jsp name="u.passWord"和name="u.passWord"是对Action中User对象进行映射 -->
  2. <formaction="loginvo.action">
  3. 用户名:<inputname="u.userName"type="text"/>用户密码<inputname="u.passWord"type="password"/>
  4. <inputtype="submit"value="提交"/>
  5. </form>
<!--login_input_vo.jsp name="u.passWord"和name="u.passWord"是对Action中User对象进行映射 -->
<form action="loginvo.action">
用户名:<input name="u.userName" type="text"/>用户密码<input name="u.passWord" type="password"/>
<input type="submit" value="提交"/>
</form>

再看看配置文件

Xml代码 复制代码 收藏代码
  1. <action name="loginputvo">
  2. <result>/page/getValue/login_input_vo.jsp</result>
  3. </action>
  4. <actionname="loginvo"class="study.getValue.VoLoginAction">
  5. <resultname="success">/page/getValue/success.jsp</result>
  6. <resultname="error">/page/getValue/fail.jsp</result>
  7. </action>

成功失败后的页面没有什么好修改的。

三、使用模型驱动(ModelDriven)的方式。

上面的例子中在页面要写上u.userName,按照习惯前面的“u.”是不是可以不要呢,同时又能保持第二种方式里Action的“纯洁”,Struts2的模型驱动就可以做到。

从实现方式上面需要Action实现模型驱动的接口,先来看Action是怎么写的:

Java代码 复制代码 收藏代码
  1. package study.getValue;
  2. import study.getValue.vo.User;
  3. import com.opensymphony.xwork2.Action;
  4. import com.opensymphony.xwork2.ModelDriven;
  5. /**
  6. *
  7. * Action实现ModelDriven接口。
  8. * 在Action里定义一个私有变量User,这个User应该被new出来,
  9. * 不过里面的值是Strus来设置的
  10. * 不需要Setter和Getter方法
  11. * @author arne3166
  12. * @version [0100, 2010-9-30]
  13. */
  14. public class ModelDrivenLoginActionimplements ModelDriven<User>
  15. {
  16. //需要将user对象new出来;
  17. private User u = new User();
  18. //实现的接口方法
  19. @Override
  20. public User getModel()
  21. {
  22. return u;
  23. }
  24. public String execute()
  25. {
  26. String userName = u.getUserName();
  27. String passWord = u.getPassWord();
  28. if (null!= userName &&null != passWord
  29. && userName.equals("arne3166") && passWord.equals("111111"))
  30. {
  31. return Action.SUCCESS;
  32. }
  33. else
  34. {
  35. return Action.ERROR;
  36. }
  37. }
  38. }
package study.getValue;
import study.getValue.vo.User;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ModelDriven;
/**
 *
 * Action实现ModelDriven接口。
 * 在Action里定义一个私有变量User,这个User应该被new出来,
 * 不过里面的值是Strus来设置的
 * 不需要Setter和Getter方法
 * @author  arne3166
 * @version  [0100, 2010-9-30]
 */
public class ModelDrivenLoginAction implements ModelDriven<User>
{
    //需要将user对象new出来;
    private User u = new User();
    //实现的接口方法
    @Override
    public User getModel()
    {
        return u;
    }
    public String execute()
    {
        String userName = u.getUserName();
        String passWord = u.getPassWord();
        if (null!= userName && null != passWord
            && userName.equals("arne3166") && passWord.equals("111111"))
        {
            return Action.SUCCESS;
        }
        else
        {
            return Action.ERROR;
        }
    }
}

下面回到Sturts的配置文件

Xml代码 复制代码 收藏代码
  1. <action name="loginputmodeldriven">
  2. <result>/page/getValue/login_input_modeldriven.jsp</result>
  3. </action>
  4. <actionname="loginmodeldriven"class="study.getValue.ModelDrivenLoginAction">
  5. <resultname="success">/page/getValue/success.jsp</result>
  6. <resultname="error">/page/getValue/fail.jsp</result>
  7. </action>

再看表单的页面

Java代码 复制代码 收藏代码
  1. <!--又回到原始简单的样式了O(∩_∩)O-->
  2. <form action="loginmodeldriven.action">
  3. 用户名:<input name="userName" type="text"/>用户密码<input name="passWord" type="password"/>
  4. <input type="submit" value="提交"/>
  5. </form>
<!--又回到原始简单的样式了O(∩_∩)O-->
<form action="loginmodeldriven.action">
用户名:<input name="userName" type="text"/>用户密码<input name="passWord" type="password"/>
<input type="submit" value="提交"/>
</form>

这里注意一下,

这是必须的
//需要将user对象new出来;
private User u = new User();

如果不将user new出来的话,会在页面给你一个异常吃吃

Java代码 复制代码 收藏代码
  1. Struts Problem Report
  2. Struts has detected an unhandled exception:
  3. Messages:
  4. File: study/getValue/ModelDrivenLoginAction.java
  5. Line number: 23
  6. --------------------------------------------------------------------------------
  7. Stacktraces
  8. java.lang.NullPointerException
  9. study.getValue.ModelDrivenLoginAction.execute(ModelDrivenLoginAction.java:23)
  10. sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  11. sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  12. sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  13. java.lang.reflect.Method.invoke(Method.java:597)

ps:在用以上方法的时候,有时候会用的多种结合,当用了以上两种方法或以上之后,应该注意传值的冲突。。。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值