我有,我认为一个非常简单的Spring MVC设置。我的应用程序上下文.xml是这样的:
<mvc:annotation-driven />
<mvc:resources mapping="/css/**" location="/css/" />
<context:property-placeholder location="classpath:controller-test.properties" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/views/" p:suffix=".jsp" />
我目前的web.xml是:
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map all requests to the DispatcherServlet for handling -->
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
我正试图将这个设置转换为纯基于Java的配置。我在网上搜索了一下,到目前为止,我找到了一些解释(一些什么)如何进行Java配置的东西,但是没有解释如何向环境(即web上下文)注册Java配置。
到目前为止,我在@Configuration方面是这样的:
@Configuration
@EnableWebMvc
@PropertySource("classpath:controller.properties")
@ComponentScan("com.project.web")
public class WebSpringConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/css/**").addResourceLocations("/css/");
}
@Bean
public ViewResolver configureViewResolver() {
InternalResourceViewResolver viewResolve = new InternalResourceViewResolver();
viewResolve.setPrefix("/WEB-INF/views/");
viewResolve.setSuffix(".jsp");
return viewResolve;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer){
configurer.enable();
}
}
如何将其注册到web容器?我正在使用最新的spring(4.02)。
谢谢!
基于Java的配置,无需向< code>web.xml添加任何元素。WebApplicationInitializer非常适合与Spring的基于代码的< code>@Configuration类一起使用
WebApplicationInitializer « 在 Servlet 3.0 环境中
实现的接口,以便以编程方式配置 ServletContext -- 而不是(或可能与)传统的基于 Web .xml的方法结合使用。SpringServletContainerInitializer 会自动检测此 SPI 的实现,它本身由任何 Servlet 3.0 容器自动引导
。使用 Tomcat 7 的 Servlet Spec 3.0
从Spring 3.2开始,列出了一些实现WebApplicationInitializer的抽象类,SrevletContainer将自动检测到它。
AbstractAnnotationConfigDispatcherServletInitializer extends
AbstractDispatcherServletInitializer extends
AbstractContextLoaderInitializer implements WebApplicationInitializer
使用Spring 4.1.6.RELEASE
版本,模块核心,web,webmvc,beans
。
public class WebXML_DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { MvcServletXMLConfigurer.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return null;
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
基于Java的配置来使用Spring服务静态资源。
@Configuration
@EnableWebMvc // <mvc:annotation-driven />
@ComponentScan(value = {"com.github.yash777.controllers"})
// <context:component-scan base-package="com.github.yash777" />
public class MvcServletXMLConfigurer extends WebMvcConfigurerAdapter implements WebMvcConfigurer {
/**
* <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
* p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />
*
* @return InternalResourceViewResolver as a bean configuration.
*/
@Bean
public InternalResourceViewResolver getInternalResourceViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/jsp/");
resolver.setSuffix(".jsp");
return resolver;
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
System.out.println("WebMvcConfigurer - addResourceHandlers() function get loaded...");
// <mvc:resources mapping="/styles/**" location="/css/" />
registry
.addResourceHandler("/styles/**")
.addResourceLocations("/css/") // webapp/css/
.setCachePeriod(3600)
.resourceChain(true) // Spring 4.1
.addResolver(new GzipResourceResolver()) // Spring 4.1
.addResolver(new PathResourceResolver()); // Spring 4.1
// <mvc:resources mapping="/static/**" location="/static/" />
registry.addResourceHandler("/static/**")
.addResourceLocations("/static/", "classpath:/static/") // src/main/resources/static/
.setCachePeriod(3600)
.resourceChain(true)
.addResolver(new PathResourceResolver());
}
}
列出了一个示例控制器:
@Controller
@RequestMapping(value = { "/controller", "/c" })
public class Test extends HttpServlet {
private static final long serialVersionUID = 1L;
@RequestMapping(value = {"/message", "/m"}, method = RequestMethod.GET )
public void message(HttpServletRequest request, HttpServletResponse response ) throws IOException {
System.out.println("@Controller Get method called.");
}
@RequestMapping(value = "/getView", method = RequestMethod.GET )
public ModelAndView setViewName( Model model ) {
System.out.println("GET... /getView");
ModelAndView mav = new ModelAndView();
mav.setViewName("test");
return mav;
}
}
WEB-INF/web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
</web-app>
您需要对 Web.xml
进行以下更改,以支持基于 java 的配置。这将告诉 DispatcherServlet
使用基于注释的 java 配置 AnnotationConfigWebApplicationContext
来加载配置。您只需要将 java 配置文件的位置传递给上下文ConfigLocation
参数,如下所示
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/*path to your WebSpringConfig*/ </param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
更新:在不更改web.xml的情况下执行相同操作
您甚至可以在没有< code>web.xml的情况下做到这一点,因为Servlet规范3.0使< code>web.xml成为可选的。您只需要实现/配置< code > WebApplicationInitializer 接口来配置< code>ServletContext,这将允许您以编程方式创建、配置和执行< code>DispatcherServlet的注册。好在< code > WebApplicationInitializer 是自动检测的。
总之,需要实现WebApplication ationLaunalizer
来摆脱web.xml
。
public class MyWebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
// Create the 'root' Spring application context
AnnotationConfigWebApplicationContext rootContext =
new AnnotationConfigWebApplicationContext();
rootContext.register(WebSpringConfig.class);
// Manage the lifecycle of the root application context
container.addListener(new ContextLoaderListener(rootContext));
// Create the dispatcher servlet's Spring application context
AnnotationConfigWebApplicationContext dispatcherContext =
new AnnotationConfigWebApplicationContext();
dispatcherContext.register(DispatcherConfig.class);
// Register and map the dispatcher servlet
ServletRegistration.Dynamic dispatcher =
container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
更新:来自评论
一个稍微更复杂的解释也包含在官方Spring参考Spring4发布中
参考:
http://docs.spring.io/spring/docs/3.1.x/javadoc-api/org/springframework/web/WebApplicationInitializer.html
问题内容: 我有一个我认为非常简单的Spring MVC设置。我的applicationContext.xml是这样的: 我的web.xml当前是这样的: 我正在尝试将此设置转换为基于Java的纯配置。我已经在网上搜索过,到目前为止,我已经提出了一些东西(这些东西可以解释)如何进行Java配置,但是没有解释如何在环境(即Web上下文)中注册该Java配置。 到目前为止,我对@Configurati
我正在使用Spring批处理设置一个作业服务器。我的JdbcCursorItemReader需要配置sql,该sql在每个作业运行的基础上进行更改。因为sql发生了变化,所以我希望阅读器具有@stepscope,这样我就不需要担心sql的状态性了。 所以我设置了这样一个类: 我在整个服务器上使用基于Java的配置。ItemReader的一个实例的bean如下所示: 启动服务器并运行Spring批处
问题内容: 不合理,无法通过注释而不是纯XML Bean来配置Spring Bean,现在我正面临后果。 我使用以下方式配置REST通道 现在,我只需要简单地将设置为仅将此具有非null值的字段输出到JSON。我尝试了以下方法: Bean被创建,但是转换器的另一个实例已创建并在通道中使用。所以我已经尝试过这种方法并在Stackoverflow问题中进行了描述,但是json序列化仍然使用其自己的配置
最后,我尝试通过 但我以结束。所以现在我别无选择,所以我在这里征求任何想法。如何控制和配置框架使用的映射器?
我正在使用Spring MVC开发一个web应用程序,它完全基于Java,没有web。xml配置。我编写了下面的类来加载bean并设置url模式。如何设置欢迎文件?
这段配置通过上下文进行扫描--我用调试器检查了它。问题可能出在哪里?