Struts2总结之第一章
Struts2的简单介绍
问题:什么是框架,框架有什么用?
框架 是 实现部分功能的代码 (半成品),使用框架简化企业级软件开发 ,提高开发效率。
学习框架 ,清楚的知道框架能做什么? 还有哪些工作需要自己编码实现 ?
问题:什么是struts2框架,它有什么用?
Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。
其全新的Struts2的体系结构与Struts1的体系结构差别巨大。Struts2以WebWork为核心
struts2=struts1+webwork;
struts2框架是apache产品。
struts2是一个标准的mvc框架。 javaweb中的model2模式就是一个mvc模式。model2=servlet+jsp+javaBean
struts2框架是在javaweb开发中使用的。
使用struts2框架,可以简化我们的web开发,并且降低程序的耦合度。类似于struts2框架的产品 :
struts1 webwork jsf springmvc
ssh---struts2 spring hibernate
ssi---springmvc spring ibatis
XWork---它是webwork核心
Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,
强大的表达式语言(OGNL – the Object Graph Navigation Language),
IoC(Inversion of Control反转控制)容器等
Struts2快速入门程序和流程分析
1. 导入相应的jar包
下载Struts2的jar包,struts-2.3.33-all版本
Struts2的目录结构
apps: 例子程序
docs:文档
lib:struts2框架所应用的jar以及插件包
src:源代码
core 它是struts2的源代码
xwork-core struts2底层使用了xwork,xwork的源代码
注意:在struts2开发,一般情况下最少导入的jar包,去apps下的struts2-blank示例程序中copy
struts2-blank.war\WEB-INF\lib
2. 创建index.jsp页面,请求的初始页面,点击链接转跳到action所指定的页面
创建hello.jsp页面,action执行完成之后所转跳的页面
3. 对struts2框架进行配置
- web.xml文件中配置前端控制器(核心控制器)-----就是一个Filter
目的:是为了让struts2框架可以运行。 - 编写filter的文件位置:struts2-blank.war\WEB-INF下面
<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>
4. 创建一个HelloAction类
- 要求,在HelloAction类中创建一个返回值是String类型的方法,注意,无参数。
public class HelloAction {
public String hello() {
return "good";
}
}
5. 在struts.xml文件中配置HelloAction
- 对于struts.xml的配置可以参考struts2-blank.war\WEB-INF\classes下的struts.xml
<struts>
<!-- 包名,包一般都要继承struts-default包。 -->
<package name="p1" extends="struts-default" namespace="/">
<!--namespace和 action的name属性组成访问的资源路径 :/hello -->
<!-- class action所在的类名 | method action所在的方法名 -->
<action name="hello" class="com.syj.action.HelloAction" method="hello">
<!-- 将action中方法返回的值和result的name属性值进行对比,相同则转跳到指定的资源路径处 -->
<result name="good">/hello.jsp</result>
</action>
</package>
</struts>
6. 在index.jsp中添加链接,进行测试
<body>
<a href="${pageContext.request.contextPath}/hello">我的第一個Struts2程序</a>
</body>
</html>
访问连接,就可以看到HelloAction类中的hello方法执行了,也跳转到了hello.jsp.
模仿Struts2的案例实现
1.使用dom4j和Xpath对Struts2.xml进行解析
2.编写index.jsp hello.jsp HelloAction struts.xml文件
3.创建一个Filter----StrutsFilter
4.在web.xml文件中配置StrutsFilter过滤器,在StrutsFilter中完成拦截操作,并访问Action中的方法,跳转到hello.jsp页面操作
<filter>
<filter-name>struts</filter-name>
<filter-class>cn.itcast.filter.StrutsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
5.模拟实现具体的Struts2功能。
// 2.1 得到请求资源路径
String uri = request.getRequestURI();
String contextPath = request.getContextPath();
String path = uri.substring(contextPath.length() + 1);
// System.out.println(path); // hello
// 2.2 使用path去struts.xml文件中查找某一个<action name=path>这个标签
SAXReader reader = new SAXReader();
// 得到struts.xml文件的document对象。
Document document = reader.read(new File(this.getClass()
.getResource("/struts.xml").getPath()));
Element actionElement = (Element) document
.selectSingleNode("//action[@name='" + path + "']"); // 查找<action
// name='hello'>这样的标签
if (actionElement != null) {
// 得到<action>标签上的class属性以及method属性
String className = actionElement.attributeValue("class"); // 得到了action类的名称
String methodName = actionElement.attributeValue("method");// 得到action类中的方法名称。
// 2.3通过反射,得到Class对象,得到Method对象
Class actionClass = Class.forName(className);
Method method = actionClass.getDeclaredMethod(methodName);
// 2.4 让method执行.
String returnValue = (String) method.invoke(actionClass
.newInstance()); // 是让action类中的方法执行,并获取方法的返回值。
// 2.5
// 使用returnValue去action下查找其子元素result的name属性值,与returnValue做对比。
Element resultElement = actionElement.element("result");
String nameValue = resultElement.attributeValue("name");
if (returnValue.equals(nameValue)) {
// 2.6得到了要跳转的路径。
String skipPath = resultElement.getText();
// System.out.println(skipPath);
request.getRequestDispatcher(skipPath).forward(request,
response);
return;
}
}
Struts2的工具配置
配置web.xml的提示从操作
1.struts2-core-2.3.33.jar包下面有一个struts-2.3.dtd文件我们要让我们的IDE去关联这个文件(目的就是解决在不联网的状态下可以进行在web.xml开发的提示配置)
2.在struts-2.3.33\apps下的struts2-blank.war\WEB-INF\classes下的struts.xml文件
3.打开windows下的Preferences在搜索查找XML Catelog
4.最后点击Apply And Close
Struts2框架配置文件的加载顺序
-
struts2框架要能执行,必须先加载StrutsPrepareAndExecuteFilter.
-
在StrutsPrepareAndExecuteFilter的init方法中对Dispatcher进行了初始化.
-
在Dispatcher类中定义的init方法内就描述了struts2配置文件加载的顺序
init_DefaultProperties(); // [1] ---------- org/apache/struts2/default.properties init_TraditionalXmlConfigurations(); // [2] --- struts-default.xml,struts-plugin.xml,struts.xml init_LegacyStrutsProperties(); // [3] --- 自定义struts.properties init_CustomConfigurationProviders(); // [5] ----- 自定义配置提供 init_FilterInitParameters() ; // [6] ----- web.xml init_AliasStandardObjects() ; // [7] ---- Bean加载
配置文件的加载顺序
-
default.properties文件
作用:定义了struts2框架中所有常量 位置: org/apache/struts2/default.properties
-
struts-default.xml
作用:配置了bean,interceptor,result等。 位置:在struts的core核心jar包.
-
struts-plugin.xml
它是struts2框架中所使用的插件的配置文件。(不适用插件没有什么用)
-
struts.xml
我们使struts2所使用的配置文件。(也可以配置struts.properties所需要的一些常量的配置)
-
struts.properties
就是可以自定义常量。(基本都可以在struts.xml 里面完成)
-
web.xml
配置Filter 在开发中,后加载文件中的配置会将先加载文件中的配置覆盖。
-
-
重点的执行顺序
default.properties struts-default.xml struts.xml web.xml