美文网首页技术干货
(七)Struts2进阶之Action接收参数的三种方法

(七)Struts2进阶之Action接收参数的三种方法

作者: 秃头哥编程 | 来源:发表于2018-05-22 00:05 被阅读0次

    我们知道每个Action都会对应一个类,具体在前面实现Action这篇文章讲了。那么这肯定就会涉及到参数传递的问题,因为我们要传递信息啊。除了使用session这一类方法,还有其他三种,总结如下。

    我们使用一个登陆的小例子来说明


    1.使用Action的属性接收参数

    这是最常见的方法,使用代码说明如下。

    @SuppressWarnings("serial")
    public class LoginAction extends ActionSupport {
        private String username;
        private String password;
        public String login() {
            System.out.println(username);
            // ....
            return "success";
        }
        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;
        }
    }
    

    Login.jsp代码如下

    <body>
        <form action="login.action" method="post">
            <!-- name的值注意一下 -->
            username:<input type="text" name="username">
            password:<input type="password" name="password">
            <input type="submit" value="submit">
        </form>
    </body>
    

    在struts.xml中配置Action

    <struts>
        <package>
            <action name="login" class="com.codeliu.action.LoginAction" method="login">
                <result name="success">/success.jsp</result>
            </action>
        </package>
    </struts>
    

    success.jsp代码如下

    <body>
        username:${username}
    </body>
    

    启动项目后,输入信息,会在控制台打印信息,同时success.jsp页面会输出用户名。


    2.使用Domain Model接收参数

    如果用第一个方法的话,如果我们要传递的信息好多,那么势必会造成Action中有很多字段,显得很臃肿,这时我们可以用下面的方法

    新建一个User.java,有一个集合类

    public class User {
        private String username;
        private String password;
        
        private List<String> books;
        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 List<String> getBooks() {
            return books;
        }
        public void setBooks(List<String> books) {
            this.books = books;
        }
    }
    

    然后把LoginAction.java改成如下

    @SuppressWarnings("serial")
    public class LoginAction extends ActionSupport {
        // 封装属性在User类中
        private User user;
        public String login() {
            System.out.println(user.getUsername());
            System.out.println(user.getBooks().get(0));
            // ....
            return "success";
        }
        public User getUser() {
            return user;
        }
        public void setUser(User user) {
            this.user = user;
        }
    }
    

    注意要有set和get方法连接User类。

    Login.jsp也得改,注意输入框的name值,List集合的方式

    <body>
        <form action="login.action" method="post">
            <!-- name的值注意一下 -->
            username:<input type="text" name="user.username">
            password:<input type="password" name="user.password">
            book1:<input type="text" name="user.books[0]">
            book1:<input type="text" name="user.books[1]">
            <input type="submit" value="submit">
        </form>
    </body>
    

    success.jsp的代码改成如下,才能获取参数值

    <body>
        username:${user.username}
    </body>
    

    启动项目,同样能获得用户输入的参数。


    3.使用ModelDriven接口

    第二种方式,我们可以看到,在Login.jsp中,输入框的name值是和对象的实例名联系在一起的,如果我们对象的实例名变了,那么都得重新改一遍,这肯定是不行的。

    现在我们看看使用ModelDriven接口。

    LoginAction.java修改如下

    @SuppressWarnings("serial")
    public class LoginAction extends ActionSupport implements ModelDriven<User>{
        // 封装属性在User类中,记得实例化
        private User user = new User();
        public String login() {
            System.out.println(user.getUsername());
            System.out.println(user.getBooks().get(0));
            // ....
            return "success";
        }
        @Override
        public User getModel() {
            return user;
        }
    }
    

    注意这里的User必须实例化,并且没有set和get方法,只是重写了getModel方法,返回值为User的实例对象。

    修改Login.jsp

    <body>
        <form action="login.action" method="post">
            <!-- name的值注意一下 -->
            username:<input type="text" name="username">
            password:<input type="password" name="password">
            book1:<input type="text" name="books[0]">
            book1:<input type="text" name="books[1]">
            <input type="submit" value="submit">
        </form>
    </body>
    

    注意看此时的name属性的值和实例对象的名称没有联系了。

    同样success.jsp的代码也可以改成如下

    <body>
        username:${username}
    </body>
    

    运行结果还是和上面一样


    总结:虽然第二种方式看起来也挺方便的,但我们推荐第三种。

    相关文章

      网友评论

        本文标题:(七)Struts2进阶之Action接收参数的三种方法

        本文链接:https://www.haomeiwen.com/subject/qorcjftx.html