【Java万花筒】打破Java Web迷雾:探索Servlet、JSP、Spring、MyBatis、Hibernate的奥秘

掌握Java Web全家桶:从Servlet到Hibernate的完整开发指南

前言

欢迎订阅专栏:Java万花筒

文章目录

  • 掌握Java Web全家桶:从Servlet到Hibernate的完整开发指南
    • 前言
      • 1. Servlet
        • 1.1 Servlet简介
        • 1.2 Servlet配置
        • 1.3 处理HTTP请求
        • 1.4 会话管理
        • 1.5 Servlet Filters
        • 1.6 异步处理
        • 1.7 Servlet容器初始化
      • 结束本章
      • 2. JSP (JavaServer Pages)
        • 2.1 JSP简介
        • 2.2 JSP标签和表达式
        • 2.3 JSP指令
        • 2.4 JSP自定义标签
        • 2.5 JSP EL(Expression Language)
        • 2.6 JSP隐含对象
        • 2.7 JSP标签库 (JSTL)
        • 2.8 JSP中的异常处理
      • 结束本章
      • 3. Spring框架
        • 3.1 Spring框架概述
        • 3.2 Spring MVC
        • 3.3 Spring中的依赖注入
        • 3.4 Spring Boot
        • 3.5 Spring AOP(面向切面编程)
        • 3.6 Spring事务管理
        • 3.7 Spring Security
        • 3.8 Spring Data JPA
      • 结束本章
      • 4. MyBatis
        • 4.1 MyBatis简介
        • 4.2 MyBatis配置
        • 4.3 SQL映射
        • 4.4 MyBatis注解
        • 4.5 动态SQL
        • 4.6 MyBatis缓存
        • 4.7 MyBatis插件
      • 结束本章
      • 5. Hibernate
        • 5.1 Hibernate简介
        • 5.2 Hibernate配置
        • 5.3 实体映射
        • 5.4 Hibernate查询语言 (HQL)
      • 5. Hibernate - 续
        • 5.5 Hibernate Criteria查询
        • 5.6 Hibernate关联关系
        • 5.7 Hibernate事务管理
      • 结束本章
    • 总结

1. Servlet

1.1 Servlet简介

Servlet是Java编写的服务器端程序,主要用于处理HTTP请求和生成响应。它是Java EE(Enterprise Edition)规范的一部分,通常部署在支持Servlet规范的Web容器中,如Tomcat。Servlet的生命周期包括初始化、服务和销毁三个阶段。

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("/example")
public class ExampleServlet extends HttpServlet {

    @Override
    public void init() throws ServletException {
        // 初始化代码
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 处理GET请求的代码
    }

    @Override
    public void destroy() {
        // 销毁代码
    }
}
1.2 Servlet配置

Servlet可以通过部署描述符(web.xml)或使用注解进行配置。部署描述符通常用于复杂的配置,而注解是一种简化的配置方式。


<web-app>
    <servlet>
        <servlet-name>exampleServletservlet-name>
        <servlet-class>com.example.ExampleServletservlet-class>
    servlet>
    <servlet-mapping>
        <servlet-name>exampleServletservlet-name>
        <url-pattern>/exampleurl-pattern>
    servlet-mapping>
web-app>
// 使用注解配置
@WebServlet("/example")
public class ExampleServlet extends HttpServlet {
    // Servlet代码
}
1.3 处理HTTP请求

Servlet可以处理多种HTTP请求方法,包括GET和POST。通过HttpServletRequest对象可以获取请求参数等信息。

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    String name = request.getParameter("name");
    response.getWriter().println("Hello, " + name + "!");
}
1.4 会话管理

Servlet提供了HttpSession接口用于在会话中存储和检索信息。也可以使用Cookies来实现客户端的会话管理。

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    // 创建或获取会话
    HttpSession session = request.getSession(true);

    // 存储数据到会话
    session.setAttribute("user", "John");

    // 从会话中获取数据
    String user = (String) session.getAttribute("user");

    response.getWriter().println("User: " + user);
}
1.5 Servlet Filters

Servlet Filters是一种拦截HTTP请求和响应的机制,允许开发者在请求到达Servlet之前或响应返回给客户端之前执行一些额外的处理。常见的应用场景包括日志记录、权限验证、字符编码等。

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@WebFilter(urlPatterns = "/example/*", initParams = @WebInitParam(name = "encoding", value = "UTF-8"))
public class ExampleFilter implements Filter {

    private String encoding;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        encoding = filterConfig.getInitParameter("encoding");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        // 执行过滤操作,如字符编码设置
        httpRequest.setCharacterEncoding(encoding);
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // 销毁代码
    }
}
1.6 异步处理

Servlet 3.0引入了对异步处理的支持,允许在处理请求时释放容器线程,以提高并发性能。通过AsyncContextAsyncListener实现异步处理。

@WebServlet("/asyncExample")
public class AsyncExampleServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        AsyncContext asyncContext = request.startAsync();
        asyncContext.addListener(new MyAsyncListener());
        asyncContext.setTimeout(30000); // 设置超时时间
        asyncContext.start(() -> {
            // 异步处理逻辑
            // ...
            asyncContext.complete(); // 处理完成
        });
    }
}
1.7 Servlet容器初始化

Servlet容器在启动时会调用Servlet的init方法,但有时我们需要在容器启动时执行一些全局初始化操作。这时可以使用ServletContextListener

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class AppInitializer implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        // 执行全局初始化操作
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // 执行全局销毁操作
    }
}

结束本章

本章深入介绍了Servlet的各个方面,从基本的请求处理到高级的异步处理和全局初始化操作。理解和掌握这些概念将使你能够更灵活地构建强大的Java Web应用程序。下一章我们将深入学习JavaServer Pages(JSP)。

2. JSP (JavaServer Pages)

2.1 JSP简介

JSP是一种在Java中编写动态Web页面的技术。它允许在HTML页面中嵌入Java代码,通过JSP引擎在服务器端生成最终的HTML页面。JSP的生命周期包括翻译阶段、编译阶段和执行阶段。

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


    JSP Example


    <% String message = "Hello, JSP!"; %>
    

<%= message %>

2.2 JSP标签和表达式

JSP内置了多个标签和表达式,用于简化在HTML中插入Java代码的过程。

<%@ page import="java.util.List" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>


    
  • ${item}
  • 2.3 JSP指令

    JSP指令用于设置全局信息,如页面语言、编码等。其中,页面指令和包含指令是常用的两种。

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ include file="header.jsp" %>
    
    2.4 JSP自定义标签

    JSP允许创建自定义标签库,以便在JSP页面中使用自定义标签。

    <%@ taglib uri="/WEB-INF/custom-tags" prefix="custom" %>
    
    
    
    2.5 JSP EL(Expression Language)

    JSP EL是一种用于访问Java对象的表达式语言,它简化了在JSP页面中输出和获取数据的方式。EL表达式使用${}语法。

    ${user.name}
    
    2.6 JSP隐含对象

    JSP提供了一些隐含对象,开发者可以在JSP页面中直接使用,如requestsessionapplication等。

    <%
        String username = (String) request.getAttribute("username");
        out.println("Username: " + username);
    %>
    
    2.7 JSP标签库 (JSTL)

    JSTL是一组用于简化JSP开发的标准标签库,包括核心标签库、XML标签库、SQL标签库等。它提供了循环、条件判断、数据库查询等功能。

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    
    
        
  • ${item}
  • 2.8 JSP中的异常处理

    在JSP页面中处理异常可以通过errorPage指令或try-catch块实现。

    <%@ page errorPage="errorPage.jsp" %>
    
    <%
        try {
            // 代码可能抛出异常
        } catch (Exception e) {
            out.println("An error occurred: " + e.getMessage());
        }
    %>
    

    结束本章

    本章深入研究了JavaServer Pages(JSP)的各个方面,从基础的语法和标签到EL表达式、隐含对象、标签库等高级概念。通过深入学习这些内容,你将能够更灵活地创建动态而强大的Web页面。下一章我们将探讨Spring框架的核心概念。

    3. Spring框架

    3.1 Spring框架概述

    Spring框架是一个全面的Java企业级应用程序开发框架。它提供了IoC(控制反转)、AOP(面向切面编程)、MVC(模型-视图-控制器)等功能,使得开发者可以更轻松地构建可维护和可测试的应用程序。

    // 示例:Spring IoC容器配置
    @Configuration
    @ComponentScan(basePackages = "com.example")
    public class AppConfig {
        // 配置其他Bean
    }
    
    3.2 Spring MVC

    Spring MVC是Spring框架的Web模块,实现了MVC设计模式。控制器、视图解析器和模型是Spring MVC的核心组件。

    // 示例:Spring MVC控制器
    @Controller
    @RequestMapping("/example")
    public class ExampleController {
    
        @GetMapping("/hello")
        public String hello(Model model) {
            model.addAttribute("message", "Hello, Spring MVC!");
            return "helloPage";
        }
    }
    
    3.3 Spring中的依赖注入

    Spring的IoC容器负责管理应用程序中的对象,通过依赖注入将它们组装在一起。这种方式使得组件更加松耦合。

    // 示例:使用构造函数注入
    @Service
    public class ExampleService {
    
        private final AnotherService anotherService;
    
        @Autowired
        public ExampleService(AnotherService anotherService) {
            this.anotherService = anotherService;
        }
    }
    
    3.4 Spring Boot

    Spring Boot简化了Spring应用程序的开发,提供自动配置和嵌入式容器。它允许开发者更专注于业务逻辑而不是配置。

    // 示例:Spring Boot应用程序入口
    @SpringBootApplication
    public class MyApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(MyApplication.class, args);
        }
    }
    
    3.5 Spring AOP(面向切面编程)

    Spring AOP允许在应用程序的多个模块中定义横切关注点,将它们单独维护,并在需要的地方进行通用的横切操作。

    // 示例:定义切面
    @Aspect
    @Component
    public class LoggingAspect {
    
        @Before("execution(public * com.example.service.*.*(..))")
        public void logBefore(JoinPoint joinPoint) {
            // 执行前置通知的逻辑
        }
    }
    
    3.6 Spring事务管理

    Spring提供声明式的事务管理,允许通过注解或XML配置来定义事务的边界。

    // 示例:声明式事务管理
    @Service
    @Transactional
    public class ExampleService {
    
        @Transactional(readOnly = true)
        public ExampleEntity findById(Long id) {
            // 查询逻辑
        }
    
        @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
        public void updateExample(ExampleEntity example) {
            // 更新逻辑
        }
    }
    
    3.7 Spring Security

    Spring Security是Spring框架的安全性模块,提供了诸如身份验证、授权、攻击防护等功能。

    // 示例:Spring Security配置
    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                    .antMatchers("/public/**").permitAll()
                    .anyRequest().authenticated()
                    .and()
                .formLogin()
                    .loginPage("/login")
                    .permitAll()
                    .and()
                .logout()
                    .permitAll();
        }
    }
    
    3.8 Spring Data JPA

    Spring Data JPA简化了对数据的访问和操作,通过使用JPA规范,开发者可以更方便地进行数据库操作。

    // 示例:Spring Data JPA Repository
    public interface ExampleRepository extends JpaRepository<ExampleEntity, Long> {
        List<ExampleEntity> findByName(String name);
    }
    

    结束本章

    本章详细介绍了Spring框架的核心概念,包括IoC容器、Spring MVC、依赖注入、Spring Boot等。通过学习这些内容,你将能够构建出高效、模块化、易于维护的Java企业级应用程序。在下一章,我们将深入了解持久层框架MyBatis。

    4. MyBatis

    4.1 MyBatis简介

    MyBatis是一个持久层框架,用于简化数据库操作。它通过XML或注解配置SQL映射,并提供了灵活的参数映射和结果映射。

    
    <mapper namespace="com.example.ExampleMapper">
        <select id="selectById" resultType="com.example.ExampleEntity">
            SELECT * FROM example_table WHERE id = #{id}
        select>
    mapper>
    
    4.2 MyBatis配置

    MyBatis的配置包括数据源配置、环境配置以及映射器配置。可以通过XML文件或Java代码进行配置。

    // 示例:MyBatis Java配置
    @Configuration
    @MapperScan("com.example.mapper")
    public class MyBatisConfig {
    
        @Bean
        public DataSource dataSource() {
            // 配置数据源
            return new DriverManagerDataSource();
        }
    
        @Bean
        public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
            // 配置SqlSessionFactory
            SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
            factoryBean.setDataSource(dataSource);
            return factoryBean.getObject();
        }
    
        @Bean
        public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
            // 配置SqlSessionTemplate
            return new SqlSessionTemplate(sqlSessionFactory);
        }
    }
    
    4.3 SQL映射

    在MyBatis中,SQL映射文件定义了SQL语句以及参数和结果的映射关系。使用#{}语法进行参数绑定。

    // 示例:MyBatis Mapper接口
    public interface ExampleMapper {
    
        @Select("SELECT * FROM example_table WHERE id = #{id}")
        ExampleEntity selectById(@Param("id") Long id);
    }
    
    4.4 MyBatis注解

    MyBatis还支持使用注解配置SQL映射,通过在Mapper接口的方法上添加相应注解实现。

    // 示例:MyBatis注解配置
    @Mapper
    public interface ExampleMapper {
    
        @Select("SELECT * FROM example_table WHERE id = #{id}")
        ExampleEntity selectById(@Param("id") Long id);
    }
    
    4.5 动态SQL

    MyBatis允许使用动态SQL构建灵活的查询语句,通过等标签实现条件判断和循环。

    
    <select id="selectByExample" resultType="com.example.ExampleEntity">
        SELECT * FROM example_table
        <where>
            <if test="name != null">
                AND name = #{name}
            if>
            <if test="status != null">
                AND status = #{status}
            if>
        where>
    select>
    
    4.6 MyBatis缓存

    MyBatis提供了一级缓存和二级缓存。一级缓存是SqlSession级别的缓存,而二级缓存是全局级别的缓存。

    
    <settings>
        <setting name="cacheEnabled" value="true"/>
    settings>
    
    
    <mapper namespace="com.example.ExampleMapper" useCache="true">
        
    mapper>
    
    4.7 MyBatis插件

    MyBatis插件允许开发者在SQL执行过程中干预,可以用于日志记录、性能监控等场景。

    // 示例:MyBatis插件
    @Intercepts({
        @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})
    })
    public class ExamplePlugin implements Interceptor {
    
        @Override
        public Object intercept(Invocation invocation) throws Throwable {
            // 执行前置逻辑
            Object result = invocation.proceed();
            // 执行后置逻辑
            return result;
        }
    }
    

    结束本章

    本章详细介绍了MyBatis框架,包括配置、SQL映射、注解、动态SQL、缓存、插件等方面。通过学习这些内容,你将能够更高效地进行数据库操作,并了解如何优化SQL执行过程。在下一章,我们将深入研究另一流行的持久层框架Hibernate。

    5. Hibernate

    5.1 Hibernate简介

    Hibernate是一个强大的对象关系映射(ORM)框架,用于简化Java应用程序与数据库的交互。它通过将Java对象映射到数据库表,实现了数据库操作的面向对象编程。

    // 示例:Hibernate实体映射
    @Entity
    @Table(name = "example_entity")
    public class ExampleEntity {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        @Column(name = "name")
        private String name;
    }
    
    5.2 Hibernate配置

    Hibernate的配置包括Hibernate配置文件、映射文件、Session工厂等。配置文件中定义了数据库连接信息、方言等。

    
    <hibernate-configuration>
        <session-factory>
            
            <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydatabaseproperty>
            
        session-factory>
    hibernate-configuration>
    
    5.3 实体映射

    Hibernate使用注解或XML文件定义实体映射,指定实体与数据库表的映射关系。注解方式如下:

    // 示例:Hibernate注解配置
    @Entity
    @Table(name = "example_entity")
    public class ExampleEntity {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        @Column(name = "name")
        private String name;
    }
    
    5.4 Hibernate查询语言 (HQL)

    Hibernate提供了一种类似SQL的查询语言HQL,通过对象而不是表名和列名进行查询。

    // 示例:Hibernate HQL查询
    String hql = "FROM ExampleEntity e WHERE e.name = :name";
    Query<ExampleEntity> query = session.createQuery(hql, ExampleEntity.class);
    query.setParameter("name", "John");
    List<ExampleEntity> resultList = query.getResultList();
    

    5. Hibernate - 续

    5.5 Hibernate Criteria查询

    Hibernate Criteria查询是一种面向对象的查询方式,通过创建Criteria对象进行条件查询。

    // 示例:Hibernate Criteria查询
    CriteriaBuilder builder = session.getCriteriaBuilder();
    CriteriaQuery<ExampleEntity> criteriaQuery = builder.createQuery(ExampleEntity.class);
    Root<ExampleEntity> root = criteriaQuery.from(ExampleEntity.class);
    
    criteriaQuery.select(root)
        .where(builder.equal(root.get("name"), "John"));
    
    List<ExampleEntity> resultList = session.createQuery(criteriaQuery).getResultList();
    
    5.6 Hibernate关联关系

    Hibernate支持多种关联关系,包括一对一、一对多、多对一、多对多等。通过注解或XML配置来定义关联关系。

    // 示例:Hibernate一对多关联关系
    @Entity
    @Table(name = "parent_entity")
    public class ParentEntity {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        @OneToMany(mappedBy = "parent")
        private List<ChildEntity> children;
    }
    
    @Entity
    @Table(name = "child_entity")
    public class ChildEntity {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        @ManyToOne
        @JoinColumn(name = "parent_id")
        private ParentEntity parent;
    }
    
    5.7 Hibernate事务管理

    Hibernate支持编程式和声明式的事务管理,可以通过注解或XML配置来定义事务。

    // 示例:Hibernate声明式事务
    @Service
    @Transactional
    public class ExampleService {
    
        @Transactional(readOnly = true)
        public ExampleEntity findById(Long id) {
            // 查询逻辑
        }
    
        @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
        public void updateExample(ExampleEntity example) {
            // 更新逻辑
        }
    }
    

    结束本章

    本章深入介绍了Hibernate框架,包括配置、实体映射、HQL查询、Criteria查询、关联关系、事务管理等方面。通过学习这些内容,你将能够更高效地进行对象关系映射,提高应用程序的数据库操作效率。在下一章,我们将总结全文内容,为读者提供一份完整的Java Web开发指南。

    总结

    通过阅读本文,读者将获得以下收益:

    • 对Java Web开发的全面认识,从基础的Servlet和JSP到强大的框架Spring、MyBatis和Hibernate;
    • 理解每个库和框架的用法和配置方式,为实际项目提供实用指导;
    • 掌握常用的设计模式和最佳实践,提高代码质量和可维护性;
    • 具备构建现代、高效、可扩展Web应用程序的基础知识。

    本文将引导读者深入探索Java Web开发的精髓,旨在成为每位Java开发者的实用手册和参考资料。

    你可能感兴趣的:(Java万花筒,java,前端,servlet,开发语言,spring,mybatis,网络)