零基础Java开发入门 spring boot 【系列三】跨域、xml转跳、分页等小问题解决

351 阅读2分钟

上一章 零基础Java开发入门 spring boot 【系列二】-- 数据库连接之mysql+mybatis

我们这章解决小基本开发常见问题,先把get改成post

@RequestMapping(value="/user/walletList", method = RequestMethod.POST)
public List<UserWallet> userWalletList( @RequestBody userWalletBody userWalletBody){
    List<UserWallet> userWallet = userMapper.selectUserWallet(userWalletBody.getId());
    return userWallet;
}

对应userWalletBody类

@Data
class userWalletBody{
    private Long id;
}

这时候我们用RequestBody而不是RequestParam是因为RequestParam不适合用在Accept: application/json的请求上,也就是Axios的默认请求方式。(Axios是前端主流请求库)

看下前端测试代码

Axios.post('http://localhost:3456/user/walletList', {id: 1}).then(res => {
    console.log(res)
})

允许后会发现跨域了

CORS跨域

这时候随便在对应工程新建一个java文件,复制下面代码即可。

package com.example.demo.config;

import org.springframework.stereotype.Component;

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

@Component
public class CORSFilter implements Filter {

    private ServletRequest request;
    private ServletResponse response;
    private FilterChain chain;

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        this.request = request;
        this.response = response;
        this.chain = chain;
        HttpServletResponse res = (HttpServletResponse) response;
        res.addHeader("Access-Control-Allow-Credentials", "true");
        res.addHeader("Access-Control-Allow-Origin", "*");
        res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
        res.addHeader("Access-Control-Allow-Headers", "Content-Type,X-CAF-Authorization-Token,sessionToken,X-TOKEN");
        // 允许请求携带的请求头
        res.addHeader("Access-Control-Allow-Headers", "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, token");
        if (((HttpServletRequest) request).getMethod().equals("OPTIONS")) {
            response.getWriter().println("ok");
        } else {
            chain.doFilter(request, response);
        }
    }

    @Override
    public void destroy() {
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
}

然后我们就可以跨域了啦。

mapper转跳到xml

我们去IDEA安装这个插件即可,如下图

然后我们会发现左侧多了来往的绿色箭头,如下图👇

分页

我们在控制类修改下刚刚的user/list这个接口,添加一个前端参数
@RequestMapping(value="/user/list", method = RequestMethod.POST)
public List<User> userList(@RequestBody PageInfo pageInfo){
    List<User> userList = userMapper.selectList(pageInfo);
    return userList;
}

然后在mapper添加一个selectList来覆盖默认的查询List<User> selectList(@Param("pageInfo") PageInfo PageInfo);,然后在xml里面添加一个sql语句和分页即可

<select id="selectList" resultType="com.example.demo.entity.User">
    SELECT * FROM app.user LIMIT ${pageInfo.pageNum * pageInfo.pageSize},#{pageInfo.pageSize};
</select>

虽然完成了,但是这个注解好丑啊,可以去掉注解变成List<User> selectList(PageInfo PageInfo);然后把xml里面的【对象.】去掉,也就是下面代码

<select id="selectList" resultType="com.example.demo.entity.User">
   SELECT * FROM app.user LIMIT ${pageNum * pageSize},#{pageSize};
</select>

--未完待续--