2022/5/6 Spring MVC框架扩展

目录

1丶访问静态文件

        1.1丶配置springmvc-servlet.xml文件

        1.2丶配置web.xml

        1.3丶导入静态文件

        1.4丶所需jar包 

2丶文件上传与下载

        2.1丶配置springmvc-servlet.xml文件

        2.2丶在web文件下创建statics文件夹

         2.3丶创建上传文件的jsp

         2.4丶创建Controller

         2.5丶运行效果

 3丶RestFul 风格

        3.1丶概念

        3.2丶功能 

        3.3丶 传统方式操作资源

        3.4丶使用RESTful操作资源

        3.5丶学习测试

4丶Spring表单标签及数据效验

        4.1丶Spring提供的常用表单标签

        4.2丶JSR 303约束

5丶多文件上传

6丶本章总结


1丶访问静态文件

        1.1丶配置springmvc-servlet.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">
        <!--支持mvc注解-->
        <mvc:annotation-driven></mvc:annotation-driven>
        <!--扫描Controller包-->
        <context:component-scan base-package="controller"></context:component-scan>

        <!--放行jsp所有静态资源-->
        <mvc:default-servlet-handler></mvc:default-servlet-handler>

        <!--配置静态资源-->
       <!--<mvc:resources mapping="/statics/**" location="/statics/"/>-->
        <!--两种方式任意选择,第二种方式js文件夹要在statics文件夹下才生效-->
</beans>

        1.2丶配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="4.0">
    <!--过滤器让整个web项目转发重定向都不会出现中文乱码-->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!--Spring mvc的核心类是一个Servlet,叫做前端控制器-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>
            <!--DispatcherServlet是springmvc的核心控制着整个页面的转发和重定向-->
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <!--加载spring mvc配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

        1.3丶导入静态文件

  <head>
    <title>$Title$</title>
    <script src="js/jquery-1.12.4.js"></script>

  </head>

        1.4丶所需jar包 

 

2丶文件上传与下载

web.xml与jar包与上面一致

        2.1丶配置springmvc-servlet.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">
        <!--支持mvc注解-->
        <mvc:annotation-driven></mvc:annotation-driven>
        <!--扫描Controller包-->
        <context:component-scan base-package="controller"></context:component-scan>

        <!--放行jsp所有静态资源-->
        <mvc:default-servlet-handler></mvc:default-servlet-handler>
        <!--配置文件上传组装说明书-->
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <!--设置文件上传最大大小(字节)-->
            <property name="maxUploadSize" value="500000"></property>
            <!--设置文件上传格式-->
            <property name="defaultEncoding" value="UTF-8"></property>
        </bean>
</beans>

        2.2丶在web文件下创建statics文件夹

         2.3丶创建上传文件的jsp

<%--
  Created by IntelliJ IDEA.
  User: ACER
  Date: 2022/3/11
  Time: 10:07
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file"></br>
    <input type="text" name="id"></br>
    <input type="submit">
</form>
<h1><a href="download?filename=winter.jpg">点我下载</a></h1>
</body>
</html>

         2.4丶创建Controller

package controller;

import org.apache.commons.io.FileUtils;
import org.aspectj.util.FileUtil;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.xml.ws.spi.http.HttpHandler;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

/*
 * 将类注解为控制器
 * */
@Controller
public class FlieController {
    @RequestMapping("/upload")
    public String upload(String id, @RequestParam MultipartFile file, HttpServletRequest req){
        System.out.println("接收到id:"+id);
        System.out.println("接收到文件:"+file);
        //正式开始文件上传
        if(!file.isEmpty()){
            //准备好一个文件夹接收上传的文件
            //获得服务器虚拟的路径(临时的)
            String path=req.getSession().getServletContext().getRealPath("statics");
            System.out.println("文件上传的路径是:"+path);
            //获得文件名称
            String filename=file.getOriginalFilename();
            File f=new File(path+File.separator+filename);
            try {
                //文件上传
                file.transferTo(f);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return "file.jsp";
    }

    /*文件下载的方法*/
    @RequestMapping("/download")
    public ResponseEntity<byte[]> download(String filename, HttpServletRequest req, Model m)throws Exception{
        /*定义服务器资源所在目录*/
        String path="D://javafile";
        File file=new File(path+File.separator+filename);
        //请求头
        HttpHeaders headers=new HttpHeaders();
        String downloadFilename=new String(filename.getBytes("UTF-8"),"iso-8859-1");
        //请求头设置数据表单
        headers.setContentDispositionFormData("attachment",downloadFilename);
        //设置请求头的类型
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);

        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
    };
}

         2.5丶运行效果

上传图片: 

注意:上传的图片是保存在项目的out目录下,如果out目录删除则上传的图片也将消失!与servlet上传的方式一致。

详情请查看2022/3/19 Java开发之Java web编程 第七章 使用JSP/Servlet开发复杂业务(分页+上传文件)_Abcdzzr的博客-CSDN博客

下载图片:

 注意:此方式下载的文件不能下载临时目录下的文件,只能下载静态文件夹的文件

 

 3丶RestFul 风格

        3.1丶概念

Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

        3.2丶功能 

  • 资源:互联网所有的事物都可以被抽象为资源 
  • 资源操作:使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。 分别对应 添加、 删除、修改、查询。 

        3.3丶 传统方式操作资源

通过不同的参数来实现不同的效果!方法单一,post 和 get

  • http://127.0.0.1/item/queryItem.action?id=1 查询,GET
  • http://127.0.0.1/item/saveItem.action 新增,POST 
  • http://127.0.0.1/item/updateItem.action 更新,POST 
  • http://127.0.0.1/item/deleteItem.action?id=1 删除,GET或POST

        3.4丶使用RESTful操作资源

可以通过不同的请求方式来实现不同的效果!如下:请求地址一样,但是功能可以不同!

  •  http://127.0.0.1/item/1 查询,GET 
  •  http://127.0.0.1/item 新增,POST 
  •  http://127.0.0.1/item 更新,PUT 
  •  http://127.0.0.1/item/1 删除,DELETE

        3.5丶学习测试

1. 在新建一个类 RestFulController

@Controller
public class RestFulController {
}

2. 在Spring MVC中可以使用 @PathVariable 注解,让方法参数的值对应绑定到一个URI模板变量上。

@Controller
public class RestFulController {
    //映射访问路径
    @RequestMapping("/commit/{p1}/{p2}")
    public String index(@PathVariable int p1, @PathVariable int p2, 
Model model){
        
        int result = p1+p2;
        //Spring MVC会自动实例化一个Model对象用于向视图中传值
        model.addAttribute("msg", "结果:"+result);
        //返回视图位置
        return "test";
        
   }
    
}

3.我们来测试请求查看下

 思考:使用路径变量的好处?

  • 使路径变得更加简洁;
  • 获得参数更加方便,框架会自动进行类型转换。
  • 通过路径变量的类型可以约束访问参数,如果类型不一样,则访问不到对应的请求方法,如这里访问是的路径是/commit/1/a,则路径与方法不匹配,而不会是参数转换失败。

 4. 我们来修改下对应的参数类型,再次测试

//映射访问路径
@RequestMapping("/commit/{p1}/{p2}")
public String index(@PathVariable int p1, @PathVariable String p2, Model 
model){
    String result = p1+p2;
    //Spring MVC会自动实例化一个Model对象用于向视图中传值
    model.addAttribute("msg", "结果:"+result);
    //返回视图位置
    return "test";
}

 5.使用method属性指定请求类型

用于约束请求的类型,可以收窄请求范围。指定请求谓词的类型如GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE等
我们来测试一下:

  • 增加一个方法
    //映射访问路径,必须是POST请求
    @RequestMapping(value = "/hello",method = {RequestMethod.POST})
    public String index2(Model model){
        model.addAttribute("msg", "hello!");
        return "test";
    }
    
  •  我们使用浏览器地址栏进行访问默认是Get请求,会报错405:

  •  如果将POST修改为GET则正常了;

    //映射访问路径,必须是Get请求
    @RequestMapping(value = "/hello",method = {RequestMethod.GET})
    public String index2(Model model){
        model.addAttribute("msg", "hello!");
        return "test";
    }
    

     

6.小结

Spring MVC 的 @RequestMapping 注解能够处理 HTTP 请求的方法, 比如 GET, PUT, POST, DELETE 以
及 PATCH。

7.所有的地址栏请求默认都会是 HTTP GET 类型的。
        方法级别的注解变体有如下几个: 组合注解

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping

@GetMapping 是一个组合注解
它所扮演的是 @RequestMapping(method =RequestMethod.GET) 的一个快捷方式。 
平时使用的会比较多!

4丶Spring表单标签及数据效验

详细请查看:学习SpringMVC必知必会(7)~springmvc的数据校验、表单标签、文件上传和下载_一 乐的博客-CSDN博客

Spring MVC数据校验详解_半粒冰块的博客-CSDN博客_springmvc校验注解

        4.1丶Spring提供的常用表单标签

标签名称说明
<fm:form/>渲染表单元素
<fm:input/>文本框组件标签
<fm:password/>密码框组件标签
<fm:hidden/>隐藏框组件标签
<fm:textarea/>多行文本框组件标签
<fm:radiobutton/>单选框组件标签
<fm:checkbox/>复选框组件标签
<fm:select/>下拉框组件标签
<fm:error/>显示表单数据效验所对应的错误信息

这些标签都拥有以下属性: 

  • path:属性路径,表示表单对象属性,如account,realName等。
  • cssClass:表单组件对应的CSS样式类名。
  • cssErrorClass:当提交表单后报错(服务端错误),采用CSS样式类。
  • sccStyle :表单组件对应的CSS样式。
  • htmlEscape:绑定的表单属性值是否要对HTML特殊字符进行转换,默认为true。

        4.2丶JSR 303约束

约束说明
@Null被注解的元素必须为null
@NotNull被注解的元素必须不为null
@AssertTrue被注解的元素必须为true
@AssertFalse被注解的元素必须为false
@Min(value)被注解的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)被注解的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value)被注解的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value)被注解的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max,min)被注解的元素必须的大小必须在指定范围内
@Digits(integer,fraction)被注解的元素必须是一个数字,其值得整数位和小数位上限必须在可接受的范围内
@Past被注解的元素必须是一个过去的日期
@Future被注解的元素必须是一个将来的日期
@Pattern(value)被注解的元素必须符合指定的正则表达式

5丶多文件上传

        详情请查看:

SpringMvc实现多文件上传_鹿谷門実的博客-CSDN博客_springmvc多文件上传

6丶本章总结

  • Spring MVC框架提供了<mvc:default-servlet-handler>与<mvc:resources/>标签来实现静态资源的访问。
  • REST风格是当下最流行的API风格,Spring MVC框架对其提供了良好支持,通过@PathVariable注解,可以将URL中的{XXX}占位符参数绑定到控制器处理方法的入参中。
  • 在Spring MVC框架中,Servlet API可以作为处理方法的入参使用,使用方式与普通对象类型入参没有区别。
  • 在Spring MVC框架中要实现文件上传,需要使用MultipartResolver来处理上传请求,通过CommonsMultipartResolver配置MultipartResolver解析器。
  • Spring提供了自己的一套表单标签库,实现了类似EL表达式和JSTL标签库的功能,其中<fm:form>标签通过modelAttribute来指定绑定的模型属性。
  • 在Spring MVC框架中,可以使用JSR 303实现服务器端的数据验证功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Abcdzzr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值