Struts2学习笔记(三)

时间:2023-02-26 18:50:07

MethodFilterInterceptor自定义拦截器,可以通过参数注入的方式确定拦截哪些和不拦截哪些方法

访问action的特定方法

在使用struts2的时候,不指定方法就会访问action的默认方法execute,如果指定了则会访问指定的方法。这个技巧可以用来初始化页面

<!-- 指定upload方法,则调用upload方法 -->
<action name="upload" method="upload" class="com.cheng.web.action.FileAction">
<result name="success">/WEB-INF/file/upload.jsp</result>
</action>
<!-- 不指定upload方法,则默认调用execute方法 -->
<action name="upload" class="com.cheng.web.action.FileAction">
<result name="success">/WEB-INF/file/upload.jsp</result>
</action>

使用OGNL(Object Graphic Navigation Language)表达式自定义文件下载名

private String downName;
public String download() throws FileNotFoundException {
String realPath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/upload/百度.png");
setDownName("百度");
inputStream = new FileInputStream(new File(realPath));
return SUCCESS;
}
<!-- ognl调用静态方法需要打开allowStaticMethodAccess -->
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
<param name="contentDisposition">
attachment;filename=${@java.net.URLEncoder@encode(downName,"UTF-8")}.jpg
</param>
声明文件中的<package></package>的继承关系,配置在package中的拦截器只对本包中的Action生效,不写有默认,写了没默认,需要手动添加ref

Struts的ContextMap

动作类的生命周期,每次动作访问,动作类都会实例化,所以是是线程安全的。
产生的请求数据都放到哪儿了?
每次访问动作,都会由核心控制器StrutsPrepareAndExcecuteFilter创建一个ActionContext和ValueStack对象,
这两个对象存储了整个动作访问期间用到的数据,并且把数据绑定到了线程局部变量(ThreadLocal)上,所以它是线程安全的。

-Context Map是OGNL上下文
-ActionContext 是一个Map集合
-application Map,封装应用域属性
-session Map,封装会话域属性
-request Map,封装请求域属性
-parameters Map,封装参数
-attr(searcher page,request,session,the application scopes)
Map,封装四域所有属性
-value stack(root) 是一个List集合

Action动作类的引用,默认情况下就在ValueStack的栈顶

Iterator迭代标签

var属性:取值是一个字符串
如果写了,就把var的值作为key,把当前遍历的元素作为value,放到ActionContext的大Map中
如果不写,把当前遍历的元素压入栈顶,输出后弹栈

status属性:存放遍历时的一些计数信息

int getIndex        计数从0开始
int getCount 计数从1开始
boolean isFirst 第一
boolean isLast 最后
boolean isOdd 奇数
boolean isEven 偶数

在标签中使用采用反射的方法,调用status的属性,所以需要去掉get set is

<s:iterator value="list" var="s" status="vs"></s:iterator>
<s:if test="#vs.odd">
<tr style="background-color: red">
</s:if>
<s:property value="#vs.count"></s:property>

Struts2中的一些其他常用标签,
value中填写的都是ognl表达式,要转成字符串需要加单引号

<s:set>
<s:action>
<s:if><s:ifelse><s:else>
<s:url var="填写的是key" action="填写value">放到ActionContext的中
这个标签的作用是网址后缀的自动转换,可用于伪静态
<s:url action="fun" var="url"></s:url>
<a href="${pageContext.request.contextPath}/fun">单纯</a>
<a href="<s:property value='url'/>">伪装</a>

Struts2中#,$,%

取context中的key,ognl创建Map对象时使用
$使用el表达式,在xml中使用ognl取值
%把字符串当成ognl表达式
ModelDriven中的模型对象要自己实例化
ModelDriven把模型对象压入栈顶,然后动态参数封装get set值
防止表单重复提交

<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="tokenSession"></interceptor-ref>
<result name="invalid.token">/resubmit.jsp</result>