Struts2是一个基于MVC设计模式的Web应用框架,作为控制器来建立模型与视图的数据交互,采用拦截器的机制来处理用户请求。是基于BS的HTTP交换协议,与Servlet API进行了解耦操作。
工作原理
1.Web容器接受到HttpServletRequest请求时,将请求传递个核心过滤器中的ActionContextCleanUp过滤器
2.从ActionContextCleanUp过滤器出来后经过Other filters,再调用FilterDispatcher,再调用ActionMapper,确定请求哪个Action,返回一个收集Action详细信息的ActionMapping对象。
3.FilterDispatcher将控制权委派给ActionProxy代理,调用配置管理器ConfigurationManager,从配置文件struts.xml读取配置信息,创建ActionInvocation对象。
4.ActionInvocation对象调用Action时经过过滤器,如果执行结果中返回字符串,需要到struts.xml的Result中查找对应的JSP文件。
5.Action执行后拦截器再次执行,最后响应HttpServletResponse被返回到核心过滤器中。
入门案例
1.导入Jar包
2.配置web.xml中内容:默认拦截所有请求
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 3.struts.xml:引入struts-2.3.dtd的约束
package:配置文件分包管理
name:包名,唯一性 extends:当前包的父包 abstract:是否为抽象包
namespace:当前包的名称空间 URL=/名称空间+/name
action:name:动作名称 class:动作类的全限定名 method:动作类中方法
result:name:逻辑结果视图
type:dispatcher请求转发,默认值;redirect:重定向;redirectction:重定向到某一动作,默认补全.action
grobal-result:全局变量与类中一致
<?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> <package name="abc" extends="struts-default"> <action name="hello" class="com.itheima.web.action.HelloAction" method="helloWorld"> <result name="success" type="dispatcher">/success.jsp</result> </action> </package> </struts> 3.动作类:返回值为String类型
1)无侵入式创建动作类
/* * 动作类 */ public class HelloAction { public String helloWorld(){ System.out.println("访问HellAction类的helloword方法!"); return "success"; } }
2)实现Action接口创建动作类
/* * 动作类:实现Action接口 */ public class HelloAction2 implements Action { @Override public String execute() throws Exception { System.out.println("HelloAction2执行了"); return SUCCESS; } } 3)继承ActionSupport类创建动作类
/* * 继承ActionSupport类创建动作类 */ import com.opensymphony.xwork2.ActionSupport; public class HelloAction3 extends ActionSupport { private static final long serialVersionUID = 1L; }
4.index.jsp
<a href="${pageContext.request.contextPath}/hello. action">访问动作类</a> 5.结果显示
配置文件
按照加载顺序排列
1.default.properties:配置的是键值对,是struts2中的核心jar包
2.struts.default.xml:struts2中的核心jar包
3.struts.plugin:struts2中的使用的插件
4.struts.xml:自己配置的
5.struts.properties:自己配置的键值对的
6.web.xml:过滤器初始化参数,键值对形式的参数
所以当我们可以通过修改struts.xml、struts.properties、web.xml三者中的内容
struts.xml:
<!-- 拦截内容 --> <constant name="struts.action.extension" value="abc"></constant> struts.properties:
struts.action.extension=do
web.xml:
<init-param> <param-name>struts.action.extension</param-name> <param-value>html</param-value> </init-param> 因为加载顺序的缘故,所以如果重复设置后,按照加载顺序后的为准。
小结:
Struts2的框架大致就是这样,一些基本用法也有了,刚开始接触的时候感觉所以的框架都是为了解耦合,把一些重复的内容写到配置文件中,然后通过反射创建类调用方法,实现显示。