Servlet(服务器端小程序)是JavaEE中用于处理HTTP请求的核心组件。它是一个Java类,运行在Web服务器上,负责接收和响应HTTP请求。
1. Servlet的生命周期
Servlet的生命周期由以下几个阶段组成:
init()
方法。service()
方法。doGet()
或doPost()
方法,生成响应。destroy()
方法。2. Servlet的配置
Servlet可以通过以下两种方式配置:
基于XML配置(web.xml):
在web.xml
文件中,通过
和
元素配置Servlet。
示例:
<servlet>
<servlet-name>MyServletservlet-name>
<servlet-class>com.example.MyServletservlet-class>
<init-param>
<param-name> ParamName param-name>
<param-value> ParamValue param-value>
init-param>
servlet>
<servlet-mapping>
<servlet-name>MyServletservlet-name>
<url-pattern>/myServleturl-pattern>
servlet-mapping>
基于注解配置:
使用@WebServlet
注解直接在Servlet类上配置。
示例:
@WebServlet(name = "MyServlet", urlPatterns = "/myServlet")
public class MyServlet extends HttpServlet {
// Servlet实现
}
3. Servlet的基本实现
以下是一个基本的Servlet实现示例:
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class MyServlet extends HttpServlet {
@Override
public void init() throws ServletException {
// 初始化代码
System.out.println("Servlet initialized");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 处理GET请求
resp.setContentType("text/html");
resp.getWriter().println("Hello, World!
");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 处理POST请求
String username = req.getParameter("username");
resp.setContentType("text/html");
resp.getWriter().println("Hello, "
+ username + "!");
}
@Override
public void destroy() {
// 销毁资源
System.out.println("Servlet destroyed");
}
}
JavaServer Pages(JSP)是一种动态网页技术,允许开发者在HTML页面中嵌入Java代码,以生成动态内容。
1. JSP的语法
JSP的语法包括以下几种元素:
表达式:
<%= 表达式 %>
示例:
当前时间:<%= new java.util.Date() %>
指令:
<%@ page %>
、<%@ include %>
、<%@ taglib %>
。示例:
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
动作标签:
、
。示例:
声明:
<% 声明 %>
。示例:
<%!
private int counter = 0;
%>
脚本лет:
<% 代码 %>
。**示例: Loop: <%= i %> <% for(int i=0; i<10; i++) { %>
2. 动态内容生成
JSP可以通过以下方式生成动态内容:
使用JavaBeans:
定义JavaBean:
public class User {
private String name;
// Getters and setters
}
在JSP中使用JavaBeans:
使用Expression Language (EL):
示例:
Hello, ${user.name}
使用JSP Standard Tag Library (JSTL):
导入JSTL标签库:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
使用JSTL标签:
${item}
Servlet和JSP的结合是JavaEE Web开发的核心模式。Servlet负责处理业务逻辑,JSP负责生成视图。
1. 分离Concerns(关注点分离)
2. 请求转发与共享数据
请求转发: 使用RequestDispatcher
将请求从Servlet转发到JSP。
RequestDispatcher dispatcher = req.getRequestDispatcher("result.jsp");
dispatcher.forward(req, resp);
共享数据: 将数据存储在HttpServletRequest
对象中,供JSP访问。
req.setAttribute("message", "Hello, JSP!");
在JSP中访问数据:
${message}
3. 用户登录案例
以下是一个简单的用户登录案例,展示了Servlet与JSP的联动开发:
登录页面(login.jsp):
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
用户登录
用户登录
登录处理Servlet(LoginServlet.java):
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
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 (username.equals("admin") && password.equals("admin")) {
req.setAttribute("message", "登录成功,欢迎您," + username + "!");
req.getRequestDispatcher("/welcome.jsp").forward(req, resp);
} else {
req.setAttribute("message", "用户名或密码错误!");
req.getRequestDispatcher("/login.jsp").forward(req, resp);
}
}
}
欢迎页面(welcome.jsp):
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
欢迎页面
${message}
在本节中,我们将通过一个完整的用户登录和注册功能来实践Servlet和JSP的联动开发。
1. 功能需求
2. 项目结构
以下是一个典型的JavaEE Web项目结构:
MyWebProject/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── example/
│ │ │ ├── controller/
│ │ │ │ ├── LoginServlet.java
│ │ │ │ └── RegisterServlet.java
│ │ │ └── model/
│ │ │ └── User.java
│ │ ├── resources/
│ │ │ └── META-INF/
│ │ │ └── persistence.xml
│ │ └── webapp/
│ │ ├── WEB-INF/
│ │ │ └── web.xml
│ │ ├── login.jsp
│ │ ├── register.jsp
│ │ └── welcome.jsp
├── pom.xml
└── README.md
3. 实现步骤
创建项目:
设计数据库:
users
表,包含id
、username
、password
和email
字段。实现JavaBeans:
创建User JavaBean,用于封装用户数据。
public class User {
private int id;
private String username;
private String password;
private String email;
// Getters and setters
}
实现Servlet:
实现JSP页面:
配置安全性:
部署和测试:
4. 代码示例
以下是部分代码示例:
LoginServlet.java:
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
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");
try {
// 验证用户信息
if (isValidUser(username, password)) {
req.getSession().setAttribute("user", username);
req.getRequestDispatcher("/welcome.jsp").forward(req, resp);
} else {
req.setAttribute("error", "用户名或密码错误!");
req.getRequestDispatcher("/login.jsp").forward(req, resp);
}
} catch (Exception e) {
// 处理异常
}
}
private boolean isValidUser(String username, String password) throws Exception {
// 数据库验证逻辑
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
conn = getConnection();
stmt = conn.prepareStatement("SELECT * FROM users WHERE username = ?");
stmt.setString(1, username);
rs = stmt.executeQuery();
if (rs.next()) {
return rs.getString("password").equals(password);
}
return false;
} finally {
closeResources(conn, stmt, rs);
}
}
}
login.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
用户登录
用户登录
${error}
register.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
用户注册
用户注册
${error}
welcome.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
欢迎页面
欢迎,${user}!
5. 使用Expression Language (EL) 和 JSTL
Expression Language (EL): 用于在JSP中访问JavaBean的属性。
${user.username}
JSTL: 用于在JSP中执行逻辑操作,如条件判断、循环等。
您是管理员:
6. 依赖管理
在项目中,可以使用Maven或Gradle来管理依赖。以下是一个Maven pom.xml
文件的示例:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.examplegroupId>
<artifactId>mywebappartifactId>
<version>1.0-SNAPSHOTversion>
<packaging>warpackaging>
<dependencies>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>4.0.1version>
<scope>providedscope>
dependency>
<dependency>
<groupId>javax.servlet.jspgroupId>
<artifactId>jsp-apiartifactId>
<version>2.3.1version>
<scope>providedscope>
dependency>
<dependency>
<groupId>jstlgroupId>
<artifactId>jstlartifactId>
<version>1.2version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.21version>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>3.8.1version>
<configuration>
<source>1.8source>
<target>1.8target>
configuration>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-war-pluginartifactId>
<version>3.3.1version>
<configuration>
<warSourceDirectory>src/main/webappwarSourceDirectory>
configuration>
plugin>
plugins>
build>
project>