马士兵 struts 学习笔记

1.在jsp中使用绝对路径:
在头重设置:
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
或者:<% String basePath = request.getContextPath(); %>
在head中设置:
<head>
<base href="<%=basePath%>" />
</head>
basePath=http://localhost:8088/StrutsDemo1
即可在body中直接用绝对路径来访问
<a href="path/path.action">路径问题说明</a>
相当于访问【http://localhost:8088/StrutsDemo1/path/path.action】

2.Action执行的时候并不一定要执行execute方法
可以在配置文件中配置Action的时候用method=来指定执行哪个方法也可以在url地址中动态指定(动态方法调用DMI)(推荐)
<a href="<%=basePath %>/user/userAdd">添加用户</a>
对应的action如下:
【<action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add">
            <result>/user_add_success.jsp</result>
  </action>
 】
<a href="<%=basePath %>/user/user!add">添加用户</a>
对应的action如下:
【 <action name="user" class="com.bjsxt.struts2.user.action.UserAction">
            <result>/user_add_success.jsp</result>
   </action>】
 前者会产生太多的action,所以不推荐使用
 
3.【使得配置struts更简单】使用通配符,将配置量降到最低
  不过,一定要遵守"约定优于配置"的原则
  用例:
  <package name="actions" extends="struts-default" namespace="/actions">
        <action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">
            <result>/Student{1}_success.jsp</result>
        </action>
        
        <action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
            <result>/{1}_{2}_success.jsp</result>
            <!-- {0}_success.jsp -->
        </action>
    </package>
  http://localhost:8088/StrutsDemo1/actions/Studentadd若请求这个参数表示,访问add()方法。
       访问方法后调用Studentadd_success.jsp
 
4.使用Domain Model接收参数
   url如下:http://localhost:8088/StrutsDemo1/user/user!add?user.name=a&user.age=8
   user.name表示属性。这里的user要与方法中的setUser()方法对应 也就是说要用类中定义的user
   定义的action类如下:
   public class UserAction extends ActionSupport {
    
    private User user;
    public String add() {
        System.out.println("name=" + user.getName());
        System.out.println("age=" + user.getAge());
        return SUCCESS;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
    
}

5.使用ModelDriven接收参数:
url请求:http://localhost:8088/StrutsDemo1/user/user!add?name=a&age=8
定义的action类如下:
public class UserAction extends ActionSupport implements ModelDriven<User>{
    
    private User user = new User();
    
    public String add() {
        System.out.println("name=" + user.getName());
        System.out.println("age=" + user.getAge());
        return SUCCESS;
    }

    @Override
    public User getModel() {
        return user;
    }
    
}
6.使用action属性接收参数,测试中文问题
  在sturts加上:<constant name="struts.i18n.encoding" value="GBK" /> <!-- internationalization -->

7.使用addFieldError方法和s:fieldError标签简单处理数据校验
在头文件导入struts tag:<%@taglib uri="/struts-tags" prefix="s" %>
  <s:fielderror fieldName="name" theme="simple"/>
    <br />
    <s:property value="errors.name[0]"/>
    <s:debug></s:debug>【可以点击观察这些栈都存在什么】

8.取得Map类型request,session,application,真实类型 HttpServletRequest, HttpSession, ServletContext的引用:
--前三者:依赖于容器
--前三者:IOC(只用这种)
--后三者:依赖于容器
--后三者:IOC
例子:
传过来的参数到action类中:
package com.bjsxt.struts2.user.action;

import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class LoginAction1 extends ActionSupport {
    
    private Map request;
    private Map session;
    private Map application;
    
    public LoginAction1() {
        request = (Map)ActionContext.getContext().get("request");
        session = ActionContext.getContext().getSession();
        application = ActionContext.getContext().getApplication();
    }
    
    public String execute() {
        request.put("r1", "r1");
        session.put("s1", "s1");
        application.put("a1", "a1");
        return SUCCESS;
    }
}
页面使用有两种 jsp语法和struts ongl语言  而#attr.a1是在所有容器中搜索,一般不用,因为key有可能会重复:
    <br />
    <s:property value="#request.r1"/> | <%=request.getAttribute("r1") %> <br />
    <s:property value="#session.s1"/> | <%=session.getAttribute("s1") %> <br />
    <s:property value="#application.a1"/> | <%=application.getAttribute("a1") %> <br />
    <s:property value="#attr.a1"/><br />
    <s:property value="#attr.s1"/><br />
    <s:property value="#attr.r1"/><br />
    <s:debug></s:debug>
    <br />

9.设置多个struts.xml包含在改文件中。
  例如:
  在struts.xml中代码为:
<struts>
    <constant name="struts.devMode" value="true" />
    <include file="struts1.xml" />
</struts>

10.在xml中找不到action名字的时候,默认调用一个action  设置方法:
    <package name="default" namespace="/" extends="struts-default">
        <default-action-ref name="index"></default-action-ref>
        <action name="index">
            <result>/default.jsp</result>
        </action>
    </package>
11.action result Type:
   例子:
   <struts>
    <constant name="struts.devMode" value="true" />
    <package name="resultTypes" namespace="/r" extends="struts-default">
        <action name="r1">
            <result type="dispatcher">/r1.jsp</result>
        </action>
        
        <action name="r2">
            <result type="redirect">/r2.jsp</result>
        </action>
        
        <action name="r3">
            <result type="chain">r1</result>
        </action>
        
        <action name="r4">
            <result type="redirectAction">r2</result>
        </action>
        <!-- 访问包-->
        <action name="r5">
         <result type="chain">
            <param name="actionName">r1</param>
            <param name="namespace">/rr</param>
        </result>
        </action>
    </package>
    <!-- 访问包-->
     <package name="rr" namespace="/rr" extends="struts-default">
        <action name="r1">
            <result type="dispatcher">/r3.jsp</result>
        </action>
    </package>
</struts>

12.根据方法中的返回选取result:
   <result name="error">/user_error.jsp</result>
13.动态结果一定不要忘了为动态结果的保存值设置set get方法
   struts.xml如下:
   <struts>
    <constant name="struts.devMode" value="true" />
    <package name="user" namespace="/user" extends="struts-default">
        
        <action name="user" class="com.bjsxt.struts2.user.action.UserAction">
            <result>${r}</result>
        </action>        
    </package>
        
</struts>
   相对应的类如下:
   package com.bjsxt.struts2.user.action;

import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport {
    private int type;
    
    private String r;

    public String getR() {
        return r;
    }

    public void setR(String r) {
        this.r = r;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    @Override
    public String execute() throws Exception {
        if(type == 1) r="/user_success.jsp";
        else if (type == 2) r="/user_error.jsp";
        return "success";
    }

}

14.传参数到页面(需要ognl-2.6.11.jar包):
   <struts>
    <constant name="struts.devMode" value="true" />
    <package name="user" namespace="/user" extends="struts-default">
        
        <action name="user" class="com.bjsxt.struts2.user.action.UserAction">
            <result type="redirect">/user_success.jsp?t=${type}</result>
        </action>        
    </package>
        
</struts>
  页面:
  <s:property value="#parameters.t"/>
 
15.ognl学习:
访问的url:http://localhost:8088/StrutsDemo1/ognl.action?user.age=321
<li>访问值栈中对象的普通属性(get set方法):<s:property value="user.age"/> | <s:property value="user['age']"/> | <s:property value="user[\"age\"]"/> | wrong: <%--<s:property value="user[age]"/>--%></li>
<li>访问值栈中action的普通方法:<s:property value="m()" /></li>
<li>访问静态方法:<s:property value="@com.bjsxt.struts2.ognl.S@s()"/></li>
<li>访问静态属性:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/></li>
<li>访问Math类的静态方法:<s:property value="@@max(2,3)" /></li>
<hr />
<li>访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.User(8)"/></li>
<hr />
<li>访问List:<s:property value="users"/></li>
<li>访问List中某个元素:<s:property value="users[1]"/></li>
<li>访问List中元素某个属性的集合:<s:property value="users.{age}"/></li>
<li>访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/></li>
<li>访问Set:<s:property value="dogs"/></li>
<li>访问Map:<s:property value="dogMap"/></li>
<li>访问Map中某个元素:<s:property value="dogMap.dog101"/> | <s:property value="dogMap['dog101']"/> | <s:property value="dogMap[\"dog101\"]"/></li>
<li>访问Map中所有的key:<s:property value="dogMap.keys"/></li>
<li>访问Map中所有的value:<s:property value="dogMap.values"/></li>
<li>访问容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size"/> </li>

<li>投影(过滤):<s:property value="users.{?#this.age==1}[0]"/></li>
<li>投影:<s:property value="users.{^#this.age>1}.{age}"/></li>
<li>投影:<s:property value="users.{$#this.age>1}.{age}"/></li>
<li>投影:<s:property value="users.{$#this.age>1}.{age} == null"/></li>
结果如下:
22.投影(过滤):user1
23.投影:[2]
24.投影:[3]
25.投影:false
--------------------------------------------------------------------------------
<li>property: <s:property value="username"/> </li>
<li>property 取值为字符串: <s:property value="'username'"/> </li>
<li>property 设定默认值: <s:property value="admin" default="管理员"/> </li>
<li>property 设定HTML: <s:property value="'<hr/>'" escape="false"/> </li>
<hr />
<li>set 设定adminName值(默认为request 和 ActionContext): <s:set var="adminName1" value="'xxxxx'" /></li>

<li>set 从request取值: <s:property value="#request.adminName1" /></li>
<li>set 从ActionContext取值: <s:property value="#adminName1" /></li>

<%--<li>set 设定范围: <s:set name="adminPassword" value="password" scope="page"/></li>
<li>set 从相应范围取值: <%=pageContext.getAttribute("adminPassword") %></li>
--%>
<li>set 设定var,范围为ActionContext: <s:set var="adminPassword" value="password" scope="request"/></li>
<li>set 从相应范围取值: <s:property value="#request.adminPassword"/> </li>
<li>set 使用#取值xxxxxx: <s:property value="#request.adminPassword"/> </li>

<li>bean 定义bean,并使用param来设定新的属性值:
            <s:bean name="com.bjsxt.struts2.tags.Dog" >
                <s:param name="name" value="'pp'"></s:param>
                <s:property value="name"/>
            </s:bean>
</li>

<li>bean 查看debug情况:
            <s:bean name="com.bjsxt.struts2.tags.Dog" var="myDog">
                <s:param name="name" value="'oudy'"></s:param>
            </s:bean>
            拿出值:
            <s:property value="#myDog.name"/>
</li>

<li>include _include1.html 包含静态英文文件
<s:include value="/_include1.html"></s:include>
</li>
<li>include _include1.html 包含静态英文文件,说明%用法
<s:set var="incPage" value="%{'/_include1.html'}" />
<s:include value="%{#incPage}"></s:include>
</li>

<li>if elseif else:                                               
age = <s:property value="#parameters.age[0]" /> <br />        
<s:set var="age" value="#parameters.age[0]" />                
<s:if test="#age < 0">wrong age!</s:if>                       
<s:elseif test="#parameters.age[0] < 20">too young!</s:elseif>
<s:else>yeah!</s:else><br />                                  
<s:if test="#parameters.aaa == null">null</s:if>              
</li>

<li>遍历集合:<br />
<s:iterator value="{1, 2, 3}" >
    <s:property/> |
</s:iterator>
</li>    
输出:遍历集合:
       1 | 2 | 3 |

<li>自定义变量:<br />
        <s:iterator value="{'aaa', 'bbb', 'ccc'}" var="x">
            <s:property value="#x.toUpperCase()"/> |
        </s:iterator>
</li>
输出:自定义变量:
       AAA | BBB | CCC |
       
<li>使用status:<br />
        <s:iterator value="{'aaa', 'bbb', 'ccc'}" status="status">
            <s:property/> |
            遍历过的元素总数:<s:property value="#status.count"/> |
            遍历过的元素索引:<s:property value="#status.index"/> |
            当前是偶数?:<s:property value="#status.even"/> |
            当前是奇数?:<s:property value="#status.odd"/> |
            是第一个元素吗?:<s:property value="#status.first"/> |
            是最后一个元素吗?:<s:property value="#status.last"/>
            <br />
        </s:iterator>
</li>                                     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值