讲解之前,大家应该了解,HTTP请求参数都是字符串类型,对于Java我们需要将其转换为相应的数据类型。
Struts2提供了强大的类型转换机制,Struts2的转换机制可以基于OGNL表达式,只要我们把HTTP请求参数(例如表单元素),命名为合法的OGNL表达式,我们就可以充分利用Struts2为我们提供的类型转换机制,也大大的缩减了我们的代码量。以经典的用户登录功能讲解:
一:前台表单:
<s:form action="login">
<s:textfield name="user.name" label="用户名"/>
<s:textfield name="user.pass" label="密码"/>
<s:submit value="转换"/>
<s:reset value="重置"/>
</s:form>
表单中的name属性就是OGNL表达式形式,Struts2会把user.name自动赋值给Action中的user的name属性。
但是使用Struts2这种转换时需要注意:
1:系统会根据映射创建user所对应的User类的实例,但是我们需要为这个类提供无参数的构造器。
2:如果想让user.name为Action中的user的name属性赋值,我们需要在user对应的类中提供setName()方法,Struts2就是通过该方法赋值。
如下:我们创建user所对应的类User,并声明name,pass属性,提供相应的get,set方法。
public class User {
private String name;
private String pass;
public User(){
}
public User(String name, String pass) {
this.name = name;
this.pass = pass;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
}
Struts2就会通过相应的方法将user.name向Action user的name属性赋值。
二:Action:InputAction
import com.opensymphony.xwork2.Action;
public class InputAction implements Action{
private User user;
private String tip;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getTip() {
return tip;
}
public void setTip(String tip) {
this.tip = tip;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
if(getUser().getName().equals("mao")&&getUser().getPass().equals("3214")){
setTip("登陆成功");
return SUCCESS;
}else{
return ERROR;
}
}
}<span style="font-size:14px;">
</span>
三:结果页面代码:
<h3>${requestScope.tip}</h3>
<h3><s:property value="user.name"/></h3>
四:结果
下面使用Map实现:
一:前台界面 (为了演示实现,可能界面不符合常规)
<s:form action="mapLogin">
<s:textfield name="stuMap['one'].name" label="第一个用户名"/>
<s:textfield name="stuMap['one'].pass" label="第一个密码"/>
<s:textfield name="stuMap['two'].name" label="第二个用户名"/>
<s:textfield name="stuMap['two'].pass" label="第二个密码"/>
<s:submit value="转换"/>
</s:form>
二:StuMap所对应的类:
public class MapUser {
private String name;
private String pass;
public MapUser(){
}
public MapUser(String name, String pass) {
this.name = name;
this.pass = pass;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
}
三:Action: MapAction
public class MapAction implements Action{
private Map<String,MapUser>stuMap;
private String tip;
public Map<String, MapUser> getStuMap() {
return stuMap;
}
public void setStuMap(Map<String, MapUser> stuMap) {
this.stuMap = stuMap;
}
public String getTip() {
return tip;
}
public void setTip(String tip) {
this.tip = tip;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
if(getStuMap().get("one").getName().equals("mao")&&getStuMap().get("one").getPass().equals("3214")){
setTip("登陆成功");
return SUCCESS;
}else{
return ERROR;
}
}
}
四:结果界面代码:
<h3>第一个用户名:<s:property value="stuMap['one'].name"/></h3><br>
<h3>第一个密码:<s:property value="stuMap['one'].pass"/></h3><br>
<h3>第二个用户名:<s:property value="stuMap['two'].name"/></h3><br>
<h3>第二个密码:<s:property value="stuMap['two'].pass"/></h3><br>
五:输入相应的用户名密码 返回视图:
List与Map的处理基本一致:只是Map是“Action属性名[‘key 值’] 属性名” 而List是“Action属性名[‘索引 值’] 属性名”