转:struts2从请求取值的三种方式

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

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

我介绍三种方式:

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


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

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

请看我的Action:

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里面的配置


<action name="loginput" >

<result>/page/getValue/login_input.jsp</result>

</action>

<action name="login" class="study.getValue.LoginAction">

<result name="success">/page/getValue/success.jsp</result>

<result name="error">/page/getValue/fail.jsp</result>

</action>


复制代码看jsp是怎么写的:



<form action="login.action"><!-- name="userName" 和 name="passWord"同Action里面的私有属性对上 -->

用户名:<input name="userName" type="text"/>用户密码<input name="passWord" type="password"/>

<input type="submit" value="提交"/>

</form>


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

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

看看我们是怎么做的

首先定义User

Java代码

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);
}

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代码

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;
}
}
}

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代码

<!--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>

<!--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代码

<action name="loginputvo" >
<result>/page/getValue/login_input_vo.jsp</result>
</action>
<action name="loginvo" class="study.getValue.VoLoginAction">
<result name="success">/page/getValue/success.jsp</result>
<result name="error">/page/getValue/fail.jsp</result>
</action>

<action name="loginputvo" >
<result>/page/getValue/login_input_vo.jsp</result>
</action>
<action name="loginvo" class="study.getValue.VoLoginAction">
<result name="success">/page/getValue/success.jsp</result>
<result name="error">/page/getValue/fail.jsp</result>
</action> 成功失败后的页面没有什么好修改的。



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

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

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


Java代码

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;
}
}
}

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代码
<action name="loginputmodeldriven" >  
<result>/page/getValue/login_input_modeldriven.jsp</result>
</action>
<action name="loginmodeldriven" class="study.getValue.ModelDrivenLoginAction">
<result name="success">/page/getValue/success.jsp</result>
<result name="error">/page/getValue/fail.jsp</result>
</action>

<action name="loginputmodeldriven" >
<result>/page/getValue/login_input_modeldriven.jsp</result>
</action>
<action name="loginmodeldriven" class="study.getValue.ModelDrivenLoginAction">
<result name="success">/page/getValue/success.jsp</result>
<result name="error">/page/getValue/fail.jsp</result>
</action>


再看表单的页面


Java代码
 
<!--又回到原始简单的样式了O(∩_∩)O-->
<form action="loginmodeldriven.action">
用户名:<input name="userName" type="text"/>用户密码<input name="passWord" type="password"/>
<input type="submit" value="提交"/>
</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代码

Struts Problem Report
Struts has detected an unhandled exception:

Messages:
File: study/getValue/ModelDrivenLoginAction.java
Line number: 23


--------------------------------------------------------------------------------

Stacktraces
java.lang.NullPointerException
study.getValue.ModelDrivenLoginAction.execute(ModelDrivenLoginAction.java:23)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)


转:http://www.85java.com/thread-1132-1-1.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值