网站建议:179001057@qq.com

struts2入门知识总结1

技术2022-05-12  0

1、  什么是Struts2

struts2是一个按MVC模式设计的Web层框架,其实它就是一个大大的filter,我们可以在web.xml文件中将符合某种特征的所有请求交给这个filter处理,这个filter再参照一个配置文件(通常为/WEB-INF/classes/struts.xml)将各个请求分别分配给不同的action去处理。

一个扩展知识点:struts的配置文件可以有多个,可以按模块配置各自的配置文件,这样可以防止配置文件的过度膨胀;

Struts

Prepare

And

Execute

Filter

用户请求

Action

Action

struts.xml

Web容器

web.xml

2、  Struts2体系结构图

 

对上图的理解:

当一个初始请求到达Servlet容器,它会经过一系统的标准filter,这些Filter链包括ActionContextCleanUp filter:发挥作用当集成像SiteMesh Plugin一类的技术,接着FilterDispatcher被调用,通过轮询参考ActionMapper决定一个请求和一个Action相关连! ActionMapper决定了一个Action的调用,FilterDispatcher委托ActionProxy控制, ActionProxy参考框架的配置文件管理,接着,ActionProxy生成一个ActionInvocation, 它负责命令执行,这样调用任何拦截器先于调用ActionAcion执行完毕.ActionInvocation负责查找适当的结果以和struts.xml中的action result code相比较,结果一般是调用一个在JSPFreeMarker中绘制的模板!

对图中部分类的解释:

1ActionMapperActionMapping

Ø       org.apache.struts2.dispatcher.mapper.ActionMapper接口

HTTP请求action调用请求之间提供了一个映射。当给定一个HTTP请求时,ActionMapper根据请求的URI来查找是否有对应的action调用:

              (1)如果有,则返回一个描述了action调用的ActionMapper;

              (2)如果没有匹配的action调用请求,则返回null.

              Struts2框架对该接口提供的默认实现是org.apache.struts2.dispatcher.mapper.DefaultActionMapper.

Ø       ActionMapping本质上是一个数据传输对象,它将Action类和要执行的方法的详细资料收集在一起。ActionMappingorg.apache.struts2.dispatcher.Dispatcher和用户各种接口组件使用。     ActionMapping的完整类名是org.apache.struts2.dispatcher.mapper.ActionMapping.

2ActionProxyActionInvocation

Ø       ActionProxyXWork中和真正的Action充当代理的角色,在通过框架框架执行Action的过程中,因为是使用代理而不是直接操纵对象,所以可以在代理中封装拦截器、result等额外代码。

Ø       ActionProxy持有ActionInvocation对象。ActionInvocation代表了action执行的当前状态。它持有拦截器(按顺序 )Action实例、结果映射(从结果码到Result实例的映射)ActionContext.

 

3、  开发Struts2最少需要的JAR

struts2-core-2.x.x.jar :Struts 2框架的核心类库

xwork-core-2.x.x.jar :XWork类库,Struts 2在其上构建

ognl-2.6.x.jar :对象图导航语言(Object Graph Navigation Language),struts2框架通过其读写对象的属性

freemarker-2.3.x.jar :Struts 2UI标签的模板使用FreeMarker编写

commons-logging-1.x.x.jar :ASF出品的日志包,Struts 2框架使用这个日志包来支持Log4JJDK 1.4+的日志记录。

commons-fileupload-1.2.1.jar :文件上传组件,2.1.6版本后必须加入此文件

Struts的下载包中有一个struts2-blank-2.1.6.war的应用,只需要将其

WEB-INF/lib目录中的JAR拷贝到ProjectWEB-INF/lib目录下便可,不可随便导入其它的JAR,应按需要导入,否则会出现异常。

4、  开发Struts2参数配置:

1、在struts2中,struts框架是通过Filter启动的。

web.xml文件中配置FilterDispatcher

<filter>

    <filter-name>struts2</filter-name>

<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

 <!-- 自从Struts 2.1.3以后,下面的FilterDispatcher已经标注为过时

<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

 -->

</filter>

<filter-mapping>

    <filter-name>struts2</filter-name>

    <url-pattern>/*</url-pattern>

</filter-mapping>

StrutsPrepareAndExecuteFilterinit()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作。

 

注意struts2读取到struts.xml的内容后javabean形式存放在内存中以后struts2对用户的每次请求处理将使用内存中的数据而不是每次都读取struts.xml文件

2、默认的配置文件struts.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

   <package name="itcast" namespace="/test" extends="struts-default">

        <action name="helloworld" class="net.cjava.action.HelloWorldAction" method="execute" >

       <result name="success">/WEB-INF/page/hello.jsp</result>

        </action>

    </package>

</struts>

注意:StrutsPrepareAndExecuteFilter的功能:

l       是对struts2.0.xFilterDispatcher的替代,结合了StrutsPrepareFilterStrutsExecuteFilter的功能。

l       目前提供的文档对此类的描述甚少,可以参看FilterDispatcher的帮助文档来获得部分信息。

l       查询ActionMapper是否该拦截此请求,对于拦截的请求,此过滤器处理后,将终止过滤器链。如果其他Filter也要处理struts2拦截的请求,必须放在此Filter之前进行配置。

l       处理符合/struts/*路径格式的静态内容的访问请求

l       其他的Filter通常要位于StrutsPrepareAndExecuteFilter之前,如果其他的Filter要访问Struts的特性,这时候不要使用StrutsPrepareAndExecuteFilter ,而是使用StrutsPrepareFilterStrutsExecuteFilter,并让其他的Filter应位于两者之间。

l       分析一个action路径的结果视图转发给另外一个action路径时为何不能直接使用dispatcher类型,而是要使用chain类型。

5struts.xml详解

struts2框架中使用包来管理Action,包的作用和java中的类包是非常类似的,它主要用于管理一组业务功能相关的action。在实际应用中,我们应该把一组业务功能相关的Action放在同一个包下。

 

配置包时必须指定name属性,name属性值可以任意取名,但必须唯一,他不对应java的类包,如果其他包要继承该包,必须通过该属性进行引用。包的namespace属性用于定义该包的命名空间,命名空间作为访问该包下Action的路径的一部分,如访问上面例子的Action,访问路径为:/test/helloworld.action namespace属性可以不配置,如果不指定该属性,默认的命名空间为“”(空字符串)。

 

通常每个包都应该继承struts-default包, 因为Struts2很多核心的功能都是拦截器来实现。如:从请求中把请求参数封装到action、文件上传和数据验证等等都是通过拦截器实现的。 struts-default定义了这些拦截器和Result类型。可以这么说:当包继承了struts-default才能使用struts2提供的核心功能。 struts-default包是在struts2-core-2.x.x.jar文件中的struts-default.xml中定义。 struts-default.xml也是Struts2默认配置文件。 Struts2每次都会自动加载 struts-default.xml文件。

 

包还可以通过abstract=“true”定义为抽象包,抽象包中不能包含action

6Action名称的搜索顺序

1获得请求路径的URI,例如url是:http://server/struts2/path1/path2/path3/test.action

 

2.首先寻找namespace/path1/path2/path3package,如果不存在这个package则执行步骤3;如果存在这个package,则在这个package寻找名字为testaction,当在该package下寻找不到action 时就会直接跑到默认namaspacepackage里面去寻找action默认的命名空间为空字符串“” 如果在默认namaspacepackage里面还寻找不到该action,页面提示找不到action

 

3.寻找namespace/path1/path2package,如果不存在这个package,则转至步骤4;如果存在这个package,则在这个package中寻找名字为testaction,当在该package中寻找不到action 时就会直接跑到默认namaspacepackage里面去找名字为testaction ,在默认namaspacepackage里面还寻找不到该action,页面提示找不到action

 

4.寻找namespace/path1package,如果不存在这个package则执行步骤5;如果存在这个package,则在这个package中寻找名字为testaction,当在该package中寻找不到action 时就会直接跑到默认namaspacepackage里面去找名字为testaction ,在默认namaspacepackage里面还寻找不到该action,页面提示找不到action

 

5.寻找namespace/package,如果存在这个package,则在这个package中寻找名字为testaction当在package中寻找不到action或者不存在这个package时,都会去默认namaspacepackage里面寻找action,如果还是找不到,页面提示找不到action

注意:注意区分默认名称空间与根(/)名称空间的区别,根(/)名称空间就是一个普通的名称空间,与”/user/admin””/user” 等一样,都是具体的包名,只是它是最顶层的名称空间,当struts在某个子名称空间对应的包中没有查找action时,不会再去根(/)名称空间中查找,但会在默认名称空间中继续查找该action

 

7Action配置中的各项默认值

1>如果没有为action指定class,默认是ActionSupport

2>如果没有为action指定method,默认执行action中的execute() 方法。

3>如果没有指定resultname属性,默认值为success

注意:

虽然,理论上Struts 2.0Action无须实现任何接口或继承任何类型,但是,我们为了方便实现Action,大多数情况下会采用以下二种方式对Action进得处理:

1>继承com.opensymphony.xwork2.ActionSupport

2>实现com.opensymphony.xwork2.Action

默认情况下:重载(Override)或覆写(Overload)其中的的

 String execute() throws Exception

8struts.xml中常量的配置详解

l       在根元素<struts>下可以使用constant子元素配置常量。

l       strut2的核心jar包内的org.apache.struts2包下的default.properties文件中可以看到各个常量的注释说明

常量可以在struts.xmlstruts.properties中配置,建议在struts.xml中配置,两种配置方式如下:

1、在struts.xml文件中配置常量

<struts>

    <constant name="struts.action.extension" value="do"/>

</struts>

 

2、在struts.properties中配置常量

struts.action.extension=do

 

1、指定需要Struts 2处理的请求后缀

我们都是默认使用.action后缀访问Action。其实默认后缀是可以通过常量”struts.action.extension“进行修改的,例如:我们可以配置Struts 2只处理以.do为后缀的请求路径:

 <constant name="struts.action.extension" value="do"/>

如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。如:

 <constant name="struts.action.extension" value="do,go"/>

 

常量配置列表:

<!-- 指定默认编码集,作用于HttpServletRequestsetCharacterEncoding方法 freemarker velocity的输出 -->

    <constant name="struts.i18n.encoding" value="UTF-8"/>

    <!-- 该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。

    如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。 -->

    <constant name="struts.action.extension" value="do"/>

    <!-- 设置浏览器是否缓存静态内容,默认值为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" />

    <!– spring集成时,指定由spring负责action对象的创建 -->

    <constant name="struts.objectFactory" value="spring" />

 <!–该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为false -->

<constant name="struts.enable.DynamicMethodInvocation" value="false"/>

 <!--上传文件的大小限制-->

<constant name="struts.multipart.maxSize" value=10701096"/>

 

 

 

 

 


最新回复(0)