SSH框架——struts2篇

Posted 夕冰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSH框架——struts2篇相关的知识,希望对你有一定的参考价值。

使用Action的动态方法调用

在一个Action中包含多个控制处理逻辑。例如对于同一个表单,当用户通过不同按钮来提交同一个表单时,系统需要使用Action的不同方法来处理用户请求,这时就需要用的Action的动态方法调用。


1、通过ActionName!MethodName方法

通过Action名!方法名 方法调用,struts.xml配置如下

<?xml version="1.0"  encoding="UTF-8" ?>

<!DOCTYPE struts  PUBLIC

    "-//Apache Software  Foundation//DTD Struts Configuration 2.3//EN"

    "http://struts.apache.org/dtds/struts-2.3.dtd">

 

<struts>

    <!-- 指定编码 -->

    <constant name="struts.i18n.encoding"  value="UTF-8"></constant>

    <!-- 指定全局国际化资源文件 -->

    <constant name="struts.custom.i18n.resources"  value="mess"></constant>

    <!-- 修改以下配置,不需要重新启动tomcat -->

    <constant name="struts.devMode"  value="true"></constant>

    <!-- 调用动态方法 -->

    <constant name="struts.enable.DynamicMethodInvocation"  value="true"></constant>

    

    <package name="test"  extends="struts-default">     

       <action name="toLogin" class="org.cgx.vo.LoginRegiistAction  ">

         <result name="login">/welcome.jsp</result>

         <result name="regist">/regist.jsp</result>

         <result name="error">/error.jsp</result>

        </action>             

     

    </package>

 

</struts>

其中<constant name="struts.enable.DynamicMethodInvocation"value="true"></constant> 一定要设置为true,否则struts机制不支持动态方法。

Action类方法代码

package org.cgx.vo;

 

import com.opensymphony.xwork2.ActionContext;

import com.opensymphony.xwork2.ActionSupport;

 

publicclass LoginRegiistAction extends ActionSupport{

    private String username;

    private String password;

    private String tip;

   

    public String getUsername() {

       returnusername;

    }

    publicvoid setUsername(String username)  {

       this.username = username;

    }

    public String getPassword() {

       returnpassword;

    }

    publicvoid setPassword(String password)  {

       this.password = password;

    }

    public String getTip() {

       returntip;

    }

    publicvoid setTip(String tip) {

       this.tip = tip;

    }

   

    @Override

    public String execute() throws Exception  {

        if(this.getUsername().equals("xice")&&this.getPassword().equals("123")){

           //登录成功将用户名存入session

           ActionContext.getContext().getSession().put("user", "欢迎"+this.getUsername()+",您已登录成功!");

           //返回登录成功标记

           return"login";

       }

       return"error";

    }

   

    //点击注册时响应action

    public String regist() throws  Exception{

       ActionContext.getContext().getSession().put("user", "恭喜"+this.getUsername()+",您已注册成功!");

       return"regist";

    }  

}

 

登录注册表单

<%@ page language="java"  import="java.util.*" pageEncoding="utf-8"%>

<%@taglib prefix="s"  uri="/struts-tags" %>

<!DOCTYPE html  PUBLIC "-//W3C//DTD  HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>登录注册界面</title>

  </head>

 

  <body>

    <s:form action="toLogin">

        <s:textfield name="username" key="user"/><br/>

        <s:textfield name="password" key="pass"/><br/>

        <s:submit key="login"/>

        <input type="submit" value="注册" onclick="regist();"/>

    </s:form>

  </body>

 

  <script>

    function regist(){  //注册按钮响应函数

        //获取第一个表单

        registForm = document.forms[0];

        //动态修改表单的action属性

        registForm.action = "toLogin!regist";

    }

 

  </script>

</html>

 

 

点击登录时直接调用Action的execute()方法,点击注册时通过javaScript设置Action

registForm.action = "toLogin!regist";

首先调用名为toLogin的Action,在此Action中调用regist()方法,完成注册功能。

 

2、指定method属性的方法

在struts.xml文件中配置<action…/>元素时可以指定method属性,则可以让Action调用指定的方法。

<?xml version="1.0"  encoding="UTF-8" ?>

<!DOCTYPE struts  PUBLIC

    "-//Apache Software  Foundation//DTD Struts Configuration 2.3//EN"

    "http://struts.apache.org/dtds/struts-2.3.dtd">

 

<struts>

    <!-- 指定编码 -->

    <constant name="struts.i18n.encoding"  value="UTF-8"></constant>

    <!-- 指定全局国际化资源文件 -->

    <constant name="struts.custom.i18n.resources"  value="mess"></constant>

    <!-- 修改以下配置,不需要重新启动tomcat -->

    <constant name="struts.devMode"  value="true"></constant>

    <!-- 调用动态方法 -->

    <constant name="struts.enable.DynamicMethodInvocation"  value="true"></constant>

    

    <package name="test"  extends="struts-default">    

        <action name="toLogin"  class="org.cgx.vo.LoginRegiistAction ">

         <result  name="login">/welcome.jsp</result>

         <result  name="error">/error.jsp</result>

        </action>       

       

       <action name="toRegist"  class="org.cgx.vo.LoginRegiistAction" method="regist">          

         <result  name="regist">/regist.jsp</result>

        </action>            

    </package>

 

</struts>

Action类方法代码和5.1相同,登录注册表单只需修改javascript中的方法

<script>

    function regist(){  //注册按钮响应函数

        //获取第一个表单

        registForm = document.forms[0];

        //动态修改表单的action属性

        registForm.action = " toRegist ";

    }

  </script>

 

3、通配符*的方法

在struts.xml文件中配置<action…/>元素时使用通配符*

<?xml version="1.0"  encoding="UTF-8" ?>

<!DOCTYPE struts  PUBLIC

    "-//Apache Software  Foundation//DTD Struts Configuration 2.3//EN"

    "http://struts.apache.org/dtds/struts-2.3.dtd">

 

<struts>

    <!-- 指定编码 -->

    <constant name="struts.i18n.encoding"  value="UTF-8"></constant>

    <!-- 指定全局国际化资源文件 -->

    <constant name="struts.custom.i18n.resources"  value="mess"></constant>

    <!-- 修改以下配置,不需要重新启动tomcat -->

    <constant name="struts.devMode"  value="true"></constant>

    <!-- 调用动态方法 -->

    <constant name="struts.enable.DynamicMethodInvocation"  value="true"></constant>

    

    <package name="test"  extends="struts-default">

        <action name="to*" class="org.cgx.vo.LoginRegiistAction" method="{1}">

         <result name="login">/welcome.jsp</result>

         <result name="regist">/regist.jsp</result>

         <result name="error">/error.jsp</result>

        </action>    

    </package>

</struts>

method="{1}"指定Action调用方法名 和第一个通配符*所代表的字符相同的方法。因此需要在Action类中增加名为login()的方法

public String login() throws Exception{

    if(this.getUsername().equals("xice")&&this.getPassword().equals("123")){

           //登录成功将用户名存入session

           ActionContext.getContext().getSession().put("user", this.getUsername());

           setTip("欢迎"+this.getUsername()+",您已登录成功!");

           //返回登录成功标记

           return"login";

       }

       return"error";

}

登录注册表单代码如下:

<s:form action="tologin">

        <s:textfield name="username" key="user"/><br/>

        <s:textfield name="password" key="pass"/><br/>

        <s:submit key="login"/>

        <input type="submit" value="注册" onclick="regist();"/>

    </s:form>

 

  <script>

    function regist(){  //注册按钮响应函数

        //获取第一个表单

        registForm = document.forms[0];

        //动态修改表单的action属性

        registForm.action =  "toregist";

    }

  </script>

此时直接调用相应的Action,tologin、toregist。配置文件中的通配符to*将会自动匹配,并调用login()、regist()方法。

此时的*通配login、regist。


以上是关于SSH框架——struts2篇的主要内容,如果未能解决你的问题,请参考以下文章

SSH框架——struts2篇

SSH开发模式——Struts2进阶

SSH理解——Struts2篇

SSH框架整(12)

SSH(struts2+spring+hibernate)三大框架整合

ssh三大框架的认识