zoukankan      html  css  js  c++  java
  • 学习笔记之Struts2—浅析接收参数

    最近自己通过视频与相关书籍的学习,对action里面接收参数做一些总结与自己的理解。

    0.0、接收参数的(主要)方法

     

    1. 使用Action的属性接收参数
    2. 使用DomainModel接收参数
    3. 使用ModelDriven接收参数

    1.1、使用Action的属性接收参数

    本文以最简单的表单提交为例:

      1.1.1.建立login.jsp页面

      

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <form action="loginAction.action" method="post">
        用户名:<input type="text" name="username">
        密码:<input type="password" name="password">
        <input type="submit">
    </form>
    </body>
    </html>

      1.1.2.创建loginAction

      

    package com.zzh.action;
    
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class loginAction extends ActionSupport {
    
        private static final long serialVersionUID = 1L;
        
    
        private String username;
        private String password;
        
        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 login(){
            System.out.println(username);
            return SUCCESS;
        }
    }

    注意:System.out.println(username);后面可以做一些逻辑处理

      1.1.3.配置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>
            <package name="login" extends="struts-default" namespace="/">
                <action name="loginAction" method="login" class="com.zzh.action.loginAction">
                    <result name="success">/success.jsp</result>
                </action>
            </package>    
        </struts>

      1.1.4.创建success.jsp页面

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    你好!六月的余晖
    </body>
    </html>

    1.1.5.启动tomcat服务器,测试是否能接收

    打开网页输入http://localhost:8080/zzh/login.jsp

    输入用户名与密码提交。。。

    这时后台显示用户名

    页面跳转为

    1.2、使用DomainModel接收参数

    对于java而言,它是一种面向对象的语言,我们会发现将大量的属性直接放在loginaction中显得太过臃肿,于是,我们需要用一个对象来作为这些属性的容器,也就是将这些属性放在对象中,这时我们便可以使用DomainModel来进行。

      1.2.1.新建对象User

    将loginaction.java中的属性username与password删去,相应的getter和setter方法也删去。

    然后在User.java中

    package com.zzh.us;
    
    
    public class User {
    
        private String username;
    
        private String password;
        
    
        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;
        }
        
    }

    接着在LoginAction中声明User

    注意login()方法中要用user.getUsername()

    package com.zzh.action;
    
    
    import com.zzh.us.User;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class loginAction extends ActionSupport{
    
        private static final long serialVersionUID = 1L;
        
        private User user;
        
        public User getUser() {
            return user;
        }
    
        public void setUser(User user) {
            this.user = user;
        }
        
        public String login(){
            System.out.println(user.getUsername());
            return SUCCESS;
        }
    }

      1.2.2.指定login.jsp页面需要明确属性所属对象

    当我们有多个对象时,每个对象都有参数,而login.jsp传过来的参数没有明确对象,这时便会出现混乱。

    所以我们在login.jsp中必须明确对象。

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <form action="loginAction.action" method="post">
        用户名:<input type="text" name="user.username">
        密码:<input type="password" name="user.password">
        <input type="submit">
    </form>
    </body>
    </html>

      1.2.3.重启服务器,测试

    结果与上个方法所得 一致。

    1.3、使用ModelDriven接收参数

    ModelDriven也叫模型驱动,通过实现ModelDriven接口来接收表单数据,首先Action类必须实现ModelDriven接口,同样把表单传过来的数据封装起来,Acting类中必须实例化该对象,并且要重写getModel()方法,这个方法返回的就是Action所使用的数据模型对象。

      1.3.1.Action类中实现ModelDriven接口

      实现ModelDriven接口,将我们需要赋值转换的类(User)设置为ModelDriven的泛型,然后添加实现此接口的方法getModel()。此时,getModel()中返回的是我们需要转换的对象(user)。当然,使用了ModelDriven,我们的对于user对象的getter,setter方法需要去掉,并将user对象实例化即:user = new User();

    package com.zzh.action;
    
    
    import com.zzh.us.User;
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.ModelDriven;
    
    public class loginAction extends ActionSupport implements ModelDriven<User>{
    
        private static final long serialVersionUID = 1L;
        
        
        private User user = new User();
        
        public String login(){
            System.out.println(user.getUsername());return SUCCESS;
        }
        
        @Override
        public User getModel() {
            
            return user;
        }
    
    }

      1.3.2.login.jsp中去除属性前缀

    注意:使用了ModelDriven的方式,一个Action只能对应一个Model,因此在login.jsp中不需要添加user前缀,页面上的username对应到这个Model的username属性。

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <form action="loginAction.action" method="post">
        用户名:<input type="text" name="username">
        密码:<input type="password" name="password">
        <input type="submit">
    </form>
    </body>
    </html>

      1.3.2.重启服务器,测试

    结果与前面一致。

    2.0 传递数据集

     在通常情况下,我们需要传递的参数不只是单一的字符串,更多的是数据集。

      2.0.1.User中添加属性List<String>

      

    package com.zzh.us;
    
    import java.util.List;
    
    public class User {
        private String username;
        
            private String password;
        
        
        private List<String> bookList;
        
        
        public List<String> getBookList() {
            return bookList;
        }
        public void setBookList(List<String> bookList) {
            this.bookList = bookList;
        }
        
        
    
        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;
        }
        
    }
        

      2.0.2.login.jsp中增加两条记录给List<String>赋值

      我们可以通过booklist[0]与booklist[1]来作为name。

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <form action="loginAction.action" method="post">
        用户名:<input type="text" name="username">
        密码:<input type="password" name="password">
        书籍1:<input type="text" name="bookList[0]">
        书籍2:<input type="text" name="bookList[1]">
        <input type="submit">
    </form>
    </body>
    </html>

      2.0.3.在Action类中添加后台打印验证接收到的参数

    package com.zzh.action;
    
    
    import com.zzh.us.User;
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.ModelDriven;
    
    public class loginAction extends ActionSupport implements ModelDriven<User>{
    
        private static final long serialVersionUID = 1L;
        
    
        private User user = new User();
        
        public String login(){
            System.out.println(user.getUsername());
            System.out.println(user.getBookList().get(0));
            System.out.println(user.getBookList().get(1));
            return SUCCESS;
        }
        
        @Override
        public User getModel() {
            
            return user;
        }
    
    }

      2.0.4.重启服务器,验证后台是否接收

      

    跳转至 你好!六月的余晖页面,控制台输出:

    2.1.1.User中添加属性List<User>

    如果将泛型中的字符串改为对象,也就是说不再是一个简单的类型

    package com.zzh.us;
    
    import java.util.List;
    
    public class User {
        private String username;
    
        private String password;
        
        private List<User> bookList;
        
        public List<User> getBookList() {
            return bookList;
        }
        public void setBookList(List<User> bookList) {
            this.bookList = bookList;
        }
        
        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;
        }
        
    }

    2.1.1.更改login.jsp页面的name值

    此时的bookList【】中已经不是字符串,而是一个对象,也就是说书籍的名称在bookList中的一个属性,所以需要加后缀.username

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <form action="loginAction.action" method="post">
        用户名:<input type="text" name="username">
        密码:<input type="password" name="password">
        书籍1:<input type="text" name="bookList[0].username">
        书籍2:<input type="text" name="bookList[1].username">
        <input type="submit">
    </form>
    </body>
    </html>

    2.1.2.Action类中的后台输出

    此时后台输出user.getBookList().get(0)得到的是User对象,所以还需要增加后缀.getUsername()。

    package com.zzh.action;
    
    
    import com.zzh.us.User;
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.ModelDriven;
    
    public class loginAction extends ActionSupport implements ModelDriven<User>{
    
        private static final long serialVersionUID = 1L;
        
    
        private User user = new User();
        
        public String login(){
            System.out.println(user.getUsername());
            System.out.println(user.getBookList().get(0).getUsername());
            System.out.println(user.getBookList().get(1).getUsername());
            return SUCCESS;
        }
        
        @Override
        public User getModel() {
            
            return user;
        }
    
    
    }
             

    2.1.3.启动服务器,测试

    3.小结  总之三种方法给有优缺点,应根据不同情况选择使用。总算是写完了,自己第一篇博客,如果你觉得对你有帮助的话,请麻烦点赞或关注我,谢谢观看!

    作者:六月的余晖
    出处:http://www.cnblogs.com/zhaozihan/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。

  • 相关阅读:
    ios 设置本地化显示的app名称
    iOS 统一配置
    iPhoneX && iOS11 适配
    手机如何和电脑 无线连接 使用adb命令配合连接
    使用adb命令查看APP包名 和 包入口方法
    Charles下载及安装破解-自己编辑
    修改表里面里面的 所有账号的密码
    Xshell6会话管理器无意中关闭,在哪里打开
    工作中常用的Linux命令
    使用adb命令连接模拟器且安装apk
  • 原文地址:https://www.cnblogs.com/zhaozihan/p/5672992.html
Copyright © 2011-2022 走看看