0
点赞
收藏
分享

微信扫一扫

搭建SSH开发环境


1.       Struts2.0的Login应用

a)         建立一个Struts2.0应用(ssh2)

b)        将struts-2.0.6-all.zip包lib目录以下文件拷贝到项目的lib目录中,刷新工程。

                                       i.              antlr-2.7.2.jar

                                     ii.              commons-beanutils-1.6.jar

                                    iii.              commons-chain-1.1.jar

                                   iv.              commons-logging-1.0.4.jar

                                     v.              commons-validator-1.3.0.jar

                                   vi.              freemarker-2.3.8.jar

                                  vii.              ognl-2.6.11.jar

                                viii.              oro-2.0.8.jar

                                   ix.              struts2-core-2.0.6.jar

                                     x.              xwork-2.0.1.jar

c)        编辑web.xml文件,加入以下红色字体部份

      

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>
            org.apache.struts2.dispatcher.FilterDispatcher
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>
    
</web-app>

d)        页面的设计

                                       i.              进入登录界面login.jsp填写的用户名和密码

                                     ii.              用户名和密码验证成功后跳转到首页index.jsp

                                    iii.              用户名和密码验证失败后跳转到错误页error.jsp

                      

e)         类图

             

f)         相关代码

       页面部份

                     login.jsp

<%@ page language="java" pageEncoding="GBK"%>
<html>
    <head>
        <title>登录</title>
    </head>
    <body>
            登录
        <FORM action="login.action" method="post">
            <DIV align="center">
                <TABLE width="300px" border="1" cellpadding="0" cellspacing="0">
                    <TR>
                        <TD>
                            姓名:
                        </TD>
                        <TD>
                            <INPUT type="text" size="10" name="user.username">
                        </TD>
                    </TR>
                    <TR>
                        <TD>
                            密码:
                        </TD>
                        <TD>
                            <INPUT type="text" size="10" name="user.password">
                        </TD>
                    </TR>
                    <TR>
                        <TD colspan="2" align="center">
                            <INPUT type="submit" value="提交" name="submit">
                        </TD>
                    </TR>
                </TABLE>
            </DIV>
        </FORM>
    </body>
</html>

              index.jsp

<%@ page language="java" pageEncoding="GBK"%>
<%@ taglib uri =  "/struts-tags"  prefix = "s"  %>
<html>
    <head>
        <title>首页</title>
    </head>
    <body>
        <s:property value="user.username" />欢迎您到来!
    </body>
</html>

              error.jsp


<%@ page language="java" pageEncoding="GBK"%>
<html>
    <head>
        <title>错误</title>
    </head>
    <body>
        <DIV align="center">
            <h3>来到这里就是出错啦</h3>
        </DIV>
    </body>
</html>

Java代码部份

User.java

package cn.oksonic.model.bo;
publicclass User {
   // 用户名称
   private String username;
   // 密码
   private String password;
   public String getPassword() {
       returnpassword;
   }
   publicvoid setPassword(String password) {
       this.password = password;
   }
   public String getUsername() {
       returnusername;
   }
   publicvoid setUsername(String username) {
       this.username = username;
   }
}

               

LoginAction.java

package cn.oksonic.web;
import cn.oksonic.model.bo.User;
import com.opensymphony.xwork2.Action;
publicclass LoginAction extends ActionSupport {
   private User user =  new User();
   @SuppressWarnings("static-access")
   public String execute() throws Exception {
       // 可以在这里调用Service层来进行验证,这里只验证用户名
       if (user.getUsername().equals("oksonic"))
           returnthis.SUCCESS;
       else
           returnthis.ERROR;
   }
   public User getUser() {
       returnuser;
   }
}

 

              配置文件部份

                     新建struts.xml(src目录)

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd" >
<struts>
    <package name="user" namespace="/" extends="struts-default">
        <!-- 配置一个action -->
        <action name="login" class="cn.oksonic.web.LoginAction">
            <!--  这里的意思是登录成功后跳转到 /index.jsp 页面 -->
            <result name="success" type="dispatcher">
                <param name="location">/index.jsp</param>
            </result>
            <!--  登录失败后跳转到 /error.jsp 页面 -->
            <result name="error" type="dispatcher">
                <param name="location">/error.jsp</param>
            </result>
        </action>
    </package>
</struts>

2.       表单验证

a)         配置验证器

                            在src目录新建validators.xml文件,文件内容如下:

<validators>
    <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
    <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
    <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
    <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
    <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
    <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
    <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
    <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
    <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
    <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
    <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
</validators>

这些验证器已经定义了一些常用的验证,如:必填验证、数字验证、日期验证、邮件验证等。

要启动表单验证,需要增加一个拦截器,对struts.xml 文件进行修改,增加 <interceptor-ref name="validationWorkflowStack" />

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd" >
<struts>
    <package name="user" namespace="/" extends="struts-default">
        <!-- 配置一个action -->
        <action name="login" class="cn.oksonic.web.LoginAction">
            <!--  这里的意思是登录成功后跳转到 /index.jsp 页面 -->
            <result name="success" type="dispatcher">
                <param name="location">/index.jsp</param>
            </result>
            <!--  登录失败后跳转到 /error.jsp 页面 -->
            <result name="error" type="dispatcher">
                <param name="location">/error.jsp</param>
            </result>
            <interceptor-ref name="validationWorkflowStack" />
        </action>
    </package>
</struts>

建立验证配置文件

      对 LoginAction 进行验证规则的配置,需要新建一个配置文件,文件名以 “Action 的名称” + “-validation.xml”来命名,并保存到 LoginAction.java 文件所在的目录中

如:

LoginAction-validation.xml

文件内容如下:

<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN"  "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">
<validators>
    <field name="user.username">
        <field-validator type="requiredstring">
            <message>用户名必须填写</message>
        </field-validator>
    </field>
    <field name="user.password">
        <field-validator type="requiredstring">
            <message>用户密码必须填写</message>
        </field-validator>
    </field>
</validators>

修改 login.jsp,代码如下:

<%@ page language="java" pageEncoding="GBK"%>
<%@ taglib uri =  "/struts-tags"  prefix = "s"  %>
<html>
    <head>
         <title>登录</title>
    </head>
    <body>
            登录
        <s:form name="loginForm" action="login.action">
            <DIV align="center">
                <TABLE width="300px" border="1" cellpadding="0" cellspacing="0">
                    <TR>
                        <TD>
                            姓名:
                        </TD>
                        <TD>
                            <s:textfield  name="user.username" required="true"/>
                        </TD>
                    </TR>
                    <TR>
                        <TD>
                            密码:
                        </TD>
                        <TD>
                            <s:password name="user.password" required="user.password"/>
                        </TD>
                    </TR>
                    <TR>
                        <TD colspan="2" align="center">
                            <s:submit value="登录" />
                        </TD>
                    </TR>
                </TABLE>
            </DIV>
        </s:form>
    </body>
</html>
</html>

   这里的红字部份为struts的标签

 

修改配置文件,加入input属性,设置了此属性表单提交后如果出错后将返回到指定的页面

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd" >
<struts>
    <package name="user" namespace="/" extends="struts-default">
        <!-- 配置一个action -->
        <action name="login" class="cn.oksonic.web.LoginAction">
            <!--  这里的意思是登录成功后跳转到 /index.jsp 页面 -->
            <result name="success" type="dispatcher">
                <param name="location">/index.jsp</param>
            </result>
            <!--  登录失败后跳转到 /error.jsp 页面 -->
            <result name="error" type="dispatcher">
                <param name="location">/error.jsp</param>
            </result>
            <!--  如果验证失败,则返回登录页 -->
            <result name="input" type="dispatcher">
                <param name="location">/login.jsp</param>
            </result>
            <interceptor-ref name="validationWorkflowStack" />
        </action>
    </package>
</struts>

 

3.       使用freemarker模板

freemarker模板语言来显示页面内容在Struts2中实现起来很简单,现在欢迎页面改为使用freemarker来显示。

welcome.ftl文件,后缀名为ftl的文件即为freemarker模板文件夹,文件内容如下:


${user.username}

欢迎您的到来!这是FreeMarke页面


有一点需要注意,welcome.ftl文件默认编码为GBK,需要将其转为UTF-8,否则中文不能正常显示。

   修改Action执行成功后的转向,转到welcome.ftl

   原:

<result name="success" type="dispatcher">
                         <param name="location">/index.jsp</param>
            </result>

   改:

<result name="success" type="freemarker">
                         <param name="location">/welcome.ftl</param>
            </result>

                

   红字部份为类型,这里需要指定为freemarker


4.       集成Spring2.0

1)       加入spring2包内dist目录下的spring.jar文件,加入struts2包内lib目录下的struts2-spring-plugin-2.0.6.jar

2)       修改 web.xml,为 Web 应用增加相应的 Spring ContextLoaderListener

<listener>   
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>   
    </listener>

3)       在 src 目录下新建 struts.properties 文件,内容如下:

                struts.objectFactory = spring

4)       新增 Service 层的对像 IUserService、UserService

            IUserService

   

package cn.oksonic.service;
 
import cn.oksonic.model.bo.User;
 
publicinterface IUserService {
 
    /**
     *验证是否为合法用户
     *@paramuser
     *@return
     */
    publicboolean isValidUser(User user);
 
}

UserService

package cn.oksonic.service;
 
import cn.oksonic.model.bo.User;
 
publicclass UserService implements IUserService {
 
    publicboolean isValidUser(User user) {
       if (user.getUsername().equals("oksonic") && user.getPassword().equals("oksonic"))
           returntrue;
       else
           returnfalse;
    }
 
}


5)       修改 LoginAction.java代码

 

package cn.oksonic.web;
 
import com.opensymphony.xwork2.ActionSupport;
 
import cn.oksonic.model.bo.User;
import cn.oksonic.service.IUserService;
 
@SuppressWarnings("serial")
publicclass LoginAction extends ActionSupport {
 
    private User user =  new User();
    private IUserService userService;
    
    @SuppressWarnings("static-access")
    public String execute() throws Exception {
       // 可以在这里调用Service层来进行验证,这里只验证用户名
       if (userService.isValidUser(user))
           returnthis.SUCCESS;
       else
           returnthis.ERROR;
    }
    
    public User getUser() {
       returnuser;
    }
 
    public void
       this.userService = userService;
    }
 
}

6)       修改 struts.xml

 

原:
    <action  name="login" class="cn.oksonic.web.LoginAction">
    改:
    <action name="login" class="loginAction">

    这里红字部份为引用spring中的bean

7)       加入spring框架,并配置loginAction Bean

  applicationContext.xml文件内容如下:

<?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="userService" class="cn.oksonic.service.UserService" />
    <bean id="loginAction" class="cn.oksonic.web.LoginAction">
       <property name="userService">
           <ref bean="userService" />
       </property>
    </bean>
 
</beans>

红字的login就是struts.xml文件中所引用的Bean


5.       Struts2.0的单元测试

                     使用spring-mork进行单元测试

a)         加入spring-mork.jar文件

b)        编写BaseTest.java文件,以后所有的单元测试用例都将继承于它,它的作用是读取spring的配置文件。

                    

package cn.oksonic;
 
import org.springframework.test.AbstractSingleSpringContextTests;
 
publicclass BaseTest extends AbstractSingleSpringContextTests {
    
    protected String[] getConfigLocations() {
        returnnew String[]{"file:D:/oksonic/workspace/ssh2/WebRoot/WEB-INF/applicationContext.xml"};
    }
    
    publicstaticfinalvoid testTmp() {
        assertTrue( true );
    }
    protectedvoid logDebug( Object arg0 ) {
        logger.error(arg0);
    }
    protectedvoid logError( Object arg0 ) {
        logger.error(arg0);
    }
    protectedvoid logWarn( Object arg0 ) {
        logger.warn(arg0);
    }
 
}

c)        创建测试用例LoginActionTest.java

                    

package cn.oksonic.web;
 
import org.junit.Test;
import cn.oksonic.BaseTest;
import cn.oksonic.model.bo.User;
 
publicclass LoginActionTest extends BaseTest {
 
    private LoginAction action;
    
    @Override
    protectedvoid onSetUp() throws Exception {
        super.onSetUp();
        action = (LoginAction) this.applicationContext.getBean("loginAction");
    }
    
    @Override
    protectedvoid onTearDown() throws Exception {
        super.onTearDown();
        action = null;
    }
    
    @Test
    publicvoidtestExecute() throws Exception {
        User user = new User();
        user.setPassword("oksonic");
        user.setUsername("oksonic");
        action.setUser(user);
        assertEquals(action.execute(), action.SUCCESS);
    }
 
}

举报

相关推荐

0 条评论