spring从头开始(五)---spring web开发

spring web

MVC

在web应用中,贯穿全局的一个关键角色就是request。
这里写图片描述
1. 一个request离开浏览器到达服务端。首先到DispatcherServlet。由DispatcherServlet分发给某个spring controller。
2. 一般一个应用会有很多controller。具体应该分发给哪个controller呢?DispatcherServlet会根据handler mapping判断。
3. controller处理具体业务请求,组装返回的响应。
4. 响应一般是以model和view的形式返回。
5. DispatcherServlet调用view resolver对view进行渲染。

构建spring mvc工程

从上面可以看出DispatcherServlet是核心。
那么从配置DispatcherServlet入手。
一般我们在web.xml中配置DispatcherServlet。从spring 3.1之后我们可以使用java config配置。

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { RootConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { WebConfig.class };
    }
}

pom中的依赖:

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.6.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.2.6.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.2.6.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>

请注意javaee-api是为了在编译时引入Servlet api。

任何实现AbstractAnnotationConfigDispatcherServletInitializer接口的类,都会被发现并用于配置servlet context。
我们会覆写其中的方法,getServletMappings()做的是url的映射。这里非常简单,全部都映射到“/”。

当DispatcherServlet启动的时候,会创建Spring application context,然后开始加载bean。这个getServletConfigClasses()方法,就是从WebConfig类的配置中加载bean(这里使用java config)。

DispatcherServlet创建的这种application context,主要用于加载controllers, view resolvers, 和 handler mappings等。
还有一种application context,由ContextLoaderListener创建,主要用于加载中间件,数据库操作等基础组件。

AbstractAnnotationConfigDispatcherServletInitializer 可以创建 DispatcherServletContextLoaderListener. 从getServletConfigClasses() 返回的被 @Configuration 注解的类是用于 DispatcherServlet的application context. 从getRootConfigClasses() 返回的被 @Configuration 注解的类是用于 ContextLoaderListener的application context.

这种java config是web.xml配置的一种可替代,但是要注意这个只能部署在支持Servlet 3.0以上的server中,
如tomcat7及以上。

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@Configuration
@EnableWebMvc
public class WebConfig {
}

这是最简单的一个WebConfig。注意@EnableWebMvc用于使能spring mvc组件。
这个webConfig是空的,啥也干不了,完善一下代码:

@Configuration
@EnableWebMvc
@ComponentScan("yunsheng")
public class WebConfig extends WebMvcConfigurerAdapter {
    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        resolver.setExposeContextBeansAsAttributes(true);
        return resolver;
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}
  1. 增加了自动扫描ComponentScan
  2. 增加了一个viewResolver。并声明为一个bean。作用是,如一个名为home的view,会被解析指定为/WEB_INF/views/home.jsp。
  3. 继承WebMvcConfigurerAdapter,并重写了configureDefaultServletHandling方法。在其中设置configurer.enable()的作用是告诉DispatcherServlet对静态资源的请求不要处理,直接交给容器默认的servlet。
controller

在spring mvc中controller是指这样的类:他们的方法被@RequestMapping注解,以表明自己处理什么类型的请求。
如:

package yunsheng.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import static org.springframework.web.bind.annotation.RequestMethod.*;

@Controller
public class HomeController {

    @RequestMapping(value = "/", method = GET)
    public String home() {
        return "home";
    }

}

当有一个对根目录的GET请求到达,这个home方法会执行,返回的就是view的名字。然后DispatcherServlet会调用上面的viewResolver方法,执行解析,得到最终view路径:/WEB_INF/views/home.jsp
随便写一下这个jsp。
这个controller也得requestmapping也可以写成类级别的。

@Controller
@RequestMapping("/")
public class HomeController {

    @RequestMapping(method = GET)
    public String home() {
        return "home";
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值