springboot mvc 前端+filter+controller

文章讲述了如何在Java后端使用过滤器处理前端的POST和GET请求。对于POST请求,通过获取并操作请求体,然后用BodyRequestWrapper封装新的请求。GET请求则是通过设置请求属性并在过滤器中传递。同时,介绍了ParameterRequestWrapper用于添加额外的请求参数。

前端访问类型:

Content-Type: application/x-www-form-urlencoded; charset=UTF-8

Accept: application/json, text/plain, */*

对应filter

//获取request的body参数

String postContent =getBody(request);

 //获取Request的body数据
    private String getBody(ServletRequest request) {
        StringBuilder stringBuilder = new StringBuilder();
        BufferedReader bufferedReader = null;
        InputStream inputStream = null;
        try {
            inputStream = request.getInputStream();
            if (inputStream != null) {
                bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                char[] charBuffer = new char[128];
                int bytesRead = -1;
                while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                    stringBuilder.append(charBuffer, 0, bytesRead);
                }
            } else {
                stringBuilder.append("");
            }
        } catch (IOException ex) {

        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return stringBuilder.toString();
    }

获取body后操作完成然后封装request,然后传递chain。

     Map<String, Object> param = new HashMap<>(); //自定义参数
                    param.put("city", "1");
                    param.put("name","2");
                    ParameterRequestWrapper pr = new ParameterRequestWrapper(request, param);
                    filterChain.doFilter(pr, servletResponse);

ParameterRequestWrapper

package com.pj.filter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;
public class ParameterRequestWrapper extends HttpServletRequestWrapper {

    private Map<String, String[]> params = new HashMap<>();

    public ParameterRequestWrapper(HttpServletRequest request) {
        super(request);
        this.params.putAll(request.getParameterMap());
    }

    public ParameterRequestWrapper(HttpServletRequest request, Map<String, Object> extendParams) {
        this(request);
        //这里将扩展参数写入参数表
        addAllParameters(extendParams);
    }

    @Override
    public Enumeration<String> getParameterNames() {
        return new Vector(params.keySet()).elements();
    }

    @Override
    public String getParameter(String name) {
        String[] values = params.get(name);
        if (values == null || values.length == 0) {
            return null;
        }
        return values[0];
    }

    @Override
    public String[] getParameterValues(String name) {
        String[] values = params.get(name);
        if (values == null || values.length == 0) {
            return null;
        }
        return values;
    }

    private void addAllParameters(Map<String, Object> otherParams) {
        for (Map.Entry<String, Object> entry : otherParams.entrySet()) {
            addParameter(entry.getKey(), entry.getValue());
        }
    }

    private void addParameter(String name, Object value) {
        if (value != null) {
            if (value instanceof String[]) {
                params.put(name, (String[]) value);
            } else if (value instanceof String) {
                params.put(name, new String[]{(String) value});
            } else {
                params.put(name, new String[]{String.valueOf(value)});
            }
        }
    }
}

然后后端获取数据是

public ResponseEntity getPowerConsumption(@RequestParam(value = "city") String city1,

@RequestParam(value = "name") String name

){

System.out.println(name)}

前端是get

filter很简单。

request.setAttribute("city", "cc");

filterChain.doFilter(request, servletResponse);

后端获取也很简单

@GetMapping("getCity")

public void getCity(HttpServletRequest request) {

//从request中获取到东西。然后再用接口获取到文件

String s=(String) request.getAttribute("city");

前端是

Content-Type: application/json;

Accept: application/json, text/plain, */*

后端filter是

String postContent = getBody(request);

 //获取Request的body数据
    private String getBody(ServletRequest request) {
        StringBuilder stringBuilder = new StringBuilder();
        BufferedReader bufferedReader = null;
        InputStream inputStream = null;
        try {
            inputStream = request.getInputStream();
            if (inputStream != null) {
                bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                char[] charBuffer = new char[128];
                int bytesRead = -1;
                while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                    stringBuilder.append(charBuffer, 0, bytesRead);
                }
            } else {
                stringBuilder.append("");
            }
        } catch (IOException ex) {

        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return stringBuilder.toString();
    }

获取数据之后封装request

JSONObject jsStr = JSONObject.parseObject(postContent);
                jsStr.put("city", "city");
  postContent = jsStr.toJSONString();
                //将修改后参数放入重写的方法中
                request = new BodyRequestWrapper(request, postContent);
  filterChain.doFilter(request, servletResponse);

BodyRequestWrapper

package com.pj.filter;


import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

//更改body中的值
public class BodyRequestWrapper extends HttpServletRequestWrapper {

    // 存放JSON数据主体
    private String body;

    public BodyRequestWrapper(HttpServletRequest request, String context) {
        super(request);
        body = context;
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
        final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes("UTF-8"));
        ServletInputStream servletInputStream = new ServletInputStream() {
            @Override
            public int read() throws IOException {
                return byteArrayInputStream.read();
            }

            @Override
            public boolean isFinished() {
                return false;
            }

            @Override
            public boolean isReady() {
                return false;
            }

            @Override
            public void setReadListener(ReadListener listener) {

            }
        };
        return servletInputStream;
    }

    @Override
    public BufferedReader getReader() throws IOException {
        return new BufferedReader(new InputStreamReader(this.getInputStream()));
    }
}


controller是

@PostMapping("getCity")
    public void getTotalFlowIndex(@RequestBody ConditionDto conditionDto) {

}

Spring Boot 是一种基于 Spring 框架的快速开发脚手架,它可以帮助我们快速搭建 Web 应用程序。Layui 是一个非常流行的前端 UI 框架,它提供了丰富的组件和样式,可以帮助我们快速构建美观的网页界面。 下面介绍如何使用 Spring Boot 和 Layui 框架实现页面交互。 1. 创建 Spring Boot 项目 首先,我们需要创建一个 Spring Boot 项目。可以使用 Spring Initializr 创建一个空的 Spring Boot 项目。在选择依赖项时,选择 Web 和 Thymeleaf。 2. 添加 Layui 依赖 在 pom.xml 文件中添加 Layui 的依赖: ```xml <dependency> <groupId>com.github.lauwerys</groupId> <artifactId>layui-spring-boot-starter</artifactId> <version>1.4.1</version> </dependency> ``` 3. 创建 HTML 页面 在 src/main/resources/templates 目录下创建 index.html 文件: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Layui Demo</title> <link rel="stylesheet" href="/layui/css/layui.css"> </head> <body> <div class="layui-container"> <div class="layui-row"> <div class="layui-col-md6"> <div class="layui-card"> <div class="layui-card-header">用户信息</div> <div class="layui-card-body"> <form class="layui-form"> <div class="layui-form-item"> <label class="layui-form-label">用户名</label> <div class="layui-input-block"> <input type="text" name="username" required lay-verify="required" placeholder="请输入用户名" autocomplete="off" class="layui-input"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">密码</label> <div class="layui-input-block"> <input type="password" name="password" required lay-verify="required" placeholder="请输入密码" autocomplete="off" class="layui-input"> </div> </div> <div class="layui-form-item"> <div class="layui-input-block"> <button class="layui-btn" lay-submit lay-filter="formDemo">提交</button> <button type="reset" class="layui-btn layui-btn-primary">重置</button> </div> </div> </form> </div> </div> </div> </div> </div> <script src="/layui/layui.js"></script> <script> layui.use('form', function(){ var form = layui.form; //监听提交 form.on('submit(formDemo)', function(data){ layer.msg(JSON.stringify(data.field)); return false; }); }); </script> </body> </html> ``` 这是一个简单的表单页面,使用了 Layui 的组件和样式。表单提交后会弹出一个提示框,显示提交的数据。 4. 运行项目 完成以上步骤后,启动 Spring Boot 项目,访问 http://localhost:8080/index.html 即可看到页面效果。 5. 实现后台逻辑 在后台代码中,可以使用 Spring MVC 的注解来处理表单提交: ```java @Controller public class UserController { @RequestMapping(value = "/submit", method = RequestMethod.POST) @ResponseBody public String submit(@RequestParam String username, @RequestParam String password) { return "用户名:" + username + ",密码:" + password; } } ``` 这个方法会接收表单提交的数据,并返回一个字符串。可以将返回的字符串在前端页面中显示出来。 修改 HTML 页面的 form 表单: ```html <form class="layui-form" action="/submit" method="post"> <div class="layui-form-item"> <label class="layui-form-label">用户名</label> <div class="layui-input-block"> <input type="text" name="username" required lay-verify="required" placeholder="请输入用户名" autocomplete="off" class="layui-input"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">密码</label> <div class="layui-input-block"> <input type="password" name="password" required lay-verify="required" placeholder="请输入密码" autocomplete="off" class="layui-input"> </div> </div> <div class="layui-form-item"> <div class="layui-input-block"> <button class="layui-btn" lay-submit lay-filter="formDemo">提交</button> <button type="reset" class="layui-btn layui-btn-primary">重置</button> </div> </div> </form> ``` 修改 JavaScript 代码: ```javascript layui.use('form', function(){ var form = layui.form; //监听提交 form.on('submit(formDemo)', function(data){ $.post(data.form.action, data.field, function(result){ layer.msg(result); }); return false; }); }); ``` 这个 JavaScript 代码会在表单提交时,使用 jQuery 的 post 方法将数据提交到后台,然后将后台返回的字符串显示在提示框中。 至此,我们就使用 Spring Boot 和 Layui 框架实现了一个简单的页面交互功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值