Spring(五): SpringMVC的简单使用

SpringMVC是在Spring基础上的一个MVC框架,可以很方便地进行web项目开发。



传统的servlet

传统的Java Web项目是通过Servlet进行控制转发的(其实SpringMVC也是基于servlet的),在不使用其他框架的情况下,一个单纯使用servlet的web项目应该是这样子的:
定义一个类(如LoginServlet)继承HttpServlet,重写其中的doGet方法和doPost方法

//LoginServlet.java
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getRequestDispatcher("/login.jsp").forward(req, resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

然后在web项目的配置文件web.xml中添加servlet的配置:

<servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.test.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
    <!-- 要与之前定义的 servlet-name 一致 -->
    <servlet-name>LoginServlet</servlet-name>
    <!-- http请求的url -->
    <url-pattern>/login</url-pattern>
</servlet-mapping>

SpringMVC的控制转发

SpringMVC是基于DispatcherServlet的MVC框架,DispatcherServlet的继承关系为:

HttpServlet <-- HttpServletBean <-- FrameworkServlet <-- DispatcherServlet

每一个请求最先访问的都是DispatcherServletDispatcherServlet负责转发Request请求给相应的HandlerHandler处理以后再返回相应的视图(View)或模型(Model)或都不返回。
在使用注解的SpringMVC中,处理器Handler是基于@Controller@RequestMapping这两个注解的,@Controller声明一个处理器类,@RequestMapping声明对应请求的映射关系,这样就可以提供一个非常灵活的匹配和处理方式。

web配置

要想使用SpringMVC,就得在web.xml文件中像配置普通servlet那样对DispatcherServlet进行配置:

<servlet>
    <servlet-name>web</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:spring.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>web</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

上面的servlet配置中直接通过初始化参数设置了contextConfigLocation,这样就会去指定的位置加载spring配置;如果设置的话,则SpringMVC会自动到/WEB-INF目录下寻找一个叫[servlet-name]-servlet.xml的配置文件,像上面的例子就会找/WEB-INF/web-servlet.xml进行加载。

  • classpath*:spring.xmlclasspath:spring.xml的区别

classpath:spring.xml表示仅加载classpath目录下的spring.xml
classpath*:spring.xml表示加载classpath目录及其子目录下,还有jar包中所有名为的spring.xml的文件

类控制器

类控制器是真正做事情的Handler,web配置好了之后,来看看处理器类是怎么写的:

//LoginController.java
@Controller
@RequestMapping("/admin")
public class LoginController {
    @RequestMapping(value = "/login", method = RequestMethod.GET)
    @ResponseBody
    public String login() {
        return "login success";
    }
}

上面例子中请求的URL后面的路径为:/admin/login,即方法上的@RequestMapping注解是在类的注解基础上的,如果类上没有@RequestMapping注解,则方法上注解的路径就是绝对路径了。
另外注解@ResponseBody表示直接返回结果,否则,返回的字符串会被当成一个模板文件(如jsp),具体内容后续文章再说。

spring的配置

通过web配置,可以把请求转发到我们定义的类控制器中处理,前提是web项目能够找到我们定义的类控制器,这就需要在spring配置文件中来指定。
这里的spring配置跟之前的差不多,无非就是让Spring能够找到我们用@Controller注解的Bean,另外还需要添加<mvc:annotation-driven />来支持SpringMVC注解

<!-- 支持SpringMVC注解 -->
<mvc:annotation-driven />
<!-- 扫描 LoginController 所在的包 -->
<context:component-scan base-package="com.test.springMVC"/>