Struts2框架的概述:

什么是框架:

框架是一个软件的半成品,通过完成部分的功能.

什么是Struts2框架:

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是一个基于MVC设计模式的WEB层框架.

* EE三层结构:WEB层,业务层,持久层.

* MVC与EE三层结构.由不同的时期,不同的人提出来.

WEB层的框架:

Struts1

WebWork

Struts2

SpringMVC

----WEB层框架的特点:(前端控制器模式:)

从客户端的每次请求都会到达前端控制器(核心过滤器):在前端控制器中完成部分功能代码,具体的代码会被分发到不同的Action中进行处理.

 Struts2和Struts1的区别:

Struts2核心是webwork.

Struts2和Struts1除了名称相近之外没有太大联系.

Struts2的目录结构:

* apps :Struts2提供一些应用.war:web项目打包成war格式.java工程打包成jar格式.

* docs :Struts2的开发文档.

* lib :Struts2的开发的jar包.

* src :Struts2的源码.


struts2创建过程:
----1.创建一个Web工程:
----2.引入相应的jar包:

struts-2.3.15.3\apps\struts2-blank\WEB-INF\lib

* 引入提供的空的应用中的所有的jar包:

----3.编写一个JSP的页面:

<h1>Struts2的入门案例</h1>

<h3><a href="${ pageContext.request.contextPath }/hello.action">Struts2的入门</a></h3>

----4.配置Struts2的核心过滤器:(前端控制器)



1



2



3



4



5



6



7



8



9


<!-- 配置Struts2的核心过滤器 -->



< filter >



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



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



</ filter >



< filter-mapping >



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



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



</ filter-mapping >




-----5.编写一个Action类

配置Action类:(在Struts2框架的配置文件中进行配置)



1



2



3



4



5



6



7



8



9


< struts >



<!-- 配置一个包: -->



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



<!-- 配置Action:name是请求action去掉后缀名的名称. -->



< action name = "hello" class = "cn.itcast.struts2.demo1.HelloAction" >



< result name = "success" >/demo1/success.jsp</ result >



</ action >



</ package >



</ struts >




----6.编写一个success.jsp

Struts2的执行的流程:

从客户端发送请求---》先经过核心过滤器:(StrutsPrepareAndExecuteFilter).----》执行一组拦截器(完成了部分功能)-----》执行目标Action------》跳转到结果页面.

配置文件的加载顺序:

创建了StrutsPrepareAndExecuteFilter的时候,在init方法中执行Dispatcher中的init方法:

init_DefaultProperties(); // [1] ----加载org/apache/struts2/default: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

struts-default.xml

struts-plugin.xml

strtus.xml

struts.properties

web.xml

因为这个三个配置文件都可以修改struts2中常量:后加载的修改的常量会生效!!!


Struts2的常见配置:



<package>:包.



包的概念

Java中包:用来区分类重名的问题.

Struts2中包:用来管理<action>

<package>中属性:

* name :包的名称.名称需要时唯一的.

* extends :继承.代表当前的包继承其他的包.一般都继承struts-default包(struts2框架提供的.).

* namespace :名称空间.名称空间与<action>中的name属性共同决定的访问路径.

* namespace的取值:

* namespace=”” :默认值.默认名称空间

* namespace=”/” :跟名称空间.

* namespace=”/aaa/bbb” :带名称的名称空间.

* 名称空间的访问顺序:

* 如果访问路径中有名称空间,访问带有名称空间的action.如果访问路径中没有名称空间,先会去跟名称空间下查询.去默认的名称空间下查询.

* 访问的过程中有名称空间最大化的原则:

* abstract :抽象的.(了解).如果包是abstract=”true”.那么这个包可以被其他包继承的.



<action>的配置:



<action>的属性:

* name :与<package>中namespace共同决定action的访问路径.

* class :Action类的全路径.

* method :执行Action中哪个方法.默认值execute

默认的Action和Action的默认处理类:

默认的Action :当访问一个路径不存在的Action的时候,正常会报404.可以配置一个默认的Action.访问一个找不到的路径的时候,就会执行默认的Action:

* <default-action-ref name="hello"/>

Action的默认处理类 :路径可以找到,但是class属性没有配置.

* <default-class-ref class="com.opensymphony.xwork2.ActionSupport" />



<result>的配置:



<result>的属性:

* name :逻辑视图名称.

* type :跳转的方式.


常量的配置:

***** Struts2常量定义在 default.properties

修改常量可以在哪几个文件中修改:

struts.xml (推荐在文件中修改常量.)

* 格式:<constant name="" value=""/>

struts.properties

* 格式:key=value

web.xml

* 格式:



1



2



3



4



5



6



7



8


< filter >



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



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



< init-param >



< param-name >key</ param-name >



< param-value >value</ param-value >



</ init-param >



</ filter >




***** 后加载配置文件修改的常量会将先加载的配置文件修改的常量覆盖.

常见的常量:

* struts.i18n.encoding=UTF-8 :在Struts2使用UTF-8字符集.在提交数据采用POST方式的时候中文乱码不需要进行处理了.

* struts.action.extension=action,, :Struts2的默认扩展名.默认值action,, 默认值是action或者不写.

修改常量:

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

<constant name="struts.devMode" value="true"/>


包含<include>的配置:

包含其他模块的配置文件:

<include file="cn/itcast/struts2/demo1/struts_demo1.xml"/>

访问action的三种方法:
----1、一个action对应一个方法,直接访问
----2、使用通配符的形式完成Action的访问:(*****)

条件:

* 执行的方法要和访问的路径有一定关系!!!

----3、动态方法访问.(***)

条件:

必须开启sruts2的中一个常量!!!

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

动态方法访问的格式:

* Action的访问路径!方法名.action

 结果页面<result>的配置的类型:

<result>标签:

* name :逻辑视图名称默认值是success.

* type :类型.

* dispatcher :默认值.转发.(转发到JSP)

* redirect :重定向.(重定向到JSP)

* chain :转发.转发到一个Action.

* redirectAction :重定向到Action.

* stream :文件下载的时候使用的.


Servlet是单例的:

第一次请求会创建Servlet的对象的实例,以后每次访问都使用的是同一个Servlet的实例.出现线程安全的问题.

Action是多例的:

每次请求都会创建一个新的Action的实例.不会出现线程安全的问题.