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>

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

原文地址:https://www.cnblogs.com/m97i/p/7478033.html