在上一节介绍的例子中,Login.java里有username和password两个属性,并且有set和get方法,如果JSP中表单的数量较大,会导致一种现象,set和get方法大量的存在于action中,如果我们把这些属性封装在一个JavaBean中,通过struts2框架,会更清晰明了。
1.新建一个登陆实体类,LoginInfo.java
package bean; public class LoginInfo { private String username; 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; } private String password; }
2.控制层Login.java
package controller; import bean.LoginInfo; import com.opensymphony.xwork2.ActionSupport; public class Login extends ActionSupport{ private LoginInfo logininfo; public LoginInfo getLogininfo() { return logininfo; } public void setLogininfo(LoginInfo logininfo) { this.logininfo = logininfo; } @Override public void validate() { // TODO Auto-generated method stub super.validate(); if("".equals(this.logininfo.getUsername())) { this.addFieldError("logininfo.username", "用户名不能为空"); } if("".equals(this.logininfo.getPassword())) { this.addFieldError("logininfo.password", "密码不能为空"); } } public String execute() { if(this.logininfo.getUsername().equals("hello")&&this.logininfo.getPassword().equals("struts2")) { return SUCCESS; } else { return ERROR; } } }
声明了一个LoginInfo类型的变量,并设置了set和get方法。其中this.addFieldError("logininfo.username", "用户名不能为空");username也要改成logininfo.username。
3.jsp代码:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> <s:form action="login.action" method="post" name="login"> <s:textfield name="logininfo.username" label="账号"></s:textfield> <br/> <s:textfield name="logininfo.password" label="密码"></s:textfield> <br/> <s:submit value="提交"></s:submit> </s:form> </body> </html>
其中name属性值有了变化都加上了logininfo,这样会自动封装到LoginInfo实体的属性中,如果名称不一致就不会完成自动封装,同学可以亲自试一试。
4.struts.xml文件没有变化,运行程序即可
5.尽管程序运行正确,但有一点,即:
private LoginInfo logininfo;
我们并没有为LoginInfo创建对象,正常创建对象应该如下:
private LoginInfo logininfo = new LoginInfo();
这里其实用到java反射机制,如果对象为空,自动在底层通过反射机制实例化一个对象,然后调用其set方法。