struts基础学习

1.struts1.x于struts2.x区别

        1.struts2没有像struts1一样与servlet API耦合
        2.struts2的核心为xwork。一个请求生成一个实例,而1是使用的同一个
        3.Struts 2直接使用Action属性作为输入属性,而struts1使用actionform
        4.struts2加入了ognl........// 详细见: http://blog.csdn.net/ilmlife/article/details/9704753


2.struts2基础学习

    2.1 配置文件

             a) 常量配置(详细参见struts的属性文件) 
                      eg.指定web应用默认字符集,开发模式的使用(修改action、修改xml文件后不需要再重启服务器,直接就可以看到结果。 但是,项目上线后,需要关闭开发模式)
              <constant name="struts.i18n.encoding" value="gbk" />
<pre name="code" class="html">              <constant name="struts.devMode" value="true" />
 
 
 
 
 
 
 
              b)  package配置(把action、result、type、interceptor等这些元素打包到一个逻辑单元中)。可继承使用(extends)
                       eg.
         <package name="action" namespace="/action" extends="struts-default">
		<action name="action" class="com.struts.action.Action">
			<result name="success">/pagestruts/Action.jsp</result>
		</action>
		<action name="actionimpl" class="com.struts.action.ActionExtends">
			<result name="success">/pagestruts/Action.jsp</result>
		</action>
		<action name="actionextends" class="com.struts.action.ActionImpl">
			<result name="success">/pagestruts/Action.jsp</result>
		</action>
	</package>
             c)  配置命名空间(namespace)(通过不同的命名空间划分不同的功能模块,利于多人协作开发时保持相互之间的独立性,提高开发效率)
                      eg.
        <package name="wildcard" namespace="/wildcard" extends="struts-default">
		<action name="*_*" class="com.struts.wildcard.{1}Action" method="{2}">
			<result>/pagestruts/{1}_{2}.jsp</result>
		</action>
	</package>
             d)  配置Action(将url、Action类、展示页面三者绑定)
                      url:namespace + actionname
                      class:Action Class
                      return:view。返回类型:

type

使用说明

chain 

用来处理Action链,将一个action的执行与另外一个配置好的action串连起来。用第一个action的getter方法和第二个action的setter方法来完成action之间属性的复制。服务器端跳转到action

dispatcher  

用来转向JSP页面,这是默认的结果类型,如果在action配置中没有配置其他的结果类型,它就会被使用。服务器端跳转到视图

freemaker   

处理FreeMarker模板   

httpheader

控制特殊HTTP行为的结果类型

redirect  

   重定向到一个URL。客户端跳转到视图

redirectAction 

  重定向到一个Action。客户端跳转到Action

stream 

  向浏览器发送InputSream对象,通常用来处理文件下载,还可用于返回AJAX数据 

velocity

  处理Velocity模板 

xslt  

处理XML/XLST模板   

plainText   

   显示原始文件内容,例如文件源代码  

                            global result配置:
<package name="test" namespace="/globalResult" extends="struts-default">
    	<global-results>
    <span style="white-space:pre">		</span><result name="mainpage">/main.jsp</result>
    <span style="white-space:pre">	</span></global-results>     
</package>
               e)  include 多配置文件配置
<include file="XXXXX.xml" />
                      可以通过注解的方式实现零配置

    2.2 Action

            a) 不继承任何的Action(Action类完全不和struts2框架发生耦合,但不能使用struts2中的某些功能)
package com.struts.action;

public class Action {
	public final String SUCCESS = "success";
	public String execute(){
		return SUCCESS;
	}
}


            b) 实现Action接口
package com.struts.action;

import com.opensymphony.xwork2.Action;

public class ActionImpl implements Action{
	public String execute() throws Exception {
		return SUCCESS;
	}
}


            c) 继承ActionSupport类(推荐)
package com.struts.action;

import com.opensymphony.xwork2.ActionSupport;

public class ActionExtends extends ActionSupport{
	private static final long serialVersionUID = 8545758502007427546L;

	@Override
	public String execute() throws Exception {
		return SUCCESS;
	}
	
}
           action的动态调用 访问方式为actionname!methodname

    2.3 struts标签

                2.3.1  property 输出变量值
                <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>
               2.3.2  set 设置变量值
<pre name="code" class="html">                <li>set 设定adminName值(默认为request 和 ActionContext): <s:set var="adminName" value="username" /></li>
		<li>set 从request取值: <s:property value="#request.adminName" /></li>
		<li>set 从ActionContext取值: <s:property value="#adminName" /></li>
		<s:debug></s:debug>
		<%--<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="session"/></li>
		<li>set 使用#取值: <s:property value="#adminPassword"/> </li>
		<li>set 从相应范围取值: <s:property value="#session.adminPassword"/> </li>
                2.3.3  action 执行Action 
 
 
 
 
 
 
                <s:action var="a" name="testOgnl" namespace="/" executeResult="true" ignoreContextParams="false" >
  		    <s:param name="uname">老高</s:param>
  	        </s:action>
               2.3.4  include 包含其他资源执行结果
                <li>include _include1.html 包含静态英文文件,说明%用法
		<s:set var="incPage" value="%{'/_include1.html'}" />
		<s:include value="%{#incPage}"></s:include>
		</li>
               2.3.5  if elseif else 流程控制标签
         <%
		request.setAttribute("random",new Random().nextInt(100));
	 %>
	 <s:if test="#request.random>=80">
	 	<b>优秀!</b>
	 </s:if>
	 <s:elseif test="#request.random>=60">
	 	<b>一般!</b>
	 </s:elseif>
	<s:else>
		<b>不合格!</b>
	</s:else>
           2.3.5  date 输出日期
         <%
  		request.setAttribute("d",new Date(23432432L));
  	 %>
  	 <s:date name="#request.d" format="yyyy-MM-dd" nice="true" /> <!-- 增加nice,format属性不起作用 -->
  	 <hr/>
  	 <s:date name="#request.d" format="yyyy-MM-dd"  var="c"/> <!-- 使用var,时间不会打印出,而是保存在c变量中! -->
           2.3.6  iterator 循环迭代标签 

                         1. value 将要迭代的集合,使用OGNL表示

                         2. var   指向集合中正被迭代的对象

                         3. begin  如果指定,迭代器从begin指定的索引开始

                         4. end    如果指定,迭代器到end指定的索引结束(包含end索引指向的对象)

                         5. step      如果指定,迭代器每次递增的增量。如果不指定,默认是1

                         6. status  用来表示迭代器状态的变量。他有如下的方法:
                                           int  getCount() 返回迭代次数
                                           int getIndex() 返回当前迭代的索引值
                                           boolean isEven() 当前迭代的索引值是否偶数
                                           boolean isFirst() 当前迭代的索引值是否第一个元素
                                           boolean isLast() 当前迭代的索引值是否最后一个元素
                                           boolean isOdd() 当前迭代的索引值是否奇数

 <body>
  	<s:set var="s" value="{00,11,22,33,44,55,66,77,88,99}" ></s:set>
  	<table width="200px" border="1">
  	 <s:iterator value="#request.s"  var="temp" begin="0" end="7" step="1" status="idx">
  	 	<s:if test="#idx.odd">
			<tr bgcolor="gray"><td><s:property value="#idx.index"/>---<s:property value="#temp" /></td></tr>
  	 	</s:if>
  	 	<s:else>
			<tr><td><s:property value="#idx.index"/>---<s:property value="#temp" /></td></tr>
  	 	</s:else>
  	 </s:iterator>
  	</table>
  </body>
                2.3.7  textfield 文本域 |  textarea 多行文本域 | file 文件域 | checkbox | checkboxlist 复选框 | radio 单选按钮 |  selet下拉框 等参见开发文档

    2.4 ognl

               2.4.1  优点:保持EL语言的优点外• 能够访问对象的普通方法• 能够访问类的静态属性和静态方法• 强大的操作集合类对象的能力• 支持赋值操作和表达式串联• 访问OGNL上下文和ActionContext
               2.4.2  使用:
                                  • 操作OgnlValueStack中属性  直接拿栈中的对象使用   xxx.xxx.xxx 如:user.username
                                  • 操作AcitionContext其他域中的属性  获取上下文中的值   #xxx.xxx如:#session.id
                                  • 和[]操作符(没有点运算符操作方便,但是功能强大,可以传入变量值,动态取值)
                                  • OGNL支持所有的JAVA运算符
                                  • OGNL操作集合 
                                          — List/ Set
  <body>
  	<s:set var="list" value="{'a','b','c'}" scope="request"></s:set>
	<p><s:property value="#request.list.get(2)" /></p>
  </body>
                                          — Map
<body>
  	<%
  		request.setAttribute("a","123456");
  	 %>
  	<s:set var="m" value="#{'name':'老高','pwd':#request.a}" scope="request"></s:set>
	<p><s:property value="#request.m.name" /></p>
	<p><s:property value="#request.m.pwd" /></p>
  </body>
                                          — in和not in操作符
  <body>
  	<s:set var="s" value="{'a','b','c'}" scope="request"></s:set>
  	<s:set var="m" value="#{'name':'老高','pwd':'123456'}" scope="request"></s:set>
	<p><s:property value="'a' in {'a','b','c'}" /></p>
	<p><s:property value="'a' not in #request.s" /></p>
	<p><s:property value="'name' in #request.m.keys" /></p>
	<p><s:property value="'老高' in #request.m.values" /></p>
  </body>
            2.4.3  过滤/投影(我们把过滤集合中的元素产生一个子集合,叫做投影)
                      ?---符合选择逻辑的所有元素
                      ^---符合选择逻辑的第一个元素
                      $---符合选择逻辑的最后一个元素
                #this---表示集合是的元素
<html>
  <head>
    <title>测试OGNL</title>
  </head>
  <body>
  	<%
  		User u1 = new User("张三","123456");
  		User u3 = new User("王五","123456");
  		User u5 = new User("高淇","654321");
  		User u6 = new User("马士兵","654321");
  		List list = new ArrayList();
  		list.add(u1);
  		list.add(u3);
  		list.add(u5);
  		list.add(u6);
  		request.setAttribute("s",list);
  	 %>
  	 <s:set var="s1" value="#request.s.{?#this.pwd=='654321'}" scope="request" ></s:set>
  	 <s:iterator value="#request.s1" var="temp" >
		 <p><s:property value="#temp.uname" /></p>
  	 </s:iterator>
  </body>
</html>
            2.4.4  OGNL其他技术
                      • 调用对象普通方法  直接调用即可:<s:property value="#request.t5.test1()" /> 
                      • 调用类的静态方法和静态属性 @class@method(args) //调用静态方法        @class@field //调用静态字段
                        (其中class必须给出完整的类名(包括包名),如果省略class,那么默认使用的类是java.util.Math,如: @@min(5,3) @@max(5,3) @@PI)
                        同时,需要修改struts.xml配置,增加:
                                       <constant name="struts.ognl.allowStaticMethodAccess" value="true" />

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值