zoukankan      html  css  js  c++  java
  • Java struts2

    1.结果页面配置
    (1)全局结果页面
    解决在不同的action返回相同的字符串,且跳转的页面相同时,需要重复代码的问题。通过<global-result><result name = "hello">/hello.jsp</result></golbal-result>,这个全局结果在当前package生效。
    (2)局部结果页面
    在action中配置的result为局部结果,如果同时有全局和局部,以局部为准。
    (3)result标签的type属性
    指定如何跳转到路径中去。可取值有redirect、dispatcher、chain(一般不用)、redirectAction,前两个跳转到页面,后两个跳转到action,默认为dispatcher。
    <result name="add" type = "redirectAction">hello</result>,其中hello为action的name。
    2.在action中获取表单提交方式
    (1)使用ActionContext类获取
    Map<String, Parameter> map = ActionContext.getContext().getParameters();
    (2)使用ServletActionContext类获取
    HttpServletRequest request = ServletActionContext.getRequest();
    通过该类的静态方法可以得到Servlet的request、session、response和ServletContext对象。
    (3)使用接口注入方式获取(一般不用)
    实现ServletResultAware接口,重写setServletRequest(HttpServletRequest request)方法,提供私有request属性。
    private HttpServletRequest request;
    @Override
    public void setServletRequest(HttpServletRequest request){
    this.request = request;
    }
    然后在方法中就可以使用request了
    3.struts2提供的表单提交方式
    (1)属性封装
    直接把表单提供的数据封装到action的属性中。action中的成员变量名字包含和表单中input的name,并为这些变量生成set方法,当表单提交后就可以直接使用这些变量了。
    (2)模型封装(常用)
    可以直接将表单中的数据封装到实体类的对象中。首先实现ModelDriven<T>接口,其中T为实体类类型,实现getModel方法(返回实体类对象),在action中创建实体类对象。要求实体类中的属性必须包含表单中input的name。
    注意:不能同时使用模型封装和属性封装来获取同一个表单的数据,若同时使用只会进行模型封装!!!
    (3)表达式封装
    通过在jsp中的表达式将表单中的数据封装到实体类的对象中。首先声明实体类对象,然后为其创建set和get方法,最后将input中的name设置为”对象名.属性名“的格式。
    4.struts2获取数据封装到集合中
    (1)List封装
    步骤:在action中定义List对象——为List对象生成get和set方法——页面中通过表达式进行封装。表达式写法name = "list[0].username"
    (2)Map封装
    步骤:在action中定义Map对象——为Map对象生成get和set方法——页面中通过表达式进行封装。表达式写法name = "map['keyname'].username"
    5.表达式封装和模型驱动比较
    相同点:都可以将数据封装到对象中
    不同点:在一个action中模型驱动只能将数据封装到一个实体类的对象中,如果需要为多个对象封装数据可以使用表达式封装。
    6.ognl表达式和值栈
    在struts2中用来操作值栈中的内容,与struts2的标签一起使用;ognl不是struts2的一部分,是一个单独的项目,可以单独使用。
    (1)struts2标签库的使用
    <%@ taglib uri = "/struts-tags" prefix = "s" %>
    (2)值栈是什么
    struts2内置的一种存储机制,类似jsp的域对象。可以在action中将数据放入值栈,在页面中取出来。
    (3)servlet和action的区别
    Servlet:只在访问时创建一次,单例对象
    action:每次访问都重新创建,多例对象
    (4)值栈储存位置
    存储在action对象中,每个action中都有一个值栈对象,所以现有action对象才有值栈对象。
    (5)获取值栈对象
    i:通过ActionContext获取
    ActionContext.getContext.getValueStack();
    (6)值栈的结构
    分为root和context两部分,root继承arraylist类,context实现map接口;一般使用root里面的数据。
    通过struts2的标签<s:debug>可以查看值栈的结构和其中的数据。
    (7)向值栈中放入数据
    i:set方法——在值栈中添加一个Map集合
    ii:put方法——在值栈中添加一个数据对应的类型
    iii:在action中声明变量,并提供get方法——直接放在action中,不需开辟额外空间(常用)
    (8)在页面中从值栈中获取数据
    i:获取字符串
    <s:property value = "str"/>
    ii:获取对象的值
    <s:property value = "obj.field"/>
    iii:获取list中的值
    --<s:property value = "list[0].username" />
    --<s:iterator value = "list">
     <s:property value = "username"/>
    </s:iterator>
    --<s:iterator value = "list" var = ""user>
     <s:property value = "#user.username"/>
    </s:iterator>
    该种方式会将取出的list对象临时放在context中,取出时需要加上特殊符号#,能提高取值效率
    7.为什么通过EL表达式可以取得值栈中的值?
    EL表达式可以取得域对象中的值,在底层对request的getAttrbute方法有增强,如果在与对象中没有找到指定值的话就会在值栈中去寻找,找到的话会将该值放入与对象中,在返回该值。
    8.OGNL中#、%的使用
    (1)#的使用
    获取context中的数据
    <s:property value = "#request.req"/>
    (2)%的使用
    在struts2标签库中除了s:property的其他标签中如果需要使用OGNL表达式的话需要加上%,例如:<s:textfield name = "username" value = "%{#request.req}"></s:textfield>
    9.拦截器的使用
    (1)什么是拦截器
    拦截器中封装了框架提供的很多功能
    (2)拦截器什么时候执行
    在创建action对象之后,在action中的方法执行之前。
    (3)拦截器的底层原理
    主要使用AOP思想和责任链模式
    AOP:面向切片编程,不通过修改源代码为增加方法功能,应用场景:功能模块化
    责任链模式:类似于过滤链,执行一系列操作,当前一个操作执行完后需要放行才能执行下一个操作。
    (4)AOP思想和责任链模式在拦截器中的使用
    通过AOP思想在action的方法前添加各个拦截器,以责任链模式执行各个拦截器。
    (5)拦截器与过滤器的区别
    过滤器可以过滤任意内容(html、jsp、servlet、图片路径),而拦截器只会拦截action。
    (6)自定义拦截器
    i:继承MethodFilterInterceptor类
    ii:重写doIntercept方法
    return invocation.invoke()代表放行
    return "";代表直接放回
    iii:配置拦截器(注册拦截器)
    ---声明拦截器
    在action所在的package标签下,添加<interceptors>标签
    <interceptors>
     <interceptor> name = "loginintercept" class = "拦截器的全限定名"></interceptor>
    </interceptors>
    ---在action中使用自定义拦截器
    <interceptor-ref name = "loginintercept"></interceptor-ref>
    这样的话会对当前action中所有方法进行拦截,通过以下配置可以不对某些方法拦截
    <interceptor-ref name = "loginintercept">
     <param name = "excludeMethods">不拦截的方法名</param>,其中excludeMethods为固定值。
    </interceptor-ref>
    ---如果在action中配置自定以拦截器,默认拦截器不会执行;解决方案:把默认拦截器手动使用
    <interceptor-ref name = "defaultStack"></intereptor-ref>
    10.struts2常用标签
  • 相关阅读:
    java web项目打包.war格式
    version 1.4.2-04 of the jvm is not suitable for thi
    Sugarcrm Email Integration
    sharepoint 2010 masterpage中必须的Content PlaceHolder
    微信开放平台
    Plan for caching and performance in SharePoint Server 2013
    使用自定义任务审批字段创建 SharePoint 顺序工作流
    Technical diagrams for SharePoint 2013
    To get TaskID's Integer ID value from the GUID in SharePoint workflow
    how to get sharepoint lookup value
  • 原文地址:https://www.cnblogs.com/xiao-ji-xiang/p/10028720.html
Copyright © 2011-2022 走看看