讲解之前,大家应该了解,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; } } }三:结果页面代码:
<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; } }
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属性名[‘索引 值’] 属性名”