Struts2介绍
Struts2是一种基于MVC模式的轻量级Web框架。本质上相当于一个Servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。
Struts2优势
- 自动封装参数
- 参数校验
- 结果的处理 转发 重定向
- 国际化
- 显示等待页面
-
防止重复提交
WEB层框架基于的前端控制器模式
在传统的开发中,有一次请求就会对应一个Servlet。这样会导致出现很多的Servlet。而Struts2将所有请求都先经过一个前端控制器,在前端控制器中实现框架的部分功能。具体的操作交到具体的Action中。
快速入门
下载Struts2开发包
- Struts2的官网 https://struts.apache.org/
解压开发包
-
解压后的目录结构如下:
- apps:该文件夹用于存放官方提供的Struts2示例程序。
- docs:该文件夹用于存放官方提供的Struts2文档
- lib:该文件夹用于存放Struts2的核心类库。以及Struts2的第三方插件类库
创建一个web工程引入相应jar包
可以参考apps下的一些示例代码,其中struts2-blank.war是struts2的空工程,我们可以查看它的lib目录
这些就是基本的开发包了,具体含义如下:
创建一个页面:放置一个链接
首先需要在WebContent下创建一个目录demo1,在demo1下创建一个新的jsp 在jsp中编写
创建Action
/**
* @Auther: wxblack-mac
* @Date: 2018/5/23 16:49
* @Description: Struts2 Action类
*/
public class HelloAction {
public String hello() {
System.out.println("hello world");
return "success";
}
}
编写配置文件 struts.xml
引入dtd约束文件
将struts2配置到web.xml中
由于Struts2是基于filter,所以需要配置Struts2的核心过滤器
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*
Struts2框架架构演示
核心配置详解
Struts2 核心配置 Struts.xml
/hello.jsp
Struts2常量配置
Struts默认常量配置位置
修改Struts2常量配置
第一种 在struts.xml文件中使用 标签 开发中常用
第二种 在src下创建strtus.properties文件
第三种 在项目的web.xml中
以上的顺序 也是配置文件的加载顺序 后加载的会覆盖先加载的
常量配置
基本常量配置
- 通常 Struts2框架按如下搜索顺序加载Struts2常量:
- struts-default.xml 该文件保存在struts2-core-2.5.14.jar文件中
- struts-plugin.xml Struts2等插件中
- struts.xml web应用默认的Struts2配置文件
- struts.properties Struts2默认的配置文件
- web.xml 该文件是Web应用的配置文件
如果在多个文件中配置了同一个Struts2常量,则后一个文件中配置的常量会覆盖前面文件中配置的常量值
配置进阶
Struts2动态方法调用
动态方法调用指的是:
我们在配置struts.xml需要配置method属性 代表调用的方法,如果调用的方法过多则会出现复杂且冗余的method配置,这样显然是不合理的。Struts2提供了动态的方法调用,可以让我们在调用方法时 指定方法的名称 调用对应的方法。这样可以大大简化我们的配置
方式一:
- 需要开启动态方法调用
- 不需要配置method属性
/hello.jsp
- 在调用时 通过 !方法名 来指定方法的调用
http://localhost:8080/ss/dynamic/Demo1Action!add
> 表示调用Demo1Action中的add方法
这种方式有一个弊端:由于地址路径的特殊,对SEO优化不友好
方式二:
- 通配符方式 动态方法调用
/hello.jsp
http://localhost:8080/ss/dynamic/Demo1Action_find 这个地址中 *代表"find" 相当于配置了 method="find"
使用PreResultListener
PreResultListener是一个监听器接口,可以在Action完成控制处理之后,系统转入实际的物理视图之间被回调
Struts2应用可由Action、拦截器添加PreResultListener监听器,添加PreResultListener监听器通过ActionInvocation的addPreResultListener()方法完成。一旦为Action添加了PreResultListener监听器,该监听器就可以在应用转入实际物理视图之前回调该监听器的beforeResult()方法
- 一旦为拦截器添加了PreResultListener监听器,该监听器会对该拦截器所拦截的所有Action都起作用
ActionInvocation invocation = ActionContext.getContext().getActionInvocation();
invocation.addPreResult(ActionInvocation invocation,String resultCode)
{
.....处理逻辑
invocation.getInvocationContext().put("extra",new Date());
}
Struts2默认配置
Struts2的很多配置都有默认值,在不配置的时候就以默认值来指定
/hello.jsp
配置默认Action
当用户请求找不到对应的Action时,系统默认的Action即将处理用户请求
配置默认Action通过
配置默认Action使用
配置Action默认处理类
在配置
自定义Action默认处理类
配置默认Action处理类使用
action类的详解
action的创建方式
方式一:直接创建一个类,可以是POJO(不用继承任何父类 也不需要实现任何接口)
这种方式并不好,使得Struts2框架的代码浸入性更低
方式二:实现一个接口Action
/**
* Action的详解
* @author wx-blackmac
* @create 2018-05-23 22:34
* bestwishes for you
* good luck!
* Action接口预置了一些字符串
* SUCCESS
* NONE
*
**/
public class Demo3Action implements Action {
/**
* execute是提示Action方法规范
* @return
* @throws Exception
*/
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
方式三:继承ActionSupport
ActionSupport帮我们实现了 Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable 这些接口 当我们使用这些接口时,不需要自己实现
/**
* Action的详解
* @author wx-blackmac
* @create 2018-05-23 22:34
* bestwishes for you
* good luck!
*
**/
public class Demo3Action extends ActionSupport {
}
因为ActionSupport完全符合一个Action的要求,所以也可直接使用ActionSupport作为业务控制器,如果配置Action没有指定class属性(没有用户提供Action类),系统自动使用ActionSupport类作为Action处理类
配置异常处理
Struts2的异常处理我们一般希望如果出现异常1的时候系统转入视图资源1,如果出现异常2系统转入视图资源2。我们可以采用如下的方式
public class XxxAction
{
public String execute(){
try{
....
}catch(异常1 e){
return 结果1;
}catch(异常2 e){
return 结果2;
}
}
}
但是,这样的方式会出现大量的try-catch块,完全手动处理异常,非常烦琐。
我们可以声明execute()抛出全部异常,将异常直接抛给Struts2框架。Struts2框架接收到Action抛出的异常之后,根据struts.xml配置异常映射。转入指定的视图
声明式异常捕捉
Struts2的异常处理机制是通过在struts.xml文件中配置
- exception:此属性指定该异常映射所设置的异常类型
- result:指定Action出现该异常时,系统返回Result属性值对应的逻辑视图名
异常映射分类
- 局部异常映射
将元素作为 元素的子元素配置
局部异常映射进队该异常映射所在的Action内有效。 - 全局异常映射
将元素作为 元素的子元素配置
全局异常映射对所有的Action都生效
如果局部异常映射和全局异常映射配置了同一个异常类型,在该Action内部局部异常映射会覆盖全局异常映射