Struts2: 是一个基于MVC设计模式的WEB层框架, C是核心过滤器Filter, V是jsp(html), M是 Action
Struts2的优势: 可以解决Servlet里获取请求参数, 页面跳转代码冗余的问题
1. 框架内置的配置文件(有三个)
default.properties: 在struts2-core.jar 中 的 org.apache.struts2包中, 存放了struts2所有的常量信息
struts-default.xml : 在struts-core.jar中, 定义了struts2框架底层的一些bean , struts-default抽象包, 拦截器,结果集
struts0pulgin.xml : 可有可无 , 定义了插件中的bean, action等信息
2. 自定义的配置文件(有三个)
struts.xml : 是struts2的核心配置文件, 位于工程的src目录下, 主要用于配置用户自定义的Action类
struts.properties : 可有可无, 位于src目录下, 用户可以添加, 也可以不添加, 用于配置struts2的常量
web.xml : 在WEB-INF下, 也可以配置struts的常量
3.配置文件加载顺序:
struts2框架中的六个配置加载顺序如下 :
default.properties--->struts-default.xml--->struts-plugin.xml--->struts.xml--->struts.properties--->web.xml
(1) struts2项目启动时, 会调用过滤器的init方法完成初始化;
(2) 初始化时, 先加载default.properties的文件
(3)再加载, struts-default.xml、struts-plugin.xml、struts.xml文件
(4)再加载, struts.properties;
(5)再加载 web.xml配置的初始化参数
4. 核心配置文件struts.xml
4.1 constant标签 : 用于修改struts中的常量
属性 :
name : 指定常量的key
value : 指定常量的值
常用常量介绍:
常量名 | 常量值 | 说明 |
struts.i18n.encoding | UTF-8 | 应用中使用的编码 |
struts.objectFactory.spring.autoWire | name | 和spring框架整合有关 |
struts.multipart.parser | jakarta | 指定文件上传用的组件 |
struts.multipart.maxSize | 2097152 | 文件上传总文件大小限制:2M |
struts.action.extension | action,, | 能进入Struts2框架内部的url地址后缀名。多个值用逗号分隔 |
struts.enable.DynamicMethodInvocation | false | 是否允许动态方法调用 |
struts.devMode | false | 是否是开发模式。开发模式:改了配置文件,不需要重启。输出更多的错误信息。开发阶段建议为true。 |
struts.ui.theme | xhtml | 页面展示用的主题 |
开启开发者模式的好处:
(1)当发生异常后, 可以再页面上看到详细的异常信息
(2)当更改了配置文件, 自动重载配置文件, 不需要重启服务, 提高开发效率
4.2 package标签 : 在struts2的配置文件中引入了面向对象的思想, 说那个了分包管理. 易于管理Action类. 便于模块化开发Action类
属性:
name: 包的名称. 必须写且必须唯一
extends : 一般情况下需要继承struts-default包, 但是不是必须的. 不过如果不继承的话, 将无法使用struts2提供的核心功能. struts-default.xml 中定义着struts-default这个包. 而struts-default.xml是在我们的struts.xml加载之前加载
abstract : 把包声明为抽象包, 抽象包就是用来被继承的. 是钥匙没有<action>元素的包, 就可以声明为抽象包
namespace : 名称空间. 它的作用是访问URL按照模块化来管理
空间名称的写法 : 一般以/ 开头. 当我们指定了空间名称之后, 访问的URL就变成了: 名称空间+action标签的name属性取值
命名空间使用公式 : http://服务器ip地址/项目名/命名空间/action 名字.action
4.3 action标签 : 配置Action类,
属性:
name: 指定Action类的访问名称. 注意此处不能有后缀, 必须唯一
class: 指定的是Action类的全路径名
method: 指定的是Action中的方法名称
在配置Action类时有一些特殊情况 :
如果在配置action节点时, 没有指定class属性, 则默认寻找com.opensymphony.xwork2.ActionSupport类, 因为在struts-default.xml做了如下配置, 指定默认的Action类, 当根据某个名字找不到对应的action时, 就找默认的类ActionSupport
5 Action编写方式(3种)
在struts 中编写一个Action的方式有三种:
(1) 实现Action接口, 重写execute 方法
好处: 可以利用Action接口里的静态常量作为方法的返回值(对应的是结果集的名字)
(2) 继承ActionSupport父类, 重写execute方法
本质上与第一种方法一样, 因为ActionSupport已经实现了Action接口
好处: 可以利用Action接口里的常量, 也可以利用父类里的国际化, 校验, 添加错误信息方法
(3) 编写一个POJO类 : Plain Ordinary Java Object , 意为简单Java对象
在自定义的POJO类中编写execute方法需要满足以下条件:
修饰符为public
返回类型为String
方法名叫execute
无形参
异常可选
特征: 没有现成的东西可用
6. Action的方法编写格式
在Action中自定义方法: 修饰符为public, 返回类型为String, 无形参, 异常可选
6.1 通过设置method属性调用Action中的方法
6.2 通配符的使用
在struts2中* 表示通配符: 匹配所有路径, {1}取出第一个* 的值, {2}取出第二个* 的值
一个*号: 匹配任意路径
<action name="*" class="xx.xx" method="{1}"></action>
例: url:add: 此时* 就是add; {1}取第一个*的值, 就是add
两个*号: 匹配像 Dept_add这样的路径
<action name="*_*" class="xx.{1}Action" method="{2}"></action>
例: url:Dept_add: 此时第一个* 就是Dept, {1}=DeptAction; 第二个*就是add,{2}=add
6.3 动态方法调用
作用: 允许通过action名字!方法名来访问Action类中的方法
需要把动态方法调用的开关打开, 默认是关闭的
<!-- 允许动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
缺点: 不安全, 不推荐使用