以前学习框架总是用Eclipse,现在都用IDEA了,以后也直接在IDEA上学习框架了。Spring MVC是需要Spring支持的,其实包含在Spring里面,但我们说Spring都是指其AOP和IoC而已。
从IDEA创建Spring和Spring MVC项目
Spring
学习IDEA搭建Spring环境,注意文中创建Spring项目时应当勾选Create empty spring-config.xml
,原文没有指出,这样就可以在src
目录下看到这个默认配置文件了。
Spring MVC
学习IDEA创建spring MVC项目,这篇博文里博主将lib/
目录直接复制到了web/lib/
,然后添加了关于这个目录的依赖,其实可以直接剪切掉这个目录,然后F4在library
里删除掉已经失效的Spring和Spring MVC路径,添加这个新的lib/
目录进去。然后在F4的Modules
里面就可以直接使用它了:
这样所有的JAR包都混杂在这个目录下,实际上区分不开,要区分的话还是用Maven之类的构建工具。
一个简易的Spring MVC例子
/WEB-INF/web.xml
和前面学S2SH时候一样,Web容器总是会在启动时先加载web.xml中的配置,先<context-param>
再<listener>
然后<filter>
最终<servlet>
的顺序,相同元素会按顺序加载,全部加载完成后才启动项目。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--[1]Spring的配置-->
<context-param>
<param-name>contextConfigLocation</param-name>
<!--这里指明要装入的Spring配置文件,可以用正则-->
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<!--这个监听器用来在Web容器启动时,自动装配前面的Spring配置文件-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--[2]Spring MVC的配置-->
<!--DispatcherServlet是统一访问点,用来接收用户请求,然后给其它处理器处理-->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--load-on-startup表示启动容器时要初始化这个Servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<!--这里url-patern设置为/,即将所有请求都交给Spring MVC处理-->
<!--所有URL请求都将被Spring MVC的DispatcherServlet截获,其中包含动态请求和静态资源请求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
这里DTD上的版本4.0会报警告,估计是Tomcat版本不够高,这个以后再说。
/WEB-INF/dispatcher-servlet.xml
这是Spring MVC的配置文件,它的文件名不一定是dispatcher-servlet.xml
,这里的dispatcher是来自于前面web.xml中配置Spring MVC的<servlet-name>
的值。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--Spring会自动去级联扫描base-package指明的包下面的Java文件-->
<!--如果扫描到有@Component,@Controller,@Service等这些注解的类,则把这些类注册为bean-->
<context:component-scan base-package="org.test"/>
<!--在Spring MVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler-->
<!--对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理-->
<!--如果不是静态资源的请求,才由DispatcherServlet继续处理-->
<!--一般Web应用服务器默认的Servlet名称是"default",因此DefaultServletHttpRequestHandler可以找到它-->
<!--如果不是"default",则需要通过default-servlet-name属性显示指定-->
<mvc:default-servlet-handler/>
<!--自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter这两个bean-->
<!--即解决了@Controller注解使用的前提配置,另外还提供了一些其它支持-->
<!--这是一种简写形式,代表了一些默认配置,它们也可以可以手动配置-->
<mvc:annotation-driven/>
<!--在Controller返回的时候进行解析视图,可以看下Controller返回的字符串-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!--指明前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--指明后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
/WEB-INF/jsp/hello.jsp
昨天才知道WEB-INF/
目录下的任何文件或子目录都受保护,无法通过浏览器直接访问,但控制器依然可以转发请求到这些页面,所以页面才一直是要放到它下面。有些重要的配置文件亦然。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Spring MVC</title>
</head>
<body>
<h1>Hello Spring MVCCCCC</h1>
</body>
</html>
这只是一个普通的JSP页面,注意/WEB-INF/jsp/hello.jsp
的前缀是/WEB-INF/jsp/
,后缀是.jsp
,中间是hello
。前缀和后缀都是配置在了前面的/WEB-INF/dispatcher-servlet.xml
文件下,而中间的内容,也就是标识这个资源的部分则是在后面的控制器中函数的返回值。
src/org/test/HelloWorldController.java
注意这个包org.test
在前面的/WEB-INF/dispatcher-servlet.xml
文件中有配置,这个类下的Java文件才能被扫描并注册。
package org.test;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
//使用@Controller注解,在对应的方法上,视图解析器可以解析return的jsp/html页面,并跳转到相应页面
@Controller
//@RequestMapping是一个用来处理请求地址映射的注解
//用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径
@RequestMapping("/mvc")
public class HelloWorldController {
//用于方法上,指明访问什么路径时要调用该方法
@RequestMapping("/hello")
public String sayHello() {
//根据dispatcher-servlet.xml的配置,这个字符串将被解析成视图/WEB-INF/jsp/hello.jsp
return "hello";
}
}
注意这里的注解配置和返回值。@RequestMapping
实际是Spring MVC对RESTful
风格应用的支持。