害!弄了整整一天,这个SpringMVC 的helloWorld程序终于能跑起来了,遇到了头疼的404问题始终无法解决,非常的蛋疼,代码也没有错误就是运行不起来!
现在我已解决这个问题,顺便做个记录
首先搭建好项目环境,创建maven工程,引入依赖 这样建立web工程可以保证web.xml的版本为最新,不会导致版本过低而出现404的问题。
我出现的主要问题在于依赖有问题,换个依赖就好了,总的来说这个问题也相当隐蔽了,还好解决了!依赖用下面这些!
<properties> <spring.version>5.0.2.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> </dependencies>总结下程序的写入步骤,有两个版本,网上大都是直接上注解版,那我就先从配置版入手吧:
注册DispatcherServlet,并关联SpringMVC的配置文件
DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心,用来接收或拦截用户发起的请求
<servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--关联SpringMVC的配置文件,SpringMVC-servlet.xml是一会要写的配置文件--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:SpringMVC-servlet.xml</param-value> </init-param> <!--设置启动级别为1--> <load-on-startup>1</load-on-startup> </servlet> <!--/ 匹配所有的请求;(不包括.jsp)--> <!--/* 匹配所有的请求;(包括.jsp)--> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>配置文件名字可以随便起,但是官方要求我们最好是用 【servlet-name】-servlet.xml 来给配置文件起名字, 例如我起的名字叫SpringMVC-servlet.xml,这名字也要和上面在web.xml中写过的的param-value对应!
引入命名空间 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> </beans> 添加处理映射器,处理适配器,视图解析器 试题解析器中要把所有视图都存放在WEB-INF目录中,这个目录客户端不能直接访问,进而保证视图安全 <!-- 添加处理映射器--> <beans> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!-- 添加处理适配器--> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> <!-- 添加视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <!-- 设置前缀--> <property name="prefix" value="/WEB-INF/jsp/"/> <!-- 设置后缀--> <property name="suffix" value=".jsp"/> </bean> </beans>处理器映射器,处理器适配器,视图解析器可以称之为SpringMVC三大件!
一种是使用注解,另一种是使用实现controller接口的方法,这里我们使用实现controller接口的方法, 更有助于我们理解SpringMVC的执行过程
public class HelloController implements Controller { public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { // 创建一个模型和视图 ModelAndView modelAndView = new ModelAndView(); // 封装对象,放在ModelAndView中 modelAndView.addObject("msg","HelloSpringMVC"); // 封装要跳转的视图,放在ModelAndView中 modelAndView.setViewName("hello"); //: /WEB-INF/jsp/hello.jsp return modelAndView; } }将自己写的业务类交给SpringIOC进行管理,在SpringMVC-servlet.xml中注册bean
<bean id="/hello" class="com.zlq.controller.HelloController"/>接下来就可以配置并启动tomcat进行测试了 访问地址为 http://localhost:8080/工程名/hello
将之前导入的dependencies依赖全部复制到lib目录下
重启Tomcat 即可解决!写过配置版才能更加深刻的理解注解版,如果还不理解,那就写十遍,没有笨人,只有懒人!
annotation-driven的作用:用来支持mvc注解驱动 。 在spring中我们采用@RequestMapping注解来完成映射关系 ,要想使@RequestMapping注解生效, 必须向上下文中注册处理映射器(DefaultAnnotationHandlerMapping )和处理适配器(AnnotationMethodHandlerAdapter), 而annotation-driven配置帮助我们自动完成处理映射器和处理适配器两个实例的注入。 5. 配置视图解析器
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver " id="internalResourceViewResolver"> <!-- 前缀 --> <property name="prefix" value="/WEB-INF/jsp/"/> <!-- 后缀 --> <property name="suffix" value=".jsp"/> </bean>通常处理器映射器和处理器适配器不需要我们配置,它们两个已经被注解驱动替代,而我们只需要手动开启视图解析器即可
有了注解,编写操作业务就变得简单多了 @RequestMapping:该注解可以写在类上也可以写在方法上,如果想要多级路径就可以在类上写一个,在方法上写一个。
@Controller //为了让Spring IOC容器初始化时自动扫描 @RequestMapping("/HelloController") //为了映射请求路径,这里因为类与方法上都有映射所以访问时应该是/HelloController/hello; public class HelloController { @RequestMapping("/hello") //此时真实访问地址为 : 项目名/HelloController/hello public String sayHello(Model model) { //向模型中添加属性msg与值,可以在JSP页面中取出并渲染 model.addAttribute("msg", "hello,SpringMVC"); //web-inf/jsp/hello.jsp return "hello"; //会被视图解析器处理,返回的字符串就是视图的名字 } }接下来运行tomcat, 访问地址为 http://localhost:8080/工程名/HelloController/hello
文章也是精心整理的,方便后期的查阅也方便大家更好的理解,相信按照我的步骤来不会有错,如果有哪里不对的地方也恳请大家指点~~~