时间:2017-1-11 11:05

——Struts2中获取请求参数(重点)

1、Struts2是一个MVC框架,那么分别表示什么?
    View:JSP
    Model:Action
    Controller:Action、StrutsPrepareAndExecuteFilter

2、为什么Action既是Model又是Controller?
    因为Action本身可以作为一个JavaBean。

3、在Struts2中获取请求参数有两大种(三小种)方式可以获取:
    1)属性驱动(在Action中添加属性,对Action的属性进行操作)
        *   直接将Action作为一个Model,就可以得到请求参数,也就是将Action作为一个JavaBean,提供get/set方法。
            这种方式底层是通过反射来实现的。
            >   问题1:使用Action封装请求参数,会不会存在线程安全问题?
                不会,每一次请求都会生成一个Action对象。
            >   问题2:使用该方式封装数据,将数据封装到Action属性中,不可能将Action对象传递给业务层。
                需要单独定义JavaBean,将Action属性封装到JavaBean

            示例代码:

                    //属性驱动的第一种方式获取请求参数,直接将Action做为Model
                    public class Login1Action extends ActionSupport {
 
                        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;
                        }
 
                        @Override
                        public String execute() throws Exception {
                            HttpServletRequest request = ServletActionContext.getRequest();
 
                            if ("tom".equals(username) && "123".equals(password)) {
 
                                request.getSession().setAttribute("username", username);
 
                              return SUCCESS;
                            } else {
                                request.setAttribute("login.message", "用户名或密码错误");
                                return "failer";
                            }
                        }
                    }

            实现原理:
                1、首先为Action类提供JavaBean属性,并提供get / set方法
                2、在过滤器中添加如下代码,将请求参数封装到JavaBean中:

                    /*
                     * 在调用invoke()方法前,处理请求参数的封装
                     */
                    Object actionObject = c.newInstance();
                    // 将请求参数封装到Action中(底层也是反射实现的)
                    BeanUtils.populate(actionObject, request.getParameterMap());
                3、在Action中使用属性 

------------------------------------------------------------------------------------------------------------------

        *   创建独立的Model对象,页面通过ognl表达式封装
            >   在Action中声明一个JavaBean对象
            >   private User user;
            >   提供get/set方法:public User getUser()....
            >   在页面中使用ognl表达式:<input type="text" name="user.username" />
            优点:简单,解决了第一种封装的问题。
            缺点:在页面中使用了ognl表达式,与Struts2框架耦合度高。

            示例代码:

                /*

                 * 属性驱动的第二种方式获取请求参数,在Action中声明一个JavaBean
                 * 在表单中的name值需要修改为:
                 *  * name="user.username" name="user.password"
                 *  * <input type="text" name="user.username" />
                 * user表示Action内部封装JavaBean对象的名称
                 * 这是Struts2中提供的一个默认表达式语言:ognl
                 */
                public class Login2Action extends ActionSupport {
                    private User user;
 
                    public User getUser() {
                        return user;
                    }
 
                    public void setUser(User user) {
                        this.user = user;
                    }
 
                    @Override
                    public String execute() throws Exception {
                        HttpServletRequest request = ServletActionContext.getRequest();
 
                        if ("tom".equals(user.getUsername()) && "123".equals(user.getPassword())) {
 
                            request.getSession().setAttribute("username", user.getUsername());
                            return SUCCESS;
                        } else {
                            request.setAttribute("login.message", "用户名或密码错误");
                            return "failer";
                        }
                    }
                }

------------------------------------------------------------------------------------------------------------------

            这种方式底层通过Struts2中的一个interceptor进行了封装:
                <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor" />
                    @Override

                    public String doIntercept(ActionInvocation invocation) throws Exception {
                        Object action = invocation.getAction();
                        if (!(action instanceof NoParameters)) {
                            ActionContext ac = invocation.getInvocationContext();
                            // 相当于request.getParameters(); 
                            final Map<String, Object> parameters = retrieveParameters(ac);
 
                            if (LOG.isDebugEnabled()) {
                                LOG.debug("Setting params " + getParameterLogMap(parameters));
                            }
 
                            if (parameters != null) {
                                Map<String, Object> contextMap = ac.getContextMap();
                                try {
                                    ReflectionContextState.setCreatingNullObjects(contextMap, true);
                                    ReflectionContextState.setDenyMethodExecution(contextMap, true);
                                    ReflectionContextState.setReportingConversionErrors(contextMap, true);
 
                                    ValueStack stack = ac.getValueStack();
                                    // 将参数赋值给Action中的JavaBean 
                                    setParameters(action, stack, parameters);
                                } finally {
                                    ReflectionContextState.setCreatingNullObjects(contextMap, false);
                                    ReflectionContextState.setDenyMethodExecution(contextMap, false);
                                    ReflectionContextState.setReportingConversionErrors(contextMap, false);
                                }
                            }
                        }
                        return invocation.invoke();
                    }

------------------------------------------------------------------------------------------------------------------

    2)模型驱动(在开发中应用比较多)
        使用ModelDriven接口,对请求数据进行封装。
        步骤:
            *   声明一个JavaBean对象并且必须实例化对象。
                >   private User user = new User();
            *   Action类实现ModelDriven接口
                >   public class Login3Action extends ActionSupport implements ModelDriven

            *   重写getModel()方法
                >   public Object getModel() { return this.user; }

        优点:解决了属性驱动存在的问题
            *   不需要将Action封装成JavaBean
            *   解决了在页面中使用ognl表达式的问题
        缺点:一次只能封装一个JavaBean对象,getModel()方法只能返回一个Bean。

        很多关于模型驱动的拦截器都是ModelDriven拦截器操作的:
            com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor

        示例代码:

            /*

             * 使用模型驱动获取请求参数
             */
            public class Login3Action extends ActionSupport implements ModelDriven {
                private User user = new User();
 
                public Object getModel() {
                    return this.user;
                }
 
                public String login() throws Exception {
                    HttpServletRequest request = ServletActionContext.getRequest();
                    System.out.println(user.getUsername() + ": " + user.getPassword());
                    if ("tom".equals(user.getUsername()) && "123".equals(user.getPassword())) {
 
                        request.getSession().setAttribute("username", user.getUsername());
 
                        return "success.jsp";
                    } else {
                        request.setAttribute("msg", "用户名或密码错误");
                        return "login.jsp";
                    }
                }
            }

        实现原理:
            1、在Action中声明一个初始化的JavaBean对象。
            2、实现ModelDriven接口
            3、重写getModel()方法
            4、在拦截器中实现如下代码:

                /*
                 * 模型驱动
                 */
                // 得到HelloAction类中声明的User对象
                Object actionObject = c.newInstance();
 
                // 判断HelloAction是否实现了MyModelDriven接口
                if(actionObject instanceof MyModelDriven){
                    // 将子类强转成父类
                    MyModelDriven model = (MyModelDriven)actionObject;
 
                    // 获取HelloAction内部的User对象,然后把请求参数封装到User对象中
                    BeanUtils.populate(model.getModel(), request.getParameterMap());
                } else {
                    // 1、属性驱动
                    actionObject = c.newInstance();
                    // 将请求参数封装到Action中(底层也是反射实现的)
                    BeanUtils.populate(actionObject, request.getParameterMap());
                }

——将请求参数封装到集合(了解)

原理:使用ognl表达式实现。

1、将数据封装到List集合
    页面:
        用户名1:<input type="text" name="users[0].username" /><br/>

        密    码1:<input type="password" name="users[0].password" /><br/>
 
        用户名2:<input type="text" name="users[1].username" /><br/>
        密    码2:<input type="password" name="users[1].password" /><br/>

Action类:
        private List<User> users;
        get / set方法

2、将数据封装到Map集合
    页面:
        用户名1:<input type="text" name="users['aaa'].username" /><br/>

        密    码1:<input type="password" name="users['aaa'].password" /><br/>
 
        用户名2:<input type="text" name="users['bbb'].username" /><br/>
        密    码2:<input type="password" name="users['bbb'].password" /><br/>

    Action类:
        private Map<String, User> users;
        get / set方法


——总结

1、Action接收请求参数

*   关于Struts2中的MVC
    *   属性驱动
        >   直接将Action作为JavaBean。
        >   Action中封装JavaBean,在页面上需要使用ognl表达式来给组件起名。
    *   模型驱动
        >   让Action实现ModelDriven接口,重写getModel()方法实例化一个JavaBean对象,该方法返回的就是实例化的JavaBean对象。
    *   关于请求参数封装到集合
        >   List
        >   Map

Struts2之处理请求参数的更多相关文章

  1. struts2 action接收请求参数和类型转换

    1,action接收请求参数 在struts2中action是什么?(struts2是一个mvc框架)         V:jsp        M:action         C:action  ...

  2. struts2框架之请求参数(参考第二天学习笔记)

    获取请求参数 请求参数:表单中的数据,或者是超链接中的数据. 1. 得到request,再通过request来获取.2. 属性驱动 在Action中提供与表单字段名称相同的属性即可. 而一个名为par ...

  3. struts2-Action处理请求参数

    struts2 和 MVC 定义关系 StrutsPrepareAndExecuteFilter : 控制器 JSP : 视图 Action : 可以作为模型,也可以是控制器 struts2 Acti ...

  4. Struts2请求参数校验

    校验的分类 客户端数据校验 和 服务器端数据校验 客户端数据校验 ,通过JavaScript 完成校验 (改善用户体验,使用户减少出错 ) 服务器数据校验 ,通过Java代码 完成校验 struts2 ...

  5. 请求参数到表述层的类型转换——Struts2

    一.简介 说明:HTTP 协议传输数据没有类型的概念,在服务器端是通过 request.getParameter().request.getParameterValue() 方法得到请求参数为 Str ...

  6. struts2视频学习笔记 11-12(动态方法调用,接收请求参数)

    课时11 动态方法调用 如果Action中存在多个方法时,可以使用!+方法名调用指定方法.(不推荐使用) public String execute(){ setMsg("execute&q ...

  7. 十一、Struts2封装请求参数的方式

    十一.Struts2封装请求参数的方式 方式一.Action 本身作为model对象,通过成员setter封装(一个名字为params的拦截器干的) 注意:表单中的名称要和动作类中的名称一致(这是必须 ...

  8. struts2之请求参数接收

    struts2之请求参数接收 1. 采用基本类型接受请求参数(get/post)在Action类中定义与请求参数同名的属性,struts2便能自动接收请求参数并赋予给同名的属性.请求路径:http:/ ...

  9. struts2获取请求参数的三种方式及传递给JSP参数的方式

    接上一篇文章 package test; import com.opensymphony.xwork2.ActionSupport; import javax.servlet.http.*; impo ...

随机推荐

  1. Apache HBase 1.7.1 发布,分布式数据库

    Apache HBase 是一个开源的.分布式的.版本化的.非关系的数据库.Apache HBase 提供对数十亿个数据的低延迟随机访问在非专用硬件上有数百万列的行. 关于 HBase更多内容,请参阅 ...

  2. Springboot中注解@Configuration源码分析

    Springboot中注解@Configuration和@Component的区别 1.先说结论,@Configuration注解上面有@Component注解,所以@Component有的功能@Co ...

  3. R在ubuntu16.04上环境搭建

    1.R安装 sudo apt-get update sudo apt-get remove vim-common sudo apt-get install vimapt-cache show r-ba ...

  4. Guava - Set集合

    当我们在统计一个字符串中每个单词出现的次数时,通常的做法是分割字符串,遍历字符串,然后放到一个map里面,来进行统计,Guava中提供了类似功能的集合,Multiset String strWorld ...

  5. XIN队算法

    XIN队算法 注:名称由莫队算法改编而来 从luogu搬过来了... \(newly\;upd:2021.7.8\) \(newly\;upd:2021.6.6\) OI至高算法,只要XIN队算法打满 ...

  6. Pelles C编译时出现的“POLINK: fatal error: 拒绝访问”问题的一种可能成因

    在使用PellesC编译程序时,第一遍能正常编译执行,第二遍就无法编译,出现以下问题提示: Building NEWprogram2.exe. POLINK: fatal error: 拒绝访问. * ...

  7. python3实现名片管理系统(文件版)

    def menu(): #首先定义功能列表函数menu() print(" 名片管理系统 V1.0 ") print("1:增加新用户") print(&quo ...

  8. jvm源码解读--10 enum WKID 枚举

    源码中对于枚举类型WKID的使用 static bool initialize_wk_klass(WKID id, int init_opt, TRAPS); static void initiali ...

  9. SQL SERVER Date列和Time列合并成一列处理报表数据

    问题原由: intouch项目中,利用intouch脚本来存储数据时,存入的时间格式为:date,time分开存储.在报表需求中,有需要利用查询两个时间段之间的数据. 问题解决: 1.直接写脚本(写出 ...

  10. SAS 常用字符串函数

    原文链接:https://www.cnblogs.com/snoopy1866/p/15085466.html CAT(item-1 <, -, item-n>) : 在保留首尾空格的情况 ...