左右不同 2026-01-06 17:37 采纳率: 100%
浏览 3
已结题

Struts表单标签问题

以前用ssh编过网页,现在重操旧业。但现在使用Struts2 7.1时出现了个问题。在欢迎页index.jsp中使用Struts表单标签,总是报错。尝试在web.xml中
设置过滤*.jsp,不起作用。

<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>*.jsp</url-pattern>

后面网上找了很多办法,发现要使用Struts表单标签,必须通过action调用,然后才能正确显示。是不是Struts新版本中不允许直接调用jsp,还是我的设置有问题。

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2026-01-06 17:38
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    你提到的问题是关于 Struts 2.7.1 中使用 Struts 表单标签(如 <s:form><s:textfield> 等)时出现的错误,并且发现只有在通过 Action 调用 JSP 页面时才能正常显示。这确实是一个常见的问题,尤其是在 Struts 的新版本中,对 JSP 页面的处理方式有所变化。


    ✅ 问题分析

    1. Struts 表单标签的使用前提

    Struts 表单标签(如 <s:form>)依赖于 ActionContextServletActionContext,它们需要在 Action 执行过程中 被初始化。如果直接访问 JSP 页面(例如:index.jsp),而没有经过 Action 的调用,那么这些标签将无法正确解析和渲染。

    2. Struts 2.7.1 的变化

    在较新的 Struts 版本中(如 2.5+),对 JSP 的处理方式进行了优化,不再推荐直接访问 JSP 页面,而是要求通过 Action 来跳转到 JSP 页面。这样可以确保 Struts 标签能够正确地获取上下文信息。

    3. web.xml 中的过滤器配置

    你尝试设置 <url-pattern>*.jsp</url-pattern> 是为了让 Struts 过滤器处理所有 JSP 请求。然而,这种做法在 Struts 2.7.1 中已经不推荐,因为 Struts 已经默认会处理 JSP 页面,不需要显式配置。


    ✅ 解决方案

    ✅ 正确的做法:通过 Action 调用 JSP 页面

    1. 创建一个 Action 类

    package com.example.actions;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class IndexAction extends ActionSupport {
        public String execute() {
            return "success";
        }
    }
    

    2. 配置 struts.xml 文件

    <struts>
        <package name="default" namespace="/" extends="struts-default">
            <action name="index" class="com.example.actions.IndexAction">
                <result name="success">/index.jsp</result>
            </action>
        </package>
    </struts>
    

    3. 修改 index.jsp 页面

    不要直接访问 index.jsp,而是通过 URL 访问:

    http://localhost:8080/your-app/index.action
    

    这样,Struts 会先调用 IndexAction,然后跳转到 index.jsp,此时 Struts 标签就能正常工作了。


    ✅ 错误配置的说明

    ❌ 不推荐的 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>*.jsp</url-pattern>
    </filter-mapping>
    

    原因:

    • Struts 2.7.1 默认已经处理 JSP 页面。
    • 显式配置 *.jsp 可能导致冲突或未预期的行为。
    • Struts 表单标签需要 Action 上下文支持,不能直接作用于未被 Action 调用的 JSP。

    ✅ 总结

    | 问题 | 原因 | 解决方案 | |------|------|----------| | Struts 表单标签报错 | 直接访问 JSP 页面,没有通过 Action 调用 | 通过 Action 调用 JSP 页面 | | web.xml 设置不起作用 | Struts 2.7.1 不再推荐显式配置 *.jsp | 移除 *.jsp 的过滤器映射 | | 标签无法显示 | Action 上下文未初始化 | 确保页面由 Action 调用 |


    ✅ 推荐做法(完整示例)

    1. Action 类

    package com.example.actions;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class WelcomeAction extends ActionSupport {
        public String execute() {
            return "success";
        }
    }
    

    2. struts.xml 配置

    <struts>
        <package name="default" namespace="/" extends="struts-default">
            <action name="welcome" class="com.example.actions.WelcomeAction">
                <result name="success">/index.jsp</result>
            </action>
        </package>
    </struts>
    

    3. JSP 页面(index.jsp)

    <%@ taglib prefix="s" uri="/struts-tags" %>
    
    <s:form action="submit">
        <s:textfield name="username" label="用户名"/>
        <s:submit value="提交"/>
    </s:form>
    

    4. 访问 URL

    http://localhost:8080/your-app/welcome.action
    

    如果你还有其他关于 Struts 2.7.1 的配置或功能问题,欢迎继续提问!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月14日
  • 已采纳回答 1月6日
  • 创建了问题 1月6日