使用 Spring Boot 和 Next.js 创建全栈 Web 应用程序

制作 Web 应用程序是一门细致的艺术,我在前端的 Next.js 和强大的 Spring Boot 后端的融合中找到了我最喜欢的画布。Next.js因其高效的前端开发能力而俘获了我的心。借助 Next.js,您可以在画布上进行绘制,从而使您能够制作通过您独特的 API 丰富的全栈应用程序。

然而,这段旅程并非没有细微差别。有时,静态资产与后端应用程序的和谐集成对于无缝用户体验至关重要。

这就是本指南的用武之地。它致力于教您在 Spring Boot 环境中从 Next.js 应用程序无缝提供静态资产的艺术。我们的主要目标是解决浏览器刷新和直接 URL 输入的挑战,确保 Tomcat 服务器内流畅的用户体验,同时充分利用 Next.js 的静态资源。

如果您渴望深入研究使用 Spring Boot 和 Next.js 创建全栈 Web 应用程序的复杂性,那么本文就是您导航旅程的指南针。

使用以下命令创建 Nextjs 应用程序

npx create-next-app@latest

此命令会设置一个新的具有最新版本的 Next.js 项目,为您构建前端提供坚实的基础。

创建 Next.js 项目后,在您首选的文本编辑器(例如 Visual Studio Code)中将其打开。这将允许您使用前端代码并进行必要的修改。

在 package.json 和 next.config.js 中进行必要的更改并构建项目

从后端获取数据

在 Next.js 项目中创建一个 list.js 文件,负责从 Spring Boot API 获取数据。实现必要的逻辑以从后端检索数据并将其呈现在前端。

function List() {
    const [list, setList] = useState([])
    const fetchList = () => {
        fetch("/e3docs/getlist")
            .then(response => {
                return response.json()
            })
            .then(data => {
                setList(data)
            })
    }
    useEffect(() => {
        fetchList()
    }, [])
    function getlist() {
        return list.map((item, i) => {
            return (
                <Fragment key={i}>
                    <tr>
                        <td>
                            {(i + 1)}
                        </td>
                        <td>
                            {item}
                        </td>
                    </tr>
                </Fragment>
            );
        })
    }
    return (
        <main>
            <div style={{ paddingLeft: '34%', paddingTop: '2%', display: 'flex' }}>
                <h2 style={{ paddingRight: '10px' }}>
                    <Link href="/">Home</Link>
                </h2>
                <h2>
                    <Link href="/list">List</Link>
                </h2>
            </div>
            <div style={{ paddingLeft: '34%', paddingTop: '3%' }}>
                <table>
                    <thead>
                        <tr>
                            <th>No.</th>
                            <th>Description</th>
                        </tr>
                    </thead>
                    <tbody>
                        {list.length > 0 && (getlist())}
                    </tbody>
                </table >
            </div>
        </main>
    );
}
export default List;

创建新页面来处理 Web 应用程序刷新和直接 URL 输入

要处理 Web 应用程序刷新或直接 URL 输入等场景,请在 Next.js 项目中创建一个新页面。当用户在浏览器中直接输入 URL 或页面刷新时,该页面将有助于处理 Next JS 中的 404 错误页面。

function PageRefresh() {
    const router = useRouter();
    useEffect(() => {
        if (router.isReady) {
            router.push(router.asPath).catch((e) => {
                router.push('/_error');
            });
        }
    }, [router.isReady])
    return (
        <div>Loading...</div>
    );
}
export default PageRefresh;

构建并导出 Next.js 项目,该项目将使用编译和优化的 Next.js 应用程序创建一个“out”文件夹。

使用 Spring Initializr 创建新项目

使用Spring Initializr创建一个新的 Spring Boot 项目。指定必要的依赖项和项目设置,并生成项目结构。

生成项目后,找到 build.gradle 文件并使用应用程序所需的任何其他依赖项或插件更新它。该文件用作构建系统的配置。

为 API 创建控制器类

要处理 API 请求,请在 Spring Boot 项目中创建一个控制器类。此类将定义端点及其关联的请求处理方法,允许您与后端 API 进行交互。

@RestController
@RequestMapping("e3docs")
public class E3DocsController {
 @GetMapping("/getlist")
 public List<String> getList() {
  List<String> list = new ArrayList<String>();
  list.add("India");
  list.add("China");
  list.add("United States(US)");
  list.add("Russia");
  list.add("Australia");
  list.add("African");
  list.add("Europe");
  return list;
 }
}

为 Next.js 集成创建过滤器组件

为了在 Spring Boot 后端和 Next.js 前端之间顺利集成,请创建一个过滤器组件。该组件将拦截请求并执行必要的操作,例如直接 URL 输入或页面刷新。

@Component
public class PageRefreshFilter implements Filter {
    private static final String PAGE = "/pagerefresh/pagerefresh.html";
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        doFilter((HttpServletRequest) request, (HttpServletResponse) response, chain);
    }
    private void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        String path = request.getServletPath();
        if ("/".equals(path) || path.contains(".") || path.contains("e3docs")) {
            chain.doFilter(request, response);
        } else {
            request.getRequestDispatcher(PAGE).forward(request, response);
        }
    }
}

前端与后端集成

将静态内容从 Next.js 项目的“out”文件夹复制到 Spring Boot 项目的 /src/main/resources/static 文件夹中。这确保了可以从 Spring Boot 服务器访问前端资产。

通过运行以下命令构建 Spring Boot 项目:
gradlew clean assemble

成功完成构建过程后,您将在“build/distributions”目录中找到一个 zip 文件。提取该 zip 文件的内容并执行相关脚本(例如批处理文件(例如 .bat))以启动 Spring Boot 服务器。

服务器运行后,您可以通过打开 Web 浏览器并输入以下 URL 来访问该应用程序:http://localhost:8080。这将使您能够与 Spring Boot 应用程序无缝交互。

有关每个步骤的详细演练,包括具体配置和故障排除提示,请参阅下面提到的完整文章。
使用 Spring Boot 和 Next js 创建全栈 Web 应用程序

快乐编码!😃

使用 Spring Boot 和 Next.js 创建全栈 Web 应用程序

给TA打赏
共{{data.count}}人
人已打赏
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索