SpringMVC(笔记二)

SpringMVC(笔记二)

1.0.0 搭建SpringMVC环境

1.添加依赖

<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

2.配置web.xml

 <!-- 配置核心控制器 -->
   <servlet>
      <servlet-name>dispatcherServlet</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>classpath:springMVC.xml</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
   </servlet>
   
   <!--
       /  : 通配所有路径,不包含jsp资源,页面访问jsp可以找到页面的!!!
       /* : 通配所有路径,包含jsp资源。页面访问jsp找不到页面啦!!!
    -->
   <servlet-mapping>
      <servlet-name>dispatcherServlet</servlet-name>
      <url-pattern>/</url-pattern>
   </servlet-mapping>

3.编写springMVC.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:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       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">

    <!--扫描注解-->
    <context:component-scan base-package="cn.zonhar"/>

    <!--配置视图解析器-->
  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--解决静态资源访问不了问题-->
    <mvc:default-servlet-handler/>

    <!--配置mvc注解支持-->
    <mvc:annotation-driven/>

</beans>

2.0.0 搭建SpringMVC环境(解决静态资访问不了问题)

方案一(不推荐,如果有多个资源需要配置多个):

<!--
  mapping: 拦截的URI路径
  location: 页面所在物理路径(写目录即可)
-->
<mvc:resources mapping="/pages/*" location="pages/"/>
<mvc:resources mapping="/index.html" location="/index.html"/>

方案二(强力推荐,一步到位):

<!--充当了Tomcat的DefaultServlet的功能-->
<mvc:default-servlet-handler/>

3.0.0 SpringMVC控制器方法参数:Model与ModelMap(1)基本用法

目标

  1. 使用Model或者ModelMap作为控制器方法参数
  2. 作用:可以往request域中存储数据。 request.setAttribute(key, value);

实现

步骤:

  1. 编写ModelController,编写方法
  2. 编写index.jsp获取数据
  3. 部署测试

实现

1.编写ModelController,编写方法

package com.zonhar.controller.a_model;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * Model与ModelMap(1)基本用法
 */
@Controller
public class ModelController {
    
    //1.使用Model接口传递数据到jsp页面
    @RequestMapping("/model")
    public String model(Model model){
        //往Model存入数据:本质request.setAttribute(xxx)
        model.addAttribute("cn","China");
        return "index";
    }

    //1.使用ModelMap接口传递数据到jsp页面
    @RequestMapping("/modelMap")
    public String modelMap(ModelMap modelMap){
        //往ModelMap存入数据:本质request.setAttribute(xxx)
        modelMap.addAttribute("us","America");
        return "index";
    }
}

2.编写index.jsp获取数据

在这里插入图片描述

3.测试

C:\Users\zonhar\AppData\Roaming\Typora\typora-user-images\1563005202753.png

4.0.0 SpringMVC控制器方法参数:Model与ModelMap(2)源码分析

目标

  1. Model接口和ModelMap什么关系?
  2. Model接口和ModelMap底层怎么放数据到域对象?

实现

  1. Model接口和ModelMap什么关系?

Model接口的实现类 和 ModelMap的子类是相同的!!!

在这里插入图片描述
在这里插入图片描述

运行时Model接口和ModelMap类创建都是BindingAwareoModelMap对象!!

  1. Model接口和ModelMap底层怎么放数据到域对象?

DispathcerServlet的doDispathcer方法入手

this.processDispatchResult(processedRequest, response, mappedHandler, mv, (Exception)dispatchException);

在这里插入图片描述

5.0.0 控制器方法返回值

目标

控制器方法的返回值类型的作用

控制器返回值的写法:

  1. 字符串

    1.1 普通字符串

    1.2 转发字符串

    1.3 重定向字符串

  2. void

  3. ModelAndView

  4. Java对象

实现

package cn.zonhar.controoler.b_return;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 控制器返回
 */
@Controller
public class ReturnContrller {

    //返回字符串    普通字符串 : 访问的页面名称(不包含前缀和后缀的)
    @RequestMapping("/returnIndex")
    public String returnString(){
        System.out.println("ReturnString");
        return "index";
    }

    //1.返回字符串,转发字符串: 拥有转发页面功能的字符串  forward:固定写法
    @RequestMapping("/forward")
    public String forwardString(){
        System.out.println("forward转发成功!");
        return "forward:/pages/forward.jsp";
    }

    //1.返回字符串,重定向字符串: 拥有重定向页面功能的字符串  redirect:固定写法
    @RequestMapping("/redirect")
    public String redirect(){
        System.out.println("redirect");
        return "redirect:/pages/redirect.jsp";
    }

    //2. void: 自行使用request或response进行转发或重定向
    @RequestMapping("/returnvoid")
    public void returncVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //转发
        //request.getRequestDispatcher("/pages/forward.jsp").forward(request,response);
        //重定向
        response.sendRedirect("/pages/redirect.jsp");
    }

    //返回Model AndView:  ModelAndView:封装了Model和View的对象,
    // Model就是Model接口或ModelMap,View封装返回的页面名称(转发)
    @RequestMapping("/mv")
    public ModelAndView mv(){
        ModelAndView mv =new ModelAndView();
        mv.addObject("cn","China");
        mv.setViewName("upload");
        return mv;
    }
}

6.0.0 交互JSON数据:@RequestBody与@ResponseBody注解

说明

@RequestBody

作用:在处理器方法形参上使用,把请求的json格式数据,转换成java对象。

@ResponseBody

作用:在处理器方法返回值上使用,或者方法上使用。把响应的java对象,转换成json格式数据。

前置依赖

在项目中导入jackson依赖

<!-- jackson支持包 -->
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-core</artifactId>
  <version>2.9.5</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-annotations</artifactId>
  <version>2.9.5</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.5</version>
</dependency>

实现

步骤:

1.编写requestAjax.html页面

2.编写JsonController

3.部署测试

实现:

1.编写requestAjax.html页面

 <!--导入jquery-->
 <script src="/js/jquery-3.3.1.min.js"></script>
<button id="but1" type="button">提交</button>
    <script type="text/javascript">
        $(function () {
           $("#but1").click(function () {
                $.post({
                    //请求地址
                    url:"/responseBodyJson",
                    //发送给后台的数据
                    data:'{"id":100,"name":"小泽","address":"日本"}',
                    //后台返回的数据格式
                    dataType:"json",
                    //请求格式与编码
                    contentType:"application/json;charset=utf-8",
                    success:function (data) {
                        alert(data+"___"+data.id+"__"+"__"+data.name+"__"+data.address);
                    }
                });
           });
        });
    </script>

2.编辑entity(实体类)

package cn.zonhar.entity;

public class Person {
    private Integer id;
    private String name;
    private String address;
	...
}

3.编写JsonController

package cn.zonhar.controller.c_json;

import cn.zonhar.entity.Persion;
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.ResponseBody;

/**
 * Json格式处理
 */
@Controller
public class JsonController {

    /**
     * 处理Json格式数据
     * 前端->后端: {"id":100,"name":"小泽","address":"日本"}
     *   @RequestBody: 把前端发送的json字符串转换为Java对象
     *   (注意:json的属性名称和Java对象的属性名称保持一致)
     *   @ResponseBody: 把后端产生的Java对象(包含集合类型)转换为Json字符串,返回给前端
     */
    @RequestMapping("/responseBodyJson")
    @ResponseBody
    public Person responseBodyJson(@RequestBody Person person){
        System.out.println(persion);
        persion.setId(10086);
        persion.setName("桐人");
        persion.setAddress("日本");
        return person;
    }

}

4.测试

在这里插入图片描述

7.0.0 Restful 风格的 URL(1)简介

实现

1.什么是RESTful风格?

REST(英文: Representational State Transfer, 简称 REST) 描述了一个架构样式的
网络系统, 比如 web 应用程序。 它首次出现在 2000 年 Roy Fielding 的博士论文中, 他
是 HTTP 规范的主要编写者之一。在目前主流的三种 Web 服务交互方案中,REST 相比于 SOAP
(Simple Object Access protocol, 简单对象访问协议) 以及 XML-RPC 更加简单明了, 无
论是对 URL 的处理还是对 Payload 的编码, REST 都倾向于用更加简单轻量的方法设计和实
现。 值得注意的是 REST 并没有一个明确的标准, 而更像是一种设计的风格。
REST 其核心价值在于如何设计出符合 REST 风格的网络接口。 基于这个风格设计的软
件可以更简洁, 更有层次, 更易于实现缓存等机制。

REST其实对HTTP规则的一种简化,只是对URL进行简化!!!

2. RESTful的好处?

1)客户端和服务端之间的URL规则更简洁

2)客户端和服务端之间的URL更有层次

3) 更易于实现在服务端缓存客户端资源

3. RESTful的例子?

在使用RESTful之前(传统方式的URL)

增加: http://localhost:8080/user?method=add

修改: http://localhost:8080/user?method=update

删除: http://localhost:8080/user?method=delete

查询: http://localhost:8080/user?method=find

使用RESTFul之后 (GET、POST、PUT、DELETE)

增加: http://localhost:8080/user POST

修改: http://localhost:8080/user PUT

删除: http://localhost:8080/user DELETE

查询: http://localhost:8080/user GET / POST

8.0.0Restful 风格的 URL(2)基于HiddenHttpMethodFilter 的示例

目标

演示RESTful风格的案例

前置条件

为了在前端模拟出不同的请求方式,需要引入SpringMVC提供的HiddenHttpMethodFilter

在web.xml配置

<!-- 转换请求方式的过滤器 -->
<filter>
   <filter-name>hiddenHttpMethodFilter</filter-name>
   <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
   <filter-name>hiddenHttpMethodFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

在这里插入图片描述

实现

步骤:

1.编写restful.html

 <form action="/user" method="post">
        <input type="hidden" name="_method" value="post">
        <input type="submit" value="增加">
    </form>


    <form action="/user" method="post">
        <input type="hidden" name="_method" value="put">
        <input type="submit" value="修改">
    </form>


    <form action="/user" method="post">
        <input type="hidden" name="_method" value="delete">
        <input type="submit" value="删除">
    </form>

    <form action="/user" method="post">
        <input type="hidden" name="_method" value="get">
        <input type="submit" value="查询">
    </form>

2.编写UserController编写CRUD方法

package cn.zonhar.controller.d_restful;

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

/**
 * RESTful风格的处理
 *
 * */
@Controller
@RequestMapping("/user")
public class RestfulController {
    //添加
    @RequestMapping(method = RequestMethod.POST)
    public String add(){
        System.out.println("保存用户");
        return "success";
    }

    //查询
    @RequestMapping(method = RequestMethod.GET)
    public String find(){
        System.out.println("查询用户用户");
        return "success";
    }

    //删除
    @RequestMapping(method = RequestMethod.DELETE)
    @ResponseBody
    public String delete(){
        System.out.println("删除用户");
        return "success";
    }

    //修改
    @RequestMapping(method = RequestMethod.PUT)
    @ResponseBody
    public String update(){
        System.out.println("修改用户用户");
        return "success";
    }
}

3.部署测试

[外链图片转存失败(img-kUCQFjnj-1563024433781)(C:\Users\zonhar\AppData\Roaming\Typora\typora-user-images\1563019199229.png)]

1.基于RESTful风格传递参数?

页面:

<form action="/user/10" method="post">
    <input type="hidden" name="_method" value="delete">
    <input type="submit" value="删除">
</form>

Controller:

//删除
    @RequestMapping(value ="/{id}",method = RequestMethod.DELETE)
    @ResponseBody
    public String delete(@PathVariable("id") Integer id){
        System.out.println("删除用户id为:"+id);
        return "success";
    }

[外链图片转存失败(img-suWBdr9m-1563024433782)(C:\Users\zonhar\AppData\Roaming\Typora\typora-user-images\1563020624393.png)]

9.0.0 SpringMVC 实现文件上传(一)传统文件上传

介绍

  • 文件上传的三要素

1.表单必须是Post

2.表单类型是multipart/form-data

3.表单必须有至少一个

  • 借助第三方组件实现文件上传

    使用 Commons-fileupload 组件实现文件上传,需要导入该组件相应的支撑 jar 包: Commons-fileupload 和commons-io。 commons-io 不属于文件上传组件的开发 jar 文件,但 Commons-fileupload 组件从 1.1 版本开始,它工作时需要 commons-io 包的支持。

实现

前置条件:

在项目导入commons-fileupload坐标

<!-- commons-fileUpload -->
<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.3.1</version>
</dependency>

步骤:
1.编写upload.html页面

2.编写Upload1Controller

3.部署测试

实现:

1.编写upload.html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>

<form action="/upload1" method="post" enctype="multipart/form-data">
    用户名称:<input type="text" name="username"><br/>
    用户文件:<input type="file" name="imgFile"><br/>
    <input type="submit" value="上传">
    
</form>


</body>
</html>

2.编写Upload1Controller

package cn.zonhar.controller.e_upload;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.List;
import java.util.UUID;

@Controller
public class Upload1Controller {
    @RequestMapping("/upload1")
    @ResponseBody
    public String upload(HttpServletRequest request) throws Exception {
        String uploadPath = request.getSession().getServletContext().getRealPath("/upload");

        File file =new File(uploadPath);
        if(!file.exists()){
            file.mkdir();
        }

        //创建FileItemFactory
        FileItemFactory factory =new DiskFileItemFactory();
        //创建ServletFileUpload
        ServletFileUpload sfu =new ServletFileUpload(factory);
        //获取请求的内容
        List<FileItem> fileItemList = sfu.parseRequest(request);
        for (FileItem item : fileItemList) {
           //判断哪些是普通字段或文件
            if(item.isFormField()){
                if(item.getFieldName().equals("name")){
                    String username =  item.getString("utf-8");
                    System.out.println("用户名:"+username);
                }
            }else{
                //文件
                String fileName = item.getName();
                //解决文件重复的问题=UUID+文件后缀
                String newFileName =
                        UUID.randomUUID().toString()+fileName.substring(fileName.lastIndexOf("."));
                File targetFile =new File(file,newFileName);

                //保存文件
                item.write(targetFile);
                //删除重复文件
                item.delete();
            }
        }

        return "上传成功!";
    }
}

10.0.0 SpringMVC 实现文件上传(二)SpringMVC文件上传

步骤

SpringMVC提供对commons-fileUpload的封装,简化文件上传

注意:如果使用SpringMVC文件上传,也是需要依赖commons-fileUpload

实现

步骤:

1.修改upload.html

2.编写Upload2Controller

3.配置springMVC.xml

4.部署测试

实现:

1.修改upload.html

在这里插入图片描述

2.编写Upload2Controller

package cn.zonhar.controller.e_upload;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.MultipartStream;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.List;
import java.util.UUID;

/**
 * SpringMVC文件上传
 */
@Controller
public class Upload2Controller {

    /**
     * MultipartFile: 封装文件数据的对象,变量名称必须和页面的file域的名称保持一致,否则接收不到
     */
    @RequestMapping("/upload2")
    @ResponseBody
    public String upload(HttpServletRequest request, String name, MultipartFile imgFile) throws Exception {

        //1. 创建目标地址的目录:项目的/upload目录
        //getRealPath: 获取项目下的某个目录的路径
        String uploadPath = request.getSession().getServletContext().getRealPath("/upload");


        File file =new File(uploadPath);
        if(!file.exists()){
            file.mkdir();
        }
        //SpringMVC方式解析文件
        //普通字符
        String fileName = imgFile.getOriginalFilename();
        System.out.println("用户名:"+name);
        String newFileName =
                UUID.randomUUID().toString()+fileName.substring(fileName.lastIndexOf("."));

        //文件
        //保存文件到服务器的upload目录
        File targetFile =new File(file,newFileName);
        imgFile.transferTo(targetFile);
        return "上传成功!";
    }
}

3.配置springMVC.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:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       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">

    <!--扫描注解-->
    <context:component-scan base-package="cn.zonhar"/>

    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!-- 文件上传解析器 -->
    <!--
         ***文件解析器必须有id,且必须叫multipartResolver
    -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--文件限制大小(字节)-->
        <property name="maxUploadSize" value="1024000"/>
    </bean>

    <!--解决静态资源访问不了问题-->
    <mvc:default-servlet-handler/>

    <!--配置mvc注解支持-->
    <mvc:annotation-driven/>

</beans>

[外链图片转存失败(img-O7TMaUwP-1563024433786)(C:\Users\zonhar\AppData\Roaming\Typora\typora-user-images\1563024190935.png)]

11.0.0 SpringMVC 实现文件上传(三)跨服务器文件上传

步骤

在实际场景中,有可能文件上传调用了一台Tomcat服务器的代码,但通过这些代码把文件传递另一个Tomcat服务器中。这时就用到跨服务的文件上传啦!!

应用服务器:上传代码

文件服务器:保存最后的文件

实现

步骤:

1.部署文件服务器(Tomcat)

2.应用服务器编写代码(jersey 跨服务调用工具)

实现:

1.部署文件服务器(Tomcat)

1.1 在tomcat/conf/web.xml

在这里插入图片描述

1.2 修改tomcat/conf/server.xml
在这里插入图片描述

1.3 在tomcat的webapps创建一个项目及目录

在这里插入图片描述

1.4 启动文件服务器

在这里插入图片描述

2.应用服务器编写代码(jersey 跨服务调用工具)

2.1 导入jersey坐标

<dependency>
  <groupId>com.sun.jersey</groupId>
  <artifactId>jersey-core</artifactId>
  <version>1.18.1</version>
</dependency>
<dependency>
  <groupId>com.sun.jersey</groupId>
  <artifactId>jersey-client</artifactId>
  <version>1.18.1</version>
</dependency>

2.2 修改upload.html
在这里插入图片描述

2.3编写Upload3Controller

package com.zonhar.controller.e_upload;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.UUID;

/**
 * 跨服务的文件上传
 */
@Controller
public class Upload3Controller {



    @RequestMapping("/upload3")
    public String upload(HttpServletRequest request, String username, MultipartFile imgFile) throws Exception {
        //保存文件到服务器的upload目录
        String fileName = imgFile.getOriginalFilename();
        String newFileNmae = UUID.randomUUID().toString()+fileName.substring(fileName.lastIndexOf("."));
        
        
        //定义文件服务器的目标地址
        String targetPath = "http://localhost:6080/fileUpload/upload/"+newFileNmae;


        //创建 jersey 包中提供的 client 对象
        Client client = new Client();
        //使用 client 和文件服务器建立联系
        //上传地址:http://localhost:6080/fileSystem/upload/文件
        WebResource resource = client.resource(targetPath);
        //把 web 资源对象写到文件服务器
        resource.put(String.class,imgFile.getBytes());


        return "success";
    }

}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值