您的位置:首页 > 健康 > 美食 > 【全面指南】Java Web开发完全指南:从基础到实战

【全面指南】Java Web开发完全指南:从基础到实战

2024/10/6 8:21:55 来源:https://blog.csdn.net/weixin_68020300/article/details/142062908  浏览:    关键词:【全面指南】Java Web开发完全指南:从基础到实战

文章目录

  • Java Web 开发基础
    • 1. 引言
      • 1.1 Java Web开发简介
      • 1.2 当前Web开发环境中的Java地位
    • 2. 前端基础知识
      • 2.1 HTML/CSS 快速入门
      • 2.2 JavaScript 基础
      • 2.3 前后端交互的基础
    • 3. 数据格式
      • 3.1 XML 概览
      • 3.2 JSON 介绍
    • 4. Servlet 技术
      • 4.1 Servlet 概述
      • 4.2 Servlet 进阶
      • 4.3 Servlet 示例代码
    • 5. 过滤器(Filter)和监听器(Listener)
      • 5.1 过滤器的作用与实现
      • 5.2 监听器的作用与实现
    • 6. JSP 技术
      • 6.1 JSP 概述
      • 6.2 JSP 与Servlet的区别
      • 6.3 动态页面开发
      • 6.4 JSP 示例代码
    • 7. JSTL 标签库
    • 8. Cookie 与 Session 技术
      • 8.1 Cookie 概述
      • 8.2 Session 概述
      • 8.3 安全性考虑
      • 8.4 Cookie 与 Session 示例代码
    • 9. 实战案例分析
      • 9.1 用户登录与注册系统
      • 9.2 电子商务网站商品展示
      • 9.3 后台管理系统


Java Web 开发基础

1. 引言

1.1 Java Web开发简介

Java Web开发是一种使用Java编程语言来创建动态Web应用程序的技术。它利用了Java平台的优势,如跨平台性、安全性、强大的API支持以及广泛的社区支持,使得开发者能够构建出复杂而高效的Web应用。Java Web开发不仅仅限于服务器端编程,还包括客户端脚本编写、数据库操作以及各种中间件技术的应用。

Java Web开发的核心技术包括Servlet、Java Server Pages (JSP)、JavaServer Faces (JSF)、Spring MVC等。这些技术提供了从简单的表单处理到复杂的业务逻辑处理的能力,使得开发者能够构建出高度可定制的Web应用。

1.2 当前Web开发环境中的Java地位

尽管JavaScript框架(如React、Vue.js)在前端开发中占据了主导地位,Java仍然在后端开发中保持着重要位置。特别是在企业级应用领域,Java凭借其稳定性和成熟度成为许多大型公司的首选语言之一。随着云计算和微服务架构的发展,Java也在不断地适应新的技术趋势,比如Spring Boot框架简化了微服务的开发过程,而Spring Cloud则为微服务治理提供了完整的解决方案。

Java在Web开发领域的地位还体现在其生态系统上。大量的开源项目、框架和工具使得Java开发者能够快速搭建起功能丰富的Web应用。此外,Java也因其类型安全和面向对象的特性,在处理大规模并发请求方面具有优势。


2. 前端基础知识

2.1 HTML/CSS 快速入门

HTML (HyperText Markup Language) 是一种标记语言,用于定义网页的结构。CSS (Cascading Style Sheets) 则是用来描述HTML文档外观的语言。下面是一个简单的HTML页面示例:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>简单页面</title><style>body {font-family: Arial, sans-serif;color: #333;}h1 {color: #f00;}</style>
</head>
<body><h1>欢迎来到我的网站</h1><p>这是一个简单的网页。</p>
</body>
</html>

在这个例子中,我们定义了一个标题和一段文本,并通过内联样式表设置了字体和颜色。

2.2 JavaScript 基础

JavaScript是一种广泛使用的编程语言,主要用于实现Web页面上的交互效果。下面是一个简单的JavaScript示例,展示了如何改变HTML元素的内容:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>JavaScript 示例</title>
</head>
<body><button onclick="changeText()">点击我改变文本</button><p id="text">初始文本</p><script>function changeText() {document.getElementById('text').innerHTML = "文本已改变";}</script>
</body>
</html>

在这个例子中,当用户点击按钮时,changeText()函数会被调用,并修改指定ID的段落元素的内容。

2.3 前后端交互的基础

前后端交互通常涉及通过HTTP协议发送请求和接收响应。前端可以通过AJAX(Asynchronous JavaScript and XML)技术异步地与后端进行数据交换。下面是一个使用原生JavaScript发起GET请求的例子:

function fetchUserData(userId) {var xhr = new XMLHttpRequest();xhr.onreadystatechange = function () {if (xhr.readyState == 4 && xhr.status == 200) {console.log(xhr.responseText);}};xhr.open("GET", "http://example.com/api/user/" + userId, true);xhr.send();
}fetchUserData(1);

此代码片段展示了如何创建一个XMLHttpRequest对象并发送一个GET请求到服务器获取用户信息。


3. 数据格式

3.1 XML 概览

1. XML 的基本语法

XML (eXtensible Markup Language) 是一种类似于HTML的标记语言,但它更加强调数据的结构化表达。一个简单的XML文档如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<catalog><book id="bk101"><author>Gambardella, Matthew</author><title>XML Developer's Guide</title><genre>Computer</genre><price>44.95</price><publish_date>2000-10-01</publish_date><description>An in-depth look at creating applications with XML.</description></book>
</catalog>

2. 解析XML文档

Java中有多种方法可以解析XML文档,其中DOM (Document Object Model) 和SAX (Simple API for XML) 是最常用的两种方式。以下是使用DOM解析上述XML文档的一个简单示例:

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;try {DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();Document doc = dBuilder.parse("books.xml");doc.getDocumentElement().normalize();System.out.println("Root element :" + doc.getDocumentElement().getNodeName());NodeList nList = doc.getElementsByTagName("book");for (int temp = 0; temp < nList.getLength(); temp++) {Node nNode = nList.item(temp);System.out.println("\nCurrent Element :" + nNode.getNodeName());if (nNode.getNodeType() == Node.ELEMENT_NODE) {Element eElement = (Element) nNode;System.out.println("Book id : " + eElement.getAttribute("id"));System.out.println("Author : " + eElement.getElementsByTagName("author").item(0).getTextContent());System.out.println("Title : " + eElement.getElementsByTagName("title").item(0).getTextContent());System.out.println("Genre : " + eElement.getElementsByTagName("genre").item(0).getTextContent());System.out.println("Price : " + eElement.getElementsByTagName("price").item(0).getTextContent());System.out.println("Publish Date : " + eElement.getElementsByTagName("publish_date").item(0).getTextContent());System.out.println("Description : " + eElement.getElementsByTagName("description").item(0).getTextContent());}}} catch (Exception e) {e.printStackTrace();
}

这段代码演示了如何加载并解析XML文档,并打印出各个元素的内容。

3.2 JSON 介绍

1. JSON 对象与数组

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。一个典型的JSON对象如下所示:

{"name": "John Doe","age": 30,"isMarried": false,"hobbies": ["reading", "swimming", "gaming"],"address": {"street": "123 Main St","city": "Anytown"}
}

2. 使用Java解析JSON数据

Java中有多个库可以帮助解析JSON数据,如Jackson、Gson等。下面是使用Jackson库解析上面JSON对象的一个简单示例:

首先,确保添加了Jackson库的依赖项(如果使用Maven的话):

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.3</version>
</dependency>

然后,使用Jackson来解析JSON字符串:

import com.fasterxml.jackson.databind.ObjectMapper;public class User {private String name;private int age;private boolean isMarried;private List<String> hobbies;private Address address;// getters and setters// ...public static void main(String[] args) throws Exception {String jsonString = "{\"name\":\"John Doe\",\"age\":30,\"isMarried\":false,\"hobbies\":[\"reading\",\"swimming\",\"gaming\"],\"address\":{\"street\":\"123 Main St\",\"city\":\"Anytown\"}}";ObjectMapper mapper = new ObjectMapper();User user = mapper.readValue(jsonString, User.class);System.out.println("Name: " + user.getName());System.out.println("Age: " + user.getAge());System.out.println("Is Married: " + user.isMarried());System.out.println("Hobbies: " + user.getHobbies());System.out.println("Address: " + user.getAddress().getStreet() + ", " + user.getAddress().getCity());}
}

在这个例子中,我们首先定义了一个User类来映射JSON对象,然后使用ObjectMapper对象将JSON字符串转换为Java对象。


4. Servlet 技术

4.1 Servlet 概述

1. Servlet 生命周期

Servlet是一个运行在Web容器中的Java组件,用于处理客户端的请求并产生响应。Servlet的生命周期由Web容器管理,主要包括初始化、服务和销毁三个阶段。

  • 初始化:当Servlet第一次被请求时,Web容器会调用init()方法进行初始化。
  • 服务:每当客户端发出请求时,Web容器会调用service()方法来处理请求。
  • 销毁:当Web容器决定卸载Servlet时,会调用destroy()方法来释放Servlet占用的资源。

2. 创建第一个Servlet

要创建一个Servlet,你需要继承javax.servlet.http.HttpServlet类,并重写doGet()和/或doPost()方法来处理HTTP GET和POST请求。

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/hello")
public class HelloServlet extends HttpServlet {@Overridepublic void init() throws ServletException {super.init();System.out.println("Servlet 初始化...");}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {PrintWriter out = resp.getWriter();out.println("<html><body>");out.println("<h1>Hello, World!</h1>");out.println("</body></html>");}@Overridepublic void destroy() {System.out.println("Servlet 销毁...");super.destroy();}
}

3. Servlet 配置与部署

web.xml 配置文件

传统的Servlet配置是在web.xml文件中完成的。下面是一个简单的配置示例:

<servlet><servlet-name>HelloServlet</servlet-name><servlet-class>com.example.HelloServlet</servlet-class>
</servlet><servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/hello</url-pattern>
</servlet-mapping>

注解配置Servlet

从Servlet 3.0开始,可以使用注解来配置Servlet,如前面的@WebServlet注解所示。

4.2 Servlet 进阶

1. ServletContext 和 ServletConfig

  • ServletContext:提供了一种在整个Web应用范围内共享数据的方式。
  • ServletConfig:提供了一种在Servlet初始化时传递参数的方法。
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/context")
public class ContextServlet extends HttpServlet {@Overridepublic void init(ServletConfig config) throws ServletException {super.init(config);System.out.println("Servlet 初始化...");}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {PrintWriter out = resp.getWriter();out.println("<html><body>");out.println("<h1>使用 ServletContext 和 ServletConfig</h1>");out.println("<p>Application name: " + getServletContext().getServletContextName() + "</p>");out.println("</body></html>");}
}

2. Servlet 通信

Servlet之间可以通过ServletContext来共享数据,例如设置一个全局属性供其他Servlet访问。

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;@WebListener
public class GlobalDataListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {sce.getServletContext().setAttribute("appData", "Hello from listener!");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {sce.getServletContext().removeAttribute("appData");}
}

4.3 Servlet 示例代码

完整的Servlet示例,包括初始化、服务和销毁过程。

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/example")
public class ExampleServlet extends HttpServlet {@Overridepublic void init(ServletConfig config) throws ServletException {super.init(config);System.out.println("Servlet 初始化...");}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {PrintWriter out = resp.getWriter();out.println("<html><body>");out.println("<h1>Example Servlet</h1>");out.println("</body></html>");}@Overridepublic void destroy() {System.out.println("Servlet 销毁...");super.destroy();}
}

5. 过滤器(Filter)和监听器(Listener)

5.1 过滤器的作用与实现

1. Servlet Filter API

过滤器允许开发者拦截客户端的请求和服务器的响应。可以用来执行诸如认证、日志记录、压缩等任务。

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@WebFilter("/secure/*")
public class AuthFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;HttpServletResponse res = (HttpServletResponse) response;if (req.getSession().getAttribute("user") != null) {chain.doFilter(request, response);} else {res.sendRedirect(req.getContextPath() + "/login");}}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("AuthFilter 初始化...");}@Overridepublic void destroy() {System.out.println("AuthFilter 销毁...");}
}

2. 编写过滤器示例

假设我们有一个简单的登录页面和一些需要认证才能访问的页面,我们可以使用上面定义的AuthFilter来保护这些页面。下面是一个简单的登录控制器示例:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;@WebServlet("/login")
public class LoginServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");String password = req.getParameter("password");// 简单的验证逻辑if ("admin".equals(username) && "password".equals(password)) {HttpSession session = req.getSession();session.setAttribute("user", username);resp.sendRedirect(req.getContextPath() + "/secure/home");} else {resp.sendRedirect(req.getContextPath() + "/login?error=true");}}
}

5.2 监听器的作用与实现

1. Servlet Listener API

监听器用于监听Web应用中特定事件的发生,例如应用程序上下文的创建和销毁、会话的创建和失效等。

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.annotation.WebListener;@WebListener
public class SessionListener implements HttpSessionListener {@Overridepublic void sessionCreated(HttpSessionEvent se) {System.out.println("New session created: " + se.getSession().getId());}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {System.out.println("Session destroyed: " + se.getSession().getId());}
}

2. 编写监听器示例

我们可以在应用中添加一个监听器来跟踪用户的会话。例如,我们可以统计在线用户数量,当新会话创建时增加计数,当会话结束时减少计数。下面是一个简单的实现示例:

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;@WebListener
public class OnlineUserCounter implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {sce.getServletContext().setAttribute("onlineUsers", 0);}@Overridepublic void contextDestroyed(ServletContextEvent sce) {sce.getServletContext().removeAttribute("onlineUsers");}@Overridepublic void sessionCreated(HttpSessionEvent se) {Integer count = (Integer) se.getServletContext().getAttribute("onlineUsers");se.getServletContext().setAttribute("onlineUsers", ++count);}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {Integer count = (Integer) se.getServletContext().getAttribute("onlineUsers");se.getServletContext().setAttribute("onlineUsers", --count);}@Overridepublic void attributeAdded(HttpSessionBindingEvent event) {}@Overridepublic void attributeRemoved(HttpSessionBindingEvent event) {}@Overridepublic void attributeReplaced(HttpSessionBindingEvent event) {}
}

在这个示例中,我们实现了一个多接口的监听器,它可以监听上下文初始化和销毁、会话创建和销毁事件,并且监听会话属性的变化。通过这种方式,我们可以实时地监控有多少用户在线,并且可以在会话结束时更新在线用户数量。


6. JSP 技术

6.1 JSP 概述

JSP 页面元素

JSP (JavaServer Pages) 是一种基于Java的服务器端技术,用于生成动态Web页面。JSP页面可以包含静态内容、脚本元素(如Java代码片段)、指令(如<%@ page %>)和标签库。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head><title>JSP Example</title>
</head>
<body><h1>Welcome to JSP</h1><%String message = "Hello, World!";out.print(message);%>
</body>
</html>

6.2 JSP 与Servlet的区别

  • JSP:更适合生成HTML等视图层的内容,内部可以嵌入Java代码,但主要关注页面展示。
  • Servlet:更侧重于处理业务逻辑,可以返回任何类型的响应内容,灵活性更高。

6.3 动态页面开发

1. 表单处理

使用JSP处理表单提交的数据:

<%@ page import="java.util.Date" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head><title>Form Submission</title>
</head>
<body><form action="submit.jsp" method="post">Name: <input type="text" name="name"><br>Email: <input type="text" name="email"><br><input type="submit" value="Submit"></form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head><title>Form Submission Result</title>
</head>
<body><h1>Form Submission Result</h1><%String name = request.getParameter("name");String email = request.getParameter("email");out.print("Name: " + name + "<br>");out.print("Email: " + email + "<br>");%>
</body>
</html>

2. 数据绑定
数据绑定使得表单数据可以直接映射到JavaBean的属性上,从而简化了数据处理的步骤。在JSP中,可以使用EL表达式来直接访问JavaBean的属性值。

表单页面

假设我们已经有了一个简单的表单页面,如下所示:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head><title>Form Submission</title>
</head>
<body><form action="submit" method="post">Name: <input type="text" name="name"><br>Email: <input type="text" name="email"><br><input type="submit" value="Submit"></form>
</body>
</html>

处理表单数据

在Servlet中处理表单提交的数据,并将其绑定到JavaBean实例:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/submit")
public class SubmitServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取表单数据String name = req.getParameter("name");String email = req.getParameter("email");// 创建User对象并设置属性User user = new User();user.setName(name);user.setEmail(email);// 将User对象存储在请求作用域中req.setAttribute("user", user);// 转发到结果页面req.getRequestDispatcher("/result.jsp").forward(req, resp);}
}

显示结果

result.jsp页面中使用EL表达式来显示用户数据:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head><title>Form Submission Result</title>
</head>
<body><h1>Form Submission Result</h1><h2>User Details:</h2><p>Name: ${user.name}</p><p>Email: ${user.email}</p>
</body>
</html>

通过这种方式,我们不仅能够处理表单数据,还能将数据绑定到JavaBean上,使得页面开发更加简洁和高效。

6.4 JSP 示例代码

一个简单的JSP示例,展示如何显示消息。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head><title>JSP Example</title>
</head>
<body><h1>Welcome to JSP</h1><%String message = "Hello, World!";out.print(message);%>
</body>
</html>

接下来,我们将继续完善这篇博客文章,重点讲述JSTL标签库以及Cookie与Session技术,并提供实战案例分析,最后得出结论部分。

7. JSTL 标签库

1. JSTL 介绍

JSTL (JavaServer Pages Standard Tag Library) 是一组标准标签库,用于简化JSP页面的开发。JSTL标签库提供了许多功能,如条件判断、循环、国际化、SQL操作等,减少了JSP页面中的Java代码量,使页面更加清晰易维护。

2. Core标签库

Core标签库是最常用的一部分,包含了基本的控制结构标签,如<c:if><c:forEach>等。

示例代码

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head><title>JSTL Core Tags Example</title>
</head>
<body><c:set var="name" value="John Doe"/><c:if test="${not empty name}"><p>Welcome, ${name}</p></c:if><c:forEach var="item" items="${items}"><p>${item}</p></c:forEach>
</body>
</html>

3. SQL标签库

SQL标签库提供了直接在JSP页面中执行SQL语句的功能,简化了数据库操作。

示例代码

<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head><title>JSTL SQL Tags Example</title>
</head>
<body><sql:setDataSource var="dataSource" driver="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/mydb" user="root" password="password"/><sql:query dataSource="${dataSource}" var="result">SELECT * FROM users</sql:query><c:forEach var="row" items="${result.rows}"><p>User ID: ${row.id}, Name: ${row.name}</p></c:forEach>
</body>
</html>

4. 函数标签库

Function标签库允许开发者自定义函数并在JSP页面中使用。

示例代码

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head><title>JSTL Functions Tags Example</title>
</head>
<body><p>Original text: Hello World!</p><p>Lowercase: ${fn:toLowerCase('Hello World!')}</p><p>Uppercase: ${fn:toUpperCase('Hello World!')}</p>
</body>
</html>

5. 国际化标签库

FMT标签库提供了国际化支持,如日期和数字格式化。

示例代码

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head><title>JSTL FMT Tags Example</title><fmt:setLocale value="zh_CN"/>
</head>
<body><fmt:formatDate value="${new java.util.Date()}" pattern="yyyy-MM-dd HH:mm:ss"/><fmt:formatNumber value="123456789" type="currency"/>
</body>
</html>

6. JSTL 示例代码

综合使用JSTL标签库来展示一个简单的页面。

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head><title>JSTL Example</title><fmt:setLocale value="zh_CN"/>
</head>
<body><c:set var="message" value="Hello, World!"/><p>${message}</p><sql:setDataSource var="dataSource" driver="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/mydb" user="root" password="password"/><sql:query dataSource="${dataSource}" var="result">SELECT * FROM users</sql:query><c:forEach var="row" items="${result.rows}"><p>User ID: ${row.id}, Name: ${fn:toLowerCase(row.name)}</p></c:forEach><fmt:formatDate value="${new java.util.Date()}" pattern="yyyy-MM-dd HH:mm:ss"/><fmt:formatNumber value="123456789" type="currency"/>
</body>
</html>

8. Cookie 与 Session 技术

8.1 Cookie 概述

1. Cookie 的使用场景

Cookie主要用于存储用户偏好设置、身份验证信息等,以便在后续请求中识别用户。

2. 设置与读取Cookie

// 设置Cookie
Cookie cookie = new Cookie("username", "john");
cookie.setMaxAge(60 * 60 * 24); // 设置有效期为一天
response.addCookie(cookie);// 读取Cookie
Cookie[] cookies = request.getCookies();
if (cookies != null) {for (Cookie cookie : cookies) {if ("username".equals(cookie.getName())) {String username = cookie.getValue();// 使用用户名}}
}

8.2 Session 概述

1. Session 的生命周期管理

Session用于在用户的多次请求之间保持状态信息。它的生命周期通常由服务器管理和维护。

2. Session 与Cookie的关系

Session通常依赖Cookie来标识客户端,因此需要在客户端启用Cookie。

8.3 安全性考虑

在使用Cookie和Session时,需要注意安全性问题,如防止会话劫持、确保传输安全等。

8.4 Cookie 与 Session 示例代码

// 设置Session
HttpSession session = request.getSession();
session.setAttribute("username", "john");// 读取Session
String username = (String) session.getAttribute("username");

9. 实战案例分析

9.1 用户登录与注册系统

1. 登录流程

  1. 用户输入用户名和密码。
  2. 应用程序验证凭据。
  3. 如果成功,创建Session并将用户信息保存在其中。
  4. 重定向到主页或其他受保护的页面。

2. 注册流程

  1. 用户填写注册表单。
  2. 应用程序验证输入数据。
  3. 将用户信息存储到数据库。
  4. 发送确认邮件给用户。

9.2 电子商务网站商品展示

  1. 用户浏览商品列表。
  2. 商品详情页面展示商品信息。
  3. 用户可以将商品添加到购物车。
  4. 购物车页面显示所有选择的商品。

9.3 后台管理系统

  1. 管理员登录后台。
  2. 提供商品管理界面,包括添加、编辑和删除商品。
  3. 订单管理,查看订单状态。
  4. 用户管理,查看和管理用户账户。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com