在Java Web开发领域,模型-视图-控制器(MVC)模式是构建可维护、可扩展应用程序的基石,Apache Struts2作为一款成熟的MVC框架,通过其强大的配置机制,将业务逻辑(模型)、数据展示(视图)和请求处理(控制器)清晰地分离开来,JSP(JavaServer Pages)通常扮演视图的角色,负责渲染数据,理解并掌握Struts2的配置,是高效整合JSP与后端逻辑的关键。

Struts2的配置体系核心在于几个关键的XML文件,它们共同定义了应用的请求流转规则。web.xml是整个Web应用的入口配置,而struts.xml则是Struts2框架的核心配置文件。
核心配置文件解析
web.xml:应用的守门人
任何基于Servlet的Java Web应用都必须包含web.xml文件,它位于WEB-INF目录下,对于Struts2应用而言,其首要任务是配置一个核心过滤器,该过滤器将拦截所有指定的请求,并交由Struts2框架进行处理,这个过滤器通常被称为StrutsPrepareAndExecuteFilter。
一个典型的web.xml配置如下:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>这段配置的作用是:创建一个名为struts2的过滤器实例,并将其映射到所有URL(),这意味着,所有进入应用的HTTP请求都会首先经过这个过滤器,从而激活Struts2的处理流程。
struts.xml:框架的大脑
struts.xml是Struts2框架的“指挥中心”,它定义了Action(控制器)、Result(视图)以及它们之间的映射关系,该文件通常放置在应用的类路径根目录下(例如src/main/resources)。
struts.xml的核心元素包括<package>、<action>和<result>。
<package>元素:用于将相关的Action、Result等配置进行分组和管理,类似于Java中的包,它通过name属性唯一标识,通过namespace属性定义URL命名空间,通过extends属性继承其他包的配置(通常继承自struts-default)。
| 属性 | 描述 |
|---|---|
name | 包的唯一标识符,必须唯一。 |
namespace | 可选,用于定义Action的URL前缀,实现模块化。 |
extends | 指定继承的父包,通常为struts-default,以获得框架默认的拦截器、结果类型等功能。 |
<action>元素:定义了一个具体的业务处理单元,它将一个URL映射到一个Java类(Action类)的方法上。
| 属性 | 描述 |
|---|---|
name | Action的名称,与URL的一部分对应。 |
class | Action类的完整限定名。 |
method | 可选,指定要执行的Action类中的方法名,默认为execute()。 |
<result>元素:定义了Action执行完成后返回的视图,它根据Action方法返回的逻辑字符串(如”success”, “error”)来定位具体的物理资源(通常是JSP页面)。
| 属性 | 描述 |
|---|---|
name | 结果的逻辑名称,必须与Action方法返回的字符串匹配,默认为”success”。 |
type | 结果类型,默认为dispatcher(表示服务器端转发),还有redirect(客户端重定向)等。 |
Struts2与JSP的无缝集成
Struts2与JSP的集成体现在两个层面:配置层面的映射和数据层面的传递。
配置映射:从Action到JSP
当一个请求(如/user/login.action)到达时,Struts2会根据struts.xml中的配置,找到对应的<action>,假设配置如下:

<package name="default" namespace="/user" extends="struts-default">
<action name="login" class="com.example.action.UserAction" method="login">
<result name="success">/WEB-INF/content/welcome.jsp</result>
<result name="input">/WEB-INF/content/login.jsp</result>
</action>
</package>如果UserAction的login()方法执行后返回字符串"success",Struts2就会查找名为"success"的<result>,然后将请求转发到/WEB-INF/content/welcome.jsp,这样,就完成了从控制器到视图的跳转。
数据传递:从Action到JSP
Struts2提供了强大的值栈机制,可以方便地将Action中的数据传递给JSP页面,在Action类中定义的、并提供了getter方法的属性,会自动被推入值栈,在JSP页面中,可以使用Struts2标签库来访问这些数据。
在UserAction中有如下代码:
public class UserAction extends ActionSupport {
private String username;
public String login() {
// ... 业务逻辑处理 ...
username = "张三";
return SUCCESS;
}
public String getUsername() {
return username;
}
}在welcome.jsp中,可以使用Struts2的<s:property>标签来显示用户名:
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>欢迎</title>
</head>
<body>
<h3>欢迎, <s:property value="username" />!</h3>
</body>
</html><s:property value="username" />会自动从值栈中查找username属性并将其值输出到页面,这种方式比传统的JSP脚本表达式${username}更加功能强大,因为它能处理更复杂的对象导航和类型转换。
高级配置与最佳实践
为了提升开发效率和应用性能,Struts2还提供了一些高级配置选项。
常量配置:可以通过
<constant>标签修改框架的默认行为,例如开启开发模式、改变UI主题等。<!-- 开启开发模式,提供更详细的错误信息和自动重载配置 --> <constant name="struts.devMode" value="true" /> <!-- 设置默认的UI主题为simple,避免生成冗余的table布局 --> <constant name="struts.ui.theme" value="simple" />
模块化配置:对于大型应用,可以将
struts.xml拆分成多个模块化的配置文件,然后在主struts.xml中使用<include>标签引入。
<include file="struts-user.xml"/> <include file="struts-product.xml"/>
约定优于配置:Struts2也支持约定优于配置的零配置模式,通过遵循特定的命名约定(如Action类名和JSP文件名的对应关系),可以大大减少XML配置的编写量。
Struts2的配置是连接JSP视图与Java后端逻辑的桥梁,通过精确配置web.xml和struts.xml,开发者可以构建出结构清晰、低耦合的Web应用,而Struts2标签库与值栈的结合,则让数据在控制器和视图之间的传递变得异常简单和高效。
相关问答FAQs
Q1: 我的struts.xml文件应该放在哪个目录下?
A1:struts.xml文件必须放置在Web应用的类路径根目录下,在标准的Maven项目结构中,这个位置是src/main/resources目录,当你构建项目时,Maven会自动将resources目录下的所有文件复制到WEB-INF/classes目录,这正是运行时类路径的根目录,如果放在其他位置,Struts2框架将无法找到并加载该配置文件。
Q2: 我已经配置了Action和Result,为什么访问时总是出现404错误?
A2: 出现404错误通常意味着Struts2未能根据请求URL找到对应的Action或Result,请按以下步骤排查:
- 检查
web.xml:确认StrutsPrepareAndExecuteFilter的url-pattern配置是否正确(通常是),确保它能拦截到你的请求。 - 检查
struts.xml中的<package>和<action>:确认请求URL是否与namespace和action name正确匹配,请求/user/login.action应对应namespace="/user"和name="login"的Action。 - 检查
<result>路径:确认Result标签中配置的JSP路径是否正确且文件真实存在,注意,路径是相对于Web应用根目录的,将JSP放在WEB-INF下可以防止直接访问,但路径必须写对。 - 检查文件位置:确认
struts.xml确实在类路径根目录,且Action类已正确编译并位于类路径中,检查服务器控制台是否有Struts2启动时的错误信息,这通常是定位问题的最快方法。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/26198.html




