使用 SpringMVC + 嵌入式 Jetty + Gradle 设置 JSP
Setup JSP with SpringMVC + Embedded Jetty + Gradle
我已经尝试了一段时间,但在使用 gradle 管理依赖项时,我真的无法理解 运行 具有嵌入式码头的 SpringMVC(基于注释的 MVC 配置)项目。
我成功显示了 jsp 页面,但是 jsp 标签没有被解析?执行?
我的设置如下所示:
build.gradle:
apply plugin: 'java'
apply plugin: 'eclipse'
repositories {
mavenCentral()
}
sourceSets.main.resources.srcDirs = ['src/main/resources', 'webapp']
sourceSets.main.java.srcDirs = ['src/main/java']
dependencies {
compile 'javax.servlet.jsp:jsp-api:2.2'
compile 'javax.servlet:javax.servlet-api:3.1.0'
compile 'javax.servlet.jsp.jstl:jstl-api:1.2'
compile 'org.springframework:spring-webmvc:4.1.6.RELEASE'
compile 'org.apache.logging.log4j:log4j-core:2.2'
compile 'org.eclipse.jetty:jetty-webapp:9.2.10.v20150310'
}
我的视图解析器配置如下:
@Bean
public InternalResourceViewResolver jspViewResolver() {
InternalResourceViewResolver bean = new InternalResourceViewResolver();
bean.setPrefix("/pages/");
bean.setSuffix(".jsp");
return bean;
}
我正在尝试显示此 jsp 页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<c:set var="test" scope="session" value="test"/>
<c:out value="${test}"/>
</body>
</html>
@编辑:
用于设置 Jetty 和 SpringMVC 的 AppInitializer:
public class AppInitializer {
private static final int DEFAULT_PORT = 8080;
private static final String CONTEXT_PATH = "/";
private static final String CONFIG_LOCATION = "pl.com.imralav.springmvc.config";
private static final String MAPPING_URL = "/*";
private static final String DEFAULT_PROFILE = "dev";
public static void main(String[] args) throws Exception {
new AppInitializer().startJetty(getPortFromArgs(args));
}
private static int getPortFromArgs(String[] args) {
if (args.length > 0) {
try {
return Integer.valueOf(args[0]);
} catch (NumberFormatException ignore) {
}
}
return DEFAULT_PORT;
}
private void startJetty(int port) throws Exception {
Server server = new Server(port);
server.setHandler(getServletContextHandler(getContext()));
server.start();
server.join();
}
private static ServletContextHandler getServletContextHandler(WebApplicationContext context) throws IOException {
ServletContextHandler contextHandler = new ServletContextHandler();
contextHandler.setErrorHandler(null);
contextHandler.setContextPath(CONTEXT_PATH);
contextHandler.addServlet(new ServletHolder(new DispatcherServlet(context)), MAPPING_URL);
contextHandler.addEventListener(new ContextLoaderListener(context));
contextHandler.setResourceBase(new ClassPathResource("WEB-INF").getURI().toString());
return contextHandler;
}
private static WebApplicationContext getContext() {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.setConfigLocation(CONFIG_LOCATION);
context.getEnvironment().setDefaultProfiles(DEFAULT_PROFILE);
return context;
}
}
不确定我可能遗漏了什么?当将 SpringMVC 作为 war 部署到 tomcat 时,servlet-api 依赖项不是 'compile' (类似于 targetCompile 或类似的东西),但它现在是嵌入式码头,所以我相信编译这次可以了
真是个愚蠢的问题。 Jetty 不支持 jsp。 Jetty 不支持 JSP 的 OOTB。一旦我插入 Thymeleaf,一切都完美无缺。感谢@geoand 和@Joakim
我已经尝试了一段时间,但在使用 gradle 管理依赖项时,我真的无法理解 运行 具有嵌入式码头的 SpringMVC(基于注释的 MVC 配置)项目。
我成功显示了 jsp 页面,但是 jsp 标签没有被解析?执行? 我的设置如下所示: build.gradle:
apply plugin: 'java'
apply plugin: 'eclipse'
repositories {
mavenCentral()
}
sourceSets.main.resources.srcDirs = ['src/main/resources', 'webapp']
sourceSets.main.java.srcDirs = ['src/main/java']
dependencies {
compile 'javax.servlet.jsp:jsp-api:2.2'
compile 'javax.servlet:javax.servlet-api:3.1.0'
compile 'javax.servlet.jsp.jstl:jstl-api:1.2'
compile 'org.springframework:spring-webmvc:4.1.6.RELEASE'
compile 'org.apache.logging.log4j:log4j-core:2.2'
compile 'org.eclipse.jetty:jetty-webapp:9.2.10.v20150310'
}
我的视图解析器配置如下:
@Bean
public InternalResourceViewResolver jspViewResolver() {
InternalResourceViewResolver bean = new InternalResourceViewResolver();
bean.setPrefix("/pages/");
bean.setSuffix(".jsp");
return bean;
}
我正在尝试显示此 jsp 页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<c:set var="test" scope="session" value="test"/>
<c:out value="${test}"/>
</body>
</html>
@编辑: 用于设置 Jetty 和 SpringMVC 的 AppInitializer:
public class AppInitializer {
private static final int DEFAULT_PORT = 8080;
private static final String CONTEXT_PATH = "/";
private static final String CONFIG_LOCATION = "pl.com.imralav.springmvc.config";
private static final String MAPPING_URL = "/*";
private static final String DEFAULT_PROFILE = "dev";
public static void main(String[] args) throws Exception {
new AppInitializer().startJetty(getPortFromArgs(args));
}
private static int getPortFromArgs(String[] args) {
if (args.length > 0) {
try {
return Integer.valueOf(args[0]);
} catch (NumberFormatException ignore) {
}
}
return DEFAULT_PORT;
}
private void startJetty(int port) throws Exception {
Server server = new Server(port);
server.setHandler(getServletContextHandler(getContext()));
server.start();
server.join();
}
private static ServletContextHandler getServletContextHandler(WebApplicationContext context) throws IOException {
ServletContextHandler contextHandler = new ServletContextHandler();
contextHandler.setErrorHandler(null);
contextHandler.setContextPath(CONTEXT_PATH);
contextHandler.addServlet(new ServletHolder(new DispatcherServlet(context)), MAPPING_URL);
contextHandler.addEventListener(new ContextLoaderListener(context));
contextHandler.setResourceBase(new ClassPathResource("WEB-INF").getURI().toString());
return contextHandler;
}
private static WebApplicationContext getContext() {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.setConfigLocation(CONFIG_LOCATION);
context.getEnvironment().setDefaultProfiles(DEFAULT_PROFILE);
return context;
}
}
不确定我可能遗漏了什么?当将 SpringMVC 作为 war 部署到 tomcat 时,servlet-api 依赖项不是 'compile' (类似于 targetCompile 或类似的东西),但它现在是嵌入式码头,所以我相信编译这次可以了
真是个愚蠢的问题。 Jetty 不支持 jsp。 Jetty 不支持 JSP 的 OOTB。一旦我插入 Thymeleaf,一切都完美无缺。感谢@geoand 和@Joakim