1.Struts2历史,与Struts1关系
Struts2是基于WebWork框架发展而来.
Struts2与Struts1可以说没有太直接关系.
2.Struts2特点
(1)由Action组件承担Struts1中ActionForm和Action的功能
(2)Action非常灵活,可以使用一个普通的Class来充当.
(3)Action可测性强
(4)提供了大量的Result组件,简化了响应处理的实现
(5)提供了大量的拦截器组件
(6)易于扩展,整合和维护
3.Struts2的MVC实现
控制器实现:FilterDispatcher(早期),StrutsPrepareAndExecuteFilter(新)
视图实现:各种类型Result,支持各种视图组件的响应.
Struts2标签,提供了分支,循环,显示等功能
模型实现:普通的POJO(Action),更加灵活
ValueStack组件,用于封装请求相关信息,例如request,session,action对象等
*4.Struts2开发入门
(1)创建Web Project,引入struts2开发基本包
(2)在web.xml中配置控制器,添加控制器的配置文件struts.xml
(3)编写JSP,Action组件
(4)编写struts.xml配置,定义Action组件和请求的对应关系
*5.Struts2配置文件
(1) struts-default.xml(框架自带)
定义了一些框架自带的Result组件,拦截器组件.
(2) struts.xml(开发创建并使用)
定义开发者编写的Result组件,拦截器组件,Action组件
(3) default.properties(框架自带)
定义了框架的一些系统参数
(4) struts.properties(开发创建并使用)
用于覆盖default.properties中的系统配置
(5) struts-plugin.xml
整合插件包中带的配置文件.
加载顺序: struts-default.xml
struts-plugin.xml
struts.xml
struts.properties
web.xml
后一个会覆盖前一个的常量值
*6.Struts2中Action相关配置
(1)<package>元素的namespace属性
用于指定package中的action对应的请求路径.
请求路径格式为:http://localhost:8080/工程名+namespace属性+<action>元素的name属性
(2)<action>元素的method属性
用于指定action中的业务方法名,默认为execute
(3)<param>元素
用于为Action,Result或拦截器组件的属性指定值.
(4)通配符*的使用
<action>的name属性可以使用若干个*号,其他属性可以使用{1},{2}格式指定.
(5)动态方法调用
通过请求格式指定业务方法名.
格式: 请求名!方法名.action
业务方法处理用户请求结束后,仅仅返回一个逻辑视图名,但还需要在struts.xml中配置物理视图资源(resault组件);
*7.ValueStack,ActionContext,ServletActionContext
(1)ValueStack
主要用于存储请求相关信息,内部结构如下:
root区域:被称为根存储区,是一个栈结构,栈顶元素为当前请求的Action对象
context区域:被称为变量存储区,是一个Map结构,存储了request,session,application等对象
(2)ActionContext用于获取context存储区内容,
可以将request,session,application对象以Map结构返回
ActionContext.getContext().getSession();
ActionContext.getContext().getApplication();
ActionContext.getContext().get("request");
(3)ServletActionContext是ActionContext子类,
可以获取Servlet API类型的对象
8.思考题
---------------将request,session,application封装成Map结构?-------------------
Map map = new SessionMap(request);
public class SessionMap extends AbstractMap{
private HttpSession session;
public RequestMap(HttpServletRequest request){
this.session = request.getSession();
}
public void put(Object key,Object value){
session.setAttribute(key.toString(),value);
}
public Object get(Object key){
return session.getAttribute(key.toString());
}
}
----------------如何使用Filter充当控制器-------------------
控制器doFilter方法的主要流程如下:
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain chain) throws IOException, ServletException {
//1.请求是否为.action
//2.如果是,通过配置信息创建Action对象,执行业务方法
//3.如果不是,chain.doFilter(arg0,arg1);
}