版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢!
本文网址:https://blog.csdn.net/sun8112133/article/details/106676866
文章目录
本篇博客还是以一个众所周知的 HelloWorld 小栗子开始讲起,帮助大家快速了解 Struts2 这个主流框架。
本篇博客中 Struts2 版本选用的是
2.3.24
。
一、Struts2 概述
在讲 HelloWorld 这个小栗子之前,我先简单说一下什么是 Struts2。
1、什么是 Struts2
如果说的专业点,Struts2 是一款基于 MVC 设计模式的 Web 应用框架,它本质上相当于 Servlet,它是作为控制器(Controller)来建立模型与视图的数据交互。说白了它就是用来 进行 WEB 开发的框架 而已。
那么有些小伙伴可能会有疑问,它的名字格式为什么和其他框架不一样,我们为什么不能把它称为 Struts 框架,而要在后面加一个 2 呢?其实 Struts 框架分为两个大版本(Struts1 和 Struts2),这两个版本的用法完全不同,相当于是两个不同的框架了。
Struts1 最先出来的时候号称是标签最丰富的框架,因为它里面有各种各样的标签,直接用标签就能展示相应的信息了,使用起来非常方便。但是随着时代的变迁,后来又出来了一款叫 WebWork 的框架,它号称是开发最便捷的框架,开发的速度要比 Struts1 更快,导致 Struts1 的用户大量流失。后来 Struts1 也发现了自己的问题,但是在原框架的基础上修改起来比较费劲了,于是它又重新设计了一款 Web 框架,就是我们现在使用的 Struts2 框架。
这也是 Struts 的一个发展历史,目前的 Web 主流框架也有很多,比如我们常见的 Spring MVC 这样的框架也同样好用,有兴趣的小伙伴们可以参考我之前写的博客:Spring MVC 笔记整理。
2、前端控制器模型设计
Struts2 这款框架 和 Spring MVC 一样也是基于 前端控制器 的模型设计。
前端控制器 在 Struts2 中相当于是一个过滤器,它是用来集中处理请求的,它负责过滤所有的请求,再将对应的请求分发到其他程序(Action)进行处理,它其实就是一个中央处理器,每次请求都需要经过它。
我们通过一张图简单了解下传统方式和 前端控制器模型 的区别:
二、HelloWorld
1、准备工作
先创建一个 Web 工程,如果你使用的是 Maven,可以先创建一个 Maven 的 Web 工程(可以参考: 在 Eclipse 中构建 Web 工程),并引入 Maven 依赖;如果你创建的是普通的 Web 工程,则直接引入 Jar 包即可。
建议大家从 Struts2 官网 上将 Struts2 的开发环境包下载下来,因为这个开发环境包里提供了 Struts2 的 Jar 包、开发文档以及测试应用等,可以很方便的帮助我们进行 Struts2 开发。
这里使用的是
struts-2.3.24
版本,解压 Strus2 开发环境包的目录:
- apps:Struts2 提供的应用,war 文件,可以将 web 项目打成 war 包,直接放入到 tomcat 里就可以运行;
- docs:Struts2 的开发文档和 API;
- lib:Struts2 框架的开发 jar 包;
- src:Struts2 的源码。
1)Maven 依赖
<dependencies>
<!-- Struts2 依赖 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.24</version>
</dependency>
<!-- Servlet 依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<!-- log4j 依赖 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>
2)Jar 包
从
apps
目录下找到struts-blank
项目(基本项目)并解压,将此项目的 jar 包全部引入。
2、目录结构
1)Maven 目录结构
2)使用 Jar 包的目录结构
3、配置前端控制器(核心过滤器)
这个前端控制器我们也把它称为是 Struts2 的核心过滤器。自
2.1.3
版本开始,ActionContextCleanUp
和FilterDispatcher
都由 StrutsPrepareAndExecuteFilter 代替了。我们需要配置 Struts2 的核心过滤器:
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.class
<!-- 配置 struts2 的核心过滤器 -->
<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>
4、创建 Struts2 的配置文件
在
src
下创建一个名字叫做struts.xml
的配置文件。在这里先不将log4j
的配置文件进行引入,若引入时需要注意,Struts2 引入的 Jar 包是log4j 2.X
的版本,所以只能使用log4j2.xml
作为配置文件,当然你也可以将2.X
版本的 jar 包换成1.X
,这样就能使用log4j.properties
作为配置文件了。
<?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>
<!-- 配置 package -->
<package name="demo1" extends="struts-default" namespace="/">
<!-- 配置 Action -->
<action name="hello" class="com.demo.HelloAction">
<!-- 配置页面的跳转 -->
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
Struts2 为了管理对 Action 的配置,通过包(package)进行管理,一个配置文件中可以有多个包,但是包的 name 属性必须在当前配置文件中是唯一的。extends 属性是指继承了
struts2-core.jar
中的struts-default.xml
,因为只有继承了这个 xml,才拥有了 Struts2 中 Action 的基本功能,namespace 属性需要和 action 标签中的 name 属性结合使用,它表示访问路径。关于此配置文件的标签及属性在后续博客中会进行专门讲解,这里大家了解即可。
在这里大家只需要知道,当浏览器的访问路径为:
/hello.action
就能够访问到该 Action 并执行对应的方法,最终跳转到success.jsp
页面。这里和大家扩展一下,Struts2 的扩展名是.action
,所以在 Action 的访问路径后面要加.action
;而 Struts1 的扩展名是.do
,所以需要加.do
扩展名。
5、编写 Action
Action 其实是一个类,这个类是用来处理用户请求,给用户作响应的。
在这个类中需要提供一个
execute()
方法,这个方法的签名是固定的,当访问该 Action 时,会默认执行该方法,若想更改其他方法,需要在 Struts2 的配置文件中进行配置,这个后续博客会有专门讲解,这里了解一下即可。
/**
* HelloAction类
*/
public class HelloAction {
/**
* 提供一个方法:
* 方法签名是固定的,共有的,返回值是 String 类型,方法名是 execute
* 在这个方法中不能传递参数
* @return
*/
public String execute() {
System.out.println("HelloAction 执行了...");
return "success"; // 返回 success 字符串,与配置文件中的 result 的 name 属性对应
}
}
6、准备 JSP 页面
我们这里准备两个 JSP 页面,一个是入口的 JSP(demo.jsp),还有一个是跳转后的 JSP(success.jsp)
1)demo.jsp
<body>
<h1>Struts2 的 HelloWorld</h1>
<h3><a href="${ pageContext.request.contextPath }/hello.action">Struts2 的 HelloWorld</a></h3>
</body>
2)success.jsp
<body>
<h1>跳转成功页面!</h1>
</body>
7、浏览器测试
用浏览器访问
/hello.action
这个 URL,如果能转发到success.jsp
页面,表示测试成功!
三、可能会出现的问题
在做 HelloWorld 这个小栗子时可能会出现一些意想不到的问题,我在做 HelloWorld 这个小栗子的时候,出现了下列问题,大家可以进行参考:
1、Maven 构建 Struts2 时报 ClassNotFoundException 异常
请参考:https://blog.csdn.net/sun8112133/article/details/104521255
2、项目报 Java 版本不匹配
请参考:https://blog.csdn.net/sun8112133/article/details/104521088