简介:Struts 1.3.8 是一款 Java Web 应用程序框架,本教程将深入讲解其关键概念和技术。涵盖 MVC 模式、配置文件、Action 类、表单 Bean、ActionForward、Tiles 插件、国际化、异常处理、JSP 标签库、ActionServlet、工具支持和源码阅读等要点。通过本教程,开发者将掌握 Struts 1.3.8 的实际应用,提升 Web 应用开发技能。
1. MVC 模式实战
1.1 MVC 模式概述
MVC(Model-View-Controller)模式是一种设计模式,它将应用程序分为三个主要组件:模型、视图和控制器。模型负责应用程序的数据和业务逻辑,视图负责显示数据,控制器负责处理用户交互并协调模型和视图之间的通信。
2. 配置文件实战
2.1 struts-config.xml 文件结构
struts-config.xml 文件是 Struts 配置的核心文件,它定义了 Struts 框架的配置信息,包括 Action 映射、Form Bean 映射和 Tiles 视图映射。
struts-config.xml 文件的结构如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
"http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
<form-beans>
<!-- Form Bean 映射 -->
</form-beans>
<action-mappings>
<!-- Action 映射 -->
</action-mappings>
<tiles-definitions>
<!-- Tiles 视图映射 -->
</tiles-definitions>
</struts-config>
2.2 配置 Action 映射
Action 映射定义了请求路径和 Action 类之间的对应关系。当用户提交一个请求时,Struts 框架会根据请求路径查找对应的 Action 映射,然后实例化并执行相应的 Action 类。
<action-mappings>
<action path="/login" type="com.example.LoginAction" name="loginForm" scope="request">
<forward name="success" path="/success.jsp" />
<forward name="failure" path="/failure.jsp" />
</action>
</action-mappings>
在这个示例中,当用户访问 "/login" 路径时,Struts 框架会实例化 com.example.LoginAction
类,并将 Action 实例的名称设置为 "loginForm",作用域设置为 "request"。如果 Action 执行成功,则会转发到 "/success.jsp" 页面;如果 Action 执行失败,则会转发到 "/failure.jsp" 页面。
2.3 配置 Form Bean 映射
Form Bean 映射定义了请求参数和 Form Bean 类之间的对应关系。当用户提交一个表单时,Struts 框架会根据请求参数查找对应的 Form Bean 映射,然后实例化并填充相应的 Form Bean 类。
<form-beans>
<form-bean name="loginForm" type="com.example.LoginForm">
<form-property name="username" type="java.lang.String" />
<form-property name="password" type="java.lang.String" />
</form-bean>
</form-beans>
在这个示例中,当用户提交一个表单时,Struts 框架会实例化 com.example.LoginForm
类,并将表单中的 "username" 和 "password" 参数分别填充到 Form Bean 的 "username" 和 "password" 属性中。
2.4 配置 Tiles 视图映射
Tiles 视图映射定义了视图文件和布局文件之间的对应关系。当 Action 执行完成后,Struts 框架会根据 Action 的结果查找对应的 Tiles 视图映射,然后渲染相应的视图文件。
<tiles-definitions>
<definition name="main" template="/layout.jsp">
<put name="title" value="Struts 1.3.8 学习笔记" />
<put name="content" value="/content.jsp" />
</definition>
</tiles-definitions>
在这个示例中,当 Action 执行完成后,Struts 框架会渲染 "/layout.jsp" 布局文件,并将 "title" 属性设置为 "Struts 1.3.8 学习笔记",将 "content" 属性设置为 "/content.jsp" 视图文件。
3. Action 类实战
3.1 Action 类概述
Action 类是 Struts 框架中的核心组件,负责处理用户请求并生成响应。它是一个 JavaBean,继承自 org.apache.struts.action.Action
类。Action 类包含以下几个关键属性:
- mapping: ActionMapping 对象,描述了 Action 的配置信息,例如 Action 的路径、方法和参数。
- request: HttpServletRequest 对象,包含了客户端请求的信息。
- response: HttpServletResponse 对象,用于向客户端发送响应。
- application: ServletContext 对象,包含了应用程序的全局信息。
- session: HttpSession 对象,包含了客户端会话的信息。
3.2 Action 类生命周期
Action 类有一个生命周期,它从用户请求到达时开始,到响应发送给客户端时结束。生命周期包括以下几个阶段:
- 初始化: Action 类被实例化并设置其属性。
- 验证: Action 类验证用户输入,例如检查必填字段是否填写。
- 执行: Action 类执行业务逻辑,例如处理用户请求或查询数据库。
- 结束: Action 类生成响应并将其发送给客户端。
3.3 Action 方法的编写
Action 类中的方法用于处理用户请求。每个 Action 类可以有多个方法,每个方法对应一个特定的请求路径。方法的签名如下:
public ActionForward execute(ActionMapping mapping, HttpServletRequest request, HttpServletResponse response) throws Exception;
execute()
方法接收三个参数:
- mapping: ActionMapping 对象,描述了 Action 的配置信息。
- request: HttpServletRequest 对象,包含了客户端请求的信息。
- response: HttpServletResponse 对象,用于向客户端发送响应。
execute()
方法返回一个 ActionForward
对象,它指定了下一个要执行的动作。 ActionForward
对象可以是:
- 一个视图: 一个 JSP 页面或其他类型的视图,用于向客户端呈现响应。
- 另一个 Action: 另一个 Action 类,用于处理进一步的请求。
- 一个错误: 一个错误页面或其他类型的错误响应。
以下是一个示例 Action 类:
public class LoginAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, HttpServletRequest request, HttpServletResponse response) throws Exception {
String username = request.getParameter("username");
String password = request.getParameter("password");
if (username.equals("admin") && password.equals("admin")) {
return mapping.findForward("success");
} else {
return mapping.findForward("failure");
}
}
}
这个 Action 类处理一个登录请求。它从请求中获取用户名和密码,然后检查它们是否与预期的值匹配。如果匹配,则返回一个 "success" 视图,否则返回一个 "failure" 视图。
代码逻辑分析:
-
request.getParameter("username")
:从请求中获取 "username" 参数的值。 -
request.getParameter("password")
:从请求中获取 "password" 参数的值。 -
username.equals("admin") && password.equals("admin")
:检查用户名和密码是否与预期的值匹配。 -
mapping.findForward("success")
:如果匹配,则返回一个 "success" 视图。 -
mapping.findForward("failure")
:如果匹配,则返回一个 "failure" 视图。
4. Form Bean 实战
4.1 Form Bean 概述
Form Bean 是 Struts 框架中用于处理表单数据的 Java Bean。它是一个普通的 Java 类,用于封装表单中的数据,并提供对这些数据的访问和验证。Form Bean 必须实现 org.apache.struts.action.ActionForm
接口。
4.2 Form Bean 的属性和方法
Form Bean 的属性和方法用于访问和修改表单中的数据。属性通常与表单中的输入字段相对应,而方法用于验证和处理数据。
4.2.1 属性
Form Bean 的属性通常是私有字段,并通过 getter 和 setter 方法访问。getter 方法用于获取属性的值,而 setter 方法用于设置属性的值。例如:
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
4.2.2 方法
Form Bean 可以定义自定义方法来验证和处理数据。这些方法通常以 validate()
或 process()
命名。
4.2.2.1 validate() 方法
validate()
方法用于验证表单中的数据。它返回一个 ActionErrors
对象,其中包含任何验证错误。如果 validate()
方法返回非空 ActionErrors
对象,则 Struts 框架将不会继续处理该请求。
4.2.2.2 process() 方法
process()
方法用于处理表单中的数据。它通常执行诸如保存数据到数据库或发送电子邮件之类的操作。
4.3 Form Bean 的验证
Struts 框架提供了多种验证 Form Bean 的方法,包括:
4.3.1 内置验证器
Struts 框架提供了内置的验证器,用于验证常见的数据类型,例如字符串、数字和日期。这些验证器可以通过在 Form Bean 的属性上使用 @Validator
注解来使用。
4.3.2 自定义验证器
除了内置验证器之外,还可以创建自定义验证器来验证更复杂的数据。自定义验证器必须实现 org.apache.struts.validator.Validator
接口。
4.3.3 Validation Framework
Struts 框架还与 Validation Framework 集成,这是一个用于验证 Java 对象的第三方库。Validation Framework 提供了更高级的验证功能,例如嵌套验证和组验证。
4.4 Form Bean 的使用
要使用 Form Bean,需要在 struts-config.xml
文件中配置它。配置包括指定 Form Bean 的类名和与之关联的 Action。例如:
<form-beans>
<form-bean name="userForm" type="com.example.struts.UserForm" />
</form-beans>
在 Action 类中,可以使用 ActionForm
对象来访问和修改表单数据。例如:
public class UserAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
UserForm userForm = (UserForm) form;
String username = userForm.getUsername();
// ...
}
}
5. ActionForward 实战
5.1 ActionForward 概述
ActionForward 是 Struts 中用于控制请求转发的一个重要类。它封装了转发目标的路径和转发类型等信息,用于将请求从一个 Action 转发到另一个 Action 或视图。
5.2 ActionForward 类型
ActionForward 有两种类型:
- RedirectActionForward: 用于重定向请求,会将响应发送到客户端,并包含一个新的 URL,浏览器会根据新的 URL 重新发送请求。
- ForwardActionForward: 用于转发请求,不会将响应发送到客户端,而是直接将请求转发到另一个 Action 或视图,从而避免了浏览器重新发送请求。
5.3 ActionForward 的使用
在 Action 类中,可以使用以下方法创建 ActionForward 对象:
// 创建一个重定向转发对象
ActionForward redirect = new RedirectActionForward("/success.jsp");
// 创建一个转发转发对象
ActionForward forward = new ForwardActionForward("/success.jsp");
在 ActionForward 对象创建后,可以使用以下方法将请求转发到目标:
// 重定向到目标 URL
return redirect;
// 转发到目标视图
return forward;
代码逻辑分析:
-
RedirectActionForward
和ForwardActionForward
类的构造函数接收一个字符串参数,该参数指定转发目标的路径。 -
return redirect
语句将请求重定向到指定的 URL,浏览器会重新发送请求。 -
return forward
语句将请求转发到指定的视图,不会重新发送请求。
参数说明:
-
path
:转发目标的路径,可以是绝对路径或相对路径。
代码示例:
public class LoginAction extends Action {
public ActionForward execute() {
// 验证登录信息
if (isValidLogin()) {
// 登录成功,转发到成功视图
return new ForwardActionForward("/success.jsp");
} else {
// 登录失败,重定向到登录页面
return new RedirectActionForward("/login.jsp");
}
}
}
Mermaid 流程图:
sequenceDiagram
participant User
participant Server
User->Server: Send login request
Server->Server: Validate login information
Server->Server: If login successful
Server->User: Forward to success view
Server->Server: Else
Server->User: Redirect to login page
6. Tiles 插件实战
6.1 Tiles 插件概述
Tiles 插件是 Struts 框架中用于实现视图模板化的插件。它允许开发人员将页面布局和内容分离,从而提高代码的可维护性和可重用性。Tiles 插件通过定义模板文件来实现视图模板化,模板文件包含占位符,这些占位符将被实际的内容填充。
6.2 Tiles 定义文件
Tiles 定义文件是 XML 格式的文件,用于定义模板文件和占位符。它通常位于 WEB-INF/tiles-defs.xml
文件中。下面是一个示例 Tiles 定义文件:
<?xml version="1.0" encoding="UTF-8"?>
<tiles-definitions>
<definition name="baseLayout" template="/WEB-INF/layouts/baseLayout.jsp">
<put-attribute name="title" value="Struts 1.3.8 学习笔记" />
<put-attribute name="header" value="/WEB-INF/tiles/header.jsp" />
<put-attribute name="content" value="/WEB-INF/tiles/content.jsp" />
<put-attribute name="footer" value="/WEB-INF/tiles/footer.jsp" />
</definition>
</tiles-definitions>
在这个示例中,我们定义了一个名为 baseLayout
的模板文件,它包含了页面的基本布局。模板文件 baseLayout.jsp
中包含四个占位符: title
、 header
、 content
和 footer
。这些占位符将被实际的内容填充。
6.3 Tiles 布局文件
Tiles 布局文件是 JSP 文件,用于定义页面的布局。它通常位于 WEB-INF/layouts
目录下。下面是一个示例 Tiles 布局文件:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title><tiles:insertAttribute name="title" /></title>
</head>
<body>
<div id="header">
<tiles:insertAttribute name="header" />
</div>
<div id="content">
<tiles:insertAttribute name="content" />
</div>
<div id="footer">
<tiles:insertAttribute name="footer" />
</div>
</body>
</html>
在这个示例中,我们定义了一个名为 baseLayout.jsp
的布局文件,它包含了页面的基本布局。布局文件中包含了四个占位符: title
、 header
、 content
和 footer
。这些占位符将被实际的内容填充。
6.4 Tiles 模板文件
Tiles 模板文件是 JSP 文件,用于定义页面的内容。它通常位于 WEB-INF/tiles
目录下。下面是一个示例 Tiles 模板文件:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<h1>Struts 1.3.8 学习笔记</h1>
<p>本笔记将详细介绍 Struts 1.3.8 框架的使用,包括 MVC 模式、配置文件、Action 类、Form Bean、ActionForward 和 Tiles 插件等内容。</p>
在这个示例中,我们定义了一个名为 content.jsp
的模板文件,它包含了页面的内容。模板文件中包含了 HTML 代码,这些代码将被填充到布局文件的占位符中。
7. 国际化实战
7.1 国际化概述
国际化是指软件能够适应不同国家或地区的用户,提供针对特定区域的语言、文化和习俗的定制化体验。它涉及到翻译文本、适应日期和时间格式、处理货币和数字格式等方面。
7.2 Struts 中的国际化实现
Struts 通过 struts-default.properties
文件和 struts.xml
配置文件来实现国际化。 struts-default.properties
文件包含了默认的国际化设置,而 struts.xml
配置文件可以覆盖这些默认设置。
7.3 国际化资源文件的创建和使用
创建国际化资源文件
国际化资源文件是包含翻译文本的文件,通常以 .properties
扩展名保存。例如,一个名为 messages.properties
的文件可以包含以下内容:
welcome.message=欢迎
error.message=错误
使用国际化资源文件
在 Struts 中,可以使用 getText()
方法从国际化资源文件中获取翻译文本。例如,在 Action 类中可以使用以下代码获取欢迎消息:
String welcomeMessage = getText("welcome.message");
覆盖默认国际化设置
在 struts.xml
配置文件中,可以使用 <message-resources>
元素来覆盖 struts-default.properties
文件中的默认国际化设置。例如,以下代码将覆盖 welcome.message
的默认翻译:
<message-resources key="welcome.message" value="你好" />
使用参数化消息
国际化资源文件还可以支持参数化消息,允许在翻译文本中插入动态值。例如,以下代码将创建一条包含用户名的欢迎消息:
welcome.message=欢迎,{0}
在 Action 类中,可以使用以下代码获取参数化欢迎消息:
String welcomeMessage = getText("welcome.message", username);
日期和时间格式化
Struts 提供了 DateTag
和 TimeTag
标签来格式化日期和时间。这些标签使用 locale
属性来指定要使用的区域设置。例如,以下代码将以中文格式化日期:
<s:date name="date" format="yyyy年MM月dd日" locale="zh_CN" />
货币和数字格式化
Struts 提供了 NumberFormatTag
标签来格式化货币和数字。此标签使用 locale
属性来指定要使用的区域设置。例如,以下代码将以美元格式化数字:
<s:number name="number" format="#,###.##" locale="en_US" />
简介:Struts 1.3.8 是一款 Java Web 应用程序框架,本教程将深入讲解其关键概念和技术。涵盖 MVC 模式、配置文件、Action 类、表单 Bean、ActionForward、Tiles 插件、国际化、异常处理、JSP 标签库、ActionServlet、工具支持和源码阅读等要点。通过本教程,开发者将掌握 Struts 1.3.8 的实际应用,提升 Web 应用开发技能。