系列一:struts2框架搭建

源码地址:https://download.csdn.net/download/u013636987/11387400

一、Struts2的介绍

Struts2是一个基于MVC设计模式的WEB层框架。就我的理解是一个封装的Servlet,他会在更前端拦截掉正常的Servlet的数据,所以如果不是特殊配置,Servlet和action不能共存。因此,你可以在action里面完成Servlet中想要完成的业务。

二、Struts2处理执行流程

1、预处理

web程序启动过后

* default.properties  ----加载default.properties配置

 init_DefaultProperties(); // [1] ---- 加载org.apache.struts.default.properties.配置的是struts2的所有常量.

* struts-default.xml  ----加载struts-default.properties配置

 init_TraditionalXmlConfigurations(); // [2] ---- 加载struts-default.xml

获取extends="struts-default,json-default"中struts-default配置,例如action中自动执行的方法execute(),就是在这里配置的

    <!-- 先配置包结构 -->
    <package name="crm" extends="struts-default,json-default" namespace="/">
        <!-- 是由Struts2框架自己来管理Action -->
       <action name="login_*" class="com.login.LoginAction" method="{1}"/>
	        <result name="none">/welcome.jsp</result>
			<result name="success">/FunctionalModule/logger/loglist.jsp</result>
        </action>

    </package>

* struts-plugin.xml ---加载jar包中的struts-plugin.xml

 init_TraditionalXmlConfigurations();//加载插件中配置

获取extends="struts-default,json-default"中struts-default配置,前提是导入了插件的jar包

这样可以使你某个action可以返回json数据。

类似下方result,不导入该jar包启动后会报错。

    <!-- 包结构 -->
    <package name="crm" extends="struts-default,json-default" namespace="/">

        <action name="upload_*" class="com.authorization.action.FileOperatorAction"
            method="{1}">
            <result type="json"></result>
        </action>
    </package>

* struts.xml ---- 配置Action以及常量.(******)

 init_TraditionalXmlConfigurations();//加载struts中action的配置

配置action

以上面包结构为例

/**
* <package>的配置:
* package:包. 不是java中说那个包. Struts2中的包 管理<action>.
* 属性:
* name		:包名.包名是唯一的不能重复的.
* extends	:继承.继承struts-default.(struts-default包中定义结果类型和拦截器.)
* namespace	:名称空间.与<action>标签中的name属性共同决定Action的访问路径.
* 写法:
* namespace有名称:	namespace=”/aa”
* namespace只是一个/:	 namespance=”/”
* namespace默认的:	namespace没写.
    
* abstract	:抽象的.用于使其他的包可以继承的.
* <package name="struts-default" abstract="true"> . 所以可以继承struts-default.

* <action>的配置:
* action:配置Action类的访问路径.
* 属性:
* name	:名称.与<package>中的namespace属性共同决定访问路径.
* class	:类的全路径.要执行的Action类的全路径.
* method	:方法.用来指定Action中执行那个方法的方法名.(默认的值execute)

*<result>的配置:
* result:配置Action执行后的页面跳转.
* 属性:
* name	:逻辑视图名称.(不是真实的视图,为真实的视图起了一个别名,在Action中返回这个字符串的别名,从而找到具体页面.)
* type	:跳转的类型.
**/

配置常量
用于设置一些struts2的常量,这些常量用于控制struts2的某些特性

	<!-- 该属性指定需要Struts2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。 如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。 -->
	<!-- 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭 -->
	<constant name="struts.serve.static.browserCache" value="false" />
	<!-- 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开 -->
	<constant name="struts.configuration.xml.reload" value="true" />
	<!-- 开发模式下使用,这样可以打印出更详细的错误信息 -->
	<constant name="struts.devMode" value="true" />
	<!-- 默认的视图主题 -->
	<constant name="struts.ui.theme" value="simple" />
	<!--<constant name="struts.objectFactory" value="spring" /> -->
	<!--解决乱码 -->
	<constant name="struts.i18n.encoding" value="UTF-8" />
	<!-- 指定允许上传的文件最大字节数。默认值是104857600(100M) -->
	<constant name="struts.multipart.maxSize" value="104857600" />
	<!-- 设置上传文件的临时文件夹,默认使用javax.servlet.context.tempdir -->

	<constant name="struts.multipart.saveDir" value="javax.servlet.context.tempdir" />

* struts.properties ---- 配置常量

init_LegacyStrutsProperties(); // [3] ---- 加载用户自定义struts.properties

可以完成struts.xml配置常量的同样操作;而且后加载的会覆盖前面加载的。所以生效的是他。

struts.action.extension=xxx 

struts.xml ---- 加载Struts2定义Bean.

 init_CustomConfigurationProviders(); // [5]

	<!-- 1配置自定义文件类myRequestParser,继承MultiPartRequest重写 -->
	<bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest"
		name="myRequestParser" class="com.authorization.action.MyJakartaMultiPartRequest"
		scope="default" optional="true" />

* web.xml ---- 配置核心过滤器及常量.

 init_FilterInitParameters() ; // [6] ---- 加载web.xml

web.xml配置核心过滤器,如下配置,先经过前端控制器(核心过滤器StrutsPrepareAndExecuteFilter)过滤器中执行一组拦截器(一组拦截器 就会完成部分功能代码)

  <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>

filter中可以对常量进行配置。而且他更后加载

	<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  	<init-param>
  		<param-name>struts.action.extension</param-name>
  		<param-value>xyz</param-value>
  	</init-param>
  </filter>

而后struts完成配置预处理,等待执行

执行阶段

用户通过网页端点击链接,如下

<a href="${pageContext.request.contextPath }/login_execute.action">访问Struts2的loginAction中的execute方法</a>

然后struts通过配置文件 class="com.login.LoginAction找到相应的类

    <!-- 先配置包结构 -->
    <package name="crm" extends="struts-default,json-default" namespace="/">
        <!-- 是由Struts2框架自己来管理Action -->
       <action name="login_*" class="com.login.LoginAction" method="{1}"/>
            <result name="none">/welcome.jsp</result>
        </action>

    </package>

执行里面login_*,*为action的方法的。默认执行execute方法

public class loginAction {

	/**
	 * 提供一个默认的执行的方法:execute
	 */
	public String execute(){
		System.out.println("loginAction中的execute执行了...");
		return NONE;
	}
}

 然后通过返回NONE,通过配置文件<result name="none">/welcome.jsp</result>返回浏览器/SRnOWeb/WebContent/welcome.jsp的内容。

注:

public class ActionDemo3 extends ActionSupport{

	@Override
	public String execute() throws Exception {
		System.out.println("ActionDemo3执行了...");
		return NONE;
	}
}
/*
Action接口中提供了5个已经定义好的视图名称:
    * SUCCESS		:success,代表成功.
    * NONE			:none,代表页面不跳转
    * ERROR			:error,代表跳转到错误页面.
    * INPUT			:input,数据校验的时候跳转的路径.
    * LOGIN			:login,用来跳转到登录页面.
ActionSupport中提供了一些功能,比如数据校验,比如国际化… 如果Action继承了ActionSupport,那么Action就会有这些功能.
*/

注:导入struts的jar包,版本一定要相同。我试过不同的,结果报错。

发布了39 篇原创文章 · 获赞 2 · 访问量 5037

猜你喜欢

转载自blog.csdn.net/u013636987/article/details/96477158
今日推荐