Struts2作为一个经典的MVC(Model-View-Controller)框架,其核心思想在于将业务逻辑、数据和页面展示进行有效分离,在Struts2中,JSP(JavaServer Pages)通常扮演着View的角色,负责将控制器处理后的数据呈现给用户,Struts2与JSP的配置和集成,是构建基于该框架的Web应用的关键环节,它不仅包括在核心配置文件中定义视图资源,更涉及到在JSP页面中如何高效、安全地使用Struts2提供的强大标签库来与后端数据进行交互。

核心配置:struts.xml中的结果映射
Struts2通过struts.xml配置文件来管理Action与视图资源(JSP页面)之间的映射关系,当一个Action执行完毕后,它会返回一个逻辑字符串(如”success”, “error”, “input”等),Struts2根据这个字符串在配置文件中查找对应的<result>标签,从而决定渲染哪个JSP页面。
基础结果配置
一个基础的<action>配置如下所示:
<package name="default" namespace="/" extends="struts-default">
<action name="login" class="com.example.action.LoginAction">
<!-- 登录成功后,跳转到welcome.jsp -->
<result name="success">/WEB-INF/content/welcome.jsp</result>
<!-- 登录失败,返回登录页面 -->
<result name="input">/WEB-INF/content/login.jsp</result>
<!-- 发生错误时,跳转到通用错误页面 -->
<result name="error">/WEB-INF/content/error.jsp</result>
</action>
</package>这里,<result>标签的name属性与Action类中返回的字符串相对应,而标签内的值则是目标JSP页面的路径,默认情况下,Struts2使用dispatcher结果类型,它通过服务器端转发(RequestDispatcher.forward())将请求传递给JSP,这是最常用的方式。
常用结果类型
除了默认的dispatcher,Struts2还提供了其他结果类型,以适应不同的跳转需求。
| 结果类型 | 描述 | 使用场景 |
|---|---|---|
dispatcher | (默认) 服务器端转发,URL不变。 | 最常见的页面跳转,将Action数据传递给JSP展示。 |
redirect | 客户端重定向,URL会改变。 | 防止表单重复提交;跳转到其他外部网站。 |
redirectAction | 重定向到另一个Action。 | 在Action之间进行跳转,保持处理逻辑的连续性。 |
stream | 向浏览器发送原始数据流。 | 文件下载、生成验证码图片等。 |
若要防止用户刷新页面导致表单重复提交,可以在成功保存数据后重定向到一个新的Action:
<result name="success" type="redirectAction">showUserList</result>
JSP页面中的配置:使用Struts2标签库
在JSP页面中,直接使用Java脚本(<% ... %>)来访问数据早已不是推荐的做法,Struts2提供了一套功能强大的标签库(Struts Tags),它基于OGNL(Object-Graph Navigation Language)表达式语言,能够以非常简洁的方式访问Value Stack(值栈)中的数据。
引入标签库
要在JSP页面中使用Struts2标签,首先必须在页面顶部引入标签库:

<%@ taglib prefix="s" uri="/struts-tags" %>
这里的prefix="s"是标签的前缀,uri="/struts-tags"是它的唯一标识符,引入后,就可以使用<s:...>格式的标签了。
核心标签应用示例
数据展示:
<s:property>标签用于输出值栈中的属性值。<!-- 假设Action中有 private String username; 并提供了getter --> 欢迎, <s:property value="username" />!
表单构建:
<s:form>及相关标签可以自动创建与Action属性绑定的表单。<s:form action="login"> <s:textfield name="username" label="用户名" /> <s:password name="password" label="密码" /> <s:submit value="登录" /> </s:form>这些表单标签会自动生成HTML,并且在表单提交失败返回
input结果时,能够自动回显用户之前输入的数据。循环遍历:
<s:iterator>标签用于遍历集合、数组等。<!-- 假设Action中有 private List<User> userList; --> <table> <s:iterator value="userList" status="st"> <tr> <td><s:property value="#st.count" /></td> <td><s:property value="name" /></td> <td><s:property value="email" /></td> </tr> </s:iterator> </table>条件判断:
<s:if>,<s:elseif>,<s:else>用于逻辑判断。<s:if test="user.age > 18"> <p>您已成年。</p> </s:if> <s:else> <p>您未成年。</p> </s:else>
高级配置与最佳实践
全局结果
在同一个包内,多个Action可能共享同一个结果页面,例如全局的错误页面或登录页面,为了避免在每个<action>中都重复定义,可以使用<global-results>。
<package name="default" namespace="/" extends="struts-default">
<global-results>
<result name="login">/WEB-INF/content/login.jsp</result>
<result name="error">/WEB-INF/content/error.jsp</result>
</global-results>
<action name="..."> ... </action>
<action name="..."> ... </action>
</package>这样,任何Action返回”login”或”error”时,都会自动跳转到这些全局定义的页面。

主题与模板
Struts2的表单标签支持“主题”概念,它控制着标签如何生成HTML代码,默认主题是xhtml,它会为每个表单字段生成一个两行的表格布局,开发者可以通过修改struts.properties或在struts.xml中设置常量来改变默认主题。
<!-- 在struts.xml中设置默认主题为simple,让开发者完全控制HTML --> <constant name="struts.ui.theme" value="simple" />
simple主题只生成最核心的HTML标签,不包含任何额外的布局代码,给予前端开发最大的灵活性。
Struts2的JSP配置是一个系统工程,它始于struts.xml中对Action与视图的路由定义,深化于JSP页面中对Struts2标签库的熟练运用,并可通过全局结果、主题等高级配置进行优化,正确理解和配置这些环节,是开发出结构清晰、易于维护的Struts2应用的基础。
相关问答FAQs
问题1:Struts2的<s:property>标签和JSP的EL表达式有什么区别?在项目中我应该优先使用哪个?
解答:
两者主要区别在于数据来源和功能强度:
- 数据来源:
<s:property value="...">使用OGNL表达式,其数据来源是Struts2的Value Stack(值栈),它能非常方便地访问Action中的属性、调用方法、访问上下文中的对象等,而EL表达式的数据来源是JSP的四大作用域(page, request, session, application),它无法直接访问Value Stack。 - 功能强度:OGNL的功能远比EL强大,支持复杂的对象图导航、方法调用、静态方法访问(需配置)、集合投影与选择等高级特性,EL则相对简单,主要用于基本的属性获取。
建议:在Struts2项目中,强烈建议优先使用Struts2标签,因为它们与框架无缝集成,能充分利用Value Stack带来的便利,代码更简洁,功能也更强大,只有在某些非Struts2控制的、或需要纯粹访问JSP作用域属性的简单场景下,才考虑使用EL表达式。
问题2:我的JSP页面中Struts2标签不生效,直接以纯文本形式显示在浏览器上,可能是什么原因?
解答:
这是一个常见问题,通常由以下几个原因导致,可以逐一排查:
- 未引入标签库:检查JSP页面顶部是否遗漏了
<%@ taglib prefix="s" uri="/struts-tags" %>这行指令,这是最常见的原因。 - Struts2过滤器配置错误:检查
web.xml中的StrutsPrepareAndExecuteFilter过滤器映射是否正确,它必须能拦截到对JSP页面的请求,通常配置为<url-pattern>/*</url-pattern>可以确保所有请求都经过过滤器处理,如果配置为*.action,则直接访问JSP时过滤器不会生效。 struts.xml文件有语法错误:如果struts.xml文件存在XML格式错误或配置问题,可能导致整个框架初始化失败,从而使得标签库无法被正确解析,可以查看服务器启动日志中是否有Struts2相关的错误信息。- JSP文件路径与
<result>配置不匹配:确保struts.xml中<result>标签里指定的JSP路径是正确的,并且该文件确实存在于该位置,如果路径错误,服务器可能返回404或一个不包含Struts2标签处理的默认错误页面。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/27940.html




