百木园-与人分享,
就是让自己快乐。

java学习之SpringMVC

0x00前言

Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet。

Spring MVC 是结构最清晰的 Servlet+JSP+JavaBean 的实现,是一个典型的教科书式的 MVC 构架,不像 Struts 等其它框架都是变种或者不是完全基于 MVC 系统的框架。

Spring MVC 角色划分清晰,分工明细,并且和 Spring 框架无缝结合。Spring MVC 是当今业界最主流的 Web 开发框架,以及最热门的开发技能。

在 Spring MVC 框架中,Controller 替换 Servlet 来担负控制器的职责,用于接收请求,调用相应的 Model 进行处理,处理器完成业务处理后返回处理结果。Controller 调用相应的 View 并对处理结果进行视图渲染,最终客户端得到响应信息

0x01springmvc介绍

  • SpringMVC一种基于Java实现MVC模型的轻量级Web框架
  • 使用简单方便开发,是简化版的servlt
  • 用于表现层开发的一种框架
  • 现在都采用注解开发更加方便

0x02SpringMVC简单入门

是属于sping容器的spring又是ioc模式的所要把所有都配置成bean

写一个配置类

//springmvc配置类,本质上还是一个spring配置类
@Configuration
@ComponentScan(\"com.itheima.controller\")
public class SpringMvcConfig {
}

写加载类去加载spring容器里的bean

package com.itheima.config;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;

//web容器配置类
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    //加载springmvc配置类,产生springmvc容器(本质还是spring容器)
    protected WebApplicationContext createServletApplicationContext() {
        //初始化WebApplicationContext对象
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        //加载指定配置类
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }

    //设置由springmvc控制器处理的请求映射路径
    protected String[] getServletMappings() {
        return new String[]{\"/\"};
    }

    //加载spring配置类
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

控制器

package com.itheima.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

//定义表现层控制器bean
@Controller
public class UserController {

    //设置映射路径为/save,即外部访问路径
    @RequestMapping(\"/save\")
    //设置当前操作返回结果为指定json数据(本质上是一个字符串信息)
    @ResponseBody
    public String save(){
        System.out.println(\"user save ...\");
        return \"{\'info\':\'springmvc\'}\";
    }

    //设置映射路径为/delete,即外部访问路径
    @RequestMapping(\"/delete\")
    @ResponseBody
    public String delete(){
        System.out.println(\"user save ...\");
        return \"{\'info\':\'springmvc\'}\";
    }
}

  1. 简单配置就说的是用@@RequestMapping作为访问的路径
  2. @ResponseBody写在函数上面就可以用该函数的返回值作为响应值,也可以设置请求方式

0x03MVC常用注解

0x1配置简化开发

package com.itheima.config;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
//web配置类简化开发,仅设置配置类类名即可
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {

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

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

    protected String[] getServletMappings() {
        return new String[]{\"/\"};
    }
}
/*

public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }
    protected WebApplicationContext createRootApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringConfig.class);
        return ctx;
    }
    protected String[] getServletMappings() {
        return new String[]{\"/\"};
    }

}
*/

0x2路径配置

@Controller
//类上方配置的请求映射与方法上面配置的请求映射连接在一起,形成完整的请求映射路径
@RequestMapping(\"/user\")
public class UserController {
    //请求路径映射
    @RequestMapping(\"/save\")
    @ResponseBody
    public String save(){
        System.out.println(\"user save ...\");
        return \"{\'module\':\'user save\'}\";
    }
    //请求路径映射
    @RequestMapping(\"/delete\")
    @ResponseBody
    public String delete(){
        System.out.println(\"user delete ...\");
        return \"{\'module\':\'user delete\'}\";
    }

}
  1. 访问第一个方法的路径是/user/save
  2. 第二个方法的路径是/user/delete

0x3请求方式和注解

//请求参数
@Controller
public class UserController {

    //普通参数:请求参数与形参名称对应即可完成参数传递
    @RequestMapping(\"/commonParam\")
    @ResponseBody
    public String commonParam(String name ,int age){
        System.out.println(\"普通参数传递 name ==> \"+name);
        System.out.println(\"普通参数传递 age ==> \"+age);
        return \"{\'module\':\'common param\'}\";
    }

    //普通参数:请求参数名与形参名不同时,使用@RequestParam注解关联请求参数名称与形参名称之间的关系
    @RequestMapping(\"/commonParamDifferentName\")
    @ResponseBody
    public String commonParamDifferentName(@RequestParam(\"name\") String userName , int age){
        System.out.println(\"普通参数传递 userName ==> \"+userName);
        System.out.println(\"普通参数传递 age ==> \"+age);
        return \"{\'module\':\'common param different name\'}\";
    }

    //POJO参数:请求参数与形参对象中的属性对应即可完成参数传递
    @RequestMapping(\"/pojoParam\")
    @ResponseBody
    public String pojoParam(User user){
        System.out.println(\"pojo参数传递 user ==> \"+user);
        return \"{\'module\':\'pojo param\'}\";
    }

    //嵌套POJO参数:嵌套属性按照层次结构设定名称即可完成参数传递
    @RequestMapping(\"/pojoContainPojoParam\")
    @ResponseBody
    public String pojoContainPojoParam(User user){
        System.out.println(\"pojo嵌套pojo参数传递 user ==> \"+user);
        return \"{\'module\':\'pojo contain pojo param\'}\";
    }

    //数组参数:同名请求参数可以直接映射到对应名称的形参数组对象中
    @RequestMapping(\"/arrayParam\")
    @ResponseBody
    public String arrayParam(String[] likes){
        System.out.println(\"数组参数传递 likes ==> \"+ Arrays.toString(likes));
        return \"{\'module\':\'array param\'}\";
    }

    //集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
    @RequestMapping(\"/listParam\")
    @ResponseBody
    public String listParam(@RequestParam List<String> likes){
        System.out.println(\"集合参数传递 likes ==> \"+ likes);
        return \"{\'module\':\'list param\'}\";
    }


    //集合参数:json格式
    //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
    //2.使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
    @RequestMapping(\"/listParamForJson\")
    @ResponseBody
    public String listParamForJson(@RequestBody List<String> likes){
        System.out.println(\"list common(json)参数传递 list ==> \"+likes);
        return \"{\'module\':\'list common for json param\'}\";
    }

    //POJO参数:json格式
    //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
    //2.使用@RequestBody注解将外部传递的json数据映射到形参的实体类对象中,要求属性名称一一对应
    @RequestMapping(\"/pojoParamForJson\")
    @ResponseBody
    public String pojoParamForJson(@RequestBody User user){
        System.out.println(\"pojo(json)参数传递 user ==> \"+user);
        return \"{\'module\':\'pojo for json param\'}\";
    }

    //集合参数:json格式
    //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
    //2.使用@RequestBody注解将外部传递的json数组数据映射到形参的保存实体类对象的集合对象中,要求属性名称一一对应
    @RequestMapping(\"/listPojoParamForJson\")
    @ResponseBody
    public String listPojoParamForJson(@RequestBody List<User> list){
        System.out.println(\"list pojo(json)参数传递 list ==> \"+list);
        return \"{\'module\':\'list pojo for json param\'}\";
    }

    //日期参数
    //使用@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd
    @RequestMapping(\"/dataParam\")
    @ResponseBody
    public String dataParam(Date date,
                            @DateTimeFormat(pattern=\"yyyy-MM-dd\") Date date1,
                            @DateTimeFormat(pattern=\"yyyy/MM/dd HH:mm:ss\") Date date2){
        System.out.println(\"参数传递 date ==> \"+date);
        System.out.println(\"参数传递 date1(yyyy-MM-dd) ==> \"+date1);
        System.out.println(\"参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> \"+date2);
        return \"{\'module\':\'data param\'}\";
    }

}


  1. 请求方式的配置是在路径也就是@RequestMapping后面配上method=request.get/post/put/delete
  2. 当输入的参数和获取的参数不同时候用,@RequestParam(\"name\")这种类似的标签给形参绑定值,如果形参和传入值相同的话可以不用谢注解

0x4JSON传输

package com.itheima.controller;

import com.itheima.domain.User;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Arrays;
import java.util.Date;
import java.util.List;
//请求参数
@Controller
public class UserController {

    //普通参数:请求参数与形参名称对应即可完成参数传递
    @RequestMapping(\"/commonParam\")
    @ResponseBody
    public String commonParam(String name ,int age){
        System.out.println(\"普通参数传递 name ==> \"+name);
        System.out.println(\"普通参数传递 age ==> \"+age);
        return \"{\'module\':\'common param\'}\";
    }

    //普通参数:请求参数名与形参名不同时,使用@RequestParam注解关联请求参数名称与形参名称之间的关系
    @RequestMapping(\"/commonParamDifferentName\")
    @ResponseBody
    public String commonParamDifferentName(@RequestParam(\"name\") String userName , int age){
        System.out.println(\"普通参数传递 userName ==> \"+userName);
        System.out.println(\"普通参数传递 age ==> \"+age);
        return \"{\'module\':\'common param different name\'}\";
    }

    //POJO参数:请求参数与形参对象中的属性对应即可完成参数传递
    @RequestMapping(\"/pojoParam\")
    @ResponseBody
    public String pojoParam(User user){
        System.out.println(\"pojo参数传递 user ==> \"+user);
        return \"{\'module\':\'pojo param\'}\";
    }

    //嵌套POJO参数:嵌套属性按照层次结构设定名称即可完成参数传递
    @RequestMapping(\"/pojoContainPojoParam\")
    @ResponseBody
    public String pojoContainPojoParam(User user){
        System.out.println(\"pojo嵌套pojo参数传递 user ==> \"+user);
        return \"{\'module\':\'pojo contain pojo param\'}\";
    }

    //数组参数:同名请求参数可以直接映射到对应名称的形参数组对象中
    @RequestMapping(\"/arrayParam\")
    @ResponseBody
    public String arrayParam(String[] likes){
        System.out.println(\"数组参数传递 likes ==> \"+ Arrays.toString(likes));
        return \"{\'module\':\'array param\'}\";
    }

    //集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
    @RequestMapping(\"/listParam\")
    @ResponseBody
    public String listParam(@RequestParam List<String> likes){
        System.out.println(\"集合参数传递 likes ==> \"+ likes);
        return \"{\'module\':\'list param\'}\";
    }


    //集合参数:json格式
    //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
    //2.使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
    @RequestMapping(\"/listParamForJson\")
    @ResponseBody
    public String listParamForJson(@RequestBody List<String> likes){
        System.out.println(\"list common(json)参数传递 list ==> \"+likes);
        return \"{\'module\':\'list common for json param\'}\";
    }

    //POJO参数:json格式
    //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
    //2.使用@RequestBody注解将外部传递的json数据映射到形参的实体类对象中,要求属性名称一一对应
    @RequestMapping(\"/pojoParamForJson\")
    @ResponseBody
    public String pojoParamForJson(@RequestBody User user){
        System.out.println(\"pojo(json)参数传递 user ==> \"+user);
        return \"{\'module\':\'pojo for json param\'}\";
    }

    //集合参数:json格式
    //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
    //2.使用@RequestBody注解将外部传递的json数组数据映射到形参的保存实体类对象的集合对象中,要求属性名称一一对应
    @RequestMapping(\"/listPojoParamForJson\")
    @ResponseBody
    public String listPojoParamForJson(@RequestBody List<User> list){
        System.out.println(\"list pojo(json)参数传递 list ==> \"+list);
        return \"{\'module\':\'list pojo for json param\'}\";
    }

    //日期参数
    //使用@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd
    @RequestMapping(\"/dataParam\")
    @ResponseBody
    public String dataParam(Date date,
                            @DateTimeFormat(pattern=\"yyyy-MM-dd\") Date date1,
                            @DateTimeFormat(pattern=\"yyyy/MM/dd HH:mm:ss\") Date date2){
        System.out.println(\"参数传递 date ==> \"+date);
        System.out.println(\"参数传递 date1(yyyy-MM-dd) ==> \"+date1);
        System.out.println(\"参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> \"+date2);
        return \"{\'module\':\'data param\'}\";
    }

}

  1. public String listPojoParamForJson(@RequestBody List<User> list)
  2. 这个方法中注解代表的意思是形参接受的是请求头中的流量
  3. 在config文件里面加上//开启json数据类型自动转换 @EnableWebMvc
  4. json是以后很常用的传输方式

0x5响应

@Controller
public class UserController {

    //响应页面/跳转页面
    //返回值为String类型,设置返回值为页面名称,即可实现页面跳转
    @RequestMapping(\"/toJumpPage\")
    public String toJumpPage(){
        System.out.println(\"跳转页面\");
        return \"page.jsp\";
    }

    //响应文本数据
    //返回值为String类型,设置返回值为任意字符串信息,即可实现返回指定字符串信息,需要依赖@ResponseBody注解
    @RequestMapping(\"/toText\")
    @ResponseBody
    public String toText(){
        System.out.println(\"返回纯文本数据\");
        return \"response text\";
    }

    //响应POJO对象
    //返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的json数据,需要依赖@ResponseBody注解和@EnableWebMvc注解
    @RequestMapping(\"/toJsonPOJO\")
    @ResponseBody
    public User toJsonPOJO(){
        System.out.println(\"返回json对象数据\");
        User user = new User();
        user.setName(\"itcast\");
        user.setAge(15);
        return user;
    }

    //响应POJO集合对象
    //返回值为集合对象,设置返回值为集合类型,即可实现返回对应集合的json数组数据,需要依赖@ResponseBody注解和@EnableWebMvc注解
    @RequestMapping(\"/toJsonList\")
    @ResponseBody
    public List<User> toJsonList(){
        System.out.println(\"返回json集合数据\");
        User user1 = new User();
        user1.setName(\"传智播客\");
        user1.setAge(15);

        User user2 = new User();
        user2.setName(\"黑马程序员\");
        user2.setAge(12);

        List<User> userList = new ArrayList<User>();
        userList.add(user1);
        userList.add(user2);

        return userList;
    }
}

  1. 想返回一个页面直接把方法的返回值写成String然后返回那个页面的名字写在哪里
  2. 响应文本数据
    返回值为String类型,设置返回值为任意字符串信息,即可实现返回指定字符串信息,需要依赖@ResponseBody注解
  3. 响应POJO对象
    //返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的json数据,需要依赖@ResponseBody注解和@EnableWebMvc注解
  4. 响应POJO集合对象
    返回值为集合对象,设置返回值为集合类型,即可实现返回对应集合的json数组数据,需要依赖@ResponseBody注解和@EnableWebMvc注解

0x04总结

SpringMvc相较于Servlet开发简单了很多只需要常用的注解,我们需要记住的是它用了那些方式去传输数据和验证数据,方便以后对java框架的审计,mvc有很多内容是和Servlet重复的我只需要大概的复习一遍,解下来还有最后一点mvc的只是就是拦截器。


来源:https://www.cnblogs.com/0x3e-time/p/16446710.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » java学习之SpringMVC

相关推荐

  • 暂无文章