表单页面和成功页面
用于填写用户注册信息的表单页面需要使用Struts 2的标签,这样就可以和服务端的Action属性进行绑定。来看一下registerUser.jsp页面的代码:
代码清单3 registerUser.jsp:用户注册表单页面 <%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> ①声明Struts标签 <html> <head><title>宝宝淘注册页面</title></head> <body> ② 引用struts.xml中定义的Action <s:form> <s:textfield key=" user.userName" label="用户名"/> <s:password key="user.password" label="密 码"/> <s:textfield key="user.email" label="Email"/> <s:submit/> </s:form> </body> </html>
首先,在①处声明Struts标签,②处的代码构造了一个表单。读者是否发现Struts 2的表单标签和Spring MVC的表单标签很相像呢?表单标签<s:form>也仅需要一个简单的标签声明就可以了,无须通过action属性指定表单提交的地址,表单组件标签也通过级联属性的方式绑定表单对象。唯一不太相同的是,表单组件标签有一个label属性,生成表单时,它将作为组件前头的一个文本标签,这种将HTML组件标签和组件本身捆绑的方式很有趣,不过好像绑定得过于紧密了,不利于HTML页面设计。
那如何访问到这个表单页面呢?答案是和Spring MVC的表单控制器一样,通过直接请求Action,Action发现User是null时自动导向到表单输入页面中,这样<s:form>标签就可以确定表单提交的地址了。可见事件发展到最后往往是殊途同归,或说英雄所见略同。
当表单提供处理完成后,我们转向一个success.jsp页面,这个页面显示注册用户的欢迎信息:
<%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>Welcome</title> </head> <body> ① 显示用户名属性 <s:property value="user.userName"/> Welcome to baobaotao </body> </html>
在①处,我们通过<s:property>标签显示表单对象的userName属性,由于级联属性的根是相对于Action而言的,所以必须设置为“user.UserName”。
将registerUser.jsp、success.jsp放置到WEB-INF/jsp目录下,这样就满足代码清单2的③和④中的配置了。
测试用户注册功能
在浏览器地址栏中输入http://localhost/baobaotao/user/registerUserAction.action,由于第一次调用时,UserRegisterAction中的user属性为null,请求将被导向到registerUser.jsp页面中,如图1所示:
图1 用户注册信息表单页面
通过这个表单页面,对照代码清3 ②处的编写方式,我们就可以清楚地知道Struts 2表单组件标签的label属性究竟对应HTML页面中的哪个内容了。
在点击Submit提交表单后,RegisterUserAction负责处理表单提交,并调用BbtForum# registerUser(User user)将User对象保存到数据库中,然后导向到success.jsp页面上。
小结
和Spring采用主动提供插件的方式集成Struts 1.x,时至今日Struts 2.0却反过来提供了一个集成到Spring中的插件包。应该说,和集成Struts 1.x相比,集成Struts 2.0更加容易了,你只需要使用以下两个步骤就可以了:
1) 将struts2-spring-plugin-2.0.6.jar添加到类路径中;
2)在struts.xml配置文件中添加以下配置:
<constant name="struts.objectFactory" value="spring" />
在Struts的<action>配置项中,原来的class属性指定为一个Action实现类,集成Spring后,class属性直接指定Spring容器中Bean的名称。