文章目录
- 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. 登录流程
- 用户输入用户名和密码。
- 应用程序验证凭据。
- 如果成功,创建Session并将用户信息保存在其中。
- 重定向到主页或其他受保护的页面。
2. 注册流程
- 用户填写注册表单。
- 应用程序验证输入数据。
- 将用户信息存储到数据库。
- 发送确认邮件给用户。
9.2 电子商务网站商品展示
- 用户浏览商品列表。
- 商品详情页面展示商品信息。
- 用户可以将商品添加到购物车。
- 购物车页面显示所有选择的商品。
9.3 后台管理系统
- 管理员登录后台。
- 提供商品管理界面,包括添加、编辑和删除商品。
- 订单管理,查看订单状态。
- 用户管理,查看和管理用户账户。