一:通配符
1.1:含义
通配符是一种特殊语句,主要有星号(*)和问号(?),用来模糊搜索文件。当查找文件夹时,可以使用它来代替一个或多个真正字符;
2.2:实例
(jsp页面)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="studentadd_addsuccess.action">添加数据</a><br/><br/>
<a href="studentupdate_add.action">修改数据</a><br/><br/>
<a href="studentdelete.action">删除数据</a><br/><br/>
<a href="studentquery.action">查询数据</a><br/><br/>
</body>
</html>
( struts.xml )
<action name="student*_*" class="com.phy.action.StudentAction" method="{1}">
<result name="{2}">/{2}.jsp</result>
</action>
此处使用通配符,其中*匹配所有,在method中的{1}表示匹配第一个*,其中跳转页面的命名也是根据第一个*的值进行的。method中的{2}匹配name中的第二个*;result中页面的命名分别取name中的第一个*和第二个*。
二:jsp页面跳转
一般我们转发有3种重定向(redirect)、转发(dispatcher--默认)、还一种是action的跳转,以前我们根据servlet跳转的话只要通过request和response来实现跳转就可以了,但是struts2我们只需要通过配置就可以实现了,通过<result>标签里面的type属性就可以实现了。
<result name="add" type="redirect/dispatcher">add.action</result> --jsp页面跳转
<result name="tosuccess" type="chain/redirectAction">studentquery</result> --action跳转
三:拦截器(Interceptor)
拦截器和以前我们学的过滤器一样起到拦截作用,它分为两种一种是系统拦截另一种是自定义拦截,它是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。
3.1:系统拦截器--Timer/Token
Timer--测试方法执行的时间,在struts.xml里面的action标签进行配置
<interceptor-ref name="timer"></interceptor-ref>
不过单纯这一句是不起作用的,我们还需要配置默认的
<interceptor-ref name="defaultStack"></interceptor-ref>
Token-- 令牌:解决表单重复提交问题
<interceptor-ref name="token"></interceptor-ref>
这样的话在运行下会报错误,所以我们需要在配置
<result name="invalid.token">/error.jsp</result>
还有一些其它系统拦截器,感兴趣的可以去官网看看
3.2:自定义拦截器
我们需要自定义一个类并且需要继承AbstractInterceptor并重写intercept方法,然后在struts.xml里面配置拦截器
<interceptors>
<interceptor name="one" class="com.phy.interceptor.OneIntercepter"></interceptor>
</interceptors>
然后在引用拦截器在action里面--属性名要和上面一样
<interceptor-ref name="token"></interceptor-ref>
如果你这样运行的话你会发现业务根本就没有走,那是应为你在写自定义拦截器类的时候没有返回值,就把方法阻拦了,这时候就需要对它进行放行了
@Override
public String intercept(ActionInvocation arg0) throws Exception {
// TODO Auto-generated method stub
return arg0.invoke/invokeActionOnly(); ----这里我们有两种放行第一种是会一直传播下去,而第二种的话就不会传播下去直接得到最终结果
}