文章目录
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 {
@Override
public void init() throws ServletException {
super.init();
System.out.println("Servlet 初始化...");
}
@Override
protected 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>");
}
@Override
public 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 {
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
System.out.println("Servlet 初始化...");
}
@Override
protected 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 {
@Override
public void contextInitialized(ServletContextEvent sce) {
sce.getServletContext().setAttribute("appData", "Hello from listener!");
}
@Override
public 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 {
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
System.out.println("Servlet 初始化...");
}
@Override
protected 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>");
}
@Override
public 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 {
@Override
public 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");
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("AuthFilter 初始化...");
}
@Override
public 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 {
@Override
protected 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 {
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("New session created: " + se.getSession().getId());
}
@Override
public 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 {
@Override
public void contextInitialized(ServletContextEvent sce) {
sce.getServletContext().setAttribute("onlineUsers", 0);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
sce.getServletContext().removeAttribute("onlineUsers");
}
@Override
public void sessionCreated(HttpSessionEvent se) {
Integer count = (Integer) se.getServletContext().getAttribute("onlineUsers");
se.getServletContext().setAttribute("onlineUsers", ++count);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
Integer count = (Integer) se.getServletContext().getAttribute("onlineUsers");
se.getServletContext().setAttribute("onlineUsers", --count);
}
@Override
public void attributeAdded(HttpSessionBindingEvent event) {}
@Override
public void attributeRemoved(HttpSessionBindingEvent event) {}
@Override
public 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 {
@Override
protected 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 后台管理系统
- 管理员登录后台。
- 提供商品管理界面,包括添加、编辑和删除商品。
- 订单管理,查看订单状态。
- 用户管理,查看和管理用户账户。