JavaEE学习日志(九十六): SpringMVC交互JSON数据,文件上传,跨服上传,统一异常处理

JavaEE学习日志持续更新----> 必看!JavaEE学习路线(文章总汇)

SpringMVC

交互JSON数据

服务器接收JSON数据

一、引入jQuery
在这里插入图片描述
二、引入静态资源后,给js静态资源放行(非常重要)
把js下的静态资源映射到js目录下

<mvc:resources mapping="/js/*" location="/js/"></mvc:resources>

三、页面中发送ajax请求

<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery.min.js"></script>
<script type="text/javascript">
    function execute() {
        alert("执行");
        $.ajax({
            url:"${pageContext.request.contextPath}/user/testRequestJson",
            data:{"username":"zhangsan","age":20},
            type:"post",
            dataType:"json",
            success:function(data) {

            }
            
        });
    }

</script>

四、服务器接收数据并打印
方式一:

@Controller
@RequestMapping("/user")
@SessionAttributes({"username","password"})
public class UserController {

    /**
     * 请求数据转换为json格式
     */
    @RequestMapping("/testRequestJson")
    public void testRequestJson(String username,Integer age){
        System.out.println(username);
        System.out.println(age);
    }

}

方式二:把所有参数转化为字符串
首先引入依赖

<dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.9.0</version>
    </dependency>

在形参中添加@RequestBody注解

/**
     * @RequestBody 可以把所有的参数转换为字符串
     * @param body
     */
    @RequestMapping("/testRequestJson2")
    public void testRequestJson2(@RequestBody String body){
        System.out.println(body);
    }

打印的结果
在这里插入图片描述

服务器回写JSON数据

服务器回写JSON数据:
使用注解@ResponseBody标记了该注解的方法,数据会以流的方式返回

@RequestMapping("/testResponseBody")
@ResponseBody
public List<User> testResponseBody(){
    //准备数据
    List<User> userList = new ArrayList<>();
    User user = new User();
    user.setUsername("张三");
    user.setPassword("123");
    user.setId(2);

    User user2 = new User();
    user2.setUsername("张三2");
    user2.setPassword("123");
    user2.setId(3);

    userList.add(user);
    userList.add(user2);

    return userList;
}

页面接收

<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery.min.js"></script>
<script type="text/javascript">
    function execute() {
        alert("执行");
        $.ajax({
            url:"${pageContext.request.contextPath}/user/testResponseBody",
            data:{},
            type:"post",
            dataType:"json",
            success:function(data) {
                alert(data[0].username);
                alert(data[1].username);
            }

        });
    }

</script>

SpringMVC文件上传

一、引入依赖fileupload,会自动依赖commons-io

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

二、页面配置
上传文件的表单前提

  1. 提交方式必须为post
  2. 表单的类型必须是multipart/form-data,多功能的表单数据
  3. 必须有一个type=file的表单元素
<body>
    <form action="${pageContext.request.contextPath}/user/upload" method="post" enctype="multipart/form-data">
        <input type="text" name="username"><br>
        <input type="file" name="upload"><br>
        <input type="submit" value="上传">
    </form>

</body>

三、spring-mvc.xml配置:可以设置上传文件的限制

<!-- 配置文件上传解析器 -->
    <!-- id的值是固定的-->
    <bean id="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 设置上传文件的最大尺寸为5MB -->
        <property name="maxUploadSize">
            <value>5242880</value>
        </property>
    </bean>

四、文件上传
考虑两点:

  1. 上传的目标路径
  2. 文件名永不重复
package com.itheima.controller;

import com.itheima.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Member;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;

@Controller
@RequestMapping("/user")
@SessionAttributes({"username","password"})
public class UserController {

    /**
     * 声明参数变量,接收数据
     */
    @RequestMapping("/upload")
    public String upload(String username, MultipartFile upload, HttpServletRequest request){
        //System.out.println(upload);

        //1.目标路径
        //获取项目运行的路径
        String realPath = request.getSession().getServletContext().getRealPath("/upload");
        //判断该路径是否存在
        File realFile = new File(realPath);
        if (!realFile.exists()){
            realFile.mkdirs();
        }


        //2.获取唯一的文件名(包含扩展名)
        String uuid = UUID.randomUUID().toString().replace("-", "");
        //获取扩展名:获取文件名
        //获取真实的文件名
        String originalFilename = upload.getOriginalFilename();
        //截取字符串,获取文件扩展名
        String extendName = originalFilename.substring(originalFilename.lastIndexOf("."));
        //唯一的文件名
        String fileName = uuid+extendName;

        //文件上传transferTo,执行文件上传
        //参数file:文件路径
        try {
            upload.transferTo(new File(realFile,fileName));
        } catch (IOException e) {
            e.printStackTrace();
        }

        return "show";
    }
}

跨服上传

一、引入jersey服务器依赖

<!--引入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>

二、修改tomcat配置
tomcat默认不能跨服上传,在tomcat/conf/web.xml中添加这句话

<init-param>
            <param-name>readonly</param-name>
            <param-value>false</param-value>
        </init-param>

添加之后

<servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
		<init-param>
            <param-name>readonly</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

三、配置图片服务器

  1. 创建一个web项目
  2. 配置一个tomcat和原来的tomcat端口号不一致
  3. 在webapp目录下创建一个upload目录
    注意:空的文件夹不会编译,需要在目录中添加任意文件

四、跨服上传文件

<form action="${pageContext.request.contextPath}/user/uploadServer" method="post" enctype="multipart/form-data">
        <input type="text" name="username"><br>
        <input type="file" name="upload"><br>
        <input type="submit" value="上传">
    </form>
@RequestMapping("/uploadServer")
    public String uploadServer(MultipartFile upload){
        //System.out.println(upload);

        //1.配置图片服务器路径
        String serverPath = "http://localhost:9090/img_server/upload/";


        //2.获取唯一的文件名(包含扩展名)
        String uuid = UUID.randomUUID().toString().replace("-", "");
        //获取扩展名:获取文件名
        //获取真实的文件名
        String originalFilename = upload.getOriginalFilename();
        //截取字符串,获取文件扩展名
        String extendName = originalFilename.substring(originalFilename.lastIndexOf("."));
        //唯一的文件名
        String fileName = uuid+extendName;
        System.out.println(fileName);
        //跨服上传
        //获取jersey服务器客户端
        Client client = Client.create();
        //配置上传资源路径的资源对象
        WebResource resource = client.resource(serverPath + fileName);
        //上传
        //参数一:资源的类型
        //参数二:文件的字节内容
        try {
            resource.put(String.class,upload.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }

        return "show";
    }

SpringMVC的统一异常处理

一、自定义异常

package com.itheima.exception;

public class CustomException extends Exception {
    private String message;

    public CustomException(String message) {
        super(message);
        this.message = message;
    }

    @Override
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

二、定义异常的统一处理对象:实现HandlerExceptionResolver接口
注意:该对象需要被创建

package com.itheima.exception;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 异常解析器
 */
//创建该类对象
@Component
public class MyExceptionResolver implements HandlerExceptionResolver {
    //解析异常

    /**
     *
     * @param httpServletRequest
     * @param httpServletResponse
     * @param o
     * @param e 其他模块传递过来的异常对象
     * @return
     */
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        ModelAndView modelAndView = new ModelAndView();
        //添加数据
        if(e instanceof CustomException){
            CustomException customException = (CustomException)e;
            modelAndView.addObject("message",customException.getMessage());
        }else {
            modelAndView.addObject("message","系统发送错误,请联系管理员!!!");
        }
        //指定页面
        modelAndView.setViewName("error");
        return modelAndView;
    }
}

三、错误页面

<%--
  Created by IntelliJ IDEA.
  User: admin
  Date: 2020/5/10
  Time: 17:38
  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>
${message}
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值