Struts2框架搭建、OGNL表达式、配置过滤器、获取参数
Struts2简介
Struts2官网
Struts2教程
Struts2 是目前较为普及和成熟的基于MVC设计模式的web应用程序框架,其优雅、简洁、可扩展的特点使得其备受开发者的青睐,并且结合了WebWork和Struts的框架的优点,因此在一定程度上简化了WEB层
的开发。
Struts2架构图
Struts2框架的搭建
在深入学习Struts2框架之前我们需要先把Struts2框架给搭起来,下面我就来演示如何搭建Struts2框架并创建一个Hello World
示例。
1、下载Struts2压缩包
2、创建动态Web项目
3、导包、配置dtd文件
4、创建Action类
5、创建JSP页面
6、设置配置文件
7、配置Struts2核心过滤器
8、测试
1、下载Struts2压缩包
压缩包直接到官网下载即可,版本可以根据自己的需要选择,我下载的是struts-2.5.16-all.zip
2、创建动态Web项目
在Eclipse中创建动态的Web项目,服务器我选择的是Tomcat 9
:
3、导包、配置的dtd文件
导包可以根据自己的需要进行,Struts2
提供的jar包
一共有90个,这里由于仅仅是演示一个Hello World
的例子,只选择一些必须用到的jar包,如果实在不知道如何选择,可以从Struts2提供的apps
示例中选取jar包。
设置dtd
约束文件:
4、创建Action类
Action类是Struts2 应用程序的关键,类似Servlet,通常情况下,在Action类中包含了完整的业务逻辑并控制用户、模型以及视图间的交互。在Java Resources => src
下创建一个HelloWorldAction
,在HelloWorldAction类
中继承ActionSupport类
并重写execute()
方法。
1 | package com.my.struts2.hello; |
5、创建JSP页面
新建一个JSP页面,在执行Action后转发到此页面:
1 | <%@ page language="java" contentType="text/html; charset=UTF-8" |
6、设置配置文件
在项目的src路径下新建一个struts.xml
文件,配置如下:
1 | <?xml version="1.0" encoding="UTF-8"?> |
7、配置Struts2核心过滤器
在web.xml
中配置Struts2核心过滤器
:
1 | <?xml version="1.0" encoding="UTF-8"?> |
8、测试
将Web项目部署到Tomcat上,在浏览器中访问:http://localhost:8080/Struts2-Hello/hello/HelloAction.action
,成功输出Hello World !
OGNL表达式
OGNL
即Object-Graph Navigation Language
的缩写,是一种功能强大的表达式语言,使用OGNL表达式可以轻松地存取任意对象的属性、调用普通方法、访问静态属性,使用OGNL表达式所需的jar包在Struts2框架中就有,因此无需额外导包
使用OGNL存取对象的属性
1 | package com.my.ognl; |
使用OGNL表达式动态设置参数
1 | package com.my.ognl; |
1 | <?xml version="1.0" encoding="UTF-8"?> |
Struts2获取参数
首先明确一点:获取参数的方法分为两个步骤:1、获取当前Action的值栈对象;2、将用于封装参数的对象压入值栈中。但是,将参数封装(设置)到对象中的这一过程实际上是由拦截器完成的,那么问题来了,拦截器是在Action之前执行的,也就是说我们必须保证在拦截器执行之前将用于封装参数的对象压入值栈中,这样才能确保拦截器能够将前端提交过来的参数被封装到对象中,那么我们怎么在拦截器执行之前将封装参数的对象压入值栈中?,Struts2为我们提供了两种方法:
1、实现Preparable接口中的prepare()方法
通过查看Struts-default.xml
可以发现,Struts2中提供了20默认的个拦截器,在这20个默认的拦截器中有一个prepare拦截器
,翻译过来就是准备的意思,也就是说我们可以在这个拦截器中做一些预处理操作,查看此拦截器的源码发现,如果我们想要进行一些预处理操作可以实现Preparable接口,其源码如下(注释部分我已经删掉了):
1 | package com.opensymphony.xwork2.interceptor; |
1 | <interceptor-stack name="defaultStack"> |
压栈的操作可以在prepare()方法中进行,如:
1 |
|
2、实现ModelDriven接口
这种方法与实现Preparable接口相比更加简单,我们可以看一下其源码,如果我们在Action中继承了ModelDriven接口,那么我们只需要重写getModel()
方法,并将用于封装参数的对象返回即可,压栈的操作将由modelDriven拦截器
帮我们进行,从某种程度上来说,这简化了我们的编码操作。
1 | package com.opensymphony.xwork2.interceptor; |