• SSH框架之Struts2第二篇


    1.2 知识点
            1.2.1 Struts2的Servlet的API的访问
                1.2.1.1 方式一 : 通过ActionContext实现
                    页面:
                    <h1>Servlet的API的访问方式一:解耦合的方式</h1>
                    <form action="${ pageContext.request.contextPath }/requestDemo1.action" method="post">
                        姓名:<input type="text" name="name"/><br/>
                        年龄:<input type="text" name="age"><br/>
                        <input type="submit" value="提交">
                    </form>
                    编写Action
                    /**
                     * Servlet的API的访问方式一:解耦合的方式
                     *     * 只能用于接收参数 和 操作域中的数据
                     * @author jt
                     */
                    public class RequestDemo1Action extends ActionSupport{
    
                        @Override
                        public String execute() throws Exception {
                            // 接收数据:
                            /**
                             * 在ActionContext中提供了一些方法:操作域对象的数据
                             *     * Map<String,Object> getParameters();
                             *     * Map<String,Object> getSession();
                             *  * Map<String,Object> getApplication();
                             */
                            // 接收参数:
                            ActionContext actionContext = ActionContext.getContext();
                            Map<String,Object> map = actionContext.getParameters();
                            for (String key : map.keySet()) {
                                String[] arrs = (String[]) map.get(key);
                                System.out.println(key+"    "+Arrays.toString(arrs));
                            }
                            // 向request域中存值:
                            actionContext.put("reqName", "req如花");
                            
                            // 向session域中存值:
                            actionContext.getSession().put("sessName", "sess凤姐");
                            
                            // 向application域中存值:
                            actionContext.getApplication().put("appName","app石榴");
                            return SUCCESS;
                        }
                    }
            
                1.2.1.2 方式二: 实现特定接口的方式实现:
                    在struts中提供了一些接口 : ServletRequestAware,ServletResponseAware,ServletContextAware;
                    页面:
                    <h1>Servlet的API的访问方式二:实现特定接口的方式</h1>
                    <form action="${ pageContext.request.contextPath }/requestDemo2.action" method="post">
                        姓名:<input type="text" name="name"/><br/>
                        年龄:<input type="text" name="age"><br/>
                        <input type="submit" value="提交">
                    </form>
            
                    编写Action:
                    /**
                     * Servlet的API的访问方式二:
                     * @author jt
                     *
                     */
                    public class RequestDemo2Action extends ActionSupport implements ServletRequestAware,ServletContextAware{
    
                        private HttpServletRequest request;
                        private ServletContext application;
    
                        @Override
                        public String execute() throws Exception {
                            // 接收数据:使用request对象。
                            Map<String, String[]> parameterMap = request.getParameterMap();
                            for (String key : parameterMap.keySet()) {
                                String[] arrs = parameterMap.get(key);
                                System.out.println(key+"   "+Arrays.toString(arrs));
                                
                            }
                            // 向域中保存数据;
                    //        向request域中保存数据
                            request.setAttribute("reqName", "r郝三");
                             // 向session域中保存数据
                            request.getSession().setAttribute("sessName", "s李四");
                            // 向application域中保存数据
                            application.setAttribute("appName", "a王五");
                            return NONE;
                        }
    
                        @Override
                        public void setServletRequest(HttpServletRequest request) {
                            this.request =  request;
                        }
                        
                        @Override
                        public void setServletContext(ServletContext application) {
                            this.application = application;
                        }
                    }
                1.2.1.3方式 : 通过ServletActionContext对象的静态方法实现 :
                    页面:
                    <h1>Servlet的API的访问方式三:通过ServletActionContext对象静态方法获取</h1>
                    <form action="${ pageContext.request.contextPath }/requestDemo3.action" method="post">
                        姓名:<input type="text" name="name"/><br/>
                        年龄:<input type="text" name="age"><br/>
                        <input type="submit" value="提交">
                    </form>
                    编写Action:
                    /**
                     * Servlet的API访问方式三:通过ServletActionContext的静态方法访问
                     * @author jt
                     *
                     */
                    public class RequestDemo3Action extends ActionSupport {
                        public String execute() throws Exception {
                            //接收参数:
                            /*
                            ServletActionContext 在struts2的API中的 : 
                            HttpServletRequest getRequest();
                            HttpServletResponse getResponse();
                            ServletContext getServletContext();
                            
                            */
                            HttpServletRequest request = ServletActionContext.getRequest();
                            Map<String,String[]> parameterMap = request.getParameterMap();
                            for(String key : parameterMap.get()) {
                                String[] value = parameterMap.get(Key);
                                System.out.println(key + "  " + Arrays.toString(value));
                            }
                            
                            //向域中存值 : 
                            request.setAttribute("reqName" , "用request向域中存数据");
                            request.getSession.setAttribute("session","向session域中存数据");
                            ServletActionContext.getServletContext().setAttribute("ServletContext","向ServletContext域中存储数据");
                            return super.execute();
                            
                        }
                    }
            
                1.2.2.1 :结果页面的分类 : 
                    全局结果页面 :
                        针对一个包下所有的action都生效的一个页面.
                        <!--全局结果页面-->
                        <global-results>
                            <result>/jsp/1.jsp</result>
                        </global-results>
                    局部结果页面 :
                        针对某一个action生效的一个页面 : 
                        <action name="requestDemo1" class="com.baidu.struts2.demo1.ActionDemo1">
                        <result>/jsp/1.jsp</result>
                        </action>
                
                1.2.2.2 配置结果页面 :
                    <result>标签配置:
                        name : 逻辑视图的名称.默认值是success.
                        type : 
                            dispatcher         : 默认值,转发.(转发到jsp的页面)
                            redirect         : 重定向.(重定向到JSP的页面),被跳转的页面中丢失传递的信息.
                            chain               : 转发到另一个Action.
                            redirectAction  : 重定向到另一个Action.跳转的页面中丢失传递的信息
                            stream             : 文件的下载
                
                1.2.2.3 Struts2的多例性 : 
                        原来的Servlet是单例存在,多次请求,请求都是同一个Servlet的实例.Struts2中Action是多实例的.有异常请求就会有一个Action的实例.
                    现在可以在Action中定义成员属性了.
                    
                    大部分我们会优先使用模型驱动的方式,因为Struts2内部有很多结果是围绕模型驱动设计的。但如果页面向多个对象中封装,那么就需要使用属性驱动的方式二了。
                    这些都是像某个对象中封装数据,
    
            1.2.3 Struts2的数据封装 :
                1.2.3.1 Struts2中的数据封装-属性驱动 : 
                    提供对应属性的set方法的方式 :
                        页面:
                        <h3>数据封装的方式一:提供属性的set方法的方式</h3>
                        <form action="${ pageContext.request.contextPath }/employee1Action.action" method="post">
                            姓名:<input type="text" name="name"/><br/>
                            年龄:<input type="text" name="age"/><br/>
                            性别:<input type="text" name="sex"/><br/>
                            工资:<input type="text" name="salary"/><br/>
                            <input type="submit" value="提交"/>
                        </form>
                        编写Action:
                        /**
                         * 数据封装的方式一:提供set方法的方式
                         * @author jt
                         *
                         */
                        public class Employee1Action extends ActionSupport{
                            private String name;
                            private Integer age;
                            private String sex;
                            private Double salary;
                            
                            public void setName(String name) {
                                this.name = name;
                            }
    
                            public void setAge(Integer age) {
                                this.age = age;
                            }
    
                            public void setSex(String sex) {
                                this.sex = sex;
                            }
    
                            public void setSalary(Double salary) {
                                this.salary = salary;
                            }
    
                            @Override
                            public String execute() throws Exception {
                                System.out.println("员工姓名:"+name);
                                System.out.println("员工年龄:"+age);
                                System.out.println("员工性别:"+sex);
                                System.out.println("员工工资:"+salary);
                                // 手动封装数据:
                                Employee employee = new Employee();
                                employee.setName(name);
                                employee.setAge(age);
                                employee.setSex(sex);
                                employee.setSalary(salary);
                                
                                
                                return NONE;
                            }
                        }
                        这种方式不是特别常用,因为需要手动封装数据,而且如果属性很多,提供很多的set方法,导致Action类易读性变差
            
                    页面中提供表达式的方式:
                        页面:
                        <h3>数据封装的方式二:页面提供OGNL表达式的写法</h3>
                        <form action="${ pageContext.request.contextPath }/employee2Action.action" method="post">
                            姓名:<input type="text" name="employee.name"/><br/>
                            年龄:<input type="text" name="employee.age"/><br/>
                            性别:<input type="text" name="employee.sex"/><br/>
                            工资:<input type="text" name="employee.salary"/><br/>
                            <input type="submit" value="提交"/>
                        </form>
                        编写Action:
                        /**
                         * 数据封装的方式二:页面提供表达式的方式
                         * @author jt
                         *
                         */
                        public class Employee2Action extends ActionSupport{
                            // 提供成员的属性employee,必须提供属性的get和set方法
                            private Employee employee;
                            
                            public Employee getEmployee() {
                                return employee;
                            }
                            public void setEmployee(Employee employee) {
                                this.employee = employee;
                            }
    
                            @Override
                            public String execute() throws Exception {
                                System.out.println(employee);
                                return NONE;
                            }
                        }
            
                1.2.3.2 Struts2 中的数据封装-模型驱动 :
                    采用模型驱动完成数据封装(推荐)
                    页面:
                    <h3>数据封装的方式三:采用模型驱动的方式</h3>
                    <form action="${ pageContext.request.contextPath }/employee3Action.action" method="post">
                        姓名:<input type="text" name="name"/><br/>
                        年龄:<input type="text" name="age"/><br/>
                        性别:<input type="text" name="sex"/><br/>
                        工资:<input type="text" name="salary"/><br/>
                        <input type="submit" value="提交"/>
                    </form>
                    编写Action:
                    /**
                     * 数据封装的方式三:采用模型驱动的方式
                     * @author jt
                     *
                     */
                    public class Employee3Action extends ActionSupport implements ModelDriven<Employee>{
                        // 模型驱动使用的对象:必须手动构建对象的实例。
                        private Employee employee = new Employee();
                        @Override
                        public Employee getModel() {
                            return employee;
                        }
                        @Override
                        public String execute() throws Exception {
                            System.out.println(employee);
                            return NONE;
                        }
                    }
                    ***** 模型驱动只能向一个实体中封装数据,如果需要向多个实体封装数据优先采用第二种方式。
            1.2.4 Struts2 的复杂数据的封装 :
                1.2.4.1 封装到List集合 :
                    页面:
                    <form action="${ pageContext.request.contextPath }/product1Action.action" method="post">
                        商品名称:<input type="text" name="list[0].name"/><br/>
                        商品价格:<input type="text" name="list[0].price"/><br/>
                        商品名称:<input type="text" name="list[1].name"/><br/>
                        商品价格:<input type="text" name="list[1].price"/><br/>
                        商品名称:<input type="text" name="list[2].name"/><br/>
                        商品价格:<input type="text" name="list[2].price"/><br/>
                        <input type="submit" value="批量导入"/>
                    </form>
                    Action:
                    /**
                     * 封装复杂的数据到List集合中。
                     * @author jt
                     *
                     */
                    public class Product1Action extends ActionSupport{
                        private List<Product> list;
                        
                        public List<Product> getList() {
                            return list;
                        }
    
                        public void setList(List<Product> list) {
                            this.list = list;
                        }
    
                        @Override
                        public String execute() throws Exception {
                            for (Product product : list) {
                                System.out.println(product);
                            }
                            return NONE;
                        }
                    }
            
                1.2.4.2 封装到Map集合
                    页面:
                    <h1>批量插入商品:封装到Map集合</h1>
                    <form action="${ pageContext.request.contextPath }/product2Action.action" method="post">
                        商品名称:<input type="text" name="map['one'].name"/><br/>
                        商品价格:<input type="text" name="map['one'].price"/><br/>
                        商品名称:<input type="text" name="map['two'].name"/><br/>
                        商品价格:<input type="text" name="map['two'].price"/><br/>
                        商品名称:<input type="text" name="map['three'].name"/><br/>
                        商品价格:<input type="text" name="map['three'].price"/><br/>
                        <input type="submit" value="批量导入"/>
                    </form>
                    Action:
                    /**
                     * 复杂类型数据封装:封装到Map集合
                     * @author jt
                     *
                     */
                    public class Product2Action extends ActionSupport {
                        private Map<String,Product> map;
                        
                        public Map<String, Product> getMap() {
                            return map;
                        }
    
                        public void setMap(Map<String, Product> map) {
                            this.map = map;
                        }
    
                        @Override
                        public String execute() throws Exception {
                            for (String key : map.keySet()) {
                                Product product = map.get(key);
                                System.out.println(key+"   "+product);
                            }
                            return NONE;
                        }
                    }
            
    随堂笔记 :    
            1 strtus2对servlet API的访问
    
             1  使用ServletActionContext类的静态方法(重要)
                        
             2  使用ActionContext对象的方法(理解)往域中存储数据,到页面展示(ps:这个对象获取不到域对象,只能操作域中的数据)
                        静态方法getContext()获取ActionContext对象
    
                    特点: 只能接受页面的数据,以及对域中数据的进行操作
    
                           获取不response对象做不了响应,也获取不到域对象
                            使用ActionContext对象的方法(理解)
                        // getContext()  --获取ActionContext对象
                        // Map<String,Object> ----- getParameters() 获取页面的所有数据
                        // Map<String,Object> ------getSession()   获取session域中的数据
                        // Map<String,Object> -------getApplication()  获取servletContext域中的数据
             3  实现特定的接口来获取的方法(了解)
    证明Action是单实例还是多实例?
                servlet是单实例  成员属性有线程危机
                Action是多实例   成员属性没有线程危机
    
    2 结果页面的逻辑视图配置
            分类:
                全局配置
                    针对一个包下所有的action都生效的一个页面
                
                局部配置
                    针对某一个action生效的一个页面
            
                注意:如果全局配置和局部配置都配置了,局部配置的优先级大于全局配置
    
            result标签: 对返回的逻辑视图进行匹配
    
                name:
                    逻辑视图的名称。默认值是success。
    
                type:
                    dispatcher  默认  请求转发(用于转发到jsp页面)
    
                    redirect   重定向(用于重定向到jsp页面)
    
                    chain     请求转发(用于转发到action)
    
                    redirectAction  重定向(用于重定向到action)
    
                    stream  用于下载的(CRM3天案例)
    
    3 struts2对页面数据的封装(模型驱动,属性驱动)
    
                 1 属性驱动---set属性方式(例如:分页玩法)  (重点)
                      条件:
                         1 需要在action的成员位置提供属性,并且要有set()方法
    
                 2 属性驱动---页面表达式的方式  (理解)
                     条件:
                        1 需要在action的成员位置上申明javabean对象,且提供get/set方法
                                例如:
                                    private User user;
                                    get()/set()
    
                        2 在页面上的参数name属性需要:
                                name=javabean对象.属性
    
                                例如: user.username;
                                      uiser.age;
    
    
                 3 模型驱动(单一的对象)  (掌握)
                        条件:
                            1 让action实现一个接口: ModelDriven
    
                            2 需要在action的成员位置上申明javabean对象,并且这个对象得实例化 private User user=new User;
    
                            3 需要 ModelDriven 这个接口中的getModel()方法
    
                            4 需要在getModel()方法里面将我们的javabean对象以返回值的形式返回回去
    
                            主页:页面还是正常的写法
                         
                 4 批量方式(针对的是多个对象数据的封装)
                        条件:
                            需要在action中提供集合,且提供get()/set()方法
                    
                    list封装:
    
                          在action中集合名称:
                                    ll
    
                          在页面需要:
                                ll[0].username
                                ll[0].age
    
                                ll[1].usrname
                                ll[1].age
    
                    map封装:
                         在action中集合名称:
                                    mm
    
                        在页面需要:
                                
                                mm[键名].属性
    
    总结:
         1 struts2怎么样获取到servlet的API(request,response,session,ServletContext,以及接受页面的数据)
    
                1 通过ServletActionContext类的静态方法
    
                2 通过ActionContext对象的方法(理解)
                            getActionContext()--对象的获取
                            注意:只能接受操作页面参数,以及操作域中的数据
                                 不能获取到域对象,也不能做响应(response对象也获取不到)
    
                3 通过特定的接口来实现
                          ServletRequestAware,ServletResponseAware,ServletContextAware,SessionAware
    
        2 结果逻辑视图的配置
                全局配置 针对的是一个包下的所有action
                局部配置 针对的是指定的action
                2个都存在的情况下优先级:局部>全局
                result标签:
                name: 逻辑视图的名称。默认值是success。
                type:
                    dispatcher    :默认值,请求转发。(请求转发到JSP的页面)
                      redirect    :重定向。(重定向到JSP的页面)
                      chain        :转发到另一个Action。
                      redirectAction:重定向到另一个Action。
                      stream    :文件的下载。
    
        3 struts2对页面数据封装的方式: 4种  ps:action多实例的,每访问一次就创建一个action对象,所以它成员位置的属性不存在线程危机
                1 属性驱动---set方式
                    条件: action提供相应的成员属性,必须得有set方法
                    
                2 属性驱动---页面表达式的方式
                    条件:
                        1 需要在action的成员位置上申明javabean对象,且提供get/set方法
                        2 在页面上的参数name属性需要:
                                name=javabean对象.属性
    
                                例如: user.username;
                                      uiser.age;
    
                3 模型驱动
                    条件:
                            1 让action实现一个接口: ModelDriven
    
                            2 需要在action的成员位置上申明javabean对象,并且这个对象得实例化 private User user=new User;
    
                            3 需要 ModelDriven 这个接口中的getModel()方法
    
                            4 需要在getModel()方法里面将我们的javabean对象以返回值的形式返回回去
    
                            主页:页面还是正常的写法
                
                
                4 批量封装
                    条件: 提供集合且提供set/get方法
    
                    list:
                        在action中: ll
    
                        在页面: ll[索引].属性
                    
                    map:
                        在action中: mm
                        在页面: mm['键名'].属性
  • 相关阅读:
    zookeeper.KeeperException$UnimplementedException: KeeperErrorCode = Unimplemented for {root.path}
    IDEA对新建java线程池的建议
    Hbase配置WEB UI界面
    Tomcat清理日志文件无法立即释放磁盘空间
    Tomcat多应用启动报错:org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading Illegal access: this web application instance has been stopped already. Could not load [].
    Soliworks 2016建模细节总结(1)
    关于自学C语言开始时应该注意的问题分享—未完待续......
    Word或者WPS里证件照的背景底色和像素调整
    Linux命令大全(非常全,史上最全)
    Android项目结构介绍
  • 原文地址:https://www.cnblogs.com/haizai/p/11518978.html
Copyright © 2020-2023  润新知