初识Struts框架:入门指南
发布时间: 2023-12-18 22:50:10 阅读量: 31 订阅数: 16
# 一、 什么是Struts框架?
## a. Struts框架的简介
Struts框架是一个基于MVC(Model-View-Controller)设计模式的开源Web应用程序框架,它利用Java Servlets、JavaBean、资源文件等技术开发MVC架构的Web应用程序。Struts框架最初是由Jakarta项目组织开发并维护,现在由Apache软件基金会进行维护。Struts框架主要用于简化Java EE应用程序的开发过程,提供了一套标准的基于MVC的应用程序架构。
## b. Struts框架的特点
1. **模块化管理**:Struts框架将应用程序划分为模型(Model)、视图(View)和控制器(Controller)三个部分,使开发人员可以将关注点分离,更好地管理应用程序。
2. **表单处理**:Struts框架提供了便捷的表单处理机制,可以轻松地完成数据验证、错误提示等操作。
3. **国际化支持**:Struts框架内建的资源文件支持多种不同语言的国际化应用。
4. **易于整合**:Struts框架可以与大多数的Java EE技术(如JSP、Servlet、EJB等)进行无缝整合。
5. **灵活配置**:Struts框架的配置文件遵循XML格式,易于配置和维护。
## 二、 Struts框架的核心组件
a. 控制器(Controller):ActionServlet
b. 视图层(View):JSP页面和标签库
c. 模型层(Model):FormBean和ActionForm
d. 配置文件:struts-config.xml
### 三、 Struts框架的工作流程
Struts框架是一个基于MVC模式的Web应用程序开发框架,它主要包括控制器、视图和模型三大组件。在实际应用中,Struts框架的工作流程通常包括客户端发送请求、ActionServlet的处理流程、Action类的执行和返回结果给客户端这几个步骤。
#### a. 客户端发送请求
1. 客户端通过浏览器发送一个HTTP请求,该请求被Web服务器接收。
2. Web服务器将请求交给配置好的Servlet容器,对于Java Web应用来说,通常是Tomcat。
3. 在web.xml文件中,配置了将所有请求交给Struts的ActionServlet处理,所以请求会被定位到ActionServlet。
#### b. ActionServlet的处理流程
1. ActionServlet首先会查找struts-config.xml配置文件,找到与请求对应的Action映射。
2. 根据映射找到对应的Action类,创建Action实例。
3. ActionServlet会创建一个ActionContext对象,用于封装本次请求的信息,然后将其传递给Action。
#### c. Action类的执行
1. Action接收ActionContext对象,根据请求信息处理业务逻辑,并进行相应的数据处理。
2. 在Action中进行必要的验证、数据处理等操作。
3. Action返回一个表示执行结果的ActionForward对象,其中包括要跳转的页面以及可能需要传递的数据。
#### d. 返回结果给客户端
1. ActionServlet接收ActionForward对象,进行页面跳转或数据传递。
2. 最终结果经过View层(通常是JSP页面)的处理和呈现,通过Web服务器返回给客户端浏览器。
### 四、 编写第一个Struts应用程序
在这一节中,我们将详细介绍如何编写第一个Struts应用程序。我们将从配置web.xml文件开始,然后编写struts-config.xml配置文件,接着创建Action类和FormBean类,并最终进行JSP页面的编写。
#### a. 配置web.xml文件
首先,我们需要在web.xml文件中配置Struts的核心控制器ActionServlet。以下是web.xml文件的配置示例:
```xml
<web-app>
<!-- 其他配置 -->
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- 其他配置 -->
</web-app>
```
在上面的配置中,我们定义了一个名为action的servlet,并指定了ActionServlet的类路径为org.apache.struts.action.ActionServlet。同时,通过`<init-param>`标签配置了Struts的主要配置文件路径为/WEB-INF/struts-config.xml。最后,使用`servlet-mapping`将*.do的请求映射到action servlet。
#### b. 编写struts-config.xml配置文件
接下来,我们需要创建struts-config.xml文件,并在其中配置Struts应用程序的相关组件,包括Action映射、FormBean配置、全局转发等。以下是一个简单的struts-config.xml配置示例:
```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>
<!-- 配置Action映射 -->
<action-mappings>
<action path="/login" type="com.example.LoginAction" name="loginForm" scope="request">
<forward name="success" path="/success.jsp"/>
<forward name="error" path="/error.jsp"/>
</action>
<!-- 其他 action 配置 -->
</action-mappings>
<!-- 配置全局转发 -->
<global-forwards>
<forward name="login" path="/login.jsp"/>
</global-forwards>
<!-- 配置全局异常处理 -->
<global-exceptions>
<exception key="app.error" type="com.example.AppException" path="/error.jsp"/>
</global-exceptions>
</struts-config>
```
在上面的配置中,我们定义了一个名为/login的Action映射,指定了对应的Action类为com.example.LoginAction,同时配置了FormBean和视图页面的转发路径。此外,我们还配置了全局转发和全局异常处理,以确保整个应用程序的一致性。
#### c. 创建Action类和FormBean类
接下来,我们需要创建一个名为LoginAction的Action类,以及与之对应的FormBean类。其中,Action类负责接收用户请求、处理业务逻辑并返回结果,而FormBean类则负责接收和验证用户输入数据。以下是一个简单的Action类和FormBean类示例:
```java
// LoginAction.java
package com.example;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.*;
public class LoginAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;
String username = loginForm.getUsername();
String password = loginForm.getPassword();
// 执行登录逻辑,验证用户名密码
if (验证通过) {
return mapping.findForward("success");
} else {
return mapping.findForward("error");
}
}
}
// LoginForm.java
package com.example;
import org.apache.struts.action.ActionForm;
public class LoginForm extends ActionForm {
private String username;
private String password;
// getter和setter方法
// 表单验证逻辑
}
```
在上面的示例中,LoginAction类继承自org.apache.struts.action.Action类,重写了execute方法处理用户的登录请求。同时,LoginForm类继承自org.apache.struts.action.ActionForm类,用于接收用户提交的登录表单数据。
#### d. 编写JSP页面
最后,我们需要编写相应的JSP页面来呈现用户界面,并与Action类和FormBean类交互。以下是一个简单的登录页面示例:
```html
<!-- login.jsp -->
<html>
<head>
<title>Login Page</title>
</head>
<body>
<form action="login.do" method="post">
Username: <input type="text" name="username"><br>
Password: <input type="password" name="password"><br>
<input type="submit" value="Login">
</form>
</body>
</html>
<!-- success.jsp -->
<html>
<head>
<title>Login Success</title>
</head>
<body>
<h1>Welcome, ${username}!</h1>
</body>
</html>
<!-- error.jsp -->
<html>
<head>
<title>Login Error</title>
</head>
<body>
<h1>Login failed. Please try again.</h1>
</body>
</html>
```
在上面的示例中,我们创建了login.jsp用于用户登录,以及success.jsp和error.jsp用于展示登录成功和失败的页面。同时我们使用了Struts的EL表达式`${username}`来显示用户登录成功后的用户名。
### 五、 Struts框架中的表单验证和数据转换
表单验证和数据转换在Web应用开发中是非常重要的一环,它可以确保用户输入的数据符合预期并且可以正确地被处理。在Struts框架中,我们可以使用Validator插件来进行表单验证,同时也可以进行数据转换和类型转换。
#### a. 使用Validator插件进行表单验证
Validator插件是Struts框架中用于表单验证的重要组件,它可以帮助我们定义和执行验证规则,确保用户提交的数据合法有效。下面是一个简单的示例,演示如何在Struts框架中使用Validator插件进行表单验证:
```java
// 注意: 在这里说明,因为python代码不支持Struts2框架,我在这里使用了java代码示例,实际代码应用中需要根据具体情况来编写。
// 定义Action类
public class LoginAction extends Action {
private String username;
private String password;
// 省略其他属性和方法
// 验证方法
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if (username == null || username.trim().equals("")) {
errors.add("username", new ActionError("error.username.required"));
}
if (password == null || password.trim().equals("")) {
errors.add("password", new ActionError("error.password.required"));
}
return errors;
}
}
// 在struts-config.xml中配置Validator插件
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
</plug-in>
// 假设在validation.xml中定义了验证规则,例如:
<form name="loginForm">
<field property="username" depends="required">
<arg key="error.username.required" />
</field>
<field property="password" depends="required">
<arg key="error.password.required" />
</field>
</form>
```
#### b. 数据转换和类型转换
除了表单验证,Struts框架还提供了数据转换和类型转换的功能,可以帮助我们将用户提交的数据转换成合适的类型,或者进行自定义的数据转换操作。以下是一个简单的示例,演示如何在Struts框架中进行数据转换:
```java
// 定义Action类
public class UserAction extends Action {
private int userId;
private Date birthday;
// 省略其他属性和方法
// 数据转换方法
protected void populateForm(HttpServletRequest request) {
userId = Integer.parseInt(request.getParameter("userId"));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
birthday = sdf.parse(request.getParameter("birthday"));
} catch (ParseException e) {
e.printStackTrace();
}
}
// 省略其他方法
}
```
在上述示例中,我们可以看到如何在Action类中进行数据转换,将字符串类型的参数转换成int和Date类型。这样可以确保在接收用户提交的数据时能够正确地处理并转换成我们需要的数据类型。
### 六、 Struts框架中的扩展和高级特性
在Struts框架中,除了基本的MVC架构和表单验证功能外,还有一些扩展和高级特性,可以提高开发效率和系统的可维护性。以下是一些常见的扩展和高级特性:
#### a. 使用Tiles进行页面布局
Tiles是一个用于构建页面布局的框架,它可以将一个页面划分为多个部分,并且可以在不同的页面中重用这些部分。在Struts框架中,可以通过Tiles将页面模板、头部、底部等部分进行组合,减少重复代码的编写,提高页面的维护性和可复用性。
```java
// 示例代码
<definition name="baseLayout" template="/WEB-INF/template/layout.jsp">
<put name="title" value="Welcome to My Website" />
<put name="header" value="/WEB-INF/template/header.jsp" />
<put name="menu" value="/WEB-INF/template/menu.jsp" />
<put name="body" value="/WEB-INF/template/body.jsp" />
<put name="footer" value="/WEB-INF/template/footer.jsp" />
</definition>
```
#### b. 使用Interceptor进行权限控制
Interceptor是Struts2框架中的一个重要特性,它可以在Action执行的前后进行拦截和处理。通过Interceptor,可以实现权限控制、日志记录、性能监控等功能,有效地对用户请求进行管理和控制。
```java
// 示例代码
public class AuthInterceptor extends AbstractInterceptor {
public String intercept(ActionInvocation invocation) throws Exception {
// 在此处进行权限验证和控制
// ...
return invocation.invoke();
}
}
```
#### c. 使用Struts2进行升级
Struts2是Struts框架的升级版本,它采用了更加灵活和优雅的设计,提供了更多的特性和功能,包括拦截器栈、OGNL表达式、标签库等,能够更好地支持现代化的Web开发需求。因此,如果需要更强大的功能和更好的开发体验,可以考虑将现有的Struts框架升级到Struts2。
0
0