Struts2 深入学习(待续)

    技术2022-05-18  12

    转载本人163博客,因工作时间只能访问技术站

    http://chaoji-liangbin.blog.163.com/blog/static/252392122010102945649963/

     

     

    1、动态执行action的执行方法

    参考:http://apps.hi.baidu.com/share/detail/12542696

    struts2的动态方法调用概括起来有三种方式,下面介绍:

    1.1 第一种方式:设置method属性

     

    在Action类中定义一个签名与execute方法相同、只是名字不同的方法,如定义为:

    public String checkLogin(){

           System.out.println("登录成功...++++");

           System.out.println("用户名:" + username);

           System.out.println("密码:" + password);

           List sysusers = sysuserService.getSysuser(username, password);

           if (sysusers != null && sysusers.size() > 0) {

               return "login_success";

           } else {

               super.addFieldError("feedback", "用户名或密码错误");

               return ERROR;

           }

        }

    然后在struts.xml文件中加一个<action>元素,并设置它的method属性。代码如下(核心代码):

        <action name="login" class="loginAction" method="checkLogin" >

               <result name="success" type="redirect">/success.jsp</result>

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

               <result name="input">/index.jsp</result>

           </action>

    Web.xml中定义的过滤器如下:

    <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>

     

     

     

     

     

    index.jsp如下:

    <s:form action="login!checkLogin.action" name="form1">

        <s:textfield name="username" label="username"></s:textfield>

        <s:password name="password" label="password"></s:password>

        <s:submit value="提交" label="submit"></s:submit>

        <s:label name="feedback"></s:label>

       </s:form>

     

     

    清单1:struts.xml部分内容

    然后在JSP中表单的action设置为loginMethod。这样,Struts2就会去调用LoginAction中的loigin方法,而不会去调用execute()方法。

     

    1.2、第二种方式:改变表单的action的设置内容

     

    同第一种方式,定一个login方法。只是不需要改变struts.xml文件的内容。然后,在JSP页面中,设置表单的action为loginMethod!login.action。这样,Struts2也会去调用login方法,而不调用execute方法。其中,表单action="loginMethod!login.action" 中,loginMethod为struts.xml文件中<action> 元素的name属性值,login.action中的login为Action类中的方法名。注意:login.action的action不能少。

     

    方法不变。

    public String checkLogin(){

           System.out.println("登录成功...----");

           System.out.println("用户名:" + username);

           System.out.println("密码:" + password);

           List sysusers = sysuserService.getSysuser(username, password);

           if (sysusers != null && sysusers.size() > 0) {

               return "login_success";

           } else {

               super.addFieldError("feedback", "用户名或密码错误");

               return ERROR;

           }

        }

     

     

    在struts.xml中定义如下:

    <action name="login" class="loginAction">

               <result name="success" type="redirect">/success.jsp</result>

               <result name="login_success" type="redirect">/success.jsp</result>

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

               <result name="input">/index.jsp</result>

        </action>

     

    index.jsp如下:

    <s:form action="login!checkLogin.action" name="form1">

        <s:textfield name="username" label="username"></s:textfield>

        <s:password name="password" label="password"></s:password>

        <s:submit value="提交" label="submit"></s:submit>

        <s:label name="feedback"></s:label>

       </s:form>

     

    3、第三种方式:使用通配符(未测试)

    首先同上面两种方式,定一个login方法,然后在struts.xml文件中配置如下内容:

    <action name="*Action"

    class="com.xuxinhua1984.struts2.i18n.LoginAction" method="{1}">

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

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

    </action>

    清单2:struts.xml部分内容

    然后在JSP页面中,设置表单的action为loginAction,此处login为Action类中的方法名,这样struts.xml中的*Action就可以和loginAction模糊匹配了,然后,method="{1}"就相当于method="login"。这样一来就回到了第一种方式。

    另外,这种方式甚至结果类型对应的物理视图都可以用通配符。例如,如果想让登录失败后返回登录页,可以设置<result name="error">/{1}.jsp</result>。这样,此处的{1}也会被*号实际的内容替代,此处为login,所以就转发回login.jsp页面了。

    总结:对于以上三种方式,我个人建议使用第一、第二种方式,感觉第三种方式是比较灵活,但是也容易产生混乱,且容易出错。

     

     

    2.表单直接传递对象

    Index.jsp:

    <%@ page language="java" pageEncoding="UTF-8"%>

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

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

    <html>

        <head>

           <title>用户登录</title>

           <script type="text/javascript">

                function refresh(){

        document.getElementById("autoImg").src = 'autoImg?now=' + new Date();

     }

           </script>

        </head>

     

        <body>

           <s:form action="login!checkLogin.action" name="sysuser">

               <s:textfield name="sysuser.account" ></s:textfield>

               <s:password name="sysuser.password" ></s:password>

               <s:submit value="提交" label="submit"></s:submit>

               <s:label name="feedback"></s:label>

           </s:form>

           验证码:

           <span οnclick="refresh();"><img src="autoImg" id="autoImg" style="cursor: pointer;">

           </span>

        </body>

    </html>

     

    注意:

    <s:textfield name="sysuser.account" ></s:textfield>

    <s:password name="sysuser.password" ></s:password>

    sysuser是action类中定义的对象名。account和password是该对象拥有的属性,这样就可以传递对象了。详细请见action:

    package com.wenbin.example;

     

    import java.util.List;

    import java.util.Map;

     

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpSession;

     

    import org.apache.struts2.ServletActionContext;

    import org.apache.struts2.interceptor.ServletRequestAware;

    import org.hibernate.Query;

    import org.hibernate.Session;

    import org.hibernate.SessionFactory;

    import org.hibernate.cfg.Configuration;

     

    import com.opensymphony.xwork2.ActionContext;

    import com.opensymphony.xwork2.ActionSupport;

    import com.wenbin.entry.Sysuser;

    import com.wenbin.service.ISysuserService;

     

    public class Login extends ActionSupport {

        private static final long serialVersionUID = 1L;

     

        private ISysuserService sysuserService;

        // private String username;

        // private String password;

        private Sysuser sysuser;

     

        // public String getUsername() {

        // return username;

        // }

        //

        // public void setUsername(String username) {

        // this.username = username;

        // }

        //

        // public String getPassword() {

        // return password;

        // }

        //

        // public void setPassword(String password) {

        // this.password = password;

        // }

     

        public String checkLogin() {

           System.out.println("登录成功...----");

           // System.out.println("用户名:" + username);

           // System.out.println("密码:" + password);

           // // HttpServletRequest request = ServletActionContext.getRequest ();

           // //获取request

           // Map

           // session=(Map)ActionContext.getContext().get(ActionContext.SESSION);

           // System.out.println("rand:"+session.get("rand"));

           // sysuser = (Sysuser)session.get("sysuser");

           System.out.println("用户名:" + sysuser.getAccount() + "....");

           System.out.println("密码:" + sysuser.getPassword() + "....");

           List sysusers = sysuserService.getSysuser(sysuser.getAccount(), sysuser

                  .getPassword());

           if (sysusers != null && sysusers.size() > 0) {

               return "login_success";

           } else {

               super.addFieldError("feedback", "用户名或密码错误");

               return ERROR;

           }

           // return "login_success";

        }

     

        public String execute() {

           System.out.println("登录成功...----");

           // System.out.println("用户名:" + username);

           // System.out.println("密码:" + password);

           // // HttpServletRequest request = ServletActionContext.getRequest ();

           // //获取request

           // Map

           // session=(Map)ActionContext.getContext().get(ActionContext.SESSION);

           // System.out.println("rand:"+session.get("rand"));

           // sysuser = (Sysuser)session.get("sysuser");

           System.out.println("用户名:" + sysuser.getAccount() + "....");

           System.out.println("密码:" + sysuser.getPassword() + "....");

           List sysusers = sysuserService.getSysuser(sysuser.getAccount(), sysuser

                  .getPassword());

           if (sysusers != null && sysusers.size() > 0) {

               return "login_success";

           } else {

               super.addFieldError("feedback", "用户名或密码错误");

               return ERROR;

           }

        }

     

        // @Override

        // public void validate() {

        // if (username == null || username.equals("")) { //

        // 这种验证,对应返回input这个名的页面,必须在struts.xml中定义<result

        // name="input">/index.jsp</result>这个属性

        // super.addActionError("用户名不能为空");

        // super.addFieldError("feedback", "用户名不能为空");

        // }

        // if (password == null || password.equals("")) {// 这种验证,对应返回input这个名的页面

        // super.addActionError("密码不能为空");

        // super.addFieldError("feedback", "密码不能为空");

        // }

        // }

     

        public static void main(String[] args) {

           // Configuration 负责管理 Hibernate 配置讯息

           Configuration config = new Configuration().configure();

           // 根据 config 建立 SessionFactory

           // SessionFactory 将用于建立 Session

     

           SessionFactory factory = config.buildSessionFactory();

     

           // 开启Session,相当于开启JDBC 的Connection

           Session session = factory.openSession();

     

           Query query = session.createQuery("from Sysuser  where password=?"); // Sysuser是持久化对象,

           query.setParameter(0, "111111");

           List<Sysuser> list = query.list();

     

           for (Sysuser sysuser : list) {

               System.out.println(sysuser.getAccount());

           }

     

           session.close();

        }

     

        public void setSysuserService(ISysuserService sysuserService) {

           this.sysuserService = sysuserService;

        }

     

        public ISysuserService getSysuserService() {

           return sysuserService;

        }

     

        public Sysuser getSysuser() {

           return sysuser;

        }

     

        public void setSysuser(Sysuser sysuser) {

           this.sysuser = sysuser;

        }

     

    }

     

    直接获取,直接读取该对象。


    最新回复(0)