时间: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. C#/.NET/.NET Core学习视频汇总(持续更新ing)

    前言: 之前有很多小伙伴在我的公众号后台留言问有没有C#/.NET/.NET Core这方面相关的视频推荐,我一般都会推荐他们去B站搜索一下.今天刚好有空收集了网上一些比较好的C#/.NET/.NET ...

  2. 【动画消消乐】HTML+CSS 自定义加载动画:怦然心跳 066

    前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出-   自我介绍 ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计 ...

  3. 八大排序算法~冒泡排序【加变量flag的作用】

    八大算法~冒泡排序[加变量flag的作用] 1,冒泡排序思想:从第一个数开始找,要把大数"排除在外"~为大数找后座.(从小到大排序哈) 外层循环~需要放后的大数个数: 内循环~从第 ...

  4. sql语句优化(持续更新)

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引.2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引 ...

  5. spring boot+mybatis plus出现Invalid bound statement (not found)

    qlSessionFactory不要使用原生的,请使用MybatisSqlSessionFactory

  6. sessionfilter中的拦截项判断

  7. 【阅读笔记】Java核心技术卷一 #0

    这是一篇备忘性质的读书笔记,仅记录个人觉得有用的知识点 本文作为一个目录索引,部分章节跳过 吐槽:此书中文翻译有不少地方不太通顺,这种情况我要把英文版对应的部分也读一遍才能明白(说实话,英文里的从句表 ...

  8. java方法基础

    java方法基础 方法的定义与调用 方法是命名的语句的有序集,是解决一类问题的步骤的有序组合. 方法包含于类或者是对象中,方法在程序中被创建,在其他地方被引用. 组成:方法是由方法头和方法体两部分组成 ...

  9. Discuz 7.x/6.x 全局变量防御绕过导致代码执行

    地址 http://192.168.49.2:8080/viewthread.php?tid=13&extra=page%3D1 安装成功后,找一个已存在的帖子,向其发送数据包,并在Cooki ...

  10. Spring Cloud分区发布实践(6)--灰度服务-根据Header选择实例区域

    此文是一个完整的例子, 包含可运行起来的源码. 此例子包含以下部分: 网关层实现自定义LoadBalancer, 根据Header选取实例 服务中的Feign使用拦截器, 读取Header Feign ...