Struts2 学习总结

一:struts2框架是应用在Javaee三层中的web层的框

二:入门案例:

        2.1:导包

        2.2:创建action(Action是一个多实例的)


            2.3:配置Action的访问路径

                    创建Struts2的核心配置文件(名称必须是 Strutsxml   位置必须在src下面)

            2.4:引入dtd约束

            2.5:Action的配置:(这些配置先写,下面讲述)

            

            发布到tomcat上,启动后。在网页上访问地址是:(会报  404错误.......   是因为.没有配置过滤器...)

                    http://127.0.0.1/struts2_day01/hello.action

注意:Struts2 必须得在web.xml中配置过滤器

    

         配置好上面的,之后  struts2的入门案例就跑起来了。。。。。。


        查看一下过滤器的源代码,看一下执行过程:

        过滤器在服务器启动时候创建,执行过滤器中的init方法,

        在init方法中,主要加载配置文件。

                      加载strust2的自带配置文件,和struts2.xml  文件

                   而web.xml在服务器启动时候加载

 三:struts2核心配置文件解析

       3.1: 名称和位置固定:(在src下面,名称是struts2.xml)

       3.2: 在配置文件中有三个标签:

               3.2.1: package标签:类似代码包,区分不同的Action,要配置Action,必须写package  才能配置action

                               name属性:与功能无关,在一个配置文件可以写对个package,区分不同的package

                            extends属性:固定值:extends="struts-default"     写了之后具备Action的功能

                                namespace属性:属性值和Action标签里面的name属性值构成访问路径

                 3.2.2:Action标签

                    配置Action的访问路径

                            name属性:与namespace属性值构成访路径。

                                                在package标签里面可以写多个Action标签,区分不同的Action的标签的

                            class属性:配置Action类的全路径

                            method属性:在Action类里面默认执行的是execute方法,但是在Action类中可以执行其他方法,就用method配置

                                                让Action里面对个方法执行,使用method进行配置

               标签result:

                    根据Action的方法返回值,配置到不同的路径里面去

                    name属性:和方法返回值一样             

                        

                    type属性:

                    配置如何到路径中去(转发或重定向)

                                (页面的跳转)dispatcher  (默认值)  转发操作

                                (页面的跳转)redirect   重定向

                                (这是Action之前跳转) chain 转发  (一般不用,因为用缓存问题)

                                (这是Action之间的跳转) redirectAction  重定向到Action    

          


四:struts2中的常量(在struts2 中 常量封装了许多功能)

         struts2 默认常量的位置:

            


        修改默认常量的值:

                一般在struts.xml中进行配置



            常量封装了许多功能:

            例如:在Action获取表单通过post方式提交中文,中文乱码就直接解决了 (get还得自己配置解决....)     配置一下上面的编码格式就好


            分模块开发:

                单独写配置文件,把配置文件引入到核心配置文件中可以



            五:Action的编写方式(三种)

                    5.1:创建普通类,不继承,不实现。直接重写execute方法即可

                    5.2:创建类,实现接口  Action

                    5.3:创建类,继承类  ActionSupport(经常用

    

            六:访问Action的方法(重点)

                            6.1:第一种访问方式:使用Action标签中的method属性,在属性里面写执行的方法。

                            6.2:第二种访问方式:通配符方式实现

                                        通配符:就是  号  可以匹配到任意内容

            




                             6.3:演示错误及注意点:

                               6.3.1: 如果在Action方法有返回值,在配置文件中没有配置,就会出现下面错误

                

                               6.3.2: Action里面的方法有返回值,如果有返回值,类型必须是String类型    

                                6.3.3:如果没有返回值,在配置文件中result不需要配置

                                        把返回值写成:“none”或 NONE

                                        


七:结果页面配置:

            7.1:全局结果页面;

                    需求:建两个Action,执行默认的execute方法,让两个方法的返回值都相同,并且配置到同一个页面去。

                    7.1.1:如果多个Action,方法返回值,返回的页面也相同,这时候就可以使用全局结果页面配置了(因为result标签里面配置都一样,就可以提取出来)

                            

                  :7.1.2:在package标签 配置全局结果页面

            

        

                7.2:局部页面:

                        

                如果配置了全局结果页面,也配置了局部页面,最终以局部配置为准

            

   八:Action获取表单对象提交数据:

               之前在web阶段,提交表单到servlet里面,在servlet类里使用request对象使用getParameter(),和 getParametermap()  方法获取,

            Action获取表单提交的数据主要有三种方式:

                8.1:第一种方式:使用ActionContext类获取:

                    ActionContext类不是new出来的,

                    具体演示:

                                8.1.1:创建表单,提交表单到Action里面,

                                 8.1.2:在Action使用ActionContext获取数据

                                    

                    

            8.2:第二种方式:使用servletActionContext类获取

                        调用servletActionContext对象里面的静态对象,得到request对象

    

                8.3:第三种方式:使用接口注入

                让Action实现ServletRequestAware接口,为了得到request对象

                


   九:在Action中操作域对象

            request,session,servletContext  域对象

             使用ServletActionContext类操作

        

       

    十: struts2封装获取表单数据方式

            10.1:原始方式获取表单封装到实体类对象

        

                10.2:属性封装

                    10.2.1:直接把表单提交的属性封装到Action的属性里面

                     10.2.2:实现步骤:

                           (1) 在Action成员变量位置定义变量

                            注意:变量名和表单输入项的name属性值一样

                            (2)  生成变量的set方法(建议set,get方法都生成)

                             (3):使用属性封装缺点

                                        使用属性封装获取表单数据到属性里面,不能把数据直接封装到实体类对象里面

                        

                    10.3:模型驱动(重点

                               10.3.1 :使用模型驱动方式,可以直接把表单数据封装到实体类对象里

                               10.3.2:实现步骤:

                                        (1):Action实现接口ModelDriven(必须指定一个实体类)

            


                                            (2):实现接口里面的getModel 方法

                                                    创建对象返回

                                           (3):在Action里面创建实体类对象(就直接封装到了实体类中了)

                                                        


                          注意问题:

                            在一个Action中,获取表单数据可以使用属性封装、和模型驱动封装,但是不能同时使用属性封装和模型驱动封装获取同一个表单数据,如果同时使用之后,执行模型驱动

                    

               10.4:表达式封装(一般用的少,因为前段和后端是不同人开发)

                        10.4.1:使用表达式封装可以把表单数据封装到实体类对象里

                        10.4.2:实现过程:

                                    (1):在Action中申明实体类

                                     (2):生成实体类变量的set和get方法

                                        



                                (3):在表单输入项的name属性值里面写表达式形式:(关键

            


                比较表达式封装和模型驱动封装

                相同点:

                            都可以把表单数据封装到实体类中。  

                不同点:                

                            (1):模型驱动只能把数据封装到一个实体对象里面。

                                         在一个Action里面不能使用模型驱动把数据封装到不同的实体类对象里面;

                            (2):使用表达式封装可以把数据封装到不同的实体类对象里

        

                            




                10.5:封装到集合里面:

                            10.5.1:封装数据到list集合

                                       (1):在Action声明list集合

                                        (2):生成list变量的set和get方法



                                        (3):在表单输入项里面写表达式:

                                            


                    10.6:封装数据到Map集合

                            (1):声明map集合

                            (2):生成get和set集合

                    

                            (3):在表单输入项的name属性值里面写表达式



 十一:OGNL概述

            11.1:之前web阶段学习过el表达式,el表达式在jsp中获取域对象里面的值

            11.2:OGNL是一种表达式

                        在struts2里操作值栈数据

                         一般和struts2标签一起使用            

              OGNL不是struts2的一部分,所以得导jar包


             11.3: OGNL入门:

                        计算字符串的长度  ognl+struts2(支持对象调用)

                        11.3.1: 在jsp页面引入struts2 的标签库

            

                        11.3.2:使用struts2标签实现操作

                    



 十二:值栈

            12.1:在web阶段,在servlet里面进行操作,把数据方法域对象里面,在页面使用el表达式获取值。域对象在一定范围内,存值和取值

             12.2:struts2里有类似与域对象的机制,是值栈,可以存值,取值

                        在Action中把值放到值栈中,在页面使用ognl+struts2 的标签取值

              12.3:servlet和Action区别

                        (1):servlet:默认在第一次访问时创建,创建一次,单实例

                        (2):Action:访问时候创建,每次访问Action的时候,都会创建Action对象,创建多次,多实例对象。

              12.4:值栈存储位置:

                            (1):每次访问Action时候,都会创建Action对象

                            (2):在每一个Action对象里面都会有一个值栈对象(只有一个)

                12.5:获取值栈对象:

                        (1):常用方式:使用ActionContext类里面的方法得到值栈对象

                          

                           (2):每个Action对象中只有一个值栈对象


                12.6:值栈内部结构:

                           (1) 第一部分为root,结构是list集合(一般都是操作都是root里的数据)

                               查看源代码:继承list

                    

                               (2)第二部分为context,结构是Map集合 

                                        查看源代码:实现Map接口



                                    里面的结构是固定的key、value结构,存储的是一些固定结构


            12.7:struts2里面的标签s:debug,使用这个标签可以看到值栈结构和存储值

                        (1):访问Action,执行Action的方法有返回值,配置返回值到jsp页面,在jsp页面使用  s:debug 这个标签


   十三:向值栈中放数据:

                13.1:第一种:使用ActionContext对象获取值栈对象,调用值栈对象里面的set方法

                

                13.2:第二种:使用ActionContext对象获取值栈对象,调用值栈对象里面的push方法

        


            13.3:在Action定义变量,生成变量的get方法

                    13.3.1:向值栈中放对象

                             (1)定义对象变量

                             (2)  生成变量的get方法

                             (3)在执行的方法里向对象中设置值

                    


                    13.3.2:向值栈里放list集合:

                             (1):定义list集合变量

                            (2):生成变量的get方法

                               (3):在执行的方法里向list集合设置值

        


十四:从值栈中获取数据:

        使用的就是  ognl+struts2标签获取值栈数据

        14.1:获取字符串:

                (1):向值栈放字符串

                    

            (2):在jsp中使用struts2 和 ognl表达式  获取

        


        14.2:获取对象:

                  (1):向值栈放对象

                

            (2):在页面获取值

            


            14.3:获取list集合:

                    14.3.1:往集合中放值

                      14.3.2:获取list集合中的值(三种方式)

                        (1)第一种获取方式:

                        

                        (2)第二种方式:


                        (3):第三种方式:

                        



    十五:    解释el表达式为什么可以值栈数据

            15.1:el表达式可以获取域对象里的值   setAttribute()放值,getAttribute() 取值

            15.2  为什么el表达式可以获取域对象里面的值:

                        因为el表达式底层增强request对象里面的方法 getAttribute方法

                        首先从request域获取值,如果获取到,直接返回

                        如果从request域对象获取不到值,到值栈中把值获取出来,在把值放到域对象里面

                

十六:OGNL中的   #  和  % 使用

           16.1:使用 # 获取context里面的数据

        


            16.1:演示#操作

                (1):向request域对象放值

              (2):在页面中使用ognl表达式获取



十七:struts2 的拦截器

       17.1:struts2 里面封装了许多功能,struts2里面封装的功能都是在拦截器  里面

       17.2:struts2里面封装了许多功能,有很多的拦截器,不是每次这些拦截器都执行,每次执行默认的拦截器,要想执行其他的,只需要配置就好。

        17.3:struts2里面默认拦截器的位置:

        


            17.4:拦截器在什么时候执行

                    在Action对象创建之后,Action的方法执行之前

              17.5:拦截器的底层原理

                   (1):aop思想:面向切面编程

                    (2):责任链模式:和过滤连模式相似

              17.6:aop和责任链模式如何应用到拦截器里面?    

                        拦截器在Action对象创建以后,Action的方法执行之前执行

                        在Action的方法执行之前执行默认拦截器,执行过程使用aop思想,在配置文件中进行操作。

                    执行拦截器的时候,执行很对的拦截器,这个过程使用责任链模式

                        执行完一个拦截器,必须做类似放行操作,在执行下一个拦截器,........

                

               17.7:重要概念:

                      17.7.1:过滤器和拦截器的区别  

                                   (1)过滤器:过滤器理论上可以过滤任何内容,,如 HTML,jsp 图片...

                                   (2)拦截器:拦截器只可以拦截Action,(struts2独有)

                        17.7.2:servlet和Action区别

                                    

                                    (1servlet默认第一次访问时候创建,创建一次,单实例对象

                                    ( 2 action 每次访问时候创建,创建多次,多实例对象

                17.8:自定义拦截器:

                        17.8.1:在struts2里面有很多的拦截器,这些拦截器封装很多功能,但是在实际开发中,struts2里面的拦截器中可以没有要使用的功能,这个时候需要自己写拦截器实现功能

                      17.8.2: 拦截器的内部结构:

        


                    17.8.3:开发中,建议使用另一种方式

                            写类。继承MethodFilterInterceptor类实现(因为这个类。可以让Action里面的莫个方法你进行拦截)

                    17.8.4:让拦截器和Action有关系

                            不是在Action调用拦截器的方法,而是通过配置文件方式进行建立关系

 十八:自定拦截器        

             拦截器实现过程:

                    第一步:创建类,继承MethodFilterInterceptor类

                    第二步:重写MethodFilterInterceptor类里面的方法写拦截器的逻辑

        


    


                    第三步:配置Action和拦截器的关系(重要)

                            (1):在要拦截的Action标签所在的package标签里面声明拦截器


                            (2):在具体的Action的标签里面使用声明的拦截器


                            (3):struts2里面执行很多的默认拦截器,但是如果在Action里面配置了自定义的拦截器,默认的拦截器就不会执行了

                            解决:把默认的拦截器手动配置一次


                            (4):配置的拦截器,对Action里面所有的方法都进行拦截,

                                    但是登录的方法不需要拦截,如果拦截了,就永远登录不进去了

                                解决:让登录的方法不进行拦截

                                直接通过配置方式让Action里面的某些方法不进行拦截


    

        

struts2 的标签库:

        struts2 标签使用在jsp页面中

          1:s:property:   和ognl表达式在jsp页面获取值栈数据

            2:s:iterator:获取值栈list集合数据

            3:s:debug:查看值栈结构和数据








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值