Struts要点总结(下)

*1、如何获取Session

    1)ActionContext获取,返回Map类型
        Map<String,Object> session = ActionContext.getContext().getSession();
    2)ServletActionContext获取,返回HttpSession类型
        HttpSession session =  ServletActionContext.getRequest().getSession();
    3)让Action实现接口SessionAware,之后Struts2在实例化Action之后会自动判断这个Action是否为SessionAware,如果是就会调用实现的方法,将session注入进来给Action。
        public class XXAction implements SessionAware {
            private Map<String,Object> session;
            public void setSession(
                Map<String,Object> session) {
                this.session = session;
            }
        }
    4)这三种方式都可以访问Session,并且他们的数据是一份即共享的。但是如果要使用的话,只选择一种方式即可,不要混合用。推荐使用接口注入的方式,即第三种。
    5)登录成功后,将登录信息记录到Session

2、Struts2对EL表达式的支持

    1)EL表达式需要从4个范围取值,page,request, session,application。(从前往后是取值顺序)
    2)Struts2做了一些处理来兼容EL表达式的取值,即不使用原始的request,而是提供一个request 的包装类,在此类中覆写request的get方法,这样EL表达式在向request取值时,struts2会实际上让它向ValueStack取值

3、通配符

    1)什么是通配符:
        用来简化struts.xml配置的
    2)原理:
        约定大于配置,即我们写的Action类名、JSP文件名满足一定的规则,那么基于这样的规则,我们可以使用通配符来描述。
    3)写一个项目,模拟增加、修改、查询功能。并且让每个Action类、每个页面都具有命名规则:采用“动作+模块”命名。
    4)基于上面的规则,我们使用通配符来做struts.xml的配置,并且比较不采用通配符和采用通配符他们的优劣。
        通配符优点:
            --大大简化配置文件struts.xml的代码
        通配符缺点:
            --创建类名、JSP文件名时,必须满足严格的规则
            --我们通过配置文件,无法直观的看出Action和JSP页面的关系,不直观。

*4、Result原理

    1)Result组件是Struts2中6大核心组件之一,主要是用于做输出的。
    2)Struts2内置了10种类型的Result,这些Result定义在struts-default.xml中,他们都是Java类,都实现了统一的接口Result。
    3)讲以下几种
        使用:用type属性指定result类型  <result name="success" type="stream"></result>
        a、dispatcher
            --用于将请求转发给页面的,是默认使用的Result。
        b、redirectAction
            --用于将请求重定向给Action的
            --用法
                <result name="ok" type="redirectAction">
                    actionName
                </result>
        c、stream
            --以二进制的形式向页面输出数据
        d、json
            --不是struts2内置的Result
            --这种类型的Result特别常用,用于向页面输出json格式的字符串。
            --常用于异步校验

5、stream类型的Result

    1)以二进制形式向页面发送数据(如:使用stream类型的result向页面输出验证码图片
    2)写法
        <result name="ok" type="stream">
            <param name="inputName">
                Action中的属性名
            </param>
        </result>    
        --param的name值,必须是inputName
        --Action中的属性名,对应的属性类型应该是 InputStream类型。

*6、json类型的Result

    1)这种类型的Result不是Struts2默认提供的,需要单独引用包。
    2)使用步骤
        a、导包
        b、将struts.xml中的package继承于json-default
        c、引用json类型Result
            --*使用root方式,指定将Action中某一个属性的值以json字符串传递给页面
            <result name="ok" type="json">
                <param name="root">Action某属性</param>
            </result>
            说明:
                --如果指定的属性是基本类型,直接返回值,比如boolean isMarry = true; json类型的Result将返回true。
                --如果指定的属性是JavaBean,json类型的Result会把这个对象转变成一个json输出,如{"name":"zhangsan","pwd":"123"}
            --使用includeProperties,指定将Action中某几个属性的值以json字符串传递给页面,注意这里多个属性之间以,隔开,并且多个属性都是基本类型的。
            <result name="ok" type="json">
                <param name="includeProperties">
                    Action属性1,Action属性2,...
                </param>
            </result>
            说明:
                --返回的格式如{"a":"A","b":"B"}
                --不写param,此时json类型的Result会把整个Action做成一个json格式的字符串,发送给页面。
                说明:
                    --返回格式如{"name":"zs","pws":"123"}

7、Struts2的UI标签

    1)用途
        --用来生成文本框、密码框、单选框、复选框、下拉选等框体
        --*生成框体之后,可以自动根据请求的Action中的属性值,给框体赋值,这种自动赋值的行为称之为数据的回显。
        --*根据很简单的标签语言,自动生成单选框、复选框、下拉选等选择性框体,并根据请求的Action的属性值,自动的选择数据。
    2)UI标签
        a、简单标签
            --form
                用于生成<form>元素
            --submit
                用于生成submit按钮
            --文本框
                用于生成<input type="text"/>
            --密码框
                用于生成<input type="password"/>
            --文本域
                用于生成<textarea>
            --单值复选框
                用于生成一个<input type="checkbox"/>
        b、复杂标签
            --单选框
                用于生成一组单选框radio
            --复选框
                用于生成一组复选框checkbox
            --下拉选
                用于生成一个select,其中包含多个option

8、拦截器

    1)什么是拦截器?
        --拦截器是Struts2中六大核心组件之一,是用于扩展Action的组件。
        --主要用于处理Action共通的事务,比如记录日志、权限检查、处理事务等等。
    2)拦截器使用步骤
        a、创建拦截器组件(类),实现接口Interceptor
        b、在struts.xml中注册拦截器,注册标记为<interceptor>
        c、在Action的配置中,引用注册好的拦截器,引用标记为<interceptor-ref>
    3)拦截器栈
        --是对拦截器的一个打包,它可以直接被Action引用,当Action引用拦截器栈时,相当于引用了该栈下的所有拦截器。
        --通过标签<interceptor-stack>定义拦截器栈
        --Struts2中默认定义了很多个拦截器栈,其中
            a、basicStack是基础拦截器栈,我们对拦截器引用时,不能丢掉该栈的内容,就是说如果不引用这个栈,Struts2很多功能运行不了。
            b、defaultStack是默认拦截器栈,其内容包含了basicStack的内容,并且比它多,是常用拦截器的一个打包。Struts2通过标签<default-interceptor-ref>来指定默认拦截器栈,我们可以在struts.xml中来改变其默认的引用,但是改变默认引用时千万别忘了要至少包含basicStack。
        --当Action中手动引用一个自定义拦截器时,那么该Action会丢掉对默认拦截器的引用。此时,需要再手动的将默认拦截器加进来。

9、拦截器实例:登录检查

    1)使用拦截器做登录检查,即如果用户没有进行登录,而是直接在浏览器地址栏中输入URL访问Action,需要做检查,未登录则不允许直接访问。
    2)如果模块所有的Action都是这样的逻辑,所以为了避免在每个Action中写重复的代码,我们可以使用拦截器来做这件事。即写一个登录检查拦截器,并且让该模块下所有的Action引用,当访问Action时,代码被拦截器截获,拦截器中判断是否已经登录, 若没有登录则踢回到登录页面,否则允许其访问该Action。
    3)登录模块的Action需要引用这个拦截器吗?
        由于登录功能就是完成用户的登录,因此不需要引用登录检查拦截器来做检查。

10、使用拦截器做文件上传

    1)Struts2自带文件上传的拦截器,能够帮助我们处理文件上传的功能,拦截器是fileUpload,我们可以直接使用。
    2)原理:
        a、当点击提交按钮,提交文件上传表单时,该请求会被fileUpload拦截器截获,此拦截器会将表单中的文件暂时上传到tomcat中某临时路径下。
        b、然后拦截器将此文件的引用传递给请求的Action, Action中需要将此临时文件转移到某固定的位置。
        c、拦截器需要清除掉临时路径下的临时文件。
    3)注意
        需要引入新的包common-io.jar
        
       

你可能感兴趣的:(struts2.0)