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根据这个字符串在配置文件中查找对应的标签,从而决定渲染哪个JSP页面。
基础结果配置
一个基础的配置如下所示:
/WEB-INF/content/welcome.jsp /WEB-INF/content/login.jsp /WEB-INF/content/error.jsp
这里,标签的属性与Action类中返回的字符串相对应,而标签内的值则是目标JSP页面的路径,默认情况下,Struts2使用
dispatcher
结果类型,它通过服务器端转发(RequestDispatcher.forward())将请求传递给JSP,这是最常用的方式。
常用结果类型
除了默认的
dispatcher
,Struts2还提供了其他结果类型,以适应不同的跳转需求。
| 结果类型 | 描述 | 使用场景 |
|---|---|---|
dispatcher
|
(默认) 服务器端转发,URL不变。 | 最常见的页面跳转,将Action数据传递给JSP展示。 |
| 客户端重定向,URL会改变。 | 防止表单重复提交;跳转到其他外部网站。 | |
redirectAction
|
重定向到另一个Action。 | 在Action之间进行跳转,保持处理逻辑的连续性。 |
| 向浏览器发送原始数据流。 | 文件下载、生成验证码图片等。 |
若要防止用户刷新页面导致表单重复提交,可以在成功保存数据后重定向到一个新的Action:
showUserList
JSP页面中的配置:使用Struts2标签库
在JSP页面中,直接使用Java脚本()来访问数据早已不是推荐的做法,Struts2提供了一套功能强大的标签库(Struts Tags),它基于OGNL(Object-Graph Navigation Language)表达式语言,能够以非常简洁的方式访问Value Stack(值栈)中的数据。
引入标签库
要在JSP页面中使用Struts2标签,首先必须在页面顶部引入标签库:
这里的
prefix="s"
是标签的前缀,
uri="/struts-tags"
是它的唯一标识符,引入后,就可以使用格式的标签了。
核心标签应用示例
高级配置与最佳实践
全局结果
在同一个包内,多个Action可能共享同一个结果页面,例如全局的错误页面或登录页面,为了避免在每个中都重复定义,可以使用。
/WEB-INF/content/login.jsp /WEB-INF/content/error.jsp ... ...
这样,任何Action返回”login”或”error”时,都会自动跳转到这些全局定义的页面。
主题与模板
Struts2的表单标签支持“主题”概念,它控制着标签如何生成HTML代码,默认主题是,它会为每个表单字段生成一个两行的表格布局,开发者可以通过修改
struts.properties
或在
struts.xml
中设置常量来改变默认主题。
主题只生成最核心的HTML标签,不包含任何额外的布局代码,给予前端开发最大的灵活性。
Struts2的JSP配置是一个系统工程,它始于
struts.xml
中对Action与视图的路由定义,深化于JSP页面中对Struts2标签库的熟练运用,并可通过全局结果、主题等高级配置进行优化,正确理解和配置这些环节,是开发出结构清晰、易于维护的Struts2应用的基础。
相关问答FAQs
问题1:Struts2的标签和JSP的EL表达式有什么区别?在项目中我应该优先使用哪个?
解答: 两者主要区别在于数据来源和功能强度:
建议 :在Struts2项目中, 强烈建议优先使用Struts2标签 ,因为它们与框架无缝集成,能充分利用Value Stack带来的便利,代码更简洁,功能也更强大,只有在某些非Struts2控制的、或需要纯粹访问JSP作用域属性的简单场景下,才考虑使用EL表达式。
问题2:我的JSP页面中Struts2标签不生效,直接以纯文本形式显示在浏览器上,可能是什么原因?
解答: 这是一个常见问题,通常由以下几个原因导致,可以逐一排查:
struts2的action获取不了前台表单的值
目测,应该是拦截器少引用一个defaultStack了。 这个defaultStack是不能少的,获取表单请求值填充到action的字段,必须要先经过strtus2的defaultStack。
用struts2实现执行完一个action后的返回页面, 5秒之后跳转到另一个页面
<head><meta http-equiv=refresh content=5;url=></head>
什么意思
这个是struts中定义action请求跳转的。 login是jsp中定义的提交表单名称,class对应的是java类。 常用用法:此时后面的1就是name中“*”的值,如:userAction!GetName,那么就会执行userAction类中的GetName方法。














发表评论