Struts2是一个针对Javaee三层结构中的Web层的框架。从用途方面出发,简单来说Struts2的最主要使用方式就是用来与页面进行数据交互,获取请求数据,过滤请求数据,处理数据,传递数据到Service层,接收数据处理结果,封装数据再返回至页面。
1、Struts2的简介
Struts2是一个基于MVC设计模式的WEB层的框架。简单描述一下什么是MVC设计模式,类似与Javaee三层结构(Web、Service、Dao),MVC更应该被称为一种软件开发模式,MVC(Model-View-Controller) 模式的基本思想是数据,显示和处理相分离。模型(Model)负责数据管理,视图(View)负责数据显示,控制器(Controller)负责业务逻辑和响应策略。
常见的WEB层框架:Struts1、Struts2、WebWork、Spring Mvc,其中Struts2、Spring Mvc最最常见,另外两个么的人用
2、框架环境的搭建
a、开发包:Struts2的开发包下载地址:http://struts.apache.org/
b、开发包目录介绍:
apps :Struts2提供一些项目。
docs :Struts2提供的开发规范和文档
lib :Struts2提供的开发jar包
src :Struts2提供的源代码
c、基础版本Struts2的环境的搭建,可以参考apps目录中的blank项目使用的jar包,将该项目解压,lib目录下的全部jar包加到项目中即可。
3、基础配置
在了解基础配置前,需要大致了解Struts2框架的基础执行流程,要使用Struts2,必须先在web.xml中配置Struts2的核心过滤器,当访问到这个核心过滤器后,才正式使用了Struts2框架。
浏览器发送过来的请求,先经过前端控制器(核心过滤器:StrutsPrepareAndExecuteFilter),过滤器内部会执行一组拦截器,这组拦截器实现部分的功能,再根据配置文件找到并执行目标Action,根据Action中方法的返回值,再与配置文件中的结果属性匹配,跳转不同的页面或者转发到其他Action或者进行其他操作,最终回到浏览器。
Struts2的核心过滤器StrutsPrepareAndExecuteFilter中有一个init()方法,该初始化方法的主要作用是用来加载整个Struts2的配置文件的,当web项目的服务器启动时,该方法会执行且仅执行一次。这与servlet中的init方法不同,servlet方法中的init方法在每次收到请求数据时都会调用。
然后介绍一下Struts中的配置文件,首先是框架自带的配置文件,下面按配置文件的加载顺序一一列举:(a-c为框架自带的配置文件,d-f为我们需要创建的配置文件或参数)加载方法的调用列表如下:
init_DefaultProperties(); // [1] ---第一步加载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] ---第六步加载标准对象
a、default.properties struts-core/org/apache/struts2/default.properties
这个properties文件主要包含了框架中会使用到的一些键值对信息,如action的后缀名地址访问 上传文件的大小控制
b、struts-default.xml struts-core/struts-default.xml
配置了Struts2的默认包,大量拦截器、拦截器组等信息
c、struts-plugin.xml struts2整合spring需要用到的一个配置文件
暂时不会用 当需要整合Spring框架时, 会导一个包 struts2-spring-plugin-2.3.24.jar, 这个配置文件就是jar包里面的
d、struts.xml action的浏览器访问路径配置文件,一般配置与项目的src根目录下
e、struts.properties 作用同xml,基本不用
f、web.xml中的StrutsPrepareAndExecuteFilter的初始化参数值, 如
<init-param>
<param-name>struts.action.extension</param-name>
<param-value>bbb</param-value>
</init-param>
后面加载的配置文件内容如果和前面配置文件的内容相同了 后面的会覆盖前面的
下面主要介绍需要配置的web.xml和struts.xml
web.xml中核心过滤器的配置格式:
<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>
struts.xml文件的配置格式:
首先介绍各个常用标签的含义:
a、package配置
<package>标签
name :包的名称,在配置文件中不要出现重名的包即可。
extends :用于继承其他的包,通常继承struts-default.
namespace :名称空间,与<action>标签中name一起决定访问路径的。如namespace为"/",Action的name为test,那么访问路径即/test
namespace=”” :默认名称空间
namespace=”/” :跟名称空间
namespace=”/aaa” :带有名称名称空间
abstract :抽象的,将这个值设置为true,用于其他包继承。
<action>标签,action标签位于package标签内
name :与namespace共同决定访问路径
class :Action类全路径
method :执行Action中的哪个方法,默认值是execute.
<result>标签配置:
name :逻辑视图的名称。默认值是success。
type :
dispatcher :默认值,转发。(转发到JSP的页面)
redirect :重定向。(重定向到JSP的页面)
chain :转发到另一个Action。
redirectAction :重定向到另一个Action。
stream :文件的下载。
*result标签位于action标签内,与action匹配,但也可以使用global-results标签配置全局结果页,在action标签外,package标签内,举例如下:
<global-results>
<result name="ok">/jsp/ok.jsp</result>
</global-results>
b、constant配置,用于配置Struts常量,后面配置的constant标签可以覆盖前面加载的
格式如下:<constant name="struts.action.extension" value="abc"/>
此外,Struts2的常量也可以在另外两个地方配置,
struts.properties:key=value
web.xml:
<filter>
<filter-name>struts2</filter-name>
<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>
c、include标签,用于包含其他配置文件
完整配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 可以覆盖前面加载的配置文件内容 -->
<constant name="struts.action.extension" value="abc"></constant>
<!-- 使用动态方法 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<!-- name: 包名 对于咱们来说意义不大 作用:给别人继承用
extends: 继承 默认值:默认基层struts2提供的一个包 包名:struts-default
继承哪个包 那这个包下的所有东西都有一份
namespace: 名称空间 和浏览器访问地址相关
abstract:抽象的 默认是false 如果写成了true 代表当前的pageage下面不能出现action 他们2个是互
斥的
该包只能被用来继承
-->
<package name="test1" extends="struts-default" namespace="/">
<!--做action的地址访问路径
name:action的名字 和浏览器访问地址相关
namespace和name 组成了当前action的访问地址
class:全限定名
method: 可以不写 默认就是执行叫一个execute的方法 -->
<action name="hello" class="cn.itcast.action.ActionDemo1" >
<!--result: 接收返回值
name:返回的别名对比 -->
<result name="abc">/jsp/demo.jsp</result>
</action>
</package>
<!-- 引入外部的action配置 -->
<include file="struts_user.xml"></include>
<package name="test3" extends="struts-default" namespace="/">
<global-results>
<result name="ok">/jsp/ok.jsp</result>
</global-results>
<action name="hello2" class="cn.itcast.action.ActionDemo2" >
<result name="success">/jsp/demo.jsp</result>
</action>
<action name="hello3" class="cn.itcast.action.ActionDemo3" >
</action>
<!-- action的3种访问方式 -->
<!-- method方式 -->
<action name="product_save" class="cn.itcast.action.ActionDemo4" method="save" >
</action>
<action name="product_delete" class="cn.itcast.action.ActionDemo4"
method="delete" >
</action>
<action name="product_update" class="cn.itcast.action.ActionDemo4" method="update" >
</action>
<action name="product_find" class="cn.itcast.action.ActionDemo4" method="find" >
</action>
<!-- 通配符方式(掌握)
*: save
delete
update
find
{1} :第一个星号的值
-->
<action name="product_*" class="cn.itcast.action.ActionDemo4" method="{1}" >
</action>
<!-- 动态方法方式(了解)
1 动态方法方式默认是关闭的 需要开启 default.properties
2 页面要使用特殊写法
-->
<action name="product" class="cn.itcast.action.ActionDemo4" ></action>
</package>
</struts>