You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ozark+Grizzly环境下MVC视图解析异常:返回JSP路径而非页面内容

解决Ozark MVC + Grizzly 视图不渲染直接返回字符串的问题

看起来你的Ozark MVC应用有几个关键配置缺失,导致控制器返回的视图路径被直接当作字符串输出,而没有触发JSP渲染。下面是针对性的解决方案:

1. 正确配置Ozark的ResourceConfig

首先,你的ApplicationResourceConfig需要注册Ozark的核心MVC特性,并配置视图前缀和后缀,让Ozark识别返回的字符串是视图名而非响应内容:

public class ApplicationResourceConfig extends ResourceConfig {
    public ApplicationResourceConfig() {
        // 扫描控制器所在的包(替换成你实际的包路径)
        packages("com.yourpackage.controllers");
        
        // 注册Ozark核心MVC特性
        register(MvcFeature.class);
        
        // 配置JSP视图的前缀和后缀
        property(MvcFeature.VIEW_PREFIX, "/WEB-INF/");
        property(MvcFeature.VIEW_SUFFIX, ".jsp");
    }
}

2. 补充Grizzly嵌入式服务器的JSP支持依赖

Grizzly默认的HTTP服务器不支持JSP处理,需要添加以下依赖来启用JSP渲染能力:

<!-- Grizzly Servlet Web Server 支持 -->
<dependency>
    <groupId>org.glassfish.grizzly</groupId>
    <artifactId>grizzly-servlet-webserver</artifactId>
    <version>2.4.4</version>
</dependency>

<!-- JSP API 依赖 -->
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>javax.servlet.jsp</artifactId>
    <version>2.3.3</version>
</dependency>

<!-- Jetty JSP引擎(Grizzly可兼容使用) -->
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>apache-jsp</artifactId>
    <version>9.4.31.v20200723</version>
</dependency>

3. 修改Grizzly服务器启动代码以支持Servlet/JSP

原来的GrizzlyHttpServerFactory创建的是基础HTTP服务器,需要换成WebServer来支持Servlet和JSP容器功能:

public class GrizzlyServer {
    private static final Logger LOGGER = LoggerFactory.getLogger(GrizzlyServer.class);
    private static final String APP_NAME = "Hello World";
    private static URI baseUri;
    private static final String PROTOCOL = "http://";
    private static final String HOST = "localhost";
    private static final String PATH = "app/";
    private static final int DEFAULT_PORT = 8080;

    private GrizzlyServer() { }

    private static int port(String[] args) {
        if (args.length > 0) {
            String port = args[0];
            try {
                return Integer.valueOf(port);
            } catch (NumberFormatException exception) {
                LOGGER.error("Invalid port number {}", port);
                LOGGER.error("Default port number {} will be used", DEFAULT_PORT);
            }
        }
        return DEFAULT_PORT;
    }

    public static WebServer startServer(int port) throws Exception {
        baseUri = UriBuilder.fromUri(PROTOCOL + HOST).port(port).path(PATH).build();
        
        // 创建支持Servlet/JSP的Grizzly WebServer
        WebServer webServer = new WebServer(port);
        
        // 注册Jersey Servlet
        ServletRegistration jerseyServlet = webServer.addServlet("JerseyServlet", ServletContainer.class);
        jerseyServlet.addMapping("/" + PATH + "*"); // 匹配app路径下的所有请求
        jerseyServlet.setInitParameter(ServletProperties.JAXRS_APPLICATION_CLASS, ApplicationResourceConfig.class.getName());
        
        // 配置JSP引擎
        webServer.setJspEnginePath("org.eclipse.jetty.jsp.JettyJspServlet");
        // 指定web资源根目录(对应你的项目web目录)
        webServer.addContext("/", new File("src/main/web"));
        
        webServer.start();
        return webServer;
    }

    public static void run(String[] args) throws IOException {
        int port = port(args);
        try {
            final WebServer server = startServer(port);
            LOGGER.info("{} started at {}", APP_NAME, baseUri);
            LOGGER.info("Hit Enter to stop it...");
            System.in.read();
            server.shutdown();
        } catch (Exception exception) {
            LOGGER.error("Server startup failed", exception);
            LOGGER.error("Exit...");
            System.exit(1);
        }
    }
}

4. 调整控制器的视图返回值

因为已经在ResourceConfig中配置了视图前缀和后缀,控制器只需返回视图名(不需要完整路径)即可:

@Controller
@Path("hello-world")
public class HelloWorldController {
    @GET
    public String index() {
        // 自动拼接为 /WEB-INF/index.jsp
        return "index";
    }
}

5. 确保Maven正确打包web资源

在pom.xml中添加资源配置,确保web目录下的文件被打包到正确的位置:

<build>
    <resources>
        <resource>
            <directory>src/main/web</directory>
            <targetPath>META-INF/resources</targetPath>
        </resource>
    </resources>
</build>

做完这些配置后,重启服务器访问http://localhost:8080/app/hello-world,应该就能正确渲染index.jsp的内容了。

内容的提问来源于stack exchange,提问作者Julez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:37:33