• struts2学习笔记


    struts1的名气+webwork核心=struts2

    使用struts2的步骤:

      1.导入jar文件
      2.在web.xml中加入一个配置filter。拦截全部的请求/*,    StrutsPrepareAndExecuteFilter
      3.在src下加入一个struts.xml, package-action-result
      4.假设要实现控制,须要加入action类
         4.1.实现Action接口
         4.2.继承ActionSupport类
         4.3.直接创建类。可是必须有方法String execute()
      5.改动struts.xml中的action标签,加入属性class相应该action类


    struts.xml中定义常量

      <constant name="" value=""/>
      开发模式:struts.devMode        =  true/false
      默认编码:struts.i18n.encoding  =  UTF-8(默认)

    怎样绑定表单元素的值:

      1.使用属性:在action中加入一个同名属性。并提供get/set方法
      2.使用javabean:在aciton中加入一个对象,并提供get/set方法
        表单元素的名字。应该为对象名.属性名
      3.使用ModelDriven

    怎样在一个Action类中处理多个请求

      1.在该Action类中,每一个请求填加一个方法
      2.在struts.xml中,加入对应的配置:
         2.1.第一种:在action标签中加入属性method,指定方法
         2.2.另外一种:每一个模块。单独写一个配置文件,在struts.xml中include进来
         2.3.第三种:动态方法:提交时,url后面加上"!方法名",比如"house!add"
         2.4.第四种:通配符:
         <action name="house_*" class="com.HouseAction" method="{1}">


    默认action:

        <default-action-ref name="index"/>   
        <action name="index"><result>/index.jsp</result></action>  
       

    <result>的属性:

    1.name,默认值是success。

    相应方法运行的返回结果
    2.type,默认值是dispatcher,指跳转方式
      dispatcher:    转发到jsp
      redirect:       重定向到本地或其它jsp或者action
      redirectAction: 重定向到本地action
      chain:          转发到action


    动态结果:

      1.在action中加入一个String属性,记录目标url
      2.在方法中动态给该属性赋值
      3.在struts.xml中,该action标签的result的url使用${属性名}


    问题:url反复的问题

    <form action="user/login">
    public String login(){
        return INPUT;
    }
    <result name="input">/login.jsp</result>
    当提交表单失败的时候,因为result默认type是转发,所以url地址不会变;
    下次再提交时。会导致/user反复出现。
    解决的方法:
    1.提交表单的action使用绝对路径,前面加一个request.getContextPath()
    2.result中的type改成重定向


    设置全局结果和全局异常:
    <package name="base" extends="struts-default" namespace="/">
        <global-results>
            <result name="error">error.jsp</result>
        </global-results>
        <global-exception-mappings>
            <exception-mapping result="error" exception="java.lang.NullPointerException"></exception-mapping>
        </global-exception-mappings>
    </package>




    怎样获得struts2封装的请求,会话,应用

    ActionContext ctx = ActionContext.getContext();
    Map<String,Object> request    = (Map<String,Object>)ctx.get("request");
    Map<String,Object> session    = ctx.getSession();
    Map<String,Object> application= ctx.getApplication();

    通过实现RequestAware,SessionAware,ApplicationAware接口,也能够获得


    怎样在JSP中获取请求,会话,应用中的值:

    1.通过jsp内置对象
    2.通过el表达式
    3.stuts标签:<s:property value="[#request.key][#attr.key]"/>




    获得原生的Servlet API对象的方式一:
    HttpServletRequest request = ServletActionContext.getRequest();
    HttpSession        session = request.getSession();
    ServletContext application = ServletActionContext.getServletContext();

    获得原生的Servlet API对象的方式二:
    通过实现接口ServletRequestAware,ServletContextAware。也能够获得


    JSTL:

       <c:if test=""></c:if>
       <c:forEach items="" var=""></c:forEach>
       <c:out value=""></c:out>
       <c:set var="" value=""></c:set>
       <c:remove var=""></c:remove>

    OGNL知识点

    OGNL訪问Value Stack(值栈):对象名.属性名
       action中定义的属性

    OGNL訪问Stack Context(值栈上下文):#作用域.属性名
       作用域




    OGNL訪问List:  list[0], list.get(0)
    OGNL訪问Map:  map['key'], map.key,
       取出全部key: map.keys
       取出全部值:  map.values

    OGNL訪问Set:  set.toArray()[0]


    OGNL调用静态方法和属性:
    @类的全然限定名@静态方法名
    @类的全然限定名@静态属性名
    struts.xml加入常量配置:
    struts.ognl.allowStaticMethodAccess  =  true





    1.struts自带的jar包:
      antlr-2.7.6.jar和anltr-2.7.2.jar
    2.Hibernate的3个lib
       asm.jar
       asm-attrs.jar
       cglib-2.1.3.jar
       commons-collections-2.1.1 和 commons-collections-3.2
       commons-logging-1.0.4     和 commons-logging-api-1.1
    找到重名的jar包,删掉低版本号的



    Struts2标签:

    数据标签:
      1.<s:property value="OGNL表达式" default="" escapeHTML="" />
      2.<s:debug/>
      3.<s:date name="OGNL表达式" format="yyyy-MM-dd HH:mm:ss"/>
      4.<s:set var="变量名" value="OGNL表达式" scope="作用域,默认是action"/>--- OGNL路径过长,或反复使用某个方法的运行结果
      5.<s:url value="地址" var="t"/>有var属性当前字符串不显示
      6.<s:a href="字符串"></s:a>,假设href里面想填入OGNL,则须要把字符串转换成OGNL表达式,%{#t}
      7.<s:include value="要包括的jsp"/> 动态的包括

      须要进行转换的:

      1.字符串转换成OGNL:-->%{}
          该属性默认是字符串:s:a-href,s:url-value, s:include-value
      2.OGNL转换成字符串:
          该属性默认是OGNL:--->用引號引起来
             s:property-value,
             s:property-default,
             s:date-name
         s:param-value
      假如不确定该属性是否默觉得OGNL,能够使用%{},来保证作为OGNL表达式处理

    控制标签:
      1.<s:if test="OGNL表达式"></s:if>
      2.<s:else><s:elseif>
      3.<s:iterator var="当前元素"  value="集合" status="集合状态">
           取当前元素的属性:<s:property value="#当前元素.属性名"/>
           推断当前索引是否奇数:<s:if test="#集合状态.odd"></s:if>
           推断当前索引是否偶数:<s:if test="#集合状态.even"></s:if>
        </s:iterator>
       使用jQuery实现隔行变色
       $(function(){
           $("table tr:gt(0):even").css("background","yellow");
       });



    UI标签:
       <s:form theme="主题" action="" method=""></s:form>
       <s:textfield name="" value=""/>
       <s:textarea name="" value=""/>
       <s:submit/>
       <s:select name="" list="OGNL表达式" listKey="作为value的属性" listValue="作为显示文字的属性"/>
       
       <s:doubleselect
            name="" list="OGNL表达式1" listKey="作为value的属性" listValue="作为显示文字的属性"
            doubleName="" doubleList="OGNL表达式2" doubleListKey="作为value的属性" doubleListValue="作为显示文字的属性"/>

       注:OGNL表达式2应该是依据OGNL表达式1取出的集合。比如map.get(top)

       日历控件:<s:datetimepicker name=""/>
       引入步骤:1.导入struts-dojo-xxx.jar
                 2.在jsp上引入该taglib:
            <%@taglib uri="/struts-dojo-tags" prefix="sx"%>
              3.在head中加入标签。标志要引入相关css和js文件
            <sx:head parseContent="true"/>
                 4.使用该日历控件

    使用拦截器

    使用拦截器的步骤1.新增一个拦截器类,继承AbstractInterceptor,在实现intercept()方法,进行拦截前后的操作。


      intercept(ActionInvocation invocation){
        //1.拦截前操作
        //2.运行兴许
        String result = invocation.invoke();
        //3.拦截后操作
        return result;
      }
    2.在struts.xml的package中,加入拦截器
    <interceptors>
        <interceptor name="拦截器1" class="类的全限定名"/>
        <interceptor name="拦截器2" class="类的全限定名"/>

        <interceptor-stack name="拦截器栈名">
         <interceptor-ref name="defaultStack"/>
            <interceptor-ref name="拦截器1"/>
            <interceptor-ref name="拦截器2"/>
        </interceptor-stack>
    </interceptors>

    3.在struts.xml的action中,指定拦截器
           <interceptor-ref name="拦截器|拦截器栈"/>
      假设还要使用struts默认的拦截器栈,须要再加入:
           <interceptor-ref name="defaultStack"/>




    表单内容:  学号、姓名、照片

    Struts实现文件上传:

    单个文件:
    1.表单中加入文件域。同一时候表单的提交方式应该是post,enctype属性应该是multipart/form-data
    2.加入commons-fileupdate**.jar,commons-io**.jar
    3.在action中。依据文件域的name,加入三个属性
         File xxx;
         String xxxContentType;
         String xxxFileName;
    4.在action方法中,将文件另存
        String uploadPath = ServletActionContext.getServletContext().getRealPath("/upload");

        FileOutputStream fos = new FileOutputStream(uploadPath+"/"+xxFileName);
        FileInputStream fis = new FileInputStream(xxx);
        IOUtils.copy(fis, fos);


    限制文件上传的大小:
    1.设置全局常量
      <constant name="struts.multipart.maxSize" value="5000000"/>

    2.加入拦截器:限制单个action的文件上传大小
      <intercepter-ref name="fileUpload">
          <param name="maximumSize">5000000</param>
      </intercepter>
      <intercepter-ref name="defaultStack"/>

       全局常量的默认值是2M。假设要限制文件大小小于2M。两种方式任选其一。
       假设要限制文件大小大于2M,则所有常量必须设置为大于或等于目标大小,拦截器可选。





    限制文件上传的类型:
      给fileUpload拦截器加入參数:
      <intercepter-ref name="fileUpload">
          <param name="allowedTypes">image/jpeg,image/pjpeg,image/png,image/gif</param>
      </intercepter>
      <intercepter-ref name="defaultStack"/>


    假设出现错误:HTTP Status 404 - No result defined for action com.pb.web.action.UploadAction and result input
    则是表示当result是input时,没有在action中定义相应的result。


    file文件域,仅仅能取value。不能给value赋值

  • 相关阅读:
    CSS3动画
    Grid布局
    JS向上取整、向下取整、四舍五入等
    JS DOM资料
    关于setInterval和setTimeout中的this指向问题
    JavaScript 高级技巧 Memoization
    请求接口的方式
    HTTP协议知识
    CSS样式重置
    Chrome 为什么使用多进程,不使用多线程
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7101397.html
Copyright © 2020-2023  润新知