第十章:OGNL表达式中的符号
- 10.1 #
“#”作用有二:
- 获取ognl上下文数据,如#key可以获得ContextMap中的对应数据
- 可以借助struts2标签,在页面创建集合,如<s:radio list=”#{key:value,……}”/>
**
- 10.2 %
**
“%”作用有二:
1 将ognl表达式转变成字符串,如%{‘’}
2 将字符串转变成ognl表达式,如%{}
- 10.3 $
“$”作用有二
1 el表达式标识,如${student.name}
2 在struts配置文件(xml,注解)中使用ognl表达式
第十一章:Struts2拦截器
- 11.1 拦截器基本概念
在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者在定义的action执行的前后加入执行的代码,也可以在一个action执行前阻止其执行。也就是说它提供了一种可以提取action中可重用代码,统一管理和执行的方式。
拦截器链 (Interceptor Chain,在Struts 2中称为拦截器栈Interceptor Stack)。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
那拦截器和过滤器有什么异同呢?
过滤器:servlet规范,适用范围为任何java web项目,可以对任何要访问的资源进行拦截。
拦截器:struts规范,适用范围仅包含struts框架项目,只能对Action进行拦截。
拦截器是AOP(aspect-oriented programming:面向切面程序设计)的典型范例,即在不修改源码的基础上对已有方法进行动态增强。
拦截器的执行过程:当请求进入struts2内部时,在执行动作方法之前先正序执行拦截器,然后执行动作方法,最后倒序执行拦截器。
- 11.2 自定义拦截器
- 11.2.1 如何自定义一个拦截器
step1:先定义一个普通java类,直接或者间接实现Interceptor接口;
方式有三种:
1. 直接实现Interceptor接口
2. 继承AbstractInterceptor抽象拦截器类
3. 继承MethodFilterInterceptor类
三种方法中,一般后两种方法更为普遍。
第一种方法:还需要实现init()和destroy()方法,而String intercept(ActionInvocation invocation)方法才是具体的拦截逻辑。
第二种方法:实现了Interceptor接口,并且提供了init()和destroy()的空实现,我们只需要覆盖String intercept(ActionInvocation invocation)方法即可。intercept()方法提供String类型的返回值作为逻辑视图,struts根据返回值跳转相应的视图。当自定义拦截器需要访问系统资源时,我们需要覆盖init()和destroy()方法。
第三种方法:MethodFilterInterceptor类是AbstractInterceptor类的子类,除了提供父类的功能之外,还提供了两个属性excludeMethod和includeMethod分别表示需要拦截和不需要拦截的方法。继承该类需要重写doInterceptor()方法。
step2:struts.xml文件的配置
<struts>
<!-- 开启开发者模式 -->
<constant name="struts.devMode" value="true"></constant>
<package name="p1" extends="struts-default">
<!-- 声明拦截器 -->
<interceptors>
<interceptor name="myInterceptor"
class="com.itheima.web.interceptors.MyInterceptor"></interceptor>
</interceptors>
<action name="demo1"
class="com.itheima.web.action.Demo1Action" method="demo1">
<!-- 引用拦截器 -->
<interceptor-ref name="myInterceptor"></interceptor-ref>
<result name="error">/success.jsp</result>
</action>
</package>
</struts>
- 11.2.2 其他
拦截器的放行:
invocation.invoke()方法。请看下面的代码:
/**
* 自定义拦截器
*/
public class MyInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("执行动作方法之前:MyInterceptor拦截了。。。。");
String rtValue = invocation.invoke();//放行
System.out.println("执行动作方法之后:MyInterceptor拦截了。。。。");
System.out.println(rtValue);
return rtValue;
}
}
拦截器返回值:
那么这个rtValue值是什么呢?它其实拦截器的返回值,就是我们Action中,执行的动作方法返回值。
自定义拦截器执行顺序:
我们也可以自定义多个拦截器,那么多个拦截器之间执行顺序是靠引用拦截器时配置的顺序来决定的。
第十二章:struts2注解配置
- 12.1 使用前提
struts2提供xml和注解配置,其功能都是一致的:当jsp页面发送请求时,struts2根据配置执行对应的动作方法,并根据返回值跳转相应的结果视图。
使用struts2注解需要导入新的jar包:
struts2-convention-plugin-2.3.24.jar
- 12.2 常用注解
- 12.2.1 @NameSpace
出现的位置:
它只能出现在package上或者Action类上。一般情况下都是写在Action类上。
作用:
指定当前Action中所有动作方法的名称空间。
属性:
value:指定名称空间的名称。写法和xml配置时一致。不指定的话,默认名称空间是""。
示例:
@Namespace("/customer")
public class CustomerAction extends ActionSupport implements ModelDriven<Customer> {
private Customer customer = new Customer();
@Override
public Customer getModel() {
return customer;
}
}
- 12.2.2 @ParentPackage
出现的位置:
它只能出现在package上或者Action类上。一般情况下都是写在Action类上。
作用:
指定当前动作类所在包的父包。由于我们已经是在类中配置了,所以无需在指定包名了。
属性:
value:指定父包的名称。
示例:
@ParentPackage("struts-default")
public class CustomerAction extends ActionSupport implements ModelDriven<Customer> {
private Customer customer = new Customer();
@Override
public Customer getModel() {
return customer;
}
}
- 12.2.3 @Action
出现的位置:
它只能出现在Action类上或者动作方法上。一般情况下都是写在动作方法上。
作用:
指定当前动作方法的动作名称。也就是xml配置时action标签的name属性。
属性:
value:指定动作名称。
results[]:它是一个数组,数据类型是注解。用于指定结果视图。此属性可以没有,当没有该属性时,表示不返回任何结果视图。即使用response输出响应正文。
interceptorRefs[]:它是一个数组,数据类型是注解。用于指定引用的拦截器。
示例:
/**
* 获取添加客户页面
* @return
*/
@Action(value="addUICustomer",results={
@Result(name="addUICustomer",location="/jsp/customer/add.jsp")
})
public String addUICustomer(){
return "addUICustomer";
}
- 12.2.4 @Result
出现的位置:
它可以出现在动作类上,也可以出现在Action注解中。
作用:
出现在类上,表示当前动作类中的所有动作方法都可以用此视图。
出现在Action注解中,表示当前Action可用此视图。
属性:
name:指定逻辑结果视图名称。
type:指定前往视图的方式。例如:请求转发,重定向,重定向到另外的动作。
location:指定前往的地址。可以是一个页面,也可以是一个动作。
示例:
/**
* 保存客户
* @return
*/
@Action(value="addCustomer",results={
@Result(name="addCustomer",type="redirect",location="/jsp/success.jsp")
})
public String addCustomer(){
customerService.saveCustomer(customer);
return "addCustomer";
}
- 12.2.5 @Results
出现的位置:
它可以出现在动作类上,也可以出现在Action注解中。
作用:
用于配置多个结果视图。
属性:
value:它是一个数组,数据类型是result注解。
示例:
@Results({
@Result(name="login",location="/login.jsp"),
@Result(name="error",location="/error.jsp")
})
public class CustomerAction extends ActionSupport implements ModelDriven<Customer> {
private Customer customer = new Customer();
@Override
public Customer getModel() {
return customer;
}
}
- 12.2.6 @InterceptorRef
出现的位置:
它可以出现在动作类上或者Action注解中。
作用:
用于配置要引用的拦截器或者拦截器栈
属性:
value:用于指定拦截器或者拦截器栈
示例:
出现在动作方法上:
/**
* 查询所有客户
* @return
*/
@Action(value="findAllCustomer",results={
@Result(name="findAllCustomer",location="/jsp/customer/list.jsp")
},interceptorRefs={
@InterceptorRef("myDefaultStack")
})
public String findAllCustomer(){
customers = customerService.findAllCustomer();
return "findAllCustomer";
}
出现在动作类上:
@InterceptorRef("myDefaultStack")
public class CustomerAction extends ActionSupport implements ModelDriven<Customer> {
private Customer customer = new Customer();
@Override
public Customer getModel() {
return customer;
}
}
myDefaultInterceptor的定义需要写在配置文件中,struts.xml中定义的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 开启开发者模式 -->
<constant name="struts.devMode" value="true"></constant>
<!-- 修改默认拦截后缀 -->
<constant name="struts.action.extension" value="action"></constant>
<!-- 修改struts2的主题 -->
<constant name="struts.ui.theme" value="simple"></constant>
<!-- 定义一个公共包,继承struts2的核心包struts-default,并且声明为抽象包 -->
<package name="myDefault" extends="struts-default" abstract="true">
<interceptors>
<!-- 声明拦截器 -->
<interceptor name="checkLogin"
class="cn.itcast.web.interceptors.CheckLoginInterceptor"/>
<!-- 声明拦截器栈,把检查登录拦截器和默认拦截器栈组合成一个新的拦截器栈 -->
<interceptor-stack name="myDefaultStack">
<interceptor-ref name="checkLogin"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 把声明的拦截器栈设置为当前项目的默认拦截器栈 -->
<default-interceptor-ref name="myDefaultStack"/>
</package>
</struts>
本文深入探讨Struts2框架的OGNL表达式符号、拦截器机制及注解配置,详解#、%、$符号作用,拦截器工作原理与自定义方法,以及注解在Struts2中的应用技巧。
1万+

被折叠的 条评论
为什么被折叠?



