使用SpringMVC进行表现层开发

本文详细介绍了SpringMVC框架的使用,包括其工作原理、控制器处理输入参数和返回值、模型数据保存、国际化支持等内容。通过示例展示了如何使用请求映射、@PathVariable、@RequestParam等注解接收参数,以及文件上传下载和Restful接口的实现。同时,还探讨了控制器的类型转换、数据校验和HttpSession的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringMVC简介

SpringMVC是基于Model2实现的技术框架,spring MVC是围绕(DispatcherServlet)分发器设计的,其作用就是将请求分发到不同的控制器。

Spring MVC的工作原理
image

Maven 依赖

spring:
    beans,
    context,
    context-support,
    core,
    aop,
    aspect,
    expression,
    web,
    webmvc

aspectj:
    aspectjweaver
    aopalliance

commons:
    logging
    fileupload

控制器处理输入参数

请求映射方式

  1. 根据请求方式 method = GET
  2. Ant风格的URL路径
    • 支持?//*三种匹配符
    • ?—— 匹配一个字符
    • /*/path —— 匹配文件名的任意字符,即匹配一层路径
    • ** —— 匹配多层路径
  3. Restful风格的路径

请求参数接收

  1. 直接接收参数(Get))
/**
     * 1.直接把表单的参数写在Controller相应的方法的形参中
      * @param username
     * @param password
     * @return
     */
    @RequestMapping("/addUser1")
    public String addUser1(String username,String password) {
        System.out.println("username is:"+username);
        System.out.println("password is:"+password);
        return "demo/index";
    }

url形式:http://localhost/SSMDemo/demo/addUser1?username=lixiaoxi&password=111111 提交的参数需要和Controller方法中的入参名称一致。

  1. @PathVariable接收参数
/**
     * 4、通过@PathVariable获取路径中的参数
      * @param username
     * @param password
     * @return
     */
    @RequestMapping(value="/addUser4/{username}/{password}",method=RequestMethod.GET)
public String addUser4(@PathVariable String username,@PathVariable String password) {
        System.out.println("username is:"+username);
        System.out.println("password is:"+password);
        return "demo/index";
    }

例如,访问http://localhost/SSMDemo/demo/addUser4/lixiaoxi/111111 路径时,则自动将URL中模板变量{username}和{password}绑定到通过@PathVariable注解的同名参数上,即入参后username=lixiaoxi、password=111111。

  1. @RequestParam接收参数
    当请求参数username不存在时会有异常发生,可以通过设置属性required=false解决,例如: @RequestParam(value=”username”, required=false)
  2. HttpServletRequest接收参数(Get/Post)
/**
     * 2、通过HttpServletRequest接收
      * @param request
     * @return
     */
    @RequestMapping("/addUser2")
    public String addUser2(HttpServletRequest request) {
        String username=request.getParameter("username");
        String password=request.getParameter("password");
        System.out.println("username is:"+username);
        System.out.println("password is:"+password);
        return "demo/index";
    }
  1. 通过Bean来接收参数(Get/Post)

Bean

···
package demo.model;

public class UserModel {

private String username;
private String password;
public String getUsername() {
    return username;
}
public void setUsername(String username) {
    this.username = username;
}
public String getPassword() {
    return password;
}
public void setPassword(String password) {
    this.password = password;
}

}
···

通过Bean获取参数

/**
     * 3、通过一个bean来接收
      * @param user
     * @return
     */
    @RequestMapping("/addUser3")
    public String addUser3(UserModel user) {
        System.out.println("username is:"+user.getUsername());
        System.out.println("password is:"+user.getPassword());
        return "demo/index";
    }
  1. @ModelAttribute获取POST请求参数
    pojo
public class Pojo{  
    private String a;  
    private int b;  

    //setter...
}

通过pojo获取参数

@RequestMapping(method= RequestMethod.POST)  
public String processSubmit(@ModelAttribute( " pojo " ) Pojo pojo) {  
    return " helloWorld " ;  
 }  

注意:
Restful——@PathVariable,主要指向资源,当指向状态时,用@RequestParam.

控制器处理返回值类型

  1. ModelMap类型
@RequestMapping(value = "getModel",method = RequestMethod.GET)
public ModelMap getModel(){
    ModelMap modelMap = new ModelMap();

    modelMap.put("1","hello world");
    return modelMap;
}
  1. Map类型
@RequestMapping(value = "/getMethod",method = RequestMethod.GET)  //二级URL
public Map<String,Object> getMethod(){
    Map data = new HashMap<String,Object>();

    data.put("1","hello world");

    return data;
}
  1. ModelAndView类型

保存模型到HttpSession

通过控制器(类)上标记@SessionAttributes注解,可将模型数据保存到HttpSession中,以便多个请求之间共用该模型属性。

@SessionAttributes(“key”)

控制器类型转换,格式化和数据校验

通过@InitBinder实现数据格式化

通过在属性上添加相应注解实现格式化

pom.xml

    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>6.0.9.Final</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
    <dependency>
      <groupId>javax.validation</groupId>
      <artifactId>validation-api</artifactId>
      <version>2.0.1.Final</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.jboss.logging/jboss-logging -->
    <dependency>
      <groupId>org.jboss.logging</groupId>
      <artifactId>jboss-logging</artifactId>
      <version>3.3.2.Final</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.fasterxml/classmate -->
    <dependency>
      <groupId>com.fasterxml</groupId>
      <artifactId>classmate</artifactId>
      <version>1.4.0</version>
    </dependency>

Person.java

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birth;

在属性上添加相应注解实现数据校验

package cn.edu.scnu.po;


import org.hibernate.validator.constraints.Range;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.Date;
public class Person {

    @NotNull
    private Integer id;
    @Size(min = 6,max = 16)
    private String name;
    @NotNull
    @Range(min = 18,max = 45)
    private Integer age;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birth;
    @Email
    @NotNull
    private String email;

    //setters和getters
}

Spring MVC实现Restful接口

SpringMVC 实现文件上传和下载

Pom.xml

文件上传与下载——基于springboot

文件上传本质上是文件复制,即将获得的MultiPartFile复制到服务器。

文件下载也是一个文件复制过程,即将服务器上的文件复制到response中。

package cn.edu.scnu.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.*;

@RestController
@RequestMapping("/file")
public class FileController {

    /**
     * w
     * @param srcFile
     * @return
     *
     * 文件上传本质上就是一个文件复制过程
     */
    @RequestMapping(value = "/upload",method = RequestMethod.POST)
    public String fileUpload(@RequestParam("file")MultipartFile srcFile) throws IOException {

        if(!srcFile.isEmpty()){
            String path = "D://text";
            String fileName = srcFile.getOriginalFilename();

            //获取源文件输入流
            InputStream inputStream = srcFile.getInputStream();
            //获取输出流
            OutputStream outputStream = new FileOutputStream(new File(path));

            int value = 0;
            while((value=inputStream.read())!=-1){
                outputStream.write(value);
            }
            inputStream.close();
            outputStream.close();

            return "文件上传成功";


        }else {
            return "文件上传失败";
        }
    }

    @RequestMapping("downloadFile")
    public void downloadFile(HttpServletResponse response){
        //下载的文件

        File downloadFile = new File("C:\\Users\\lay77\\Pictures\\timgbjn.jpg");

        //输入流\
        InputStream inputStream =null;
        //输出流是response
        OutputStream outputStream = null;
        try {
            inputStream =  new FileInputStream(downloadFile);
            outputStream = response.getOutputStream();

            //文件复制_通过缓存数组复制
            byte[] bytes = new byte[1024];
            int len = 0;
            while((len = inputStream.read(bytes))!=-1){
                outputStream.write(bytes,0,len);
            }
            System.out.println("下载成功");
        } catch (Exception e) {
            e.printStackTrace();
        }finally {

            try {
                inputStream.close();
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

SpringMVC 的国际化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值