在s2sh中web.xml文件中的如下语句
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext-*.xml</param-value>
</context-param>
把Spring中的beanfactory初始化,并且放入了servletContext中,避免Struts2在每个action中初始beanfactory(耗资源)进行数据库的操作,而Struts2的action如何取到该初始化好的beanfactory呢,笔者总结了如下三个方法:
方法1:
public class LoginAction extends ActionSupport implements ServletContextAware {
....(程序其他代码)
private ServletContext servletContext;
public String execute() {
....(程序其他代码)
BeanFactory factory = WebApplicationContextUtils
.getRequiredWebApplicationContext(servletContext);
UserManager userManager = (UserManager) factory.getBean("userManager");
....(程序其他代码)
return SUCCESS;
}
@Override
public void setServletContext(ServletContext arg0) {
// TODO Auto-generated method stub
servletContext = arg0;
}
}
Action实现ServletContextAware 接口,复写setServletContext方法,在Struts2掉用此Action时会自动将ServletContext注入到(setServletContext方法)action类中,之后BeanFactory factory = WebApplicationContextUtils
.getRequiredWebApplicationContext(servletContext);语句可以得到BeanFactory;
方法2:
在Action类不实现ServletContextAware 接口,在execute方法中加入ServletContext servletC = ServletActionContext.getServletContext();语句就可以,即从ServletActionContext中直接把ServletContext取出来
public class LoginAction extends ActionSupport {
....(程序其他代码)
public String execute() {
....(程序其他代码)
ServletContext servletC = ServletActionContext.getServletContext();
BeanFactory factory = WebApplicationContextUtils
.getRequiredWebApplicationContext(servletC);
UserManager userManager = (UserManager) factory.getBean("userManager");
....(程序其他代码)
return SUCCESS;
}
}
方法三:
把Action交给Spring的ioc容器管理,那么在action类中就不会有beanFactory生成了
步骤如下:
在applicationContext.xml文件中加入action的bean
<bean name="loginAction" class="action.LoginAction" scope="prototype">
<property name="userManager" ref="userManager"/>
</bean>
Scope最好设成prototype,避免action的线程安全问题
在struts.xml文件中,action要按如下方式申明:
<package name="user" namespace="/" extends="struts-default">
<action name="login" class="loginAction">
<result name="success">/success.jsp</result>
<result name="input">/login.jsp</result>
<result name="error">/failed.jsp</result>
</action>
</package>
<action name="login" class="loginAction">中的class要与bean中的name相对应
最后,在action中的代码就是很简单的(当然,其中的setUserManager方法别忘了)
import manager.UserManager;
import bean.User;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
private String password;
private UserManager userManager;
private String username;
public String execute() {
User user = new User();
user.setPassword(password);
user.setUsername(username);
userManager.addUser(user);
return SUCCESS;
}
public String getPassword() {
return password;
}
public String getUsername() {
return username;
}
public void setPassword(String password) {
this.password = password;
}
public void setUserManager(UserManager userManager) {
this.userManager = userManager;
}
public void setUsername(String username) {
this.username = username;
}
}