Struts2总结之快速入门和文件加载顺序

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
    
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值