springMVC学习

springMvc

请求与响应 rest风格开发 ssm整合 拦截器

springmvc工作流程

  1. 网页发来请求

  2. 发送到tomcat服务器

  3. 发送给springmvc的DispatcherServlet

  4. 分发根据路径分发给不同的控制器类处理

实现步骤

  1. 导包 springmvc和servlet

  2. 制作springmvc控制器类等同于servlet功能 controller

  3. 初始化spring环境绑定springmvc加载对应的bean

  4. 初始化servlet容器,加载spring环境,并设置springmvc技术处理的请求

实例

  1. 导包

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.10.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.1</version>
                <configuration>
                    <port>8080</port>
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>

  2. 制作控制器类

    //spring管控注册为bean@Controller
    //定义处理请求的方法method()
    //定义请求的路径@RequestMapping("/hello")
    //设置响应结果为json@ResponseBody
    @Controller
    public class controller {
        @RequestMapping("/hello")
        @ResponseBody
        public String method(){
            return "{'key':'value'}";
        }
    }

  3. 初始化spring环境

    @Configuration
    @ComponentScan("com.hang.controller")
    public class springConfig {
    }

  4. 初始化servlet环境

    public class servletContainersInitConfig extends AbstractDispatcherServletInitializer {
        //加载springmvc相关配置
        @Override
        protected WebApplicationContext createServletApplicationContext() {
            AnnotationConfigWebApplicationContext app = new AnnotationConfigWebApplicationContext();
            app.register(SpringmvcConfig.class);
            return app;
        }
        //配置tomcat接收的哪些请求归springmvc管理
        @Override
        protected String[] getServletMappings() {
            return new String[]{"/"};
        }
        //加载spring相关配置
        @Override
        protected WebApplicationContext createRootApplicationContext() {
            return null;
        }
    }

springmvc工作流程分析

  1. 服务器启动,执行servletContainersInitConfig类,初始化web容器

  2. 执行creatServletApplicationContext方法,创建WebApplicationContext对象

  3. 加载springMvcConfig

  4. 执行componetScan加载对应的bean

  5. 加载controller类,每个@requestMapping的名称对应一个具体的方法(决定请求的处理方法)

  6. 执行getServletMappings方法,定义所有请求都通过springMvc(决定哪些路径归springmvc管)

单次请求过程分析

  1. 发送请求localhost/save

  2. web容器发现所有请求都经过springmvc,将请求交给springmvc处理

  3. 解析请求路径/save

  4. 由路径/save匹配到方法save()

  5. 执行save()方法

  6. 检测到有ResponseBody直接将save()方法的返回值作为响应体返回给请求方

controller加载控制与业务bean加载控制

  1. 方法一:spring加载所有包,排除掉controller中的bean

    @Configuration
    @ComponentScan(value = "com.hang",excludeFilters = @ComponentScan.Filter(
            type = FilterType.ANNOTATION,
            classes = Controller.class
    ))
    public class SpringConfig {
    }

  2. 方法二:spring加载bean设定精准范围,service,dao

    @Configuration
    @ComponentScan({"com.hang.service","com.hang.dao"})
    public class SpringConfig {
    }

请求与响应

请求路径

类上添加对应模块名称作为前缀+方法上的路径为后缀组成访问地址

参数

  • 发送:url?参数名称=参数值

  • 接受:形参 参数类型 参数名称

中文乱码处理(只有post请求有效)

  1. 在 servlet配置类中

  2. 重写getServletFilters();方法

  3. 添加编码过滤器 CharacterEncodingFilter

    @Override
        protected Filter[] getServletFilters() {
            CharacterEncodingFilter characterEncodingFilter=new CharacterEncodingFilter("UTF-8");
            return new Filter[]{characterEncodingFilter};
    ​
        }

中文乱码原因(页面加码与解码字符集不同导致)

  • 页面使用utf-8

  • tomcat解码使用iso-8859-1

  • 解决方法:使用iso-8859-1加码再使用utf-8解码

    String encode = URLEncoder.encode("张三", "utf-8");
    String decode = URLDecoder.decode(encode, "Iso-8859-1");
    //乱码 张丕
    System.out.println(URLDecoder.decode(URLEncoder.encode(decode, "iso-8859-1"), "utf-8"));
    ​

五种请求参数

  1. 普通参数:请求参数名称与接受名称参数不同,使用@requestParam绑定参数

  2. 实体类参数:请求参数与实体类属性名相同就行

  3. 实体类嵌套,引用类型属性:属性名.属性名.属性名

  4. 数组参数:同名参数放入数组

  5. 集合参数:使用@requestParam才能存数据将参数作为数据存储而不是属性.

json格式数据传输

  1. 导入json包

  2. 开启springmvc的json转化为对象功能@EnableWebMvc

  3. 使用@requestBody加载数据

  4. 发送json数据

日期参数

@DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")Date date

使用Converter接口的子类实现转换

响应

响应页面

页面名称(有后缀名)作为返回值,返回string

响应文本

方法上添加@responseBody

响应json

方法上添加@responseBody,返回json对象(实际对象),使用的外部json包转化,不是springmvc转换,需要导包.

转换原理,调用HttpMessageConverter做的转换与日期的转换不同

Restful

查询 get

删除delete

新增post

修改put

习惯将请求地址+s users/***

参数获取

使用@PathVariable 将形参名称写入路径中

@RequestMapping(value = "/parma9/{id}",method = RequestMethod.GET)
public String parma9(@PathVariable int id){
    System.out.println(id);
    return "{'model':'webmvc'}";}

springmvc使用aop的时候要在springmvc的配置中写@EnableAspectJAutoProxy否则controller的aop不生效

简化开发

@RestController 由@Controller和@ResponseBody组成

@GetMapping get方式的请求

@PostMapping post方式的请求

@DeleteMapping delete方式的请求

@PutMapping put方式的请求

静态资源放行

访问静态页面的时候不通过springmvc,通过tomcat直接访问

  1. 继承WebMvcConfigurationSupport类

  2. 重写addResourceHandlers()方法

  3. 添加对应访问路径的访问地址

    @Configuration
    public class springMVCSupport extends WebMvcConfigurationSupport {
        @Override
        protected void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/page/**").addResourceLocations("/page/");
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值