JavaWeb 之 Struts2 快速入门

Struts2 快速入门。
Struts2 框架的概述
Struts2 框架由来
Struts2是Struts1的下一代产品,是在struts1和WebWork的技术基础上进行了合并的全新的Struts2框架。其全新的
Struts2的体系结构与Struts1的体系结构差别巨大。Struts2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts2可以理解为WebWork的更新产品。虽然从
Struts1到Struts2有着太大的变化,但是相对于WebWork,Struts2的变化很小。
Struts2 设计模型
Struts2 是一个基于 MVC 设计模式的 Web 层框架
MVC和 JavaEE 的三层结构MVC设计模式:是由一些网站的开发人员提出来的(Model View Controller)JavaEE 三层结构:SUN 公司为 EE 开发划分的结构
常见的Web层的框架
Struts1
Struts2 ★
Webwork
SpringMVC ★
Web层框架的特点
都是一个特点,
前端控制器模式记住:
前端控制器(核心的控制器)Struts2框架前端的控制器就是过滤器
Struts2 快速入门
环境准备
创建 WEB 项目
编写 JSP 的页面,编写超链接,点击超链接发送请求,请求服务器,让服务器的方法去执行!!
1  | <h3>Struts2的入门程序</h3>  | 
下载 Struts2 的开发包
- https://struts.apache.org/ – 官网地址
 
解压struts-2.3.24-all.zip包
- 解压后会看到有包和一些文件,大家需要掌握包相关的信息
 
apps– Struts2 框架提供了一些应用libs– Struts2 框架开发的 jar 包docs– Struts2 框架开发文档src– Struts2 框架源码
引入需要开发的 jar 包
Struts2框架的开发jar包非常多,但是不是所有都是必须要引入的,有一些必须要导入的jar包,这些jar包可以从Struts2框架提供的应用中找到。- 可以打开 
apps目录,然后找到struts2-blank.war应用。war 包和zip` 包的压缩格式是一样的,所以可以修改后缀名,解压。 - 找到解压后的应用,打开 
WEB-INF/lib目录下所以的jar包。复制到工程中,就可以了。 
配置 Struts2 的前端控制器
注意:这一步是必须要做的操作,这是 Struts2 核心的控制器。
Struts2的前端控制器就是一个过滤器,那么过滤器相关知识咱们都学习过,需要在web.xml中进行配置。- 前端控制器的类的路径和名称:
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter - 具体配置如下
 
1  | <filter>  | 
编写 Action 类
Action 类是动作类,是 Struts2 处理请求,封装数据,响应页面的核心控制器。需要自己编写。
1  | /**  | 
编写 Struts 的配置文件
配置文件名称是
struts.xml(名称必须是struts.xml)在
src下引入struts.xml配置文件(配置文件的路径必须是在src的目录下)配置如下
1  | 
  | 
编写跳转
1  | <struts>  | 
总结 Struts2 执行流程
执行的流程
编写的页面,点击超链接,请求提交到服务器端。
请求会先经过
Struts2的核心过滤器(StrutsPrepareAndExecuteFilter)
过滤器的功能是完成了一部分代码功能
就是一系列的拦截器执行了,进行一些处理工作。
可以在struts-default.xml配置文件中看到有很多的拦截器。
- 拦截器执行完后,会根据 
struts.xml的配置文件找到请求路径,找到具体的类,通过反射的方式让方法执行。 
总结
- JSP页面 –> 
StrutsPrepereAndExecuteFilter过滤器 –> 执行一系列拦截器(完成了部分代码) –> 执行到目标Action–> 返回字符串 –> 结果页面(result) –> 页面跳转 
Struts2 框架配置文件加载的顺序
Struts2 框架的核心是 StrutsPrepareAndExecuteFilter 过滤器
该过滤器有两个功能
- Prepare – 预处理,加载核心的配置文件
 - Execute – 执行,让部分拦截器执行
 
StrutsPrepareAndExecuteFilter  过滤器会加载哪些配置文件呢?
通过源代码可以看到具体加载的配置文件和加载配置文件的顺序
- init_DefaultProperties(); 				– 加载 
org/apache/struts2/default.properties - init_TraditionalXmlConfigurations();		– 加载 
struts-default.xml,struts-plugin.xml,struts.xml - init_LegacyStrutsProperties();			– 加载自定义的 
struts.properties - init_CustomConfigurationProviders(); – 加载用户自定义配置提供者
 - init_FilterInitParameters() ;				– 加载 
web.xml 
重点了解的配置文件
- default.properties		– 在 
org/apache/struts2/目录下,代表的是配置的是Struts2的常量的值 - struts-default.xml		– 在 
Struts2的核心包下,代表的是Struts2核心功能的配置(Bean、拦截器、结果类型等) - struts.xml				– 重点中的重点配置,代表 
WEB应用的默认配置,在工作中,基本就配置它就可以了!!(可以配置常量) - web.xml – 配置前端控制器(可以配置常量)
 
注意:
前 3 个配置文件是
struts2框架的默认配置文件,基本不用修改。后 3 个配置文件可以允许自己修改
struts2的常量。但是有一个特点:后加载的配置文件修改的常量的值,会覆盖掉前面修改的常量的值。
总结(重点掌握的配置文件)
先加载
default.properties文件,在org/apache/struts2/default.properties文件,都是常量。又加载
struts-default.xml配置文件,在核心的jar包最下方,struts2框架的核心功能都是在该配置文件中配置的。再加载
struts.xml的配置文件,在src的目录下,代表用户自己配置的配置文件最后加载
web.xml的配置文件后加载的配置文件会覆盖掉之前加载的配置文件(在这些配置文件中可以配置常量)
注意一个问题
哪些配置文件中可以配置常量?
default.properties – 默认值,是不能修改的!!
struts.xml – 可以配置,开发中基本上都在该配置文件中配置常量
struts.properties – 可以配置,基本不会在该配置文件中配置
web.xml – 可以配置,基本不会在该配置文件中配置
后加载的配置文件会覆盖掉之前加载的配置!!
struts.xml 配置文件
基本标签
<package> 标签
如果要配置 <Action> 的标签,那么必须要先配置 <package> 标签,代表的包的概念
包含的属性:
- name					– 包的名称,要求是唯一的,管理 
action配置 - extends				– 继承,可以继承其他的包,只要继承了,那么该包就包含了其他包的功能,一般都是继承 
struts-default - namespace				– 名称空间,一般与 
<action>标签中的name属性共同决定访问路径(通俗话:怎么来访问action),常见的配置如下namespace=”/“ – 根名称空间
namespace=”/aaa” – 带有名称的名称空间 - abstract				– 抽象的。这个属性基本很少使用,值如果是 
true,那么编写的包是被继承的 
<action> 标签
代表配置 action 类,包含的属性
- name			– 和 
<package>标签的namespace属性一起来决定访问路径的 - class			– 配置 
Action类的全路径(默认值是ActionSupport类) - method		– 
Action类中执行的方法,如果不指定,默认值是execute 
<result> 标签
action类中方法执行,返回的结果跳转的页面
- name – 结果页面逻辑视图名称
 - type – 结果类型(默认值是转发,也可以设置其他的值)
 
Struts2 配置常量
Struts2 框架中的哪些配置文件中配置常量?
struts.xml(必须要掌握,开发中基本上就在该配置文件中编写常量)
1  | * <constant name="key" value="value"></constant>  | 
web.xml
在
StrutsPrepareAndExecuteFilter配置文件中配置初始化参数注意:后加载的配置的文件的常量会覆盖之前加载的常量!!
需要了解的常量
- struts.i18n.encoding=UTF-8 – 指定默认编码集,作用于 HttpServletRequest 的 setCharacterEncoding 方法
 - struts.action.extension=action,,		– 该属性指定需要 Struts 2 处理的请求后缀,该属性的默认值是 action,即所有匹配 
*.action的请求都由 Struts2 处理。如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开 - struts.serve.static.browserCache=true		– 设置浏览器是否缓存静态内容,默认值为 
true(生产环境下使用),开发阶段最好关闭 - struts.configuration.xml.reload=false		– 当 struts 的配置文件修改后,系统是否自动重新加载该文件,默认值为 
false(生产环境下使用) - struts.devMode = false – 开发模式下使用,这样可以打印出更详细的错误信息
 
指定多个struts的配置文件(了解)
- 在大部分应用里,随着应用规模的增加,系统中 
Action的数量也会大量增加,导致struts.xml配置文件变得非常臃肿。 
为了避免 struts.xml 文件过于庞大、臃肿,提高 struts.xml 文件的可读性,我们可以将一个 struts.xml 配置文件分解成多个配置文件,然后在 struts.xml 文件中包含其他配置文件。
- 可以在 
<package>标签中,使用<include>标签来引入其他的struts_xx.xml的配置文件。例如: 
1  | <struts>  | 
- 注意注意注意(重要的事情说三遍):
 
1  | <include file="com/renkaigis/demo2/struts-part1.xml"/>  | 
Action 类的三种写法
Action类就是一个POJO类
- 什么是 POJO 类,
POJO(Plain Ordinary Java Object)简单的 Java 对象,简单记:没有继承某个类,没有实现接口,就是 POJO 的类。 
1  | /**  | 
配置文件:
1  | <!--POJO 类的方式-->  | 
Action 类可以实现 Action 接口
Action 接口中定义了 5 个常量,5 个常量的值对应的是 5 个逻辑视图跳转页面(跳转的页面还是需要自己来配置),还定义了一个方法,execute 方法。
需要掌握5个逻辑视图的常量
- SUCCESS – 成功
 - INPUT – 用于数据表单校验.如果校验失败,跳转 INPUT 视图
 - LOGIN – 登录
 - ERROR – 错误
 - NONE – 页面不转向
 
1  | /**  | 
配置文件:
1  | <!--实现 Action 接口的方式-->  | 
Action 类可以去继承 ActionSupport 类
(开发中这种方式使用最多)
1  | /**  | 
配置文件:
1  | <!--继承 ActionSupport 类的方式-->  | 
Action 的访问
传统的配置方式
通过 <action> 标签中的 method 属性,访问到 Action 中的具体的方法。
- 传统的配置方式,配置更清晰更好理解!但是扩展需要修改配置文件等!
 
具体的实例如下:
- 页面代码
 
1  | <H3>传统的配置文件的方式</H3>  | 
- 配置文件的代码
 
1  | <!--传统方式-->  | 
- Action 的代码
 
1  | /**  | 
通配符的访问方式
(访问的路径和方法的名称必须要有某种联系)
通配符就是 * 代表任意的字符
- 使用通配符的方式可以简化配置文件的代码编写,而且扩展和维护比较容易。
 
具体实例如下:
- 页面代码
 
1  | <H3>通配符配置文件的方式</H3>  | 
- 配置文件代码
 
1  | <!--通配符的方式-->  | 
- Action 的代码
 
1  | /**  | 
- 具体理解:在 JSP 页面发送请求,
http://localhost:9090/demo2/linkman_save.action,配置文件中的linkman_*可以匹配该请求,*就相当于变成了add,method属性的值使用{1}来代替,{1}就表示的是第一个*号的位置!!所以method的值就等于了add,那么就找到Action类中的add方法,那么add方法就执行了! 
动态方法访问的方式
(有的开发中也会使用这种方式)
如果想完成动态方法访问的方式,需要开启一个常量,
struts.enable.DynamicMethodInvocation = false,把值设置成true。注意:不同的
Struts2框架的版本,该常量的值不一定是true或者false,需要自己来看一下。如果是false,需要自己开启。在
struts.xml中开启该常量。
1  | <!-- 开启动态方法访问 -->  | 
具体实例如下:
- 页面的代码
 
1  | <H3>动态方法访问的方式</H3>  | 
- 配置文件代码
 
1  | <!--配置动态方法访问-->  | 
- Action的类的代码
 
1  | public class UserAction extends ActionSupport {  | 
总结
Struts2 框架主要以下几个步骤:
编写 web.xml 前端控制器
1  | <filter>  | 
编写 struts.xml 配置文件
1  | <package name="" namespace="/" extends="struts-default">  | 
编写 Action 类
一般继承
ActionSupport类<action>访问配置一般使用通配符的方式:
name="user_*" method="{1}"