J Web开发.java

前言:在互联网蓬勃发展的当下,Java Web开发技术始终占据着重要地位,而Servlet与JSP作为其中的核心组件,为构建动态、高效的Web应用奠定了坚实基础。 

目录

一、Servlet

动态网页的幕后推手

(一)Servlet 是什么?

(二)Servlet 能干什么?

(三)Servlet 的基本架构

(四)创建一个Servlet

(五)Servlet 的生命周期

二、JSP

让网页活起来的魔法纸

(一)JSP 是什么?

(二)JSP 怎么用?

(三)JSP 的强大功能

三、Servlet 与 JSP 的完美搭配

(一)Servlet 处理业务逻辑

(二)JSP 负责页面展示

四、进阶技巧

表单处理与数据回显

(一)表单处理流程

(二)实战代码示例

五、深入探索

会话管理和数据库交互

(一)会话管理

(二)数据库交互

六、性能优化与实战技巧

(一)Servlet 性能优化

(二)JSP 性能优化

总结


一、Servlet

动态网页的幕后推手

想象一下,你在网上购物,点击“查看商品详情”,服务器瞬间返回该商品的所有信息,包括图片、价格、库存等等。这种动态响应的魔法,背后就是 Servlet 在施展拳脚。

(一)Servlet 是什么?

Servlet 是运行在服务器端的小程序,专门处理客户端的请求。它就像是一个“万能接待员”,接收用户的各种需求,然后调用相应的服务,最后把结果返回给用户。

(二)Servlet 能干什么?

Servlet 的能力可不小,它能接收请求、处理业务逻辑、与数据库交互、返回动态响应。例如,处理用户登录、查询订单、提交表单等操作,Servlet 都能轻松搞定。

(三)Servlet 的基本架构

一个完整的 Servlet 应用通常由以下几个部分组成:

  1. Servlet 容器:Servlet 容器是 Servlet 运行的环境,它负责加载、实例化和管理 Servlet。常见的 Servlet 容器有 Tomcat、Jetty 等。

  2. Web 应用程序:Web 应用程序包含了所有的 Servlet、HTML 文件、配置文件等资源。它按照一定的目录结构组织起来,部署在 Servlet 容器中。

  3. 配置文件(web.xml):这个文件是 Web 应用的部署描述符,它定义了 Servlet 的配置信息,包括 Servlet 的名称、类名、映射路径等。

(四)创建一个Servlet

不玩虚的,直接上实战代码:

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

// 继承HttpServlet类
public class LoginServlet extends HttpServlet {
    // 处理GET请求
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 设置响应内容类型
        response.setContentType("text/html;charset=UTF-8");
        // 获取用户名和密码(模拟从请求中获取)
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        
        // 模拟登录验证逻辑
        if ("张三".equals(username) && "123456".equals(password)) {
            response.getWriter().println("<h1>登录成功,欢迎 " + username + "!</h1>");
        } else {
            response.getWriter().println("<h1>登录失败,用户名或密码错误!</h1>");
        }
    }

    // 处理POST请求(这里简单复用GET逻辑)
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        doGet(request, response);
    }
}

上面的代码中,我们创建了一个 LoginServlet 类,它继承了 HttpServlet 类,并重写了 doGetdoPost 方法。当用户通过 GET 或 POST 请求访问这个Servlet时,它会根据用户名和密码判断登录是否成功,并返回相应的HTML响应。

(五)Servlet 的生命周期

Servlet 的一生由三个主要阶段构成:

  1. 出生(初始化):容器创建Servlet实例后,会调用它的init()方法,进行一些初始化工作,比如加载配置文件、建立数据库连接。

  2. 工作(处理请求):每当有请求过来,容器就调用Servlet的service()方法,它会根据请求类型调用对应的doGet()doPost()等方法来处理请求。

  3. 死亡(销毁):当Servlet不再需要时,容器调用它的destroy()方法,用于释放资源,比如关闭数据库连接。

理解了Servlet的生命周期,我们就可以更好地管理资源,比如在init()方法中加载资源,在destroy()方法中释放资源。

二、JSP

让网页活起来的魔法纸

Servlet 能力虽强,但如果要它生成复杂的HTML页面,代码会非常繁琐。这时候 JSP 就闪亮登场了。JSP 允许我们在 HTML 页面中嵌入 Java 代码,让静态页面也能“活”起来。

(一)JSP 是什么?

JSP(全称 Java Server Pages)就是一种动态网页技术,它让开发者可以在 HTML 中写 Java 代码。服务器会先将 JSP 转换成 Servlet,再运行它,最后把动态内容填充到 HTML 中返回给用户。

(二)JSP 怎么用?

下面是一个简单的 JSP 示例:

<%@ page contentType="text/html;charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>动态页面示例</title>
</head>
<body>
    <h1>欢迎来到我的网站</h1>
    <p>当前时间是:<%= new java.util.Date() %></p>
    <p>您的 IP 地址是:<%= request.getRemoteAddr() %></p>
</body>
</html>

在这段 JSP 代码中,我们使用 <%= ... %> 语法嵌入了 Java 表达式,用于动态输出当前时间和用户的 IP 地址。当用户访问这个 JSP 页面时,服务器会先将它转换成一个 Servlet,然后执行这个 Servlet,把动态内容填充到 HTML 中,最后返回给用户。

(三)JSP 的强大功能

JSP 的厉害之处在于它把 Java 的强大计算能力和 HTML 的页面展示能力完美结合。通过 JSP,我们可以在页面中动态生成内容、访问数据库、控制页面流程等等。

三、Servlet 与 JSP 的完美搭配

在实际开发中,Servlet 和 JSP 是一对黄金搭档,它们各司其职,共同完成复杂的 Web 应用。

(一)Servlet 处理业务逻辑

Servlet 负责接收请求、处理业务逻辑、与数据库交互等。例如,处理用户登录、查询订单等操作。

(二)JSP 负责页面展示

JSP 负责将处理后的数据以用户友好的方式展示出来,比如生成 HTML 页面。

下面是一个完整的Servlet和JSP协作示例:

  • 创建Servlet(处理登录请求)

import java.io.IOException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        // 模拟登录验证逻辑
        if ("张三".equals(username) && "123456".equals(password)) {
            // 登录成功,将用户信息存储到会话中
            HttpSession session = request.getSession();
            session.setAttribute("username", username);
            // 转发到欢迎页面
            request.getRequestDispatcher("welcome.jsp").forward(request, response);
        } else {
            // 登录失败,重定向到登录页面并提示错误
            response.sendRedirect("login.jsp?error=1");
        }
    }
}
  • 创建登录页面(login.jsp)

<%@ page contentType="text/html;charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>用户登录</title>
</head>
<body>
    <h1>用户登录</h1>
    <% if ("1".equals(request.getParameter("error"))) { %>
        <p style="color: red;">登录失败,用户名或密码错误!</p>
    <% } %>
    <form action="login" method="post">
        <label>用户名:</label>
        <input type="text" name="username"><br><br>
        <label>密码:</label>
        <input type="password" name="password"><br><br>
        <input type="submit" value="登录">
    </form>
</body>
</html>
  • 创建欢迎页面(welcome.jsp)

<%@ page contentType="text/html;charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>欢迎页面</title>
</head>
<body>
    <h1>欢迎,<%= request.getSession().getAttribute("username") %>!</h1>
    <p>您已成功登录系统。</p>
</body>
</html>

四、进阶技巧

表单处理与数据回显

在 Web 开发中,表单处理是一个常见的场景。用户提交表单后,我们通常需要在下一个页面中回显用户输入的数据。下面,我们通过一个注册功能的示例,来学习如何在 Servlet 和 JSP 中实现表单处理与数据回显。

(一)表单处理流程

  1. 创建表单页面:设计一个用户注册表单,包含用户名、密码、邮箱等字段。

  2. 提交表单:用户填写表单并提交,表单数据发送到指定的Servlet。

  3. 处理表单数据:Servlet 接收表单数据,进行验证和处理。

  4. 数据回显:将处理后的数据传递给 JSP 页面进行展示。

(二)实战代码示例

  • 创建注册表单页面(register.jsp)

<%@ page contentType="text/html;charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>用户注册</title>
</head>
<body>
    <h1>用户注册</h1>
    <form action="register" method="post">
        <label>用户名:</label>
        <input type="text" name="username"><br><br>
        <label>密码:</label>
        <input type="password" name="password"><br><br>
        <label>邮箱:</label>
        <input type="email" name="email"><br><br>
        <input type="submit" value="注册">
    </form>
</body>
</html>
  • 创建处理注册请求的Servlet(RegisterServlet.java)

import java.io.IOException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class RegisterServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 获取表单数据
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String email = request.getParameter("email");

        // 模拟数据验证逻辑
        if (username.length() < 2) {
            request.setAttribute("error", "用户名长度至少为 2 个字符");
            request.getRequestDispatcher("register.jsp").forward(request, response);
            return;
        }

        if (password.length() < 6) {
            request.setAttribute("error", "密码长度至少为 6 个字符");
            request.getRequestDispatcher("register.jsp").forward(request, response);
            return;
        }

        // 模拟注册成功逻辑
        HttpSession session = request.getSession();
        session.setAttribute("username", username);
        session.setAttribute("email", email);
        response.sendRedirect("register_success.jsp");
    }
}
  • 创建注册成功页面(register_success.jsp)

<%@ page contentType="text/html;charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>注册成功</title>
</head>
<body>
    <h1>注册成功!</h1>
    <p>用户名:<%= session.getAttribute("username") %></p>
    <p>邮箱:<%= session.getAttribute("email") %></p>
    <p>您已成功注册系统。</p>
</body>
</html>

五、深入探索

会话管理和数据库交互

在复杂的 Web 应用中,会话管理和数据库交互是两个关键的技术点。我们可以使用 Servlet 和 JSP 来实现这些功能。

(一)会话管理

会话管理是指在多个请求之间保持用户的会话状态。常见的会话管理技术有 Cookie 和 Session。

  • Cookie:Cookie 是存储在客户端浏览器上的小文本文件,用于记录用户的相关信息。Servlet 可以通过HttpServletResponse对象创建和发送 Cookie

    Cookie cookie = new Cookie("username", "张三");
    response.addCookie(cookie);

    然后通过HttpServletRequest对象获取 Cookie

    Cookie[] cookies = request.getCookies();
    for (Cookie c : cookies) {
        if ("username".equals(c.getName())) {
            String username = c.getValue();
            // 处理用户名
        }
    }
  • Session:Session 是存储在服务器端的会话对象,用于保存用户会话相关的数据。Servlet 可以通过HttpServletRequest对象获取 Session

    HttpSession session = request.getSession();
    session.setAttribute("username", "张三");

    然后在其他 Servlet 或 JSP 页面中可以通过 Session 获取这个数据

    String username = (String) session.getAttribute("username");

(二)数据库交互

在实际开发中,我们通常需要与数据库进行交互来存储和查询数据。下面是一个简单的示例,展示如何在 Servlet 中连接数据库并查询数据。

  • 添加数据库驱动依赖:在项目的 pom.xml 文件中添加数据库驱动依赖(以 MySQL 为例)

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
    </dependency>
  • 创建数据库连接工具类(DBUtil.java)

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBUtil {
    private static final String URL = "jdbc:mysql://localhost:3306/your_database_name";
    private static final String USERNAME = "your_username";
    private static final String PASSWORD = "your_password";

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USERNAME, PASSWORD);
    }
}
  • 创建查询数据的Servlet(QueryServlet.java)

import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class QueryServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        try {
            // 获取数据库连接
            Connection conn = DBUtil.getConnection();
            // 创建 Statement 对象
            Statement stmt = conn.createStatement();
            // 执行查询语句
            ResultSet rs = stmt.executeQuery("SELECT id, name FROM users");

            // 处理查询结果
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                System.out.println("ID: " + id + ", Name: " + name);
            }

            // 关闭资源
            rs.close();
            stmt.close();
            conn.close();

            response.getWriter().println("<h1>数据查询成功!</h1>");
            response.getWriter().println("<p>请查看控制台输出的查询结果。</p>");

        } catch (SQLException e) {
            e.printStackTrace();
            response.getWriter().println("<h1>数据查询失败!</h1>");
        }
    }
}

六、性能优化与实战技巧

开发过程中,性能优化是至关重要的。以下是一些Servlet和JSP的优化技巧:

(一)Servlet 性能优化

  1. 减少实例创建:通过合理配置容器参数,控制Servlet实例数量。

  2. 优化资源加载:在init()方法中加载资源,避免重复加载。

  3. 注意线程安全:避免使用实例变量存储共享数据,必要时使用线程安全集合或加锁机制。

(二)JSP 性能优化

  1. 减少脚本let:多用JSTL标签和EL表达式,替代脚本let。

  2. 开启缓存:对不常变化的页面设置缓存,减少编译次数。

  3. 简化页面结构:去掉多余注释和空格,使用外部CSS和JavaScript文件。

总结

Servlet 和 JSP 是 Java Web 开发的核心技术。Servlet 是服务器端小程序,用于处理客户端请求和返回响应。JSP 则允许在 HTML 中嵌入 Java 代码,生成动态网页内容。它们协同工作,Servlet 处理业务逻辑,JSP 负责页面展示。

从简单的 Servlet 创建和 JSP 嵌入 Java 表达式,到处理用户登录和数据回显,再到会话管理和数据库交互,这些技术为构建动态网页提供了强大支持。性能优化方面,要注意 Servlet 的线程安全和资源管理,减少 JSP 中的脚本代码,合理开启缓存。

掌握 Servlet 和 JSP 的核心知识,能为 Java Web 开发打下坚实基础。在实际项目中,灵活运用这些技术,不断实践和优化,有助于提升开发效率和应用性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值