我眼中的 Struts2

Struts2 是什么

Struts2 是应用于MVC架构的WEB程序的 C

Struts2 跟Servlet 的区别是什么

首先看一下在web.xml中两者的配置区别

Struts2

  <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>*.action</url-pattern>
  </filter-mapping>

Servlet
  <servlet>
  	<servlet-name>test1</servlet-name>
  	<servlet-class>com.test.ServletTest1</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>test1</servlet-name>
  	<url-pattern>/test1</url-pattern>
  </servlet-mapping>
这里很直观的看出 Struts 用的是filter 过滤器 而Servlet 则是一般的请求拦截


Struts2 框架利用了动态代理模式来完成被拦截的请求所需要的类的初始化和调用

在他的核心类 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 中实现了两个接口 StrutsStatics,Filter 然而在StrutsStatics接口中只是定义了一下String 常量 最终实现的是Filter 中的方法

然儿却又一个要注意的问题 在StrutsPrepareAndExecuteFilter 中的 doFilter 方法有这样一个判断

......if ( excludedPatterns != null && prepare.isUrlExcluded(request, excludedPatterns)) {
	chain.doFilter(request, response);
}......
boolean handled = execute.executeStaticResourceRequest(request, response);
if (!handled) {
        chain.doFilter(request, response);
}......

那么在Struts2 框架中的web.xml文件中如果 servlet配置的地址与filter(Struts2) 配置的地址相同 那么 将不会执行Servlet配置对应的类


因为Struts2 是以WebWork为核心的 其采用了拦截器机制来处理绑定用户的的request

这样在Action 类中就是产生私有的属性 如果Action 是单例的话 就会产生线程安全问题 (给各位尝试Struts2 + Spring 框架组合的同学提一个醒 -- Struts2 的Action 默认不是单例的)

然而Servlet 不一样 Servlet 的实例是交给服务器去管理的 服务器每次解析到相同的请求类的时候就会把这个Servlet类的实例给他 让这个线程去做处理 在Servlet 中如果不是特殊情况也不会存在全局变量(属性)

Struts2 的工作原理是什么

这个在前一个主题也提到过一次 Struts2 是以WebWork为核心的 我觉得Struts2 对WebWork 做了浅封装深扩展 运行机制几乎完全依赖WebWork 自己提供了很多的拦截器的实现 只需要通过配置文件配置 因此Struts2 的可扩展性很高 然后说工作的原理 (推荐链接 struts2的核心和工作原理)

因为上边的链接讲的特别的详细 我就不做重复累述了 我大致的在这里说一下从启动到结束整个框架做了些什么 (服务器 Tomcat7)

1) Tomcat 的启动 这个我也写过一篇博客 想进行深入了解的请点 链接

在启动的时候就会将Struts2 所需的类一节配置加载完 默认的配置文件加载顺序 struts-default.xml --> struts-plugin.xml --> struts.xml (这时候加载了很多很多的配置 - 用的到的用不到的 我觉得很是多余或者是重复 这也是我不太喜欢Struts2 框架的原因之一)

2) 当用户请求来的时候

如果用户请求没有异常的情况下 Struts2 默认会对每一个请求创建一个新的Action实例 这一步是在ActionProxy 中完成的

3) 服务器停止 或者重启时

调用 destroy() 移除监听 释放资源......

Struts2 与Struts1 的区别

最大的区别就是更低代码耦合与代码的健壮 (推荐链接 Struts1和Struts2的区别和对比 )

Struts1 要求继承基类 而Struts2 却是继承不继承都可以

Struts1 对Servlet API 特别的依赖 Struts2 缺很少依赖 Servlet API 或者说不依赖 (execute方法)

还有就是健壮 Struts2 添加完善了很多东西比如参数绑定了 类型转换了 等等



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值