刚开始用idea构建spring mvc项目,代码没问题都是跟着书敲,但是配置真的是一言难尽,网上有些教程,但idea的比较少,对我这种菜鸟不友好,在自己遇到很多坑后,终于解决了,记录下。。
首先电脑上要装有tomcat来发布web项目,版本在7以上,为了兼容servelet3.0
从新建项目开始:
自己选择项目路径,等待下载库
接着按照书上的代码将各个类建好,我的目录结构是这样的
之后,将项目添加到tomcat中
修改完后点击ok,tomcat配置完毕,哈哈
尝试运行下tomcat,结果报错。。
我们添加jar包来解决这个问题。
找到tomcat安装目录lib下的,点击添加。添加完成后再次运行tomcat这个问题应该解决了。但是错误并未都解决,我们打开tomcat localhost log控制台,应该会有下面的错误。
再次尝试启动后又出现下面的问题,心好累。。
查了半天才发现,按照书上的方法是通过java类的方式来指定servelet容器,映射规则等,打开web.xml,就会发现里面的三条配置项和java类,就是SpittrWebApplicationInitializer,里是一一对应的。两种配置产生了冲突,选择注释web.xml
再次运行程序发现打开的是index.jsp,但始终还是打开了,所有控制台的日志都没报错就好哈哈。
接下来就是修改映射的问题。我不知道为什么代码里已经有将"/"的get请求映射到home.jsp下,但是就是找不到资源,心好累,希望知道的大佬评论区指点下,是不是tomcat那里的路径有问题,搞了好久。。继续说我是怎么解决的,我修改了类的映射,原来书中是这样的:
如果报http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar错,就下载对应的jar包就好,参考这里
http://www.runoob.com/jsp/jsp-jstl.html,把那两个jar拷到tomcat下应该就可以了
这时候我们重新启动程序,并在地址栏中输入home
我还是把代码贴一下吧,可以对比下:
package spittr.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration
@ComponentScan(basePackages={"spittr"},
excludeFilters={@Filter(type= FilterType.ANNOTATION, value= EnableWebMvc.class)})
public class RootConfig {
}
package spittr.config;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class SpitterWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
/**
* 将一个或多个路径映射到DispatcherServlet上
*/
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { RootConfig.class };
}
/**
* 指定配置类
* 当DispatcherServlet启动的时候,它会创建Spring应用上下文,并加载配置类或配置文件中所声明的bean
*/
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { WebConfig.class };
}
}
package spittr.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
@EnableWebMvc //启用Spring Mvc
@ComponentScan("spittr.web")
public class WebConfig extends WebMvcConfigurerAdapter {
/**
* 配置视图解析器,名为home的视图将被解析为/WEB-INF/views/home.jsp
* @return
*/
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
resolver.setExposeContextBeansAsAttributes(true);
return resolver;
}
/**
* 配置静态资源的处理
* 此配置要求DispatcherServlet将对静态资源的请求转发到Servlet容器中默认的Servlet上,
* 而非使用DispatcherServlet本身来处理此类请求
*/
@Override
public void configureDefaultServletHandling(
DefaultServletHandlerConfigurer configurer) {
// TODO Auto-generated method stub
//super.configureDefaultServletHandling(configurer);
configurer.enable();
}
}
package spittr.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller //声明一个控制器
public class HomeController {
@RequestMapping(value="/home", method=RequestMethod.GET) //处理对"/"的GET请求
public String home() {
System.out.println("处理get请求");
return "home";
}
}