springmvc搭建传统web项目

springmvc的核心在于其流程,这是使用Springmvc框架的基础,它是一种基于servlet的技术。提供了核心控制器DispatcherServlet和相关组件。servlet初始化时,springmvc会根据配置获取配置信息,从而得到统一资源标识符(URI)和处理器(Handler)之间的映射关系(HandlerMapping),为了更加灵活和增强功能,springmvc还会给处理器加入拦截器,这样就构成了一个处理器的执行链,并且根据上下文初始化视图解析器等内容,当处理器返回的时候就可以通过视图解析器定位视图,然后将数据模型渲染到视图中。以下图片从网上拷贝:
springmvc流程图

springmvc的组件和流程

当一个请求到来时,DispatcherServlet首先通过请求和事先解析好的HandlerMapping配置,找到对应的处理器(Handler),通过处理器的适配器(HandlerAdapter)来运行对应的处理器及其拦截器,在处理器返回模型和视图给DispatcherServlet后,DispatcherServlet就会把对应的视图信息传递给视图解析器(ViewResolver)。如果使用逻辑视图,视图解析器就会解析它,否则直接通过视图渲染数据模型。
1、web.xml

<!--配置spring IOC配置文件路径,如果有多个文件可以用逗号将他们分隔开,默认值是/WEB-INF/applicationContext.xml-->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        classpath*:/spring.xml
    </param-value>
</context-param>
<!--配置ContextLoaderListener用以初始化SpringIOC容器-->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>
<!--springmvc会根据servlet-name找到对应的配置文件,默认情况下的路径为/WEB-INF/springMvc-servlet.xml,
也可以通过下面的init-param指定,如src/main/resources下创建/spring/spring-mvc.xml-->
<servlet>
    <servlet-name>springMvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:/spring/spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>springMvc</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter
        </filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

默认会根据servlet-name找到相应的配置文件servletName-servlet.xml,这里采用指定的文件路径
2、spring-mvc.xml文件

<!-- 使用annotation 自动注册bean,并保证@Required,@Autowired的属性被注入 -->
<context:annotation-config/>
<!--表示使用注解驱动SpringMvc-->
<mvc:annotation-driven/>
<!--它有一个use-default-filters属性,该属性默认为true,扫描并装载指定包下的bean-->
<context:component-scan base-package="com.changhf"/>
<!-- 定义受环境影响易变的变量 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
    <property name="ignoreResourceNotFound" value="false"/>
    <property name="locations">
        <list>
        <value>classpath*:/config.properties</value>
        </list>
    </property>
</bean>

<!-- 处理静态资源请求,由web应用服务器处理 -->
<mvc:default-servlet-handler/>
<!--定义视图解析器,如果前后端分离,可以不加该解析器-->
<bean id="viewResolver"
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/view/" p:suffix=".jsp"/>
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 设置上传文件的最大尺寸为1MB -->
    <property name="maxUploadSize">
        <value>2097152</value>
    </property>
</bean>

<mvc:annotation-driven/>该注解一定要配置,不然无法装载bean。

p:prefix="abc"和如下写法同样效果

<property name="prefix">
    <value>abc</value>
</property>

3、DemoController.java

@Controller
@RequestMapping("/demo")
public class DemoController {

    @RequestMapping("/index")
    @ResponseBody
    public String index() {
        return "hello world";
    }
    @RequestMapping("/home")
    public ModelAndView home() {
        ModelAndView mv = new ModelAndView();
        mv.setViewName("home");
        return mv;
    }
}

这里测试时index()没有采用相应的任何逻辑视图,而是直接返回一个字符串,所以需要加上@ResponseBody,home()返回”/WEB-INF/view/home.jsp”。

springmvc开发流程

当启动Springmvc的时候,Springmvc就会去解析@Controller中的@RequestMapping的配置,再结合所配置的拦截器,这样它就会2组成多个拦截器和一个控制器的形式,存放到一个HandlerMapping中去。当请求来到服务器,首先是通过请求信息找到对应的HandlerMapping,进而可以找到对应的拦截器和处理器,这样就能够运行对应的控制器和拦截器。

DispatcherServlet和ContextLoaderListener

同一个web容器中,只允许存在一个ContextLoaderListener,但可以存在多个DispatcherServlet,DispatcherServlet和ContextLoaderListener在初始化时分别会生成一个WebApplicationContext,获取bean组件时,会先从DispatcherServlet的WebApplicationContext中查找,若不存在再通过ContextLoaderListener的WebApplicationContext查找,DispatcherServlet除了会装载bean之外,更重要的是会自动加载与springMvc相关的bean,如RequestMapping、ViewResolver、ExceptionHandler等

猜你喜欢

转载自blog.csdn.net/chang_li/article/details/79780797
今日推荐