三、WebWork(Struts2 的前身)
此文是对以下文章的学习笔记:http://www.blogjava.net/moxie/archive/2006/10/20/76375.html
一、WebWork
Struts2 是 WebWork 的升级,跟 Struts1 无关。
WebWork 是 Java 的一个开源框架,功能和 Struts 类似。之后被 Apache 吸收,并在此基础上推出了 Struts2 框架。
1. 过滤器fiter 和拦截器 interceptor 的区别
a:filter 是 servlet,jsp里面的东西,应该说是属于规范了。而拦截器是struts的东西,不通用。
b:请求到后台:get/post -> filter -> Interceptor -> Interceptor/filter 里面的跳转 -> 指定的 jsp/action/servlet
c:Interceptor 只能拦截 action 请求,而 filter 是万能的,是请求就能拦截。
d:filter 是链式处理的,也就是一个 filter 完后,如果还有过滤,那就得继续。顺序根据web.xml里面的顺序来。
e: filter 是 servlet包里面的一个接口,写一个filter,只要实现它,然后实现它的几个方法就算一个filter了。
2:filter 配置(题外话):
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>cn.com.webinfo.web.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
public class UserLoginFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
// 此时所有的配置文件都还没有进来,只启动了项目。所以获得对象或者jsp,都需要通过路径、cookies获得
String seerviceUri=requestUri.substring(contextPath.length());//路径
Cookie cookies[]=req.getCookies();//cookies
// 通过 spring 获得 class 对象
ClientManager clientManager=(ClientManager)WebApplicationContextUtils.getWebApplicationContext(req.getSession().getServletContext()).getBean("clientManager");
chain.doFilter(req, res);
}
public void destroy() {
// TODO Auto-generated method stub
}
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
二、WebWork 结构
1. WebWork 结构:Xwork1 + WebWork2
2.执行流程:
3. WebWork 组成(webwork.xml):Action + Reusults + Interceptors:
a.Action:
b.Results:配置文件中,自定义的字符串,用来指示Action执行之后,如何显示执行结果。
Result Type 表示如何及用哪种视图技术展现结果,由此WebWork支持多种视图技术。
而且这些技术可以互相切换,不需要修改Action。
c.Interceptors:Action 之前、之后 执行。将功能用插拔的方式注入到 Action 中。
三、WebWork实例:
1. 安装jar包
2. 配置前端控制器:FilterDispatcher(web.xml-filter)
注:①:这里的前端控制器会接受任意的请求(默认是将.action结尾的URL)映射为WebWork的Action请求。
②:我们可以在webwork.properties文件中,设置我们自己的后缀名,多个后缀名可以用逗号隔开。
例如:webwork.action.extension=action,do
3. 配置 xwork.xml
4. index.jsp
5. cc.action.LoginAction
①:它实现了Action接口,获得login.jsp页面传入的数据即输入的用户名
②:没有调用任何一个 JavaServlet 的 API
③:值堆栈和表达式语言来实现参数的传递(action的参数传递给jsp)
5. success.jsp
①:将通过表达式语言,取得Action执行之后暴露出来的数据对象
②:在Jsp页面中,默认“altSyntax”是开启的。它是用来解决标签库中的字符串和表达式语言混淆的问题。
所以,作为变量的表达式语言应该放在%{}中,否则WebWork会把它当作字符串处理
6. 结果
四、ValueStack( 值堆栈 ) 和 EL( 表达式语言 )
1. ValueStack:用来放置Java对象(例如:Action对象、Model对象等)的堆栈。
2. EL(Express Language):①:用来存储\获取(set()\get())ValueStack中存放的对象的数值。
②:直接访问类的静态数据,调用静态方法。
3. 两者都遵循OGNL规范。
4. WebWork为每一次请求构建一个ValueStack。
并将所有相关的数据对象(例如:Action对象、Model对象等)放到ValueStack中。
再将ValueStack暴露给视图页面,这样页面就可以直接访问后台处理生成的数据。
5. 查找数值的方式:我们给的操作指令是”name”,ValueStack会从上而下,遍历栈里面的对象。
6. context map:
①:它是一个放置值堆栈上下文数据的对象
②:通过符号“#“再加上对象的名称,可以访问这些数据(只可以访问)
③:一些JavaServlet相关的数据都放在这个容器中
因此:可以直接通过表达式语言去访问request、attribute、session、application里的数据。
例如:用property标签库打印出所有请求参数的数据,代码如下:<ww:property value="%{#request}"/>。
7. “top”是ValueStack里面的关键字,通过它可以找到ValueStack中最上面的那个对象。
语法:valueStack.findValue("top"))
8. 表达式语言调用形式:
①:调用基于JavaBean规范的get和set方法之外
②:可以调用一般的Java方法(这是需要使用方法的全名,并传入需要的参数)
③:可以直接访问Java类的静态字段和静态方法
五、IoC(Inversion Of Control)容器
IoC = 倒置翻转 = 依赖注入 = 依赖倒置原理
1. 用来为对象组装其依赖的对象的容器;也就是说对象本身不用关心它依赖的对象(可以是组件或者服务,反正就是提供业务方法的对象)的创建,初始化,生命周期等,而是由容器来控制。
2. 官方推荐Spring来作为WebWork的IoC容器
Spring 的方式:
①:拷贝Spring依赖的所有jar文件
②:配置web.xml文件
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
③:在webwork.properties中设置WebWork对Spring的支持:webwork.objectFactory = spring
④:可以在webwork.properties中设置Bean组件的默认组装方式。
默认是按照Bean的名称,可以选择按照类型、构造函数、自动选择等方式。
六、总结:
1. 多视图支持:只需要修改xwork.xml中的result,无需修改action
2. Action的数据验证(3种方式):
①:为action绑定验证文件,在验证文件中定义验证规则
②:在Action中实现com.opensymphony.xwork.Validateable接口的validate
③:在Action的执行方法中,编写代码来验证
注: a. webwork 又一些常规的验证可用(如:字段必填,邮箱地址等)
b. 也可以在 视图层验证(如:js),但是这个就无关webwork的验证了。
c. 前两种验证方法,参考:http://www.cnblogs.com/MissRabbit/p/6595741.html
3. 数据类型转换:
①:基本数据类型,webwork会自动处理
②:如果数据是一个集合,或者需要特定转化,就要在文件(ClassName-conversion.properties)中定义转换规则
参考:http://www.cnblogs.com/xiaolongSunny/p/4655546.html
4. Action除了执行execute()方法外,还可以执行其他的方法
条件:这些方法必须是无参数
访问格式:actionName!methodName.action,例如user!doAdd.action,调用user Action类的doAdd方法
5. Action链(Action Chaining)
http://www.blogjava.net/jnbzwm/archive/2010/11/19/338495.html
6. 多模块
①:xwork.xml 可以继承(包含) 其他的xwork.xml(例如: <include file="webwork-default.xml"/>)
②:package的继承:
http://www.cnblogs.com/ningvsban/p/3734562.html
http://www.jianshu.com/p/c3092b28ab11
7. Action的Model Driven:
http://blog.csdn.net/li_tengfei/article/details/6098145