SpringMVC

本文详细介绍了SpringMVC的优势,如与IOC容器的无缝对接、全面的解决方案和卓越性能。讲解了表述层框架需要解决的问题,如请求映射和数据校验。通过代码对比展示了SpringMVC相较于原生ServletAPI的简洁性,并提供了参数处理的实例,包括GET和POST请求、乱码处理、不同类型的参数传递(如POJO、数组、集合)。此外,还阐述了JSON数据的传递方法及日期类型的参数处理。
摘要由CSDN通过智能技术生成

1、SpringMVC 优势

SpringMVC 是 Spring 为表述层开发提供的一整套完备的解决方案。在表述层框架历经 Strust、WebWork、Strust2 等诸多产品的历代更迭之后,目前业界普遍选择了 SpringMVC 作为 Java EE 项目表述层开发的首选方案。之所以能做到这一点,是因为 SpringMVC 具备如下显著优势:

Spring 家族原生产品,与 IOC 容器等基础设施无缝对接
表述层各细分领域需要解决的问题全方位覆盖,提供全面解决方案
代码清新简洁,大幅度提升开发效率
内部组件化程度高,可插拔式组件即插即用,想要什么功能配置相应组件即可
性能卓著,尤其适合现代大型、超大型互联网项目要求

2、表述层框架要解决的基本问题

请求映射
数据输入
视图界面
请求分发
表单回显
会话控制
过滤拦截
异步交互
文件上传
文件下载
数据校验
类型转换

3、SpringMVC 代码对比

①基于原生 Servlet API 开发代码片段

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {   
    
    String userName = request.getParameter("userName");
    
    System.out.println("userName="+userName);
    
}

②基于 SpringMVC 开发代码片段

@RequestMapping("/user/login")
public String login(@RequestParam("userName") String userName){
    
    System.out.println("userName="+userName);
    
    return "result";
}
 

4、

1、修改pom文件的打包方式为war

    <packaging>war</packaging>

2、创建web.xml文件
在这里插入图片描述

5、获取传递参数

1.使用SpringMVC技术需要先导入SpringMVC的依赖坐标和servlet的坐标

    <dependencies>
<!-- SpringMVC-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.1</version>
        </dependency>
        <!--ServletAPI-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
        </dependency>

    </dependencies>

2.控制器

//声明beanSpringMVC使用@Controller定义bean
@Controller
public class UserController {
    //设置访问路径
    @RequestMapping("/save")
    //设置当前操作的返回值类型
    @ResponseBody
    public String save(){
        System.out.println("user save");
        return "{'module':'springmvc'}";
    }
}

3.加载控制器Controller对应的Bean

//创建SpringMVC的配置文件,加载Controller对应的Bean
@Configuration
@ComponentScan("com.itheima.controller")

public class SpringConfig {

}

4.定义一个Servlet容器的启动配置类

public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {


    //加载springMVC容器配置
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx=new AnnotationConfigWebApplicationContext();
        ctx.register(SpringConfig.class);
        return ctx;
    }

    //设置那些请求归属springMVC
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

//加载Spring容器配置
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

简化开发:

public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }

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

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }


//    //加载springMVC容器配置
//    protected WebApplicationContext createServletApplicationContext() {
//        AnnotationConfigWebApplicationContext ctx=new AnnotationConfigWebApplicationContext();
//        ctx.register(SpringMVCConfig.class);
//        return ctx;
//    }
//
//    //设置那些请求归属springMVC
//    protected String[] getServletMappings() {
//        return new String[]{"/"};
//    }
//
加载Spring容器配置
//    protected WebApplicationContext createRootApplicationContext() {
//        AnnotationConfigWebApplicationContext ctx=new AnnotationConfigWebApplicationContext();
//        ctx.register(SpringConfig.class);
//        return ctx;
//    }

}

get请求与post请求发送普通参数

1.一个参数(get)

只需要修改形参的值即可

@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name){
    System.out.println("普通参数传递"+name);
    return "{'module': 'commonParam'}";
}

使用postman发送请求

image-20220720143044590

控制台输出:

image-20220720143009103

2.两个参数(get)

   @RequestMapping("/commonParam")
    @ResponseBody
    public String commonParam(String name,int age){
        System.out.println("普通参数传递"+name+age);
        return "{'module': 'commonParam'}";
    }


image-20220720143307574

image-20220720143316478

3.post

image-20220720143640899

image-20220720143604191

4.乱码的处理

当我们发送的数据中有中文时,出现乱码

处理方法:

在Servler容器中设置过滤器

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

image-20220720144056124

5.当传入的参数名和形参名不一致时

使用@RequestParam注解

@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(@RequestParam("name") String username, int age){
    System.out.println("普通参数传递"+username+age);
    return "{'module': 'commonParam'}";
}

image-20220720144622721

其他四种类型的参数传递

1.POJO参数

传入参数自动封装成实体类

    @RequestMapping("/pojoParam")
    @ResponseBody
public String pojoParam(User user){
    System.out.println("pojo参数传递:"+user);
    return "{'module': 'pojoParam'}";
}

image-20220720145139333

image-20220720145155825

2.POJO嵌套POJO数据

Address实体类:

public class Address {
    private String province;

    private String city;

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    @Override
    public String toString() {
        return "Address{" +
                "province='" + province + '\'' +
                ", city='" + city + '\'' +
                '}';
    }
}

重写use实体类的构造

public class User {

    private String username;
    private  int age ;
   private Address address;


   public  Address getAddress(){
       return address;
   }

    public void setAddress(Address address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", age=" + age +
                ", address=" + address +
                '}';
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }


}

发送数据

image-20220720150022772

image-20220720145705719

3.数组参数

//数组

    @RequestMapping("/arrayParam")
    @ResponseBody
    public String arrayParam(String[] hobby){


        System.out.println("数组参数传递:"+ Arrays.toString(hobby));

        return "{'module': 'arrayParam'}";
    }

image-20220720150617372

image-20220720150637124

4.集合参数

    //集合参数
    @RequestMapping("/listParam")
    @ResponseBody
public String ListParam(List<String> arrayList){

        System.out.println("集合参数传递:"+arrayList);
           return "{'module': 'listParam'}";

    }

image-20220720150936803

报错:

严重: Servlet.service() for servlet [dispatcher] in context with path [/springmvc-demo] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: No primary or default constructor found for interface java.util.List] with root cause
java.lang.NoSuchMethodException: java.util.List.()

则需要加注解@RequestParam

    @RequestMapping("/listParam")
    @ResponseBody
public String ListParam(@RequestParam List<String> arrayList){

        System.out.println("集合参数传递:"+arrayList);
           return "{'module': 'listParam'}";

    }

image-20220720151047117

json数据传递参数

1.JSON传递集合

1.导入json坐标
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.0</version>
</dependency>
2.在核心配置类中写一个注解

@EnableWebMvc

3.在参数前加上*@RequestBody*注解
//集合参数:JSON格式

@RequestMapping("/listParamJSON")
@ResponseBody
public String listParamJSON(@RequestBody List<String> arrayList){

    System.out.println("集合参数json传递:"+arrayList);
    return "{'module': 'listParamJSON'}";

}
4.修改传入的数据格式为json

image-20220720152324358

2.JSON传递pojo

加上注解@RequestBody

    @RequestMapping("/pojoParam")
    @ResponseBody
public String pojoParam(@RequestBody User user){
    System.out.println("pojo参数传递:"+user);
    return "{'module': 'pojoParam'}";
}

image-20220720152829815

image-20220720152944225

3.json数组(pojo)

@RequestMapping("/listParamJSON")
@ResponseBody
public String listParamJSON(@RequestBody List<User> arrayList){
    System.out.println("集合参数json传递:"+arrayList);
    return "{'module': 'listParamJSON'}";
}

image-20220720153127302

image-20220720153343061

@RequestBody和@RequestParam的区别

@RequestParam用于接受url地址传参,表单传参

@RequestBody用于接受json数据

日期类型的参数传递

1.传入的日期类型是yyyy/MM/dd

@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date){
    System.out.println("日期类型的参数传递:"+date);
    return "{'module': 'dataParam'}";
}

image-20220720154936722

image-20220720155000539

2.传入的日期类型是yyyy-MM-dd

如下date1

3.传入的日期类型是yyyy-MM-dd HH:mm:ss

image-20220720160016145

@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);
    System.out.println("日期类型yyyy-MM-dd的参数传递:"+date1);
    System.out.println("日期类型yyyy-MM-dd HH:mm:ss的参数传递:"+date2);

    return "{'module': 'dataParam'}";
}

image-20220720155953687

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值