zoukankan      html  css  js  c++  java
  • struts

    struts2

        <!-- 开启使用开发模式,详细错误提示 -->
        <!-- <constant name="struts.devMode" value="true"/>-->
        <!-- 指定每次请求到达,重新加载资源文件 -->
        <!-- <constant name="struts.i18n.reload" value="true"/>-->
        <!-- 指定每次配置文件更改后,自动重新加载 -->
        <!-- <constant name="struts.configuration.xml.reload" value="true"/>-->
        <!-- 指定XSLT Result使用样式表缓存 -->
        <!-- <constant name="struts.xslt.nocache" value="true"/>-->

    动态方法 需要先在struts.xml配置
    <contant name="struts.enable.DynamicMethodInvocation" value="true"/>
    url:http://localhost:8090/test/user/loginSuccess!fail  //!fail直接调用fail方法



    <action name="loginSuccess" class="action.userAction">
      <action name="loginSuccess" class="action.userAction">
        <result name="admin" type="chain">admin(对应action的name)</result>
        <result name="comm" type="chain">comm</result>
      </action>
      <action name="admin">
        <result>/loginSuccess.jsp</result>
      </action>
      <action name="comm">
        <result>/index.jsp</result>
      </action>
            

    form表单页面跳转action绝对路径
    <form action="${pageContext.request.contextPath}/...jsp"  ../>
    用相对路径会不断追加


    ===>如何获得session
    ActionContext.getContext().getSession(); 返回Map<String,Object>

    得到session->
    Map<String, Object> session=ActionContext.getContext().getSession();
        session.put("user", user);
    //${user.userName}
    //<s:property value="#session.address" />
    得到application->
    Map<String, Object> application=ActionContext.getContext().getApplication();
        if(application.get("num")!=null){
            Integer integer=(Integer)application.get("num");
            application.put("num", integer+1);
        }else{
            application.put("num", 1);
        }
    //${num}
    得到请求->
    Map<String, Object> request=(Map<String, Object>)ActionContext.getContext.get("request");
        request.put("address","北京");
    //${address}
    //<s:property value="#request.address" />
    //在页面中使用s标签 顶部添加<%@taglib prefix="s" uri="/struts.tags" %>

    得到参数->
    Map<String, Object> parameter=ActionContext.getContext().getParameter();
    String[] args=(String[])parameter.get("user.userName");
    system.out.println(args[0]);

    也可以实现requestAware,SessionAware,ApplicationAware接口的set方法



    访问servlet api的两种
    1. ActionContext.getContext().get("request")
    2.实现接口RequestAware



    OGNL=====对象图导航语言=======================>  
    页面获取,输出action属性
    <s:property value="address" />
    页面获取request保存的数据
    <s:property value="#request.address" />

    <s:set var="变量名" value="user.userName" scope="request" >
    //scope默认request域
    <s:property value="#request.变量名">
    或者<s:property value="#变量名">
    <s:set>标签的值保存在stack context栈上下文里

    <s:date> name:被格式的值 format:格式化日期 yyyy-MM-dd

    <s:debug/> 查看值栈,栈上下文

    <s:property value="houses.{?#this.houseId==1}.{title}" />
    //过滤内容的写法 集合的?表示任何  返回一个title的数组

    <s:url action="house" var="housePage"></s:url>
    <s:url action="house!error" var="housePage"></s:url>
    //调用action为house的error方法
    //指定s:url的var属性则不会在页面生成字符串 需要再设置s:a标签
    <s:a href="#housePage">housePage</s:a>
    转化成ognl表达式 s:a href="%{#housePage}"



    <s:include value=".jsp">
        <s:param name="type" value="1"></s:param>
    </s:include>
    //s:param 参数不会放进stack context里 所以不能用s:property
       要用el表达式取值 ${param.type}


    ognl变为字符串
        <s:property value="'<hr/>'" escapeHtml="false" />
    字符串变为ognl
        <s:a href="%{#houseUrl}">超链接</s:a>

    % # $ 应用场景
    %{} 该字符串按照ognl表达式处理
    #   <s:property value="#request.name" />


    控制标签===============================>
    <s:if> <s:else> <s:elseif>
    --------------------------------->
    <s:iterator var="houseItem" value="houses" status="idx">
     <s:if test="#idx.odd">
       <tr bgcolor="gray">
     </s:if>
     <s:if test="#idx.even">
       <tr bgcolor="blue">
     </s:if>
     <td><s:property value="#houseItem.houseId"/></td>
     <td><s:property value="#houseItem.title"/></td>
     <td><s:property value="#houseItem.houseType.typeName"/></td>
     <td><s:property value="#houseItem.street.streetName"/></td>
     <td><s:date name="#houseItem.addDate" format="yyyy-MM-dd"/></td>
    </s:iterator>

    //使用<s:propery value="#idx.index"/> 得到每次循环的下标 从0开始
    //使用<s:propery value="#idx.count"/> 得到集合含有多少个对象 等价size()




    UI标签================================>
    <constant name="struts.ui.theme" value="simple"></constant>
    <s:form> <s:text> <s:textarea> <s:textfield> <s:submit>

    下拉框
    <s:select name="houseTypeId" list="集合" listkey="typeId" listvalue="typeName"></s:select>
    //listvalue要显示数据 listkey是显示数据的值


    联动需要集合
    Map<District,Set<street>> map = new HashMap<District,Set<street>>();
    并且要getset方法
    <s:form action="add" method="post" theme="simple">
        <s:doubleselect
        list="map.keySet()" name="district" listKey="districtId" listValue="districtName"
        doubleList="map.get(top)"  doubleName="street" doubleListKey="streetId" doubleListValue="streetName"/>
    </s:form>


    //list的值是map.keySet可以获得所有的键 即得到所有的district对象
    //name的值是district对象 listKey是显示出来数据的值 listValue是显示出来的数据
    //doubleList是map.get(top) 可以获得列表的第一个所选键的值
    //doubleName,doubleListKey,doubleListValue和name,listKey,listValue意义相同





    <s:property value="#session.street.streetId"/>
    <s:property value="#session.street.streetName"/>

    <s:property value="streets[2].streetId"/>
    <s:property value="streets[2].streetName"/>



    --------------->遍历

    <s:iterator  var="street" value="streets"  status="status">
    <br/>
            street.streetId<s:property value="#street.streetId"/><br/>
            street.streetName<s:property value="#street.streetName"/><br/>
            street.district.districtId<s:property value="#street.district.districtId"/><br/>
            street.district.districtName<s:property value="#street.district.districtName"/><br/>
            
    </s:iterator>


    --------------------------------------

    <action name="user_*"  class="action.UserAction"  method="{1}" >

      <result name="{1}_success"></result>

    </action>

    //方法名要和返回值前缀一样

  • 相关阅读:
    BZOJ5296 [CQOI2018] 破解D-H协议 【数学】【BSGS】
    Codeforces963C Frequency of String 【字符串】【AC自动机】
    Codeforces962F Simple Cycles Edges 【双连通分量】【dfs树】
    Hello World
    Codeforces963C Cutting Rectangle 【数学】
    BZOJ5203 [NEERC2017 Northern] Grand Test 【dfs树】【构造】
    20160422 --Switch…case 总结; 递归算法
    20160421字符串类型;日期时间类型数学类型
    20160420冒泡排序和查找
    20160419 while练习,复习
  • 原文地址:https://www.cnblogs.com/m97i/p/7478033.html
Copyright © 2011-2022 走看看