Struts2框架实战一
1 struts2 概述
Struts2 是一种基于 MVC 模式的轻量级 Web 框架,它自问世以来,就受到了广大 Web 开发者的关注,并广泛应用于各种企业系统的开发中。目前掌握 Struts2 框架几乎成为 Web 开发者的必备技能之一。接下来将针对 Struts2 的特点、安装以及执行流程等内容进行详细的讲解。 在介绍 Struts2 之前,先来认识一下 Struts1。Struts1 是最早的基于 MVC 模式的轻量级 Web 框架,它能够合理的划分代码结构,并包含验证框架、国际化框架等多种实用工具框架。但是随着技术的进步,Struts1 的局限性也越来越多的暴露出来。为了符合更加灵活、高效的开发需求,Struts2 框架应运而生。 Struts2 是 Struts1 的下一代产品,是在 Struts1 和 WebWork 技术的基础上进行合并后的全新框架(WebWork 是由 OpenSymphony 组织开发的,致力于组件化和代码重用的 J2EE Web 框架,它也是一个 MVC 框架)。虽然 Struts2 的名字与 Struts1 相似,但其设计思想却有很大不同。实质上,Struts2 是以 WebWork 为核心的,它采用拦截器的机制来处理用户的请求。这样的设计也使得业务逻辑控制器能够与 ServletAPI 完全脱离开,所以 Struts2 可以理解为 WebWork 的更新产品。 Struts2 拥有优良的设计和功能,其优势具体如下: 项目开源,使用及拓展方便,天生优势。 提供 Exception 处理机制。 Result 方式的页面导航,通过 Result 标签很方便的实现重定向和页面跳转。 通过简单、集中的配置来调度业务类,使得配置和修改都非常容易。 提供简单、统一的表达式语言来访问所有可供访问的数据。 提供标准、强大的验证框架和国际化框架。 提供强大的、可以有效减少页面代码的标签。 提供良好的 Ajax 支持。 拥有简单的插件,只需放入相应的 JAR 包,任何人都可以扩展 Struts2 框架,比如自定义拦截器、自定义结果类型、自定义标签等,为 Struts2 定制需要的功能,不需要什么特殊配置,并且可以发布给其他人使用。 拥有智能的默认设置,不需要另外进行繁琐的设置。使用默认设置就可以完成大多数项目程序开发所需要的功能。 上面列举的就是 Struts2 的一系列技术优势,只需对它们简单了解即可,在学习了后面的知识后,会慢慢对这些技术优势有更好的理解和体会。
2.1 Struts2 环境搭建
2.1.1 下载 struts2 开发包

2.1.2 struts2 开发包目录介绍

Struts2 的文件夹结构 从图中可以看出,展示的是解压后的 Struts2.3.24 的目录结构,为了让大家对每个目录的内容和作用有一定的了解,接下来针对这些目录进行简单介绍,具体如下: apps:该文件夹存用于存放官方提供的 Struts2 示例程序,这些程序可以作为学习者的学习资料,可为学习者提供很好的参照。各示例均为 war 文件,可以通过 zip 方式进行解压。 docs:该文件夹用于存放官方提供的 Struts2 文档,包括 Struts2 的快速入门、Struts2 的文档,以及 API 文档等内容。 lib:该文件夹用于存放 Struts2 的核心类库,以及 Struts2 的第三方插件类库。 src:该文件夹用于存放该版本 Struts2 框架对应的源代码。 有了 Struts2 的开发环境,接下来我们可以进行 Struts2 的开发了。
3、开发入门
3.1 开发包介绍

3.2 开发环境
1)创建web工程导入jar包

2)配置Struts2的核心控制器
Struts2的核心控制器:是一个过滤器
在web.xml中配置

3)配置Struts2的核心配置文件
位置:src【类的根目录下】
名称:struts.xml
<?xml version="1.0" encoding="UTF-8"?> <!-- 导入约束:dtd约束 去核心包下找:struts2-core-2.3.24.jar/struts-2.3.dtd 在上面文件的第三十行 --> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts></struts>
4)启动tomcat不报错的话,环境就搭建成功了

3.3 开发入门
在页面有一个请求,我们使用一个类来接收请求,在控制输出一句话,并且响应之后跳转到一个成功页面。
1)index.jsp
在这个页面中,有一个url

2)编写HelloAction类
在struts2中把接收请求的类叫动作类
3)在struts.xml中配置动作类
<?xml version="1.0" encoding="UTF-8"?>
<!-- 导入约束:
约束的位置:在struts2的核心jar包中 struts2-core-2.3.24.jar中包含一个名称为
:struts-2.3.dtd的约束文件 在上面文件的第三十行
-->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 常量配置:开发者模式-->
<constant name="struts.devMode" value="true"></constant>
<!-- 开启动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<!--
package标签解释
作用:以面向对象的思想配置文件
一个包继承了父包,能够把父包的所有配置都继承下来
属性:
name:包的名称,名称随便写,但是不能重复
extends:继承那个包,名字固定不能随便写
abstract:定义的抽象包,定义抽象包,写一个true即可,没有action的标签
才能定义为抽象包
namespace:名称空间,以面向对象的思想管理url
举例:
namespace="/n1"
action的name="hello"
访问url:/n1/hello.action
细节:1)名称空间的/不能少,框架定好的
2) 默认的名称空间:“”
-->
<package name="p1" extends="struts-default" >
<!--
action:配置动作名称与动作类与动作方法的之间的关系
属性
name:动作名称,名称可以随意写,但是不能重复,他是url地址的一部分
class:对应的动作类,默认值:com.opensymphony.xwork2.ActionSupport
method:对应的动作方法,默认值是execute
动作类的三种编写方式:
1)第一种:无侵入式编写【一般不用】
2)第二种:实现Action接口【一般少用】
3)第三种:继承ActionSupport类【常用】
-->
<action name="hello" class="com.itheima.web.action.HelloAction" method="sayHello">
<result name="yes" type="dispatcher">/success.jsp</result>
</action>
</package>
<!-- action的三种调用方式:入口看inde.jsp -->
<package name="user" extends="struts-default" >
<!-- 第一种完全匹配 -->
<!-- <action name="addUser" class="com.itheima.web.action.UserAction" method="addUser" >
<result name="yes" type="dispatcher">success.jsp</result>
</action>
<action name="deleteUser" class="com.itheima.web.action.UserAction" method="deleteUser">
<result name="yes" type="dispatcher">success.jsp</result>
</action>
<action name="updateUser" class="com.itheima.web.action.UserAction" method="updateUser">
<result name="yes" type="dispatcher">success.jsp</result>
</action>
<action name="findUser" class="com.itheima.web.action.UserAction" method="findUser">
<result name="yes" type="dispatcher">success.jsp</result>
</action> -->
<!-- 第二种:通配的方式:【项目中使用的比较多】 -->
<!--
一个*号:用*匹配动作名称,在method属性中使用{1} 获取对应的字符
-->
<!-- <action name="*" class="com.itheima.web.action.UserAction" method="{1}">
<result name="yes" type="dispatcher">success.jsp</result>
</action> -->
<!--
多个*号:
使用*号来匹配动作名称,*_*,获取第一个字符串{1},获取第二个字符串{2}
-->
<action name="*_*" class="com.itheima.web.action.UserAction" method="{1}{2}">
<result name="yes" type="dispatcher" >success.jsp</result>
</action>
<!--
第三种 :动态方法调用:【一般不用】
1)开启动态方法调用的支持配置一个常量
struts.enable.DynamicMethodInvocation = true
2)访问规则是:
动作名称!动作方法.action
-->
<action name="user" class="com.itheima.web.action.UserAction" >
<result name="yes" type="dispatcher" >success.jsp</result>
</action>
</package>
</struts>
4)编写一个响应的succ.jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>入门成功</title>
</head>
<body>
成功入门
</body>
</html>
5)测试即可
3.4 Struts2 的执行过程
执行时序:
内部执行流程:

第2章 struts2 的配置文件详解
通过上图,我们知道了学习 struts2 框架,配置文件的重要性。那么在 struts2 中给我们提供了 6 个配置文件。他们的加载时机是 tomcat 启动服务一加载我们的应用时,就加载 struts2 的配置文件。
他们的加载顺序入下图:
顺序 配置文件名 所在位置 说明 1 default.properties struts2-core-2.3.15.3.jar\org\a pache\struts2 不能修改 2 struts-default.xml struts2-core-2.3.15.3.jar 不能修改 3 strtuts-plugin.xml 在 struts2 提供的插件 jar 包中 不能修改 4 struts.xml 我们的应用中 我们修改的:推荐 5 struts.properties 我们的应用中 我们修改的 6 web.xml 我们的应用中 我们修改的,可以给过滤器配置参数
配置文件的注意事项
1、Struts2 提供了两种配置的方式。一种是 key=value 的方式,即使用.properties 文件。另一种是 xml 文件配置。我们推荐使用 xml 文件(它能描述层级关系)。
当多个配置文件中,有相同的参数,后加载的会把前面的值给覆盖了。
struts2 中的常用常量
常量定义在了 default.properties 配置文件中,体现形式都是 key=value。所有的 struts2 应用都会用到这些常量。
常用的:



struts.xml 中的标签详解
truts.xml 中的标签详解 3.2.1 constant 标签 3.2.1.1 作用: 用于修改 struts2 中的常量 3.2.1.2 属性: name:指定常量的 key value:指定常量的值 3.2.2 package 标签 3.2.2.1 作用: 在 struts2 的配置文件中引入了面向对象思想,使用了分包管理。易于管理动作类。便于模块化开发动作类。 3.2.2.2 属性: name:包的名称。必须写。且必须唯一。 extends:一般情况下需要继承 struts-default 包,但不是必须的。不过如果不继承的话,将无法使用 struts2 提供的核心功能。
struts-default.xml 中定义着 struts-default 这个包。而 struts-default.xml 是在我们的 struts.xml 加载之前加载。 abstract:把包声明为抽象包,抽象包就是用来被继承的。只要是没有<action>元素的包,就可以声明为抽象包。 namespace:名称空间。它的作用是把访问的 URL 按照模块化来管理。 名称空间的写法:
必须以/开头
后面可以是字母和数组的组合,也可只有字母。
如果有数字的话,数字不能作为/后面的第一个字符。 当我们指定了名称空间之后,访问的 URL 就变成了:名称空间+action 标签的 name 属性取值
例如:/n1/hello.action
/customer/addCustomer.action
/customer/editCustomer.action
/linkman/findAllLinkMan.action
/linkman/removeLinkMan.action
action 标签
作用: 建立动作名称和动作类以及动作方法的对应关系。 3.2.3.2 属性: name:指定的动作名称。和页面中 url 后面保持一种。注意此处不能后缀。动作名称必须唯一。
class:指定的是动作类的全限定类名。 method:指定的是动作方法名称


浙公网安备 33010602011771号