七的博客

Servlet与JSP协作开发

Java

Servlet与JSP协作开发

通过最近对 Servlet 以及 JSP 的一定接触,总结下这两个技术的一些优缺点,同时结合这两种技术进行开发。

Servlet 更适合编写复杂的业务逻辑,因为 Servlet 就是一个普通的 Java 类。如果要生成一些 HTML 代码的话比较麻烦。

JSP 则更适合动态网页的场景,比如展示数据、处理简单的业务逻辑等。 如果要编写大量的 Java 代码比较难维护,所以还是比较适合编写 HTML 片段。

Java 代码很多都是有逻辑的,可能需要被重用或者复用。如果你写在 JSP 代码中,逻辑是没有办法被复用的。那么可以想象的到,业界肯定对 JSP 以及 Servlet 进行结合使用的最佳实践。

实践原则就是将 Servlet 作为控制器, JSP 作为视图。简单来说就是 Servlet 负责接收请求,处理业务逻辑,准备数据等等之类的。 JSP 页面大部分时候只负责页面渲染以及数据渲染即可,尽量只负责做界面展示。

将之前的登录的 Servlet 登录的例子,拆分成 Servlet + JSP 的形式:

登录接口 LoginServlet.java :

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;

@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 显示登录表单
        request.getRequestDispatcher("/login.jsp").forward(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 处理登录请求
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        if ("admin".equals(username) && "password".equals(password)) {
            HttpSession session = request.getSession();
            session.setAttribute("username", username);
            response.sendRedirect("success.jsp");
        } else {
            request.setAttribute("errorMessage", "用户名或者密码验证失败.");
            request.getRequestDispatcher("/login.jsp").forward(request, response);
        }
    }
}

登录界面 login.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>登录界面</title>
</head>
<body>
    <h2>填写登录信息</h2>
    <% String errorMessage = (String) request.getAttribute("errorMessage"); %>
    <% if (errorMessage != null) { %>
        <p style="color: red;"><%= errorMessage %></p>
    <% } %>
    <form action="LoginServlet" method="post">
        Username: <input type="text" name="username"><br>
        Password: <input type="password" name="password"><br>
        <input type="submit" value="Login">
    </form>
</body>
</html>

登录成功后的 JSP 页面 success.jsp :

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>登录成功</title>
</head>
<body>
    <h2>欢迎登录, <%= session.getAttribute("username") %>!</h2>
    <p>登录成功.</p>
</body>
</html>

按照这么拆分的话:

  • LoginServlet 主要就是负责处理登录请求和登录验证的逻辑。如果登录成功的话,把用户名保存在 HttpSession 中。 然后重定向到登录成功页面,如果登录失败,就把错误信息保存在 request 中并转发到登录页面去。
  • login.jsp 只负责显示登录界面,在登录失败时显示登录失败的错误信息。
  • success.jsp 只负责显示登录成功后的欢迎信息。

通过这样去拆分,Servlet 负责处理业务逻辑,而 JSP 页面只负责显示页面内容。

Servlet 的逻辑中不包含 HTML 代码, JSP 中也尽量不包含 Java 代码。

在代码自动补全方面,Servlet 类本身是 Java 文件,里面也没有 HTML 代码,所以提示补全都可以正常。JSP 文件大部分都是 HTML 标签了,使用 Sublime、Eclipse、IDEA 等均可以进行补全提示。