1. Struts的概述
1.1 什么是Struts2
Struts2是一个基于MVC设计模式的Web应用框架,它的本质就相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts2是在Struts和WebWork的技术的基础上进行合并的全新的框架。Struts2以WebWork为核心,采用拦截器的机制来处理的请求。这样的设计使得业务逻辑控制器能够与ServletAPI完全脱离开。
- Struts2是一个基于MVC设计模型的WEB层框架
1.2 常见的web层框架
- Struts2
- Struts1
- WebWork
- SpringMVC
1.3 WEB层的框架都会基于前端控制器的模式
在传统方式的开发中,有一次请求就会对应一个Servlet,这样会导致出现很多的Servlet。而Struts2将所有的请求都先经过一个前端控制器。在前端控制器中实现框架的部分功能,剩下具体操作要提交到具体的Action中。那么所有的请求都会经过前端控制器。
如何来实现前端控制器呢?过滤器就是最好的一个实现方式,因为需要所有的请求都可以被过滤器拦截,然后在过滤器中实现部分的功能。
2. Struts2入门
2.1 下载Struts2的开发环境
http://struts.apache.org/
2.2 解压Struts2的开发包
- apps:该文件夹存放官方提供的Struts2示例程序。
- docs:Struts2的官方文档
- lib:该文件夹用于存放Struts2的核心类库,以及Struts2的第三方插件类库。
- src:该文件夹用于存放该版本Struts2框架对应的源码
2.3 创建一个web项目,并引入jar包
- 引入jar包
这些包的基本含义:
2.4 创建一个JSP页面
首先需要在WebContent下创建一个目录demo1,在demo1下创建一个新的jsp,在jsp中编写一个Action的访问路径。
<h1>Struts2的入门案例</h1>
<a href="${pageContext.request.contextPath }/hello.action">访问Struts2的Action</a>
2.5 编写一个Action
public class HelloAction{
/**
* 提供一个默认的执行方法:execute
*/
public String execute(){
System.out.println("HelloAction执行了...");
return null;
}
}
2.6 完成Action的配置
- 在src下创建(提供)名称叫做struts.xml的配置文件
现在Action类已经配置好了,但是还不是不能执行。之前介绍过WEB层框架都有一个特点就是基于前端控制器的模型,这个前端控制器是由过滤器实现的,所以我们需要配置Struts2的核心过滤器。这个过滤器的名字叫做:StrutsPrepareAndExecuteFilter
。
2.7 配置(前端控制器)核心过滤器
在web.xml中
到这里,我们的程序就可以执行了,但是到了Action以后,页面并没有跳转,只是会在控制台输出Action中的内容。但是在开发中,处理了请求之后,还需要进行页面的跳转。
这时候我们需要修改Action类中的execute方法的返回值了,这个方法返回了一个String类型,这个String类型的值就是一个逻辑视图(逻辑视图:相当于对一个真实的页面,取了一个别名)
2.8 修改Action,将方法设置一个返回值
2.9 改写struts.xml
2.10 编写success.jsp页面
3. Struts2的执行流程
当用户访问某一个Action的时候,先经过核心过滤器,在核心过滤器中执行一组拦截器(这组拦截器实现部分功能),执行目标Action,根据Action的返回值,进行页面跳转。
4. Struts2的常见配置
4.1 XML的提示问题
4.1.1 配置XML的提示
4.2 Struts2的配置文件的加载顺序
每次从客户端发送请求到服务器都要经过Struts2的核心过滤器StrutsPrpareAndExecuteFilter
,这个过滤器有两个功能:预处理和执行。在预处理过程中主要就是加载配置文件,对于的是过滤器中的init方法,而执行时用来执行一组拦截器完成部分功能,对应的是过滤器的doFilter方法。
- 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] ----加载Bean对象
default.properties => struts-default.xml => struts-plugin.xml => struts.xml => struts.properties => web.xml 后面配置的常量值会覆盖先配置的常量值。
5. Action的配置
Struts2框架的核心配置文件是struts.xml文件,该文件主要用来配置Action和请求的对应关系。
5.1 Package相关配置
Struts2框架的核心配置文件是Action和拦截器,他使用包管理Action和拦截器。每个包就是多个Action、多个拦截器、多个拦截器引用的集合。
【package标签的属性】 - name:包的名称,只有在一个项目中不重名即可; - extends:继承哪个包,通常值为struts-default; - abstract:抽象的,用于其他包的继承; - namespace:名称空间,与标签中的name属性共同决定访问的路径;
namespace有三种配置:
- 默认名称空间:默认的名称空间就是namespace="";
- 跟名称空间:跟名称空间就是namespace="/";
- 带名称的名称空间:namespace="/demo1";
5.2 action相关配置
action标签配置Action类。
【action标签的属性】
- name:与namespace共同决定访问路径;
- class:与Action类的全路径(可选);
- method:执行Action中的哪个方法的方法名,默认值execute(可选);
- converter:用于设置类型转换器(可选);
5.3 常量配置
在Struts2的框架中,提供了非常多的常量:(在default.properties)
Struts2常量配置的三种方式: - 在struts.xml文件中使用元素配置常量:
- 在struts.properties中进行修改
- 在web.xml中进行修改
init-param标签必须放在filter标签下。
5.4 分模块开发的配置
通过include引入配置:
6. Action的访问
在Struts2的应用开发中,Action作为框架的核心类,实现对用户请求的处理,Action类被称之为业务逻辑控制器。一个Action类代表一次请求或者一次调用,每个请求的动作都对应于一个相应的Action类,一个Action类是一个独立的工作单元。也就是说,用户的每次请求,都会转到一个相应的Action类里面,由这个Action类来进行处理。
6.1 Action类的写法
实现Action控制类共有3种方式。
- 【Action是一个POJO的类】
public class ActionDemo1{
public String execute(){
System.out.println("ActionDemo1执行了...");
return "success";
}
}
execute()方法的要求如下: 1. 方法的权限修饰符为public 2. 返回一个字符串,就是指示的下一个页面的Result 3. 方法没有参数
- 【Action类实现一个Action的接口】
public class ActionDemo2 implements Action{
@Override
public String execute() throws Exception{
System.out.println("ActionDmo2执行了...");
return SUCCESS;
}
}
该接口还定义了5个字符串常量,SUCCESS(success)代表成功,NONE(noe)代表页面不跳转,ERROR(error)代表跳转到错误页面,INPUT(input)数据校验的时候跳转路径,LOGIN(login)用来跳转到登录界面。
- 【Action类继承ActionSupport类】(推荐)
/**
* 提供了数据校验,国际化等一系列的操作
*/
public class ActionDemo3 extends ActionSupport{
@Override
public String execute() throws Exception{
System.out.println("ActionDemo3执行了...");
return NONE;
}
}
6.2 Action的访问
Action的访问方式:
【通过配置method属性完成】
【通过通配符的方式进行配置】(推荐)
【动态访问方法】
动态方法访问在Struts2中默认是不开启的,如果想要使用需要先去开启一个常量。
然后配置Action:
页面路径写法: