【Struts2笔记整理一】HelloWorld

版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢!
本文网址: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)进行处理,它其实就是一个中央处理器,每次请求都需要经过它。

我们通过一张图简单了解下传统方式和 前端控制器模型 的区别:

01前端控制器模型



二、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 包全部引入。

01Jar包


2、目录结构

1)Maven 目录结构

01Maven目录结构

2)使用 Jar 包的目录结构

01普通Java工程目录结构


3、配置前端控制器(核心过滤器)

这个前端控制器我们也把它称为是 Struts2 的核心过滤器。自 2.1.3 版本开始,ActionContextCleanUpFilterDispatcher 都由 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,才拥有了 Struts2Action 的基本功能,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 页面,表示测试成功!

01浏览器测试



三、可能会出现的问题

在做 HelloWorld 这个小栗子时可能会出现一些意想不到的问题,我在做 HelloWorld 这个小栗子的时候,出现了下列问题,大家可以进行参考:

1、Maven 构建 Struts2 时报 ClassNotFoundException 异常

请参考:https://blog.csdn.net/sun8112133/article/details/104521255


2、项目报 Java 版本不匹配

请参考:https://blog.csdn.net/sun8112133/article/details/104521088



博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!



猜你喜欢

转载自blog.csdn.net/sun8112133/article/details/106676866
今日推荐