高校校园网站建设与运行,网络营销公司招聘,东莞网站建设推广费用,个人营业执照网上注册入口本文为记录Servlet学习时的一些笔记和代码 课程参考黑马程序员 对于Java Web 学习的一个复习一 概述server applet 运行在服务器端的小程序 本质就是一个接口 定义java类被浏览器访问到#xff08;Tomcat识别#xff09;的规则我们会自定义这样一个类来实现复写方法实现接口二…本文为记录Servlet学习时的一些笔记和代码 课程参考黑马程序员 对于Java Web 学习的一个复习
一 概述
server applet 运行在服务器端的小程序 本质就是一个接口 定义java类被浏览器访问到Tomcat识别的规则我们会自定义这样一个类来实现复写方法实现接口二 快速入门
1 创建javaEE项目2 定义一个类 实现servlet接口3 实现接口的抽象方法4 配置servletpackage com.ts.servletdem0.servlet;//import jakarta.servlet.*;
import jakarta.servlet.*;
import java.io.IOException;/*
* servlet的快速入门
* */
public class ServletDemo1 implements Servlet {Overridepublic void init(ServletConfig servletConfig) throws ServletException {}Overridepublic ServletConfig getServletConfig() {return null;}// 提供服务的方法Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println(Hello Servlet);}Overridepublic String getServletInfo() {return null;}Overridepublic void destroy() {}
}web配置
?xml version1.0 encodingUTF-8?
web-app xmlnshttps://jakarta.ee/xml/ns/jakartaeexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttps://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsdversion5.0// 配置Servletservletservlet-namedemo1/servlet-nameservlet-classcom.ts.servletdem0.servlet.ServletDemo1/servlet-class/servletservlet-mappingservlet-namedemo1/servlet-nameurl-pattern/demo1/url-pattern/servlet-mapping/web-app
三 执行原理
1 当服务器接受到客户端浏览器的请求后 会解析浏览器的URL路径 获取访问的servlet资源2 查找web.xml文件 是否有对应的url-pattern标签体内容3 如果有 则寻找对应的servlet-class全类名4 tomcat会把字节码文件加载进内存 并且创建对象5 调用其方法四 生命周期 servlet的生命周期方法生命周期方法触发时机执行次数典型应用场景init()首次请求或服务器启动时1次初始化数据库连接、加载配置文件service()每次HTTP请求多次核心业务逻辑处理destroy()服务器正常关闭1次释放资源、保存状态
1.被创建调用init方法 只执行一次 默认是第一次被访问时创建 可以通过配置来决定执行的时机servletservlet-namedemo1/servlet-nameservlet-classcom.ts.servletdem0.servlet.ServletDemo1/servlet-class!-- 初始化创建的时机 --!-- 负数为第一次被访问时创建 0或正整数是启动服务器的时候创建--load-on-startup1/load-on-startup/servlet[一个servlet在内存中只存在一个对象 是单例的] 所以多个用户访问时会存在线程安全问题 解决方法在servlet中尽量不定义成员变量 即使定义也不要进行修改操作2.提供服务调用servlet方法 可以执行多次3.被销毁执行destroy方法 只执行一次 只有服务器正常关闭时才会执行/*
* servlet的方法
* */
public class ServletDemo2 implements Servlet {/** 初始化方法* 在servlet创建时执行 只会调用一次init方法* */Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println(init...);}/** 获取Servlet的配置对象* 返回ServletConfig对象* */Overridepublic ServletConfig getServletConfig() {return null;}/* 提供服务的方法* 每一次servlet服务被请求时调用* */Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println(service...);}/** 获取Servlet的信息* 返回一个字符串用来描述Servlet* */Overridepublic String getServletInfo() {return new String(ServletDemo2);}/** 销毁方法* 在服务器关闭时执行一次 在servlet被销毁时调用* */Overridepublic void destroy() {System.out.println(destroy...);}
}五 servlet配置 XML配置
servlet-mappingservlet-namedemo/servlet-name!-- 支持多路径映射 --url-pattern/api/*/url-patternurl-pattern.action/url-pattern
/servlet-mapping 注解配置技巧
WebServlet(name AdvancedServlet,urlPatterns {/v1/users, /backup},initParams {WebInitParam(nametimeout, value5000)},loadOnStartup 1
)
public class AdvancedServlet extends HttpServlet { ... }servlet_3.0 支持注解配置 使用WebServlet(资源路径”)WebServlet(/test)
public class TestServlet implements Servlet {Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println(init);}Overridepublic ServletConfig getServletConfig() {return null;}Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println(Servlet 3.0 启动);}Overridepublic String getServletInfo() {return null;}Overridepublic void destroy() {}
}servlet -- GenericServlet -- HttpServlet 抽象类 对Http协议的一种封装 简化操作为继承该类后 复写doGet/doPost方法 urlpartten: Servlet访问路径
(一个servlet可以配置多个访问路径)
WebServlet({/t4,/tt4,/ttt4})
public class TestServlet1 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {System.out.println(Test_多路径);}}六 HTTP概念Htyper Text Transfer Protocol 传输协议 定义了客户端和服务端通讯时 发送数据的格式特点1.基于TCP/IP的高级协议 2.默认端口80 3.基于请求/响应模型的一次请求对应一次响应 4.无状态的每次请求之间相互独立 不能交互数据请求方式常用的有两种GET1 请求参数在请求行中 在url后 2 请求的url长度有限制 3 不太安全POST:1 请求参数在请求体中 2 请求的url长度没有限制的 3 相对安全请求消息数据格式请求报文结构
GET /test?namevalue HTTP/1.1 → 请求行
Host: www.example.com ↗
Content-Type: text/html → 请求头
Accept-Language: zh-CN ↗→ 空行
usernameadminpassword123456 → 请求体(仅POST)请求行 请求方式 请求url 请求协议 版本 请求头 请求体名称 请求空行空行 请求体正文响应消息数据格式
七 Request
// 获取客户端信息
String ip request.getRemoteAddr();
String userAgent request.getHeader(User-Agent);// 获取请求参数
String username request.getParameter(user);
String[] hobbies request.getParameterValues(hobby);// 请求作用域传值
request.setAttribute(currentUser, userObj);
User u (User)request.getAttribute(currentUser);// 请求转发
request.getRequestDispatcher(/success.jsp).forward(request, response);
八 案例
// File: src/main/java/com/example/web/UserServlet.java
package com.example.web;import jakarta.servlet.*;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.*;
import java.io.*;
import java.sql.*;WebServlet(/user)
public class UserServlet extends HttpServlet {private static final String DB_URL jdbc:mysql://localhost:3306/userdb;private static final String DB_USER root;private static final String DB_PASS password;Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String action request.getParameter(action);if (register.equals(action)) {registerUser(request, response);} else if (login.equals(action)) {loginUser(request, response);}}private void registerUser(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String username request.getParameter(username);String password request.getParameter(password);String email request.getParameter(email);try (Connection conn DriverManager.getConnection(DB_URL, DB_USER, DB_PASS)) {String sql INSERT INTO users (username, password, email) VALUES (?, ?, ?);try (PreparedStatement pstmt conn.prepareStatement(sql)) {pstmt.setString(1, username);pstmt.setString(2, password);pstmt.setString(3, email);int rows pstmt.executeUpdate();if (rows 0) {request.setAttribute(message, 注册成功请登录);request.getRequestDispatcher(/login.jsp).forward(request, response);} else {request.setAttribute(error, 注册失败);request.getRequestDispatcher(/register.jsp).forward(request, response);}}} catch (SQLException e) {throw new ServletException(数据库错误: e.getMessage());}}private void loginUser(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String username request.getParameter(username);String password request.getParameter(password);try (Connection conn DriverManager.getConnection(DB_URL, DB_USER, DB_PASS)) {String sql SELECT * FROM users WHERE username ? AND password ?;try (PreparedStatement pstmt conn.prepareStatement(sql)) {pstmt.setString(1, username);pstmt.setString(2, password);try (ResultSet rs pstmt.executeQuery()) {if (rs.next()) {// 创建会话HttpSession session request.getSession();session.setAttribute(username, username);session.setAttribute(email, rs.getString(email));// 设置会话有效期30分钟session.setMaxInactiveInterval(30 * 60);response.sendRedirect(profile.jsp);} else {request.setAttribute(error, 用户名或密码错误);request.getRequestDispatcher(/login.jsp).forward(request, response);}}}} catch (SQLException e) {throw new ServletException(数据库错误: e.getMessage());}}Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 注销处理String action request.getParameter(action);if (logout.equals(action)) {HttpSession session request.getSession(false);if (session ! null) {session.invalidate();}response.sendRedirect(login.jsp);}}
}
!-- File: webapp/login.jsp --
!DOCTYPE html
html
headtitle用户登录/titlestylebody { font-family: Arial, sans-serif; max-width: 400px; margin: 0 auto; padding: 20px; }.form-group { margin-bottom: 15px; }label { display: block; margin-bottom: 5px; }input[typetext], input[typepassword] { width: 100%; padding: 8px; }button { padding: 10px 20px; background: #007bff; color: white; border: none; cursor: pointer; }.error { color: red; }/style
/head
bodyh2用户登录/h2% if (request.getAttribute(error) ! null) { %p classerror${error}/p% } %form actionuser methodpostinput typehidden nameaction valuelogindiv classform-grouplabel用户名:/labelinput typetext nameusername required/divdiv classform-grouplabel密码:/labelinput typepassword namepassword required/divbutton typesubmit登录/button/formp还没有账号? a hrefregister.jsp立即注册/a/p
/body
/html
!-- File: webapp/register.jsp --
!DOCTYPE html
html
headtitle用户注册/titlestylebody { font-family: Arial, sans-serif; max-width: 400px; margin: 0 auto; padding: 20px; }.form-group { margin-bottom: 15px; }label { display: block; margin-bottom: 5px; }input { width: 100%; padding: 8px; }button { padding: 10px 20px; background: #28a745; color: white; border: none; cursor: pointer; }.error { color: red; }/style
/head
bodyh2用户注册/h2% if (request.getAttribute(error) ! null) { %p classerror${error}/p% } %form actionuser methodpostinput typehidden nameaction valueregisterdiv classform-grouplabel用户名:/labelinput typetext nameusername required/divdiv classform-grouplabel密码:/labelinput typepassword namepassword required/divdiv classform-grouplabel邮箱:/labelinput typeemail nameemail required/divbutton typesubmit注册/button/formp已有账号? a hreflogin.jsp立即登录/a/p
/body
/html
!-- File: webapp/profile.jsp --
!DOCTYPE html
html
headtitle用户资料/titlestylebody { font-family: Arial, sans-serif; max-width: 500px; margin: 0 auto; padding: 20px; }.welcome { font-size: 1.2em; margin-bottom: 20px; }.info { background: #f8f9fa; padding: 15px; border-radius: 5px; }.logout { margin-top: 20px; }/style
/head
bodydiv classwelcomeh2欢迎, ${username}!/h2/divdiv classinfopstrong用户名:/strong ${username}/ppstrong注册邮箱:/strong ${email}/p/divdiv classlogouta hrefuser?actionlogout注销登录/a/div
/body
/html 数据库
CREATE DATABASE userdb;
USE userdb;CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,password VARCHAR(100) NOT NULL,email VARCHAR(100) NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);项目结构 project-root/
├── src/
│ └── main/
│ ├── java/
│ │ └── com/
│ │ └── example/
│ │ └── web/
│ │ └── UserServlet.java
│ └── webapp/
│ ├── WEB-INF/
│ │ └── web.xml
│ ├── login.jsp
│ ├── register.jsp
│ ├── profile.jsp
│ └── index.html
└── pom.xml
学习时间 2025.05.01