• JavaEE(入门)


    JavaEE (详细注释版)

    1. 入门基础

    1.1 JavaEE简介

    JavaEE(Java Platform, Enterprise Edition)是由Sun Microsystems推出的一套标准,现由Oracle维护。JavaEE平台主要用于开发和运行企业级应用程序,具有高可扩展性、可维护性和跨平台性。

    1.2 JavaEE体系结构

    JavaEE体系结构包括以下几层:

    • 表示层:负责与用户交互。常用技术包括Servlet、JSP、JSF等。
    • 业务逻辑层:处理具体的业务逻辑。使用EJB(Enterprise JavaBeans)来实现。
    • 持久层:负责数据的持久化。常用技术有JPA(Java Persistence API)、JDBC等。
    • 集成层:用于系统集成,常用技术包括JMS(Java Message Service)、JCA(Java Connector Architecture)等。
    1.3 环境搭建

    为了开发JavaEE应用程序,需要安装以下软件:

    • JDK(Java Development Kit):Java开发工具包。
    • Eclipse或IntelliJ IDEA:集成开发环境(IDE)。
    • Apache Tomcat:一个常用的Servlet容器。
    • Maven或Gradle:项目构建工具。

    2. 核心技术

    2.1 Servlet

    Servlet是一种用于扩展服务器功能的小程序,主要用于处理HTTP请求。以下是一个简单的Servlet例子,并且包含详细注释:

    import java.io.IOException; // 导入IOException类,用于处理输入输出异常
    import javax.servlet.ServletException; // 导入ServletException类,用于处理Servlet特有的异常
    import javax.servlet.annotation.WebServlet; // 导入WebServlet注解,用于定义Servlet的URL映射
    import javax.servlet.http.HttpServlet; // 导入HttpServlet类,所有Servlet类都继承自这个类
    import javax.servlet.http.HttpServletRequest; // 导入HttpServletRequest类,用于处理请求数据
    import javax.servlet.http.HttpServletResponse; // 导入HttpServletResponse类,用于处理响应数据
    
    @WebServlet("/hello") // 使用@WebServlet注解定义Servlet的URL映射为/hello
    public class HelloServlet extends HttpServlet {
        private static final long serialVersionUID = 1L; // 定义序列化ID
    
        // 重写doGet方法,处理GET请求
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html"); // 设置响应的内容类型为HTML
            response.getWriter().println("

    Hello, World!

    "
    ); // 输出HTML内容 } }
    2.2 JSP(JavaServer Pages)

    JSP是一种用于创建动态网页的技术,允许将Java代码嵌入到HTML中。以下是一个简单的JSP例子,并且包含详细注释:

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
    
    
    
        Hello JSP 
    
    
        

    Hello, <%= request.getParameter("name") %>!

    2.3 EJB(Enterprise JavaBeans)

    EJB是JavaEE中的一个组件模型,用于构建可伸缩的分布式业务应用程序。以下是一个简单的EJB例子,并且包含详细注释:

    import javax.ejb.Stateless; // 导入Stateless注解,用于定义无状态会话Bean
    
    @Stateless // 使用@Stateless注解定义无状态会话Bean
    public class HelloBean {
        // 定义业务方法sayHello,返回问候语
        public String sayHello(String name) {
            return "Hello, " + name + "!";
        }
    }
    

    3. 数据持久化

    3.1 JDBC(Java Database Connectivity)

    JDBC是一种用于执行SQL语句的Java API。以下是一个简单的JDBC例子,并且包含详细注释:

    import java.sql.Connection; // 导入Connection接口,用于管理数据库连接
    import java.sql.DriverManager; // 导入DriverManager类,用于获取数据库连接
    import java.sql.ResultSet; // 导入ResultSet接口,用于处理结果集
    import java.sql.Statement; // 导入Statement接口,用于执行SQL语句
    
    public class JDBCExample {
        public static void main(String[] args) {
            String url = "jdbc:mysql://localhost:3306/testdb"; // 定义数据库URL
            String user = "root"; // 定义数据库用户名
            String password = "password"; // 定义数据库密码
    
            try (Connection conn = DriverManager.getConnection(url, user, password); // 获取数据库连接
                 Statement stmt = conn.createStatement(); // 创建Statement对象
                 ResultSet rs = stmt.executeQuery("SELECT * FROM users")) { // 执行SQL查询语句,并返回结果集
    
                while (rs.next()) { // 遍历结果集
                    System.out.println(rs.getString("username")); // 输出结果集中的用户名
                }
            } catch (Exception e) { // 捕获异常
                e.printStackTrace(); // 打印异常信息
            }
        }
    }
    
    3.2 JPA(Java Persistence API)

    JPA是一种用于管理Java对象和关系数据库数据之间映射的API。以下是一个简单的JPA例子,并且包含详细注释:

    import javax.persistence.Entity; // 导入Entity注解,用于定义实体类
    import javax.persistence.Id; // 导入Id注解,用于定义主键
    
    @Entity // 使用@Entity注解定义实体类
    public class User {
        @Id // 使用@Id注解定义主键
        private Long id; // 定义实体类的ID属性
        private String username; // 定义实体类的用户名属性
    
        // 定义getter和setter方法
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    }
    
    import javax.persistence.EntityManager; // 导入EntityManager接口,用于管理实体
    import javax.persistence.EntityManagerFactory; // 导入EntityManagerFactory接口,用于创建EntityManager
    import javax.persistence.Persistence; // 导入Persistence类,用于获取EntityManagerFactory
    
    public class JPAExample {
        public static void main(String[] args) {
            // 获取EntityManagerFactory,指定持久化单元名称为my-pu
            EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-pu");
            // 获取EntityManager
            EntityManager em = emf.createEntityManager();
    
            // 开始事务
            em.getTransaction().begin();
            // 创建并设置User对象
            User user = new User();
            user.setId(1L);
            user.setUsername("john");
            // 持久化User对象
            em.persist(user);
            // 提交事务
            em.getTransaction().commit();
    
            // 关闭EntityManager和EntityManagerFactory
            em.close();
            emf.close();
        }
    }
    

    4. 高级主题

    4.1 Web服务

    JavaEE提供了对Web服务的支持,包括SOAP和RESTful服务。以下是一个简单的RESTful服务例子,并且包含详细注释:

    import javax.ws.rs.GET; // 导入GET注解,用于定义HTTP GET请求
    import javax.ws.rs.Path; // 导入Path注解,用于定义URI路径
    import javax.ws.rs.Produces; // 导入Produces注解,用于定义响应的媒体类型
    import javax.ws.rs.core.MediaType; // 导入MediaType类,用于指定媒体类型
    import javax.ws.rs.ApplicationPath; // 导入ApplicationPath注解,用于定义应用程序路径
    import javax.ws.rs.core.Application; // 导入Application类,用于配置RESTful应用程序
    
    @Path("/hello") // 使用@Path注解定义URI路径为/hello
    public class HelloService {
        @GET // 使用@GET注解定义HTTP GET请求
        @Produces(MediaType.TEXT_PLAIN) // 使用@Produces注解定义响应的媒体类型为纯文本
        public String sayHello() {
            return "Hello, World!"; // 返回问候语
        }
    }
    
    @ApplicationPath("/api") // 使用@ApplicationPath注解定义应用程序路径为/api
    public class RestApplication extends Application {
    }
    
    4.2 安全性

    JavaEE提供了丰富的安全特性,如认证和授权。以下是一个简单的安全配置例子,并且包含详细注释:

    <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
             version="3.0">
        
        <security-constraint>
            
            <web-resource-collection>
                <web-resource-name>Protected Areaweb-resource-name>
                <url-pattern>/secure/*url-pattern> 
            web-resource-collection>
            
            <auth-constraint>
                <role-name>USERrole-name>
            auth-constraint>
        security-constraint>
    
        
        <login-config>
            <auth-method>BASICauth-method> 
            <realm-name>myRealmrealm-name> 
        login-config>
    
        
        <security-role>
            <role-name>USERrole-name>
        security-role>
    web-app>
    

    5. 实战项目

    通过实际项目来巩固学习内容。以下是一个简单的在线图书管理系统项目:

    • 功能:用户可以添加、查看、更新和删除图书信息。
    • 技术栈:Servlet、JSP、JDBC、Tomcat。
    5.1 项目结构
    BookManagement
    ├── src
    │   └── com
    │       └── example
    │           ├── Book.java
    │           ├── BookDao.java
    │           ├── BookServlet.java
    │           └── DBUtil.java
    ├── WebContent
    │   ├── index.jsp
    │   └── WEB-INF
    │       └── web.xml
    └── lib
        └── mysql-connector-java.jar
    
    5.2 代码实现

    Book.java

    public class Book {
        private int id; // 定义图书的ID属性
        private String title; // 定义图书的标题属性
        private String author; // 定义图书的作者属性
    
        // 定义getter和setter方法
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public String getAuthor() {
            return author;
        }
    
        public void setAuthor(String author) {
            this.author = author;
        }
    }
    

    DBUtil.java

    import java.sql.Connection; // 导入Connection接口,用于管理数据库连接
    import java.sql.DriverManager; // 导入DriverManager类,用于获取数据库连接
    
    public class DBUtil {
        private static final String URL = "jdbc:mysql://localhost:3306/bookdb"; // 定义数据库URL
        private static final String USER = "root"; // 定义数据库用户名
        private static final String PASSWORD = "password"; // 定义数据库密码
    
        // 获取数据库连接
        public static Connection getConnection() throws Exception {
            Class.forName("com.mysql.cj.jdbc.Driver"); // 加载数据库驱动
            return DriverManager.getConnection(URL, USER, PASSWORD); // 返回数据库连接
        }
    }
    

    BookDao.java

    import java.sql.Connection; // 导入Connection接口,用于管理数据库连接
    import java.sql.PreparedStatement; // 导入PreparedStatement接口,用于执行预编译的SQL语句
    import java.sql.ResultSet; // 导入ResultSet接口,用于处理结果集
    import java.util.ArrayList; // 导入ArrayList类,用于创建动态数组
    import java.util.List; // 导入List接口,用于定义列表
    
    public class BookDao {
        // 获取所有图书
        public List<Book> getAllBooks() throws Exception {
            List<Book> books = new ArrayList<>(); // 创建图书列表
            try (Connection conn = DBUtil.getConnection(); // 获取数据库连接
                 PreparedStatement stmt = conn.prepareStatement("SELECT * FROM books"); // 创建预编译的SQL语句
                 ResultSet rs = stmt.executeQuery()) { // 执行查询,并返回结果集
    
                while (rs.next()) { // 遍历结果集
                    Book book = new Book(); // 创建图书对象
                    book.setId(rs.getInt("id")); // 设置图书ID
                    book.setTitle(rs.getString("title")); // 设置图书标题
                    book.setAuthor(rs.getString("author")); // 设置图书作者
                    books.add(book); // 将图书添加到列表中
                }
            }
            return books; // 返回图书列表
        }
    
        // 添加图书
        public void addBook(Book book) throws Exception {
            try (Connection conn = DBUtil.getConnection(); // 获取数据库连接
                 PreparedStatement stmt = conn.prepareStatement("INSERT INTO books (title, author) VALUES (?, ?)")) { // 创建预编译的SQL语句
    
                stmt.setString(1, book.getTitle()); // 设置图书标题
                stmt.setString(2, book.getAuthor()); // 设置图书作者
                stmt.executeUpdate(); // 执行更新
            }
        }
    
        // 更新图书
        public void updateBook(Book book) throws Exception {
            try (Connection conn = DBUtil.getConnection(); // 获取数据库连接
                 PreparedStatement stmt = conn.prepareStatement("UPDATE books SET title = ?, author = ? WHERE id = ?")) { // 创建预编译的SQL语句
    
                stmt.setString(1, book.getTitle()); // 设置图书标题
                stmt.setString(2, book.getAuthor()); // 设置图书作者
                stmt.setInt(3, book.getId()); // 设置图书ID
                stmt.executeUpdate(); // 执行更新
            }
        }
    
        // 删除图书
        public void deleteBook(int id) throws Exception {
            try (Connection conn = DBUtil.getConnection(); // 获取数据库连接
                 PreparedStatement stmt = conn.prepareStatement("DELETE FROM books WHERE id = ?")) { // 创建预编译的SQL语句
    
                stmt.setInt(1, id); // 设置图书ID
                stmt.executeUpdate(); // 执行删除
            }
        }
    }
    

    BookServlet.java

    import java.io.IOException; // 导入IOException类,用于处理输入输出异常
    import javax.servlet.ServletException; // 导入ServletException类,用于处理Servlet特有的异常
    import javax.servlet.annotation.WebServlet; // 导入WebServlet注解,用于定义Servlet的URL映射
    import javax.servlet.http.HttpServlet; // 导入HttpServlet类,所有Servlet类都继承自这个类
    import javax.servlet.http.HttpServletRequest; // 导入HttpServletRequest类,用于处理请求数据
    import javax.servlet.http.HttpServletResponse; // 导入HttpServletResponse类,用于处理响应数据
    
    @WebServlet("/books") // 使用@WebServlet注解定义Servlet的URL映射为/books
    public class BookServlet extends HttpServlet {
        private static final long serialVersionUID = 1L; // 定义序列化ID
        private BookDao bookDao = new BookDao(); // 创建BookDao对象
    
        // 重写doGet方法,处理GET请求
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            try {
                request.setAttribute("books", bookDao.getAllBooks()); // 获取所有图书,并设置为请求属性
                request.getRequestDispatcher("/index.jsp").forward(request, response); // 转发请求到index.jsp
            } catch (Exception e) { // 捕获异常
                throw new ServletException(e); // 抛出Servlet异常
            }
        }
    
        // 重写doPost方法,处理POST请求
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            try {
                String action = request.getParameter("action"); // 获取请求参数action
                if ("add".equals(action)) { // 如果action为add
                    Book book = new Book(); // 创建Book对象
                    book.setTitle(request.getParameter("title")); // 设置图书标题
                    book.setAuthor(request.getParameter("author")); // 设置图书作者
                    bookDao.addBook(book); // 添加图书
                } else if ("update".equals(action)) { // 如果action为update
                    Book book = new Book(); // 创建Book对象
                    book.setId(Integer.parseInt(request.getParameter("id"))); // 设置图书ID
                    book.setTitle(request.getParameter("title")); // 设置图书标题
                    book.setAuthor(request.getParameter("author")); // 设置图书作者
                    bookDao.updateBook(book); // 更新图书
                } else if ("delete".equals(action)) { // 如果action为delete
                    bookDao.deleteBook(Integer.parseInt(request.getParameter("id"))); // 删除图书
                }
                response.sendRedirect("books"); // 重定向到/books
            } catch (Exception e) { // 捕获异常
                throw new ServletException(e); // 抛出Servlet异常
            }
        }
    }
    

    index.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
    
    
    
        Book Management 
    
    
        

    Book Management

    Title:
    Author:

    <%-- 使用JSP脚本元素嵌入Java代码 --%> <% List books = (List) request.getAttribute("books"); // 获取请求属性books for (Book book : books) { // 遍历图书列表 %> <% } %>
    ID Title Author Actions
    <%= book.getId() %> <%= book.getTitle() %> <%= book.getAuthor() %>
    Title:
    Author:

    web.xml

    <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
             version="3.0">
        
        <servlet>
            <servlet-name>BookServletservlet-name> 
            <servlet-class>com.example.BookServletservlet-class> 
        servlet>
        
        <servlet-mapping>
            <servlet-name>BookServletservlet-name> 
            <url-pattern>/booksurl-pattern> 
        servlet-mapping>
    web-app>
    

    6. 参考资料

    • 《JavaEE基础教程》
    • 《JavaEE高级编程》
    • Oracle官方JavaEE文档

    7. 总结

    掌握JavaEE的核心技术,并通过实际项目实践来巩固所学知识。在学习过程中,要注重理论与实践相结合,多动手编写代码,解决实际问题,逐步提高自己的编程能力。

  • 相关阅读:
    深度学习-个人自用
    Docker 入门到实战 之 安装RocketMQ
    数据结构篇——KMP算法
    【异常的打卡记录】python实现-附ChatGPT解析
    效率倍增啊,20个面向数据科学家的自动机器学习(AutoML)库来了
    OpenStreetMap:对抗谷歌帝国的共享开源地图
    【uniapp】使用canvas组件编译到微信小程序兼容出错问题
    大数据技能大赛(高职组)答案
    using的应用
    2023-10-07 mysql-代号m-同时打开多个database-概要设计
  • 原文地址:https://blog.csdn.net/2303_76624483/article/details/139253327