struts2初试
struts2是什么?
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。
struts2的优势
- 自动封装参数
- 参数校验
- 结果的处理(转发、重定向)
- 国际化
- 显示等待页面
- 表单防止重复提交
搭建struts2的环境
1、导包
首先在项目的 lib 目录下导入struts2相关的包
2、书写Action类
在 src 下书写Action类,该类不需要继承任何的类,就是一个普通的java类
package com.jinxin.action; public class HelloAction { public String hello() { System.out.println("hello world"); return "success"; } }
3、书写struts.xml配置文件
1. 导入约束
在 struts2核心包 --> struts2.3.dtd导入约束
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
2. 进行配置
<struts> <package name="hello" namespace="/hello" extends="struts-default"> <action name="helloAction" class="com.jinxin.action.HelloAction" method="hello"> <result name="success">/hello.jsp</result> </action> </package> </struts>
3. 完整配置
<?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="hello" namespace="/hello" extends="struts-default"> <action name="helloAction" class="com.jinxin.action.HelloAction" method="hello"> <result name="success">/hello.jsp</result> </action> </package> </struts>
4、将struts2核心过滤器配置到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>
5、进行测试
在浏览器中输入指定的URL访问相应页面 http://127.0.0.1:8080/struts2test/hello/helloAction
流程分析
struts2完整的架构
在struts2的核心是拦截器
拦截器:
- 表面上,拦截器帮我们封装了很多功能
- 拦截器具有可插拔的优秀设计,何为可插拔?就是在需要哪个拦截器就用哪个拦截器,不需要哪个就不用,如果觉得功能少了,还可以自定义拦截器
- 使用了AOP思想
面向切面编程(AOP)
何为面向切面编程?以servlet中设置编码为例子,为了解决编码问题,在每一个servlet中都需要设置编码,而设置编码的代码都是一样的,这样就会造成很多代码的重复,那么既然是重复的,能不能只写一遍呢,当然是可以的,如果在每个请求到Servlet之前,现在Filter中就将编码设置了,那样不就可以只写一遍就能解决所有的编码问题了吗。如果将一个个Servlet纵向排列,那么Filter就好像从中切了一刀,这就是面向切面编程