Struts2笔记
第一节:概述
1. 简介:
l Struts2是自webwork框架发展而来,与Struts1无关,只为借助Struts1的名气;
l Sturts2所用到的基本技术:动态代理 + 反射 + 过滤器;
l Struts2主要是针对jsp/servlet的技术,Hibernate是针对DAO的技术。
2. 注意点:
l 使用Struts2标签时,eclipse需要配插件,所以建议用MyEclipse开发;
l 前端表单提交的数据统一为小写字母,大写后端不识别,原因未知;
l 每个action类中不要忘记 get() 和 set() 方法,不然Struts2访问不到属性;
l 对action类而言:进入时总动获取表单值,离开时自动加入作用域;
l 用多少jar包,导多少jar包,全部导入可能存在问题;
l 注意配置web.xml文档时的权限管理。
3. 使用流程:
l 下载:在apache官网下载;
l 新建项目,导入相应的jar包,可参见example项目struts-blank.war;
l 配置web.xml文档。
l 在src下新建struts.xml配置文件,并配置相应参数,action为对应类,name值与请求一致,返回值为result。
l 可以新建action类,进行开发了。
第二节:Action详解
1. Action的使用方法(三种):普通类+ 实现Action接口 + 继承ActionSupport类
l 普通类:简单,但是不能用某些Struts的其他功能;
l 实现Action接口:直接使用其中的常量,如:SUCCESSFUL,NONE,INPUT等。
l 继承ActionSupport类:最常用。
2. 调用Action内部的方法(除了execute()方法之外):
l 访问时,主要访问的url是:Action名 + ” ! ” + 其他方法名;即可调用改Action内其他方法。
l 原理:类似与之前表单隐藏域,Struts2框架截去” ! ”前后的字符串,前为Action,后为该Action内的方法。
第三节:封装表单的方式: (Model-Driven和 Property-Driven)
1. 比较:Property-Driven适合7个一下的表单,简单;而Model-Driven适合于大量表单提交的时候。
注意:要使用” ! ”来进行动态方法调用,必须在struts.xml配置文件中设置一条contant标签:<constant name="struts.enable.DynamicMethodInvocation" value="true" />, 这样之后才可以用,不然不可以用。详见我的csdn博客。
2. Property-Driven:Action内定义属性,表单域名称和属性名相同,(类型不用管,Struts2会帮我们自动转),提交时如下提交:” Action名!method名” 即可完成。
3. Model-Driven:用一个javabean接收前端传来的参数,实现model效果。实现步骤:
<1>. 建一个javabean,比如User类,其中属性名和表单域名称一致;
<2>. 负责处理的Action实现ModelDriven<User>接口,填入javabean的泛型;
<3>. 实现ModelDriven接口中的getModel()方法,返回一个接收到的的javabean。即可。注意:不要忘了在Action中new 该javabean,例如 User user = new User();还要有getUser()和setUser()方法。
第四讲、配置文件详解(struts.xml):
1. <package>包:作用是划分代码,便于管理。此包不同于java类中的包,此包可以被继承,继承之后自动拥有父包的内容。所有包均继承自” struts-default ”包。
l namespace命名空间:是package的一个属性,作用是指定页面的url,”/”表示根目录。
l extends: 指定继承自哪个包,默认为” struts-default ”。
2. <action>:把前端访问页面和后端处理类对应起来,属性有name,class
3. <result>结果页面: 有一下属性
l name:对应action返回值,默认为”success”;
l type:dispatcherà转发;chainà跳到另一个action;freemarkerà显示页面为freemaker;redirectà重定向;streamà向浏览器发送InputStream对象,通常用来处理下载或返回Ajax;默认为dispatcher;
l path:路径,等同于<result>标签中间的路径
4. <global-results>: 全局的result,即整个包中的所有action都共享配在其中的所有result页面。
5. <contant>配置信息:详见另一篇文档或查看我的csdn。
6. 多配置文件:
多人开发项目时,需要协作,不能用同一个struts.xml文件。我们通过<include>来指定多个配置文件。通常按人或模块来划分,通常按模块来划分,在模块下面继续划分。
注意:SSH三大框架都可以实现Annotation机制,从而不需要配置xml文件(例如:struts2.xml),但是为了便于管理,建议:struts配xml文件,Hibernate和spring配置注解@。
第五讲:ActionContext对象:
1. 在Struts2框架里,非常非常重要的对象;
2. 封装了所有Struts2的对象,包括所servlet里的所有对象;
3. 实质:ActionContext对象里包含一个context属性,此属性包含一堆属性,其中一个是table属性,此为一个map,这个名为table的map里封装了很多东西,如request,response,session等等。request里面又包含一个名叫OgnlValueStack的ValueStack(ValueStack是类似于List的一种类型)。这个OgnlValueStack中又包含一个action这个action和ActionContext是同一个对象(引用互指)。所以:我们可以操作ognlValueStack中的action来实现操作ActionContext对象,即通过操作OgnlValueStack中的action来操作Struts框架的所有属性。结构图如下:
4. 原理简介:前端的作用域对象被Struts2框架转化成map,后台返回时将map转化成作用域对象。其中Action和ActionContext对象会被转化为request对象。
5. 获取web容器信息:
l 获取session: ac.getSession().put(“key” , “value”);
l 获取request: ac.get(“ request ”);
l 获取Application: ac.getApplication();
注意:getSession()等此类代码不要放在Action的构造函数里,因为此时ActionContext里的值也许还没设置,这是通过ActionContext取得的值有可能为null。
6. 获取真正的Web容器信息: (ServletActionContext)
HttpServletRequest req = ServletActionContext.getRequest();
ServletActionContext.getRequest().getSession();
ServletActionContext. getServletContext();
第六讲:OGNL语言:(对象图形导航语言)
1. OGNL与EL相似,但比EL强大。
2. List和Map的操作: 注意:map操作时,做到两点,不少引号不少#号。
List:<s:set var=”list” value=”{123 , ’year’ , ‘good’}” scope=”request”></s:set>
Map:<s:set var=”map” value=”#{‘No01’:‘boy’ , ‘No02’:#request.list.get(0)}”></s:set>
*复杂操作如下:
<s:set var=”list” value=”{‘abc’, 123, true}” scope=”session”></s:set>
<s:set var=”m” value=”#{‘first’ : #session.list}”scope=”request” ></s:set>
取出一个map里的list<s:property value=”#session.(#request.m.first).get(0)” />
结果为:字符串‘abc’
3. 集合元素中的查找------in 和 not in:
<s: property value=” ‘a’ in {‘a’, ‘b’, ‘c’} ” />
<s: property value=” ‘a’ in #request.list />
4. 过滤/投影: 即在集合中过滤,得到一个子集,这个叫过滤或投影。
? à 符合选择逻辑的所有元素
^ à 符合选择逻辑的第一个元素
$ à 符合选择逻辑的最后一个元素
#this à表示集合中的当前元素
<s:set var="ss" value="#request.user.{?#this.pwd.equals('456')}"scope="request">
</s:set>
<s:iterator value="#request.ss"var="temp">
<s:property value="#temp.uname"/>
</s:iterator>
5. 其他操作: (调对象的方法,调对象静态方法,获取方法返回值等)
l 调用普通方法 à 直接掉
l <1>调用静态方法à 在struts.xml配置文件中配置<constant name=”struts.ognl.allowStaticMethodAccess” value=”true”/>
<2> @class@method(args) //调用类的方法 e.g @java.lang.String@toString();
<3>@@表示调用java.util.Math包中的类,e.g:@@max(3, 5);
<4>返回值:只需要在调用方法的<s: set>里设置var即可得到。
注意:调用时一定要写类的完整报名。
第七讲:Struts标签
1. Struts标签现在不支持EL,只能用OGNL。
2. Struts标签共分四大类:数据标签 + 控制标签 + 表单标签 + 非表单标签。
3. 常用标签:
l Property输出变量的值:
(通过OGNL可以有很多种操作,略过)
l Set设置变量值:
<s:set var=”aa” value=”{‘a’, ‘c’, ‘b’, ‘4’, ‘c’}”scope=”request” ></s:set>
l action用于执行Action:
<s:action name=’’login’></s:action>
有以下常用属性:
name à 只要提交到后台处理的action;
namespace à 命名空间;注意:强烈建议加上
executeResult à true 或 false,是否将执行结果包含在本页面。
action标签还可以包含子标签:<s:param name=””>value</s:param>
l date输出日期:
<s:date name=”#request.d” format=”yyyy-MM-dd” nice=”true” />
其中nice属性为:将时间表示成XX ago,即XX年前,此时format不起作用。
l include包含其他页面:
作用和<jsp: include>一样。<s:include value=”1.jsp”></s:include>
l param用于传参:
用于传参。略过
l if/ifelse/else流程控制语句:
和JSTL一样,而且用法比JSTL更简单,因为更像java代码。示例代码如下:
<h1>--------------</h1> <% request.setAttribute( |