zoukankan      html  css  js  c++  java
  • struts2的使用入门

    虽然说Struts2现在已经被SpringMVC框架淘汰了,据说是有很多安全漏洞。但是Struts2作为一个成熟的MVC框架,还是有必要了解一下的,好歹是曾经风光一时的前辈,老祖宗的东西不能丢下,里面有很多设计思想都是值得借鉴的。

    哈哈哈,前面说的话逼格是不是很高,连我自己都不信。其实是因为最近在维护SSH(Struts2+Spring+Hibernate)框架写的老项目啦,其中有些代码甚至可以追溯到2004年,简直666。虽然是年代久远的祖传代码,很不愿意维护,但是工作(恰饭)要紧,还是要稍微学习一下Struts2的使用,轻装上阵。

    Struts2编写Action的三种方式

    1.创建普通类。

    自己创建的普通类需要人为定义常量SUCCESS,而且没有表单校验等功能,需要自己编写代码实现。

    package com.test.struts2;
     
    public class TestAction {
        public String execute() {
            return "success";
        }
     
        public String add() {
            return "success";
        }
     
        public String delete() {
            return "error";
        }
    }

    2.实现Action接口。

    Action接口中定义了常量SUCCESS。

    package com.test.struts2;
     
    import com.opensymphony.xwork2.Action;
     
    public class TestAction1 implements Action {
        @Override
        public String execute() throws Exception {
            // TODO Auto-generated method stub
            return SUCCESS;
        }
     
        public String add() {
            // System.out.println("我是add()");
            return SUCCESS;
        }
    }

    3.继承ActionSupport类(最常用)。

    ActionSupport类其实是实现了Action接口的,其中封装的功能较多,实现了表单验证及常量SUCCESS的定义等。

    package com.test.struts2;
     
    import com.opensymphony.xwork2.ActionSupport;
     
    public class TestAction2 extends ActionSupport {
        public String execute() {
            return SUCCESS;    
        }
    }

    Struts2访问Action的三种方式

    1.访问action默认调用execute()方法。比如说有一个TestAction2,访问localhost:8080/test2就会调用execute()方法。如果要调用action中的其他方法,需要使用【!】符号,比如另外有一个laugh()方法,就可以通过访问localhost:8080/test2!laugh进行调用。

    <!-- 继承ActionSupport类,默认的method调用execute() -->
    <package name="test2" extends="struts-default" namespace="/test2">
        <action name="test2" class="com.test.struts2.TestAction2">
            <result>/test2.jsp</result>
        </action>
    </package>

    2.在action标签中配置method属性。

    <!-- 实现Action接口,method属性实现请求 -->
    <package name="test1" extends="struts-default" namespace="/test1">
        <action name="test1" class="com.test.struts2.TestAction1" method="add">
            <result>/test1.jsp</result>
        </action>
    </package>

    3.通配符访问。比如localhost:8080/test_方法名。

    <!-- 普通类实现Action接口,method用通配符实现请求 -->
    <package name="test" extends="struts-default" namespace="/test">
        <action name="test_*" class="com.test.struts2.TestAction" method="{1}">
            <result name="success">/test1.jsp</result>
            <result name="error">/test2.jsp</result>
        </action>
    </package>

    Struts2获取前台参数的三种方式

    这里使用form表单提交作为例子,当然使用ajax提交都可以。

    1.属性驱动。

    在Action中定义属性,确保所定义的属性名称与Form表单中的name属性一致,适用于属性个数较少的情况。

    <form action="login" method="post>
        用户名:<input type="text" name="username"/><br/>
        密码:<input type="password" name="password"/><br/>
        <button type="submit" name="login">登录</button>
    </form>
    public class LoginAction extends ActionSupport {
        // 属性驱动,需要input中name属性值相同(属性个数较少情况)
        private String username;
        private String password;
        
        public void setUsername(String username) {
            this.username = username;
        }
     
        public String getPassword() {
            return password;
        }
     
        public void setPassword(String password) {
            this.password = password;
        }
     
        public String login() {
            if ("yanggb".equals(username) && "123".equals(password)) {
                return SUCCESS;
            }
        }
    }

    2.对象驱动。

    创建一个对象实例,将表单定义的属性匹配给所定义的对象,即以对象为单位,用对象获取属性,方便属性较多的情况。

    <form action="login" method="post>
        用户名:<input type="text" name="user.username"/><br/>
        密码:<input type="password" name="user.password"/><br/>
        <button type="submit" name="login">登录</button>
    </form>
    public class LoginAction extends ActionSupport {
        // 对象驱动,input中name属性要以【对象.属性】格式组织
        private User user;
        
        public User getUser() {
            return user;
        }
    
        public void setUser(User user) {
            this.user = user;
        }
     
        public String login() {
            if ("yanggb".equals(user.username) && "123".equals(user.password)) {
                return SUCCESS;
            }
        }
    }

    3.模型驱动。

    模型驱动是对象驱动的升级,实现ModelDriven<User>接口,人为将一个对象User作为一个Model,将View层和Controller层关联起来。这样,View就能实现表单属性的匹配,同时也能知道Controller层的功能。只要使用getModel()返回对象user匹配model中的属性即可,页面不需要对象。

    <form action="login" method="post>
        用户名:<input type="text" name="username"/><br/>
        密码:<input type="password" name="password"/><br/>
        <button type="submit" name="login">登录</button>
    </form>
    public class LoginAction extends ActionSupport implements ModelDriven<User> {
        private User user;
        
        public User getUser() {
            return user;
        }
    
        public void setUser(User user) {
            this.user = user;
        }
     
        public String login() {
            if ("yanggb".equals(user.username) && "123".equals(user.password)) {
                return SUCCESS;
            }
        }
    
        @override
        public User getModel() {
            // TODO Auto-generated method stub
            // 得到model对象user(自动匹配model里面的属性,不用再在form的name属性中写具体对象)
            return user;
        }
    }

    要注意的是,当属性驱动与模型驱动同时存在的时候,不会执行属性驱动方法,而是直接执行模型驱动来获取参数。

    "有些话,说不出,则予以轻描。有些事,挥不去,便赋以淡写。"

  • 相关阅读:
    待整理[图片验证码的破解]
    关于反爬的思索[集合]
    关于showdoc的服务器部署[转]
    jQuery插件实现多图片和单图片上传
    FTP 图片上传
    多线程(临界点处理)
    Python可迭代对象、迭代器和生成器
    一文搞懂Python函数(匿名函数、嵌套函数、闭包、装饰器)!
    Python比较操作符、变量赋值、对象拷贝
    Python并发编程——多线程与协程
  • 原文地址:https://www.cnblogs.com/yanggb/p/11149172.html
Copyright © 2011-2022 走看看