注册用户实例
下面我们使用一个小例子介绍Struts集成到Spring中的具体应用。
创建Action对象
首先,我们需要编写一个能够处理表单提交的Action类,Struts 2的Action类是表单对象和控制器的混合体,Action类本身的属性就可以和表单数据进行绑定。不过为了保证业务层接口和Web层无关,一般情况下,我们还是需要编写一个独立的表单对象,只要将表单对象作为Action的属性,就可以通过级联属性的方式绑定页面的表单数据了。来看一下负责处理表单提交的UserRegisterAction的代码:
代码清单1 UserRegisterAction:用户注册Action package com.baobaotao.web.user; import com.baobaotao.domain.User; import com.baobaotao.service.BbtForum; import com.opensymphony.xwork2.ActionSupport; public class UserRegisterAction extends ActionSupport { private BbtForum bbtForum; ①业务层的Bean private User user; ②充当表单对象的POJO属性对象 @Override public String execute() throws Exception { ③Action处理请求的方法 if (user == null) { ③-1当user为null时,导向到输入表单页面 user = new User(); return INPUT; } else { ③-2当user不为null时,处理表单提交 System.out.println("user:"+user); bbtForum.registerUser(user); return SUCCESS; } } public void setBbtForum(BbtForum bbtForum) { this.bbtForum = bbtForum; } public void setUser(User user) { this.user = user; } public User getUser() { return user; } }
在UserRegisterAction中,我们定义了一个业务层BbtForum对象和用于绑定表单数据的User对象。在后续章节中,读者将看到我们如何在Spring中配置UserRegisterAction以及将Spring容器中的BbtForum Bean注入到UserRegisterAction中。用户也可以直接在UserRegisterAction中声明和表单组件相对应的属性(如userName、password等),不过由于我们需要调用业务层对象的方法操作表单数据,所以最好还是独立到一个POJO中,这便是User对象。如果请求参数仅是一些控制性数据,完全可以直接通过Action标量属性进行绑定。User对象是一个POJO,其代码如下所示:
package com.baobaotao.domain; public class User { private String userName; private String password; private String email; //省缺get/setter }
在编写好Struts 2的Action后,我们下一步要做的是在Spring容器中配置这个Action,以便充分享用Spring容器的各项功能。
配置Action
首先我们在baobaotao-web.xml的Spring配置文件中配置UserRegisterAction Bean:
①作用域必须设置为prototype <bean id="registerUserAction" class="com.baobaotao.web.user.UserRegisterAction" scope="prototype"> <property name="bbtForum" ref="bbtForum" /> ②注册Spring容器中的Bean </bean>
特别需要注意的是必须将UserRegisterAction Bean的作用域定义为prototype,因为UserRegisterAction是有状态的,必须每一个请求对应一个新的UserRegisterAction 实例。bbtForum是在baobaotao-service.xml中配置的业务层Bean,在此将其注入到Action中。
既然我们已经在Spring中配置好了Struts 2的Action,接下来就碰到了最核心的问题:如何在Struts配置文件中引用这个Bean呢?也许看一眼struts.xml配置文件就水落石出了:
代码清单2 struts.xml:配置Action <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.objectFactory" value="spring" /> <package name="user" namespace="/user" extends="struts-default"> ① 扩展默认配置 ②引用Spring容器中的Bean <action name="registerUserAction" class="registerUserAction"> <result name ="input">/ WEB-INF /jsp/ registerUser.jsp</result> ③表单输入页面 <result name=" success">/WEB-INF/jsp/success.jsp</result> ④操作成功转向的页面 </action> </package> </struts>
①处扩展了struts-default,Struts 2在struts2-core-2.0.6.jar中定义了一个struts-default.xml配置文件,定义了Struts一些默认的基础设施,在这里我们通过扩展这个配置文件提供额外的配置。②处的class="registerUserAction"也许是最令人好奇的,在正常情况下,Struts通过class属性指定Action的实现类,形如:
<action name="registerUserAction" class="com.baobaotao.web.user.UserRegisterAction">
但此时class属性却不是一个类名,相反它是一个类似于Bean名的字符串,秘密恰恰隐藏在这里:事实上class属性的值正是指向Spring容器中的Bean名称,在后台StrutsSpringObjectFactory通过类似于以下的代码获得真实的Action实例:
WebApplicationContext ctx= ApplicationContextUtils.etWebApplicationContext(ServletContext sc); UserRegisterAction userRegisterAction = (UserRegisterAction) ctx.getBean (“registerUserAction”);
通过这种集成方式,Struts 2和Spring就浑然一体、水乳交融了。在编写并配置好Action后,接下来,我们来看一下用户注册信息输入的JSP表单页面。