零基础学Struts
上QQ阅读APP看书,第一时间看更新

14.5 整合Spring完成登录案例

前面介绍了如何在Strtus 2中安装Spring插件,并介绍了Struts 2和Spring框架的整合策略。下面介绍如何通过整合Struts 2和Spring框架来完成登录案例。

14.5.1 修改控制器Action及配置

下面通过整合Spring来改进以前的登录案例。首先修改登录控制器LoginAction,为其添加类型为LoginCheck的属性lc,并为该属性添加setter方法。该属性用来接收注入的业务逻辑组件,代码如下所示。

        package net.hncu.action;
        import net.hncu.service.LoginCheck;
        import org.apache.struts2.ServletActionContext;
        import com.opensymphony.xwork2.ActionSupport;
        public class LoginAction extends ActionSupport {
              private String uname;
              private String upassword;
              private LoginCheck lc;
              // 获得uname
              public String getUname() {
                    return uname;
              }
              // 设置uname
              public void setUname(String uname) {
                    this.uname = uname;
              }
              // 获得password
              public String getUpassword() {
                    return upassword;
              }
              // 设置password
              public void setUpassword(String upassword) {
                    this.upassword = upassword;
              }
              public void setLc(LoginCheck lc) {
                    this.lc = lc;
              }
              public String execute() throws Exception {
                    // 调用业务逻辑组件来判断
                    if (lc.isLogin(getUname(), getUpassword())) {
                            // 如果为合法用户,在request范围中添加属性login,其属性值为true
                            ServletActionContext.getRequest().setAttribute("login", "true");
                            return SUCCESS;
                    } else {
                            return ERROR;
                    }
              }
        }

14.5.2 依赖注入业务逻辑组件

修改Spring配置文件“applicationContext.xml”,配置登录控制器对应的实例,并将业务逻辑组件注入到Action实例中,代码如下所示。

        <? xml version="1.0" encoding="UTF-8"? >
        <beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
            <! -- 创建业务逻辑组件实例    -->
            <bean id="loginCheck" class="net.hncu.service.LoginCheck"></bean>
            <! -- 创建控制器实例 -->
            <bean id="loginAction" class="net.hncu.action.LoginAction">
                  <property name="lc" ref="loginCheck"></property>
            </bean>
        </beans>

在“struts.xml”文件中配置LoginAction,其中class属性并不是Action类的实际处理类,而是对应Spring容器中的Bean实例,代码如下所示。

        <? 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为配置文件根元素-->
        <struts>
              <! -- Action必须放在指定的包名空间中-->
              <package name="struts2" extends="struts-default">
                    <! -- 定义loginAction,其实现类为net.hncu.struts2.action.LoginAction-->
                    <action name="login" class="loginAction">
                        <! -- 定义处理结果与视图资源之间的关系-->
                        <result name="success">/login_success.jsp</result>
                        <result name="error">/login_failure.jsp</result>
                        <result name="input">/login.jsp</result>
                    </action>
              </package>
        </struts>