• SpringMVC学习系列(2) 之 经典的HelloWorld实现


    前一篇简单介绍了Spring MVC的一些知识,下面就要开始学习如何把Spring MVC运用到具体的项目中去。

    首先还是从一个简单的Hello World项目说起:

    我机器的开发环境为:

    Ubuntu12.04(不同操作系统对本系列项目没有影响);

    开发工具:Eclipse For JavaEE;

    数据库:MySql5.5.35;

    运行环境:TomCat V7.0;

    JDK:JDK 1.7.0_45;

    项目工程为:Dynamic Web Project;

    一、项目依赖的jar包:

    1.Spring框架依赖的jar包:

    日志:commons-logging-1.1.3.jar;

    JSTL支持:jakarta-taglibs-standard-1.1.2中的jstl.jar和standard.jar;

    2.Spring的jar包:

    spring-framework-3.2.5.RELEASE/libs中的jar包(这里为了方便我直接把全部都复制过去了);

    把以上的jar包全部复制到项目的WebContent/WEB-INF/lib目录中。

    二、在/WEB-INF中添加web.xml文件,文件内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
      <display-name>SpringMVCLesson</display-name> 
            
        <servlet>
            <servlet-name>SpringMVCLesson</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springservlet-config.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup><!-- load-on-startup必须放在最后 -->
        </servlet>
        <!-- Spring MVC配置文件结束 -->
        
        <servlet-mapping>
            <servlet-name>SpringMVCLesson</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
        
    </web-app>

    首先是配置DispatcherServlet,根据系列(1)的Spring MVC响应流程图,可以看出DispatcherServlet主要就是拦截请求,然后调用对应的Controller和Action,解析和渲染指定的视图并返回响应 。

    其中classpath:springservlet-config.xml指定具体的配置文件为springservlet-config.xml。

    <load-on-startup>1</load-on-startup>是启动顺序,让这个Servlet随Servletp容器一起启动,必须放在<servlet> 配置的最后。

    servlet-mapping中的<servlet-name>指定配置的是哪个servlet<url-pattern>则指定拦截哪些请求到该servlet,这里配置的是拦截全部请求

    三、springservlet-config.xml文件配置:

    在项目中新建一个resources的Source Folder文件夹,并添加springservlet-config.xml文件。

    <?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:p="http://www.springframework.org/schema/p" 
      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:util="http://www.springframework.org/schema/util"
      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/util
      http://www.springframework.org/schema/util/spring-util.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" >
        
        <!-- 默认的注解映射的支持 -->  
        <mvc:annotation-driven/>
          
        <!-- 如果当前请求为“/”时,则转发到“/helloworld/index” -->
        <mvc:view-controller path="/" view-name="forward:/helloworld/index"/> 
        <!-- 静态资源映射 -->
        <mvc:resources mapping="/js/**" location="/WEB-INF/js/" />
        <mvc:resources mapping="/css/**" location="/WEB-INF/css/" />
        <mvc:resources mapping="/fonts/**" location="/WEB-INF/fonts/" />
        <mvc:resources mapping="/plugins/**" location="/WEB-INF/plugins/" />
        <mvc:resources mapping="images/**" location="/WEB-INF/images/" />
        <!-- 当上面要访问的静态资源不包括在上面的配置中时,则根据此配置来访问 -->
        <mvc:default-servlet-handler/>
    
        <!-- 开启controller注解支持 -->
        <!-- use-default-filters="false" 只扫描指定的注解 -->
        <context:component-scan base-package="com.demo.web.controllers" use-default-filters="false">
            <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
          
        <!-- 视图解析器 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
           <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
           <property name="contentType" value="text/html"/>        
           <property name="prefix" value="/WEB-INF/views/"/>
           <property name="suffix" value=".jsp"/>
        </bean>
        
    </beans>

    <mvc:annotation-driven/> 开启注解映射支持,它是为了简化配置的缩写形式,它相当于以下2个配置:

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

    由于我们在web.xml文件里面配置的是拦截所有的请求到该servlet,所以我们在这里要对静态资源文件映射作一下配置,否则请求这些资源文件会返回404

    <!-- 静态资源映射 -->
    <mvc:resources mapping="/js/**" location="/WEB-INF/js/" />
    <mvc:resources mapping="/css/**" location="/WEB-INF/css/" />
    <mvc:resources mapping="/fonts/**" location="/WEB-INF/fonts/" />
    <mvc:resources mapping="/plugins/**" location="/WEB-INF/plugins/" />
    <mvc:resources mapping="images/**" location="/WEB-INF/images/" />
    <!-- 当上面要访问的静态资源不包括在上面的配置中时,则根据此配置来访问 -->
    <mvc:default-servlet-handler/>

    开启Controller注解支持,并配置只扫描指定包下面的Controller:

    <context:component-scan base-package="com.demo.web.controllers" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    配置视图解析器,并指定视图所在的文件夹:

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
       <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
       <property name="contentType" value="text/html"/>        
       <property name="prefix" value="/WEB-INF/views/"/>
       <property name="suffix" value=".jsp"/>
    </bean>

    添加HelloWorldController,在项目中新建一个web的Source Folder文件夹,并在文件夹下面添加com.demo.web.controllers包,在包中添加一个HelloWorldController类,类中内容如下:

    package com.demo.web.controllers;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.servlet.ModelAndView;
    
    @Controller
    @RequestMapping(value = "/helloworld")
    public class HelloWorldController {
    
        @RequestMapping(value="/index", method = {RequestMethod.GET})
        public ModelAndView index(){
            
            ModelAndView modelAndView = new ModelAndView();  
            modelAndView.addObject("message", "Hello World!");  
            modelAndView.setViewName("index");  
            return modelAndView;
        }
        
    }

    其中@Controller 注解把该class指定为controller,controller 上的@RequestMapping 注解的 value值指定该controller所映射的请求。

    方法上的@RequestMapping 注解指定该方法为一个action,value 值指定该action所映射的请求,method 中的RequestMethod.GET指定该action只接受get请求。

    ModelAndView 中的setViewName指定了该action所对应的视图名称,解析视图时会在springservlet-config.xml文件指定的视图文件夹中寻找对应的视图。

    添加视图,在项目/WEB-INF文件夹下新建一个views文件夹,并在views中添加index.jsp视图,视图内容如下:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        ${message}
    </body>
    </html>

    运行项目,由于我们之前配置了:<mvc:view-controller path="/" view-name="forward:/helloworld/index"/> 所以直接可以看到结果:

    1

    把请求的URL地址改为配置的地址:http://localhost:8080/SpringMVCLesson/helloworld/index,可以看到结果相同:

    2

    代码下载:http://pan.baidu.com/s/1o6LRw7o

    注:之前没注意前11篇的示例代码,不知道为什么当时打包上传上去的是没有.project项目文件的,导致下载后不能直接导入eclipse运行,虚拟机又被我删掉了,这些示例代码也没有备份,但是代码文件还在的,所以可以新建一个Dynamic Web Project把对应的配置文件和controller还有view导入就可以了,给大家造成的不便说声抱歉。

  • 相关阅读:
    【前端】
    Ember.js 应用入口
    Apache 反向代理实现为http添加https的外衣
    OAuth2.0 四种授权模式
    MongoDB查询重复记录并保存到文件csv
    8000用户同时在线的服务器需求分析
    Bootstrap杂记
    Virtual Box 杂记
    RESTful API你怎么看?
    使用 ASP.NET Core 作为 mediasoup 的信令服务器
  • 原文地址:https://www.cnblogs.com/liukemng/p/3725582.html
Copyright © 2020-2023  润新知