ActionForm是一个JavaBean,需继承org.apache.struts.action.ActionForm类,它捕获通过HTTP请求传送的参数ActionForm针对每个HTML表单中的字段具有一个对应的属性ActionServlet匹配请求中的参数和ActionForm中的属性,并调用ActionForm中的setter方法,将参数传入ActionForm我们的login.jsp有username和password两个表单字段(下面将会看到),所以,我们需要定义ActionForm中相应的setter方法:setUsername和setPassword方法ActionForm中的getter/setter方法,可以通过Eclipse集成环境,自动生成ActionForm中的内部属性全部定义为私有的(private),并通过公共(public)的getter/setter方法来访问。例如:
publicclass LoginActionForm extends ActionForm { private String username; private String password; /** * @returnReturns the password. */ public String getPassword() { return password; } /** *@param password The password to set. */ public void setPassword(String password) { this.password = password; } /** *@return Returns the username. */ public String getUsername() { return username; } /** *@param username The username to set. */ public void setUsername(String username) { this.username = username; } }
我们的LoginAction做了如下事情,这些是一个Action通常都会做的最典型的事情:
1.将输入的ActionForm强制转换为LoginActionForm
2.从LoginActionForm对象中获取用户名以及密码的数据信息
3.执行用户名及密码的逻辑判断操作(在通常的情况下,要将这些业务逻辑交给专门的类去处理,这里这样做是为了演示的需要)
4.根据业务逻辑执行的结果,决定返回哪个ActionForward,我们在这里使用success这个标识来表示登录成功页面,用error标识来表示登录失败页面
小结:之前在drp中常常使用的是request的getParameter的方法来获取jsp页面的数据,有了ActionForm之后就可以直接获取了,感觉挺方便的。但是个人感觉在结构上多了一个ActionForm的类,还需要在struts的配置文件中设置form和action的关系,而且在配置的时候还容易出错,所以感觉还蛮繁琐的。我在迷惑什么时候直接使用request,什么时候使用ActionForm这种方法呢?publicclass LoginAction extends Action { public ActionForward execute(ActionMappingmapping, ActionForm form, HttpServletRequest request,HttpServletResponse response) throws Exception { //将ActionForm强制转换为LoginActionForm LoginActionForm loginForm =(LoginActionForm)form; //从LoginActionForm中提取从页面表单传递过来的参数 String username = loginForm.getUsername(); String password = loginForm.getPassword(); //根据这些参数,执行业务逻辑操作 if("admin".equals(username)&& "admin".equals(password)){ //如果用户名和密码均为admin,则转向登录成功页面 returnmapping.findForward("success"); }else{ //否则转向登录失败页面 returnmapping.findForward("error"); } } }