简介:Struts2是一个功能强大的Java web框架,采用MVC模式,适用于构建复杂的企业级Web应用程序。本项目展示了如何在日本的业务环境中使用Struts2框架,以及核心特性如Action类、拦截器、结果类型等的应用。此外,项目中涉及了使用JDOM解析XML数据,自定义Struts2标签进行分页以及页面上自动分页的实现。这些技术的结合提供了完整的Web开发实战经验,包含源码及所有资源文件,对于学习Struts2框架和Web开发流程的开发者来说,是一个宝贵的学习资源。
1. Struts2框架简介
Struts2是一个用于开发Java EE Web应用的强大框架,它是Apache软件基金会的顶级项目,广泛应用于企业级应用的开发。Struts2框架在本质上继承了MVC(Model-View-Controller)设计模式,使得开发者能够更加高效地构建Web应用,并且更加容易维护和扩展。
1.1 Struts2的历史和发展
Struts2框架的前身是Jakarta Struts,最初由Craig McClanahan在2000年发起。Struts2是在Struts和WebWork框架的基础上发展起来的,它结合了两者的优势,提供了更加稳定和强大的功能。Struts2的最新版本是基于拦截器和过滤器的,它使用拦截器栈来处理请求和响应,这使得框架具有更好的可扩展性。
1.2 Struts2框架的核心组件
Struts2框架的核心组件包括模型(Model)、视图(View)和控制器(Controller)。模型代表业务对象和数据访问对象,视图是展示层,控制器是Struts2框架本身,负责接收用户请求、调用模型处理业务逻辑、选择视图展示数据。通过这样的设计,Struts2能够实现业务逻辑和用户界面的有效分离,简化了Web应用的开发。
1.3 Struts2框架的应用场景
Struts2框架适用于构建各种Web应用,特别是对于需要复杂业务逻辑和用户交互的应用程序。由于其对MVC模式的支持,Struts2能够帮助开发者将应用逻辑清晰地分为不同的层次,从而提高代码的可读性和可维护性。此外,Struts2还提供了丰富的插件和扩展,使得开发者能够轻松集成各种功能,如表单验证、日志记录、文件上传等。
2. MVC模式在Struts2中的应用
2.1 MVC模式的基本概念
2.1.1 模型(Model)的作用和实现
模型(Model)在MVC模式中扮演着数据处理的核心角色。它不仅负责数据的存储、访问和操作,还包括业务逻辑的处理。在Struts2框架中,模型通常由JavaBean实现,它封装了数据和操作数据的方法。模型层的设计需要遵循良好的编程实践,如单一职责原则,确保每个模型只负责处理一组相关的数据和业务逻辑。
public class UserModel {
private String username;
private String password;
private String email;
// Getters and Setters
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
在上述代码中, UserModel
类封装了用户的用户名、密码和电子邮件地址。通过定义getter和setter方法,我们确保了模型的封装性和可访问性。这种设计模式不仅有助于代码的维护,也使得模型层能够独立于视图层和控制器层存在,从而更容易进行单元测试。
2.1.2 视图(View)的角色和设计
视图(View)是用户界面的展示层,它负责将模型层的数据以一种直观的方式呈现给用户。在Struts2中,视图层通常由JSP或FreeMarker模板实现。视图的设计需要遵循MVC的分离原则,即视图层只负责展示逻辑,不包含任何业务逻辑或数据处理。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>User Profile</title>
</head>
<body>
<h2>User Profile</h2>
<p>Username: ${user.username}</p>
<p>Password: ${user.password}</p>
<p>Email: ${user.email}</p>
</body>
</html>
在这个JSP页面示例中,我们展示了如何使用EL表达式将模型层的数据动态绑定到视图层。这种绑定方式不仅简化了页面的开发,还增强了页面的可维护性。视图层的设计应该注重用户体验和界面的友好性,避免在视图层中嵌入过多的业务逻辑代码。
2.1.3 控制器(Controller)的职责和配置
控制器(Controller)是MVC模式中的协调者,它负责接收用户输入,调用模型层进行数据处理,并选择视图层进行数据展示。在Struts2框架中,控制器层主要由Action类实现。Action类作为控制器,负责接收请求参数,调用模型层的方法处理业务逻辑,并返回结果给视图层。
public class UserAction extends ActionSupport {
private UserModel userModel;
public UserModel getUserModel() {
return userModel;
}
public void setUserModel(UserModel userModel) {
this.userModel = userModel;
}
@Override
public String execute() {
// Business logic here
return SUCCESS;
}
}
在这个Action类的示例中,我们定义了一个 execute
方法,它是Action类的核心方法。当用户发起一个请求时,Struts2框架会创建一个Action实例,并调用其 execute
方法。在 execute
方法中,我们可以调用模型层的方法处理业务逻辑,并根据处理结果返回相应的视图。
2.2 Struts2中的MVC实现
2.2.1 模型层的构建和数据传递
在Struts2框架中,模型层的构建通常涉及到JavaBean的定义和业务逻辑的实现。Struts2提供了多种方式来传递数据和调用模型层的方法,其中最常用的是通过Action类的属性和setter方法。
public class UserAction extends ActionSupport {
private UserModel userModel;
public String getUserModel() {
return userModel.getUsername();
}
public void setUserModel(UserModel userModel) {
this.userModel = userModel;
}
public String saveUser() {
// Save user logic
return SUCCESS;
}
}
在 UserAction
类中,我们定义了一个 userModel
属性,并通过getter和setter方法与之交互。在 saveUser
方法中,我们可以调用业务逻辑代码来保存用户信息。这种方式不仅使得数据传递清晰明了,还便于测试和维护。
2.2.2 视图层的设计和展示逻辑
视图层的设计和展示逻辑在Struts2中通常通过JSP或FreeMarker模板来实现。Struts2提供了一系列标签库,使得数据绑定和展示变得简单直观。
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>User Form</title>
</head>
<body>
<h2>User Form</h2>
<s:url action="saveUser" var="saveUrl"/>
<form action="<s:property value="#saveUrl"/>" method="post">
Username: <s:textfield name="userModel.username"/>
Password: <s:password name="userModel.password"/>
Email: <s:textfield name="userModel.email"/>
<s:submit value="Submit"/>
</form>
</body>
</html>
在这个JSP页面中,我们使用了Struts2的 <s:url>
标签生成一个URL,使用 <s:textfield>
和 <s:password>
标签来创建文本输入框和密码输入框,并绑定到 userModel
的相应属性。这种方式使得视图层与模型层的数据绑定变得简单和直观。
2.2.3 控制层的核心组件和流程控制
控制层的核心组件是Action类,它作为控制器负责处理用户请求并调用模型层的方法。在Struts2框架中,流程控制主要通过struts.xml配置文件来实现。
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="saveUser" class="com.example.UserAction" method="saveUser">
<result name="success">/userForm.jsp</result>
</action>
</package>
</struts>
在这个配置文件中,我们定义了一个 saveUser
的Action映射,当用户请求 saveUser
时,Struts2框架会创建一个 UserAction
实例,并调用其 saveUser
方法。如果方法执行成功,用户将被重定向到 userForm.jsp
视图层页面。
在本章节中,我们介绍了MVC模式的基本概念,并详细探讨了Struts2框架中模型层、视图层和控制层的实现方式。通过实际的代码示例,我们展示了如何在Struts2框架中构建模型、设计视图和配置控制器。这些知识对于理解和应用MVC模式至关重要,也为我们后续章节的深入探讨奠定了基础。
3. Action类的使用和实践
Action类是Struts2框架的核心,它负责处理用户的请求并返回响应。在本章节中,我们将深入探讨Action类的作用、基本结构以及它的高级功能。
3.1 Action类的作用和基本结构
3.1.1 Action接口的定义和方法
Action接口是Struts2框架中所有Action类的基类。它定义了一系列的方法,这些方法在请求处理的不同阶段被框架调用。
public interface Action {
String INPUT = "input";
String SUCCESS = "success";
String ERROR = "error";
String NO_METHOD = "none";
String execute() throws Exception;
}
execute()
方法是Action接口中最关键的方法,它在请求到达时被调用。此外,还有几个预定义的返回值,如 INPUT
、 SUCCESS
、 ERROR
等,这些返回值指示了处理流程的不同方向。
3.1.2 Action类的生命周期和工作原理
Action类的生命周期从创建实例开始,到请求处理结束,具体分为以下几个阶段:
- 实例化 :当请求到来时,Struts2框架会根据配置创建Action的实例。
- 设置属性 :框架通过setter方法注入请求参数。
- 调用execute :框架调用
execute()
方法处理请求。 - 返回结果 :方法返回的结果字符串决定了接下来的流程,例如返回
SUCCESS
通常意味着请求处理成功,页面将被转发到结果页面。
public class ExampleAction implements Action {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String execute() throws Exception {
// 处理请求
return SUCCESS;
}
}
3.2 Action类的高级功能
3.2.1 参数传递和结果返回
在Struts2中,参数的传递通常是通过Action的setter方法自动完成的。你可以通过 @Param
注解或者XML配置来指定参数的来源。
public class ExampleAction implements Action {
private String message;
@Param("message")
public void setMessage(String message) {
this.message = message;
}
public String execute() {
// 使用message变量
return SUCCESS;
}
}
结果返回不仅仅是返回一个字符串那么简单,Struts2提供了丰富的结果类型,如 dispatcher
、 redirect
和 redirectAction
等。
3.2.2 验证框架的集成和使用
Struts2提供了内置的验证框架,可以通过拦截器轻松集成到Action类中。你需要做的是在Action类中定义验证规则,并在验证失败时返回 input
。
public class ExampleAction implements Action {
private String name;
private int age;
@RequiredFieldValidator(message = "Name is required")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@RequiredFieldValidator(message = "Age is required")
@IntRangeFieldValidator(min = "0", max = "120", message = "Age must be between 0 and 120")
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String execute() {
// 执行操作
return SUCCESS;
}
}
通过本章节的介绍,我们了解了Action类在Struts2框架中的核心作用,包括它的接口定义、生命周期以及如何实现参数传递和结果返回。同时,我们也探索了如何集成和使用Struts2的验证框架,以确保用户输入的有效性和安全性。在下一章节中,我们将深入探讨拦截器的实现和应用场景,了解如何在Struts2中进行更高级的请求处理和安全性控制。
4. 拦截器的实现和应用
拦截器(Interceptor)是Struts2框架中一个非常强大的特性,它允许开发者在请求到达Action之前或之后执行自定义的逻辑。本章节将深入探讨拦截器的基本概念、工作流程、应用场景以及如何设计和管理拦截器链。
4.1 拦截器的基本概念
4.1.1 拦截器的定义和工作流程
拦截器是一种设计模式,它用于在不修改原有代码的情况下,对方法的调用进行拦截和处理。在Struts2中,拦截器是在请求处理流程中的一个可选环节,可以在Action执行前后添加自定义的处理逻辑。
工作流程通常如下:
- 用户发出请求。
- 请求被Struts2框架捕获,并根据配置寻找匹配的拦截器链。
- 拦截器按照顺序执行,每个拦截器可以对请求进行预处理,决定是否继续传递给下一个拦截器或直接返回结果。
- 如果所有拦截器都正常处理完毕,则最终调用Action。
- Action执行完毕后,控制权返回给拦截器链,拦截器可以对结果进行后处理。
- 最终,响应返回给用户。
4.1.2 拦截器链的设计和管理
拦截器链是多个拦截器按照特定顺序组成的处理流程。在Struts2中,可以通过XML配置文件或者注解来定义拦截器链。
示例代码:XML配置拦截器链
<package name="default" namespace="/" extends="struts-default">
<action name="example" class="com.example.ExampleAction">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="myInterceptor" />
<interceptor-ref name="anotherInterceptor" />
<result name="success">/success.jsp</result>
</action>
<interceptor name="myInterceptor" class="com.example.MyInterceptor" />
<interceptor name="anotherInterceptor" class="com.example.AnotherInterceptor" />
</package>
在这个例子中, example
Action将会依次通过 defaultStack
、 myInterceptor
和 anotherInterceptor
三个拦截器。
表格:拦截器链的管理
| 拦截器名称 | 类路径 | 描述 | |----------------|---------------------------|--------------------------------| | defaultStack | struts-default-interceptors
| Struts2默认的拦截器栈 | | myInterceptor | com.example.MyInterceptor
| 自定义拦截器,用于特定逻辑处理 | | anotherInterceptor | com.example.AnotherInterceptor
| 另一个自定义拦截器,用于其他逻辑处理 |
4.2 拦截器的应用场景
4.2.1 日志记录和性能监控
拦截器非常适合用于日志记录和性能监控。例如,可以在请求进入和退出Action时记录时间,计算处理耗时,或者记录请求的相关信息,如用户IP、请求URL等。
示例代码:日志记录拦截器
public class LoggingInterceptor implements Interceptor {
@Override
public void destroy() {
// 清理资源
}
@Override
public void init() {
// 初始化拦截器
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
long startTime = System.currentTimeMillis();
String result = invocation.invoke(); // 继续执行链中的下一个拦截器或Action
long endTime = System.currentTimeMillis();
System.out.println("Action执行耗时:" + (endTime - startTime) + "毫秒");
return result;
}
}
4.2.2 安全控制和权限验证
拦截器还可以用于安全控制和权限验证。例如,可以在请求处理前检查用户是否登录、是否具有访问某资源的权限。
示例代码:权限验证拦截器
public class AuthorizationInterceptor implements Interceptor {
@Override
public void destroy() {
// 清理资源
}
@Override
public void init() {
// 初始化拦截器
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
ActionContext context = invocation.getActionContext();
String actionName = context.get("actionName").toString();
if (!isUserAuthorized(actionName)) {
return ERROR; // 未授权,返回错误结果
}
return invocation.invoke(); // 授权成功,继续执行链中的下一个拦截器或Action
}
private boolean isUserAuthorized(String actionName) {
// 实现权限验证逻辑
return true;
}
}
在本章节中,我们深入探讨了Struts2拦截器的基本概念、工作流程、应用场景以及如何设计和管理拦截器链。通过具体的代码示例和表格,我们展示了拦截器在实际开发中的应用方式。下一章节,我们将继续深入了解如何定义结果类型和构建页面动态内容。
5. 结果类型定义和页面构建
5.1 结果类型的基本定义
5.1.1 常用结果类型介绍
在Struts2框架中,结果类型 是定义Action执行完毕后如何处理响应的重要组成部分。它们决定了数据如何被转换和展示给用户。Struts2内置了几种常见的结果类型,每种类型都有其特定的用途和适用场景。以下是一些常用的内置结果类型:
-
dispatcher
: 默认的结果类型,将响应转发到另一个资源(通常是JSP页面)。 -
redirect
: 重定向到另一个URL,可以是外部的URL或框架内部的Action。 -
redirectAction
: 类似于redirect
,但是直接重定向到另一个Action。 -
stream
: 用于将数据作为流直接发送到客户端,常用于文件下载功能。 -
velocity
: 使用Velocity模板引擎来渲染响应。 -
freemarker
: 使用FreeMarker模板引擎来渲染响应。
5.1.2 自定义结果类型的实现
除了内置的结果类型,Struts2还允许开发者根据需要自定义结果类型。自定义结果类型通常用于实现特定的逻辑处理或展示效果。创建一个自定义结果类型需要实现 Result
接口,并在 execute
方法中定义自定义的行为逻辑。
以下是一个简单的自定义结果类型的示例,我们将创建一个名为 CustomResult
的结果类型,它将简单地将数据作为JSON格式输出:
public class CustomResult implements Result {
private Map<String, Object> data;
public void setData(Map<String, Object> data) {
this.data = data;
}
@Override
public void execute(ActionContext context) throws Exception {
HttpServletResponse response = context.getHttpServletResponse();
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
String json = new Gson().toJson(data);
response.getWriter().write(json);
}
}
在上面的代码中, CustomResult
类实现了 Result
接口,并重写了 execute
方法。在 execute
方法中,我们将数据转换为JSON格式并输出到响应流中。
要使用自定义的结果类型,你需要在struts.xml中进行配置:
<action name="customAction" class="com.example.MyAction">
<result name="success" type="com.example.CustomResult">
<param name="data">{"message":"Custom JSON Response"}</param>
</result>
</action>
在这个配置中,我们指定了一个名为 customAction
的Action,当它返回 success
时,将使用我们自定义的 CustomResult
类型,并传递一个名为 data
的JSON字符串作为参数。
通过本章节的介绍,我们可以了解到如何在Struts2框架中使用内置和自定义的结果类型来控制Action的输出行为。这为开发者提供了强大的灵活性,以适应不同的业务需求和技术场景。
5.2 页面动态内容的构建
5.2.1 JSP和FreeMarker的集成
在Struts2中,JSP是一种常用的视图技术,用于构建动态网页。Struts2提供了与JSP紧密集成的能力,允许开发者在JSP页面中使用Struts2标签库来处理表单、显示数据等。
要使用JSP作为视图技术,你需要在struts.xml中配置Action的视图组件:
<action name="jspAction" class="com.example.MyAction">
<result name="success">/jsp/result.jsp</result>
</action>
在上面的配置中,当 jspAction
返回 success
时,将使用 result.jsp
作为视图组件。
FreeMarker是一个模板引擎,它被设计用来生成文本输出(包括HTML),基于模板和数据模型。Struts2同样支持FreeMarker作为视图技术。要使用FreeMarker,需要在struts.xml中进行配置:
<package name="freemarkerExample" extends="struts-default">
<action name="freemarkerAction" class="com.example.MyAction">
<result name="success" type="freemarker">
<param name="template">/freemarker/example.ftl</param>
</result>
</action>
</package>
在上面的配置中,当 freemarkerAction
返回 success
时,将使用FreeMarker模板 example.ftl
。
5.2.2 动态数据绑定和展示
在JSP或FreeMarker模板中,数据的绑定和展示是通过特定的语法实现的。对于JSP,通常使用Struts2标签库中的标签来访问Action的属性:
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Struts2 JSP Example</title>
</head>
<body>
<s:property value="message" />
</body>
</html>
在上面的JSP示例中,我们使用 <s:property>
标签来展示名为 message
的属性值。
对于FreeMarker,数据绑定是通过在模板中嵌入特定的变量来实现的:
<html>
<head>
<title>Struts2 FreeMarker Example</title>
</head>
<body>
${message}
</body>
</html>
在上面的FreeMarker示例中, ${message}
变量用于展示数据。
通过本章节的介绍,我们学习了如何在Struts2框架中使用JSP和FreeMarker作为视图技术,并了解了如何进行动态数据绑定和展示。这些知识对于构建动态交互式的Web应用程序至关重要。
6. Struts2标签、分页功能和开发资源
6.1 自定义Struts2标签和分页
Struts2框架提供了一个强大的标签库,这些标签不仅丰富了页面的表现能力,还能够简化JSP页面的代码。通过自定义标签,开发者可以创建可复用的UI组件,提高开发效率。
6.1.1 Struts2标签库的使用和扩展
Struts2标签库包含了许多内置标签,例如用于迭代、条件逻辑、输入验证等。例如,使用 <s:iterator>
标签来迭代集合:
<s:iterator value="users" var="user">
<s:property value="user.name"/>
</s:iterator>
如果内置标签不能满足特定需求,我们可以创建自定义标签。自定义标签通常涉及以下几个步骤:
- 创建标签类:继承
SimpleTagSupport
类,重写doTag
方法。 - 定义标签库描述文件(TLD):在
WEB-INF
目录下创建一个.tld
文件。 - 在JSP页面中引用自定义标签。
6.1.2 分页功能的实现和优化
分页是Web应用中常见的功能,可以提高页面加载速度和用户体验。在Struts2中实现分页功能,可以使用拦截器或者编写自定义代码。
分页拦截器的使用
Struts2提供了一个 Pagination
拦截器,可以很方便地实现分页。首先,在 struts.xml
中配置拦截器:
<package name="default" extends="struts-default">
<action name="listUsers" class="com.example.UserAction">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="pagination">
<param name="input">/listUsers.jsp</param>
<param name="output">/listUsers.jsp</param>
<param name="listVar">users</param>
<param name="pageSize">10</param>
</interceptor-ref>
<result name="success">/listUsers.jsp</result>
</action>
</package>
分页逻辑的重用和扩展
为了重用分页逻辑,可以创建一个通用的分页服务类,该类封装了分页相关的逻辑。然后,在Action中调用这个服务类来处理分页请求。
6.2 自动化分页功能
自动化分页功能可以进一步简化分页的实现,减少代码量和提高代码的可维护性。
6.2.1 分页标签的自动化处理
可以创建一个自定义标签,该标签内部调用分页服务类,并将分页结果设置到request作用域中。这样,在JSP页面中只需要简单地使用这个标签即可实现分页。
<s:tag name="paginate">
<!-- 自定义标签的内部逻辑 -->
</s:tag>
6.2.2 分页逻辑的重用和扩展
通过定义一个分页插件,可以在不同的Action之间共享分页逻辑。此外,可以为分页标签提供不同的属性,以支持更复杂的分页场景。
6.3 完整开发资源提供
为了确保开发过程的高效和项目的成功部署,提供完整的开发资源是必不可少的。
6.3.1 开发环境的搭建和配置
搭建Struts2开发环境需要配置Java开发工具包(JDK)、服务器(如Tomcat)和IDE(如IntelliJ IDEA或Eclipse)。在IDE中配置项目依赖,如Struts2库和数据库连接驱动等。
6.3.2 项目构建和部署的最佳实践
在项目构建过程中,推荐使用Maven或Gradle这样的构建工具,它们可以自动化依赖管理、编译、打包等任务。部署时,确保遵循最佳实践,如使用版本控制系统(如Git)、编写清晰的部署脚本等。
通过本章的介绍,我们可以看到Struts2框架在标签扩展、分页功能实现以及开发资源提供方面的强大能力。这些知识点不仅可以帮助开发者提升开发效率,还可以提高应用的性能和可维护性。
简介:Struts2是一个功能强大的Java web框架,采用MVC模式,适用于构建复杂的企业级Web应用程序。本项目展示了如何在日本的业务环境中使用Struts2框架,以及核心特性如Action类、拦截器、结果类型等的应用。此外,项目中涉及了使用JDOM解析XML数据,自定义Struts2标签进行分页以及页面上自动分页的实现。这些技术的结合提供了完整的Web开发实战经验,包含源码及所有资源文件,对于学习Struts2框架和Web开发流程的开发者来说,是一个宝贵的学习资源。