当前位置: 首页 > news >正文

J2EE框架技术 第一章 SSM框架搭建

    序:Java以其跨平台、安全稳定、易于维护等特性,成为了企业级应用开发的首选语言之一。而J2EE(Java 2 Platform, Enterprise Edition),作为Java技术在企业级应用领域的集大成者,更是以其强大的功能和灵活性,引领着企业级应用开发的新潮流。本章节旨在深入剖析J2EE框架技术的核心原理和最佳实践,带领读者走进这个充满挑战与机遇的世界。我们将从J2EE的基本概念入手,逐步展开对其核心组件的详细讲解,并结合实际案例,展示如何在企业级应用中灵活运用这些技术。

第一节:J2EE框架技术概述

    J2EE(Java 2 Platform, Enterprise Edition)与SSM框架在企业级应用开发中都扮演着重要的角色,但它们之间存在明显的区别和联系。以下是对J2EE与SSM框架关系的详细分析:

一、J2EE框架技术定义:

    J2EE是一套经过长期实践检验的企业级开发规范,具有高度的成熟性和稳定性。它涵盖了多个层次,包括表现层、业务逻辑层和数据访问层,通过明确的分层架构实现了系统的高内聚、低耦合。J2EE提供了丰富的组件和服务,如Servlet、JSP、EJB、JDBC、JMS、JNDI等,以及强大的事务管理、安全管理和分布式对象管理等功能。这些特性使得J2EE成为企业级应用开发的首选平台之一。

二、SSM框架定义:

    SSM框架是Spring、Spring MVC和MyBatis三个框架的整合,是标准的MVC设计模式。其中,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,提供了业务对象的一致管理方法和强大的事务管理抽象;Spring MVC是一个实现了Model-View-Controller模式的Web框架,负责请求的转发和视图管理;MyBatis是一个基于Java的持久层框架,它支持定制化SQL、存储过程以及高级映射,使得数据库操作更加灵活和高效。

三、J2EE与SSM框架的关系

技术层次上的关系:

    J2EE是一个广泛的企业级应用开发平台,它提供了丰富的组件和服务,支持企业级应用的开发、部署和管理。SSM框架则是在J2EE平台上的一个具体实现,它利用J2EE提供的组件和服务,如Servlet、JDBC等,来实现企业级应用的功能。因此,从技术层次上看,SSM框架是J2EE平台上的一个子集或具体实现。

开发模式上的联系:

    2EE平台支持多种开发模式,包括MVC模式等。SSM框架本身就是MVC模式的一个具体实现,它利用Spring MVC来实现控制器的功能,利用MyBatis来实现数据持久化的功能,并利用Spring来实现业务逻辑的处理。

四、SpringMVC模式

    Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet。

    Spring MVC 是结构最清晰的 Servlet+JSP+JavaBean 的实现,是一个典型的教科书式的 MVC 构架,不像 Struts 等其它框架都是变种或者不是完全基于 MVC 系统的框架。Spring MVC 角色划分清晰,分工明细,并且和 Spring 框架无缝结合。Spring MVC 是当今业界最主流的 Web 开发框架,以及最热门的开发技能。

    在 Spring MVC 框架中,Controller 替换 Servlet 来担负控制器的职责,用于接收请求,调用相应的 Model 进行处理,处理器完成业务处理后返回处理结果。Controller 调用相应的 View 并对处理结果进行视图渲染,最终客户端得到响应信息。

五、Spring架构图:

六、组件解析:

1、Data Access/Integration(数据访问/集成)

数据访问/集成层包括 JDBC、ORM、OXM、JMS 和 Transactions 模块,具体介绍如下。

JDBC 模块:提供了一个 JBDC 的样例模板,使用这些模板能消除传统冗长的 JDBC 编码还有必须的事务控制,而且能享受到 Spring 管理事务的好处。

ORM 模块:提供与流行的“对象-关系”映射框架无缝集成的 API,包括 JPA、JDO、Hibernate 和 MyBatis 等。而且还可以使用 Spring 事务管理,无需额外控制事务。

OXM 模块:提供了一个支持 Object /XML 映射的抽象层实现,如 JAXB、Castor、XMLBeans、JiBX 和 XStream。将 Java 对象映射成 XML 数据,或者将XML 数据映射成 Java 对象。

JMS 模块:指 Java 消息服务,提供一套 “消息生产者、消息消费者”模板用于更加简单的使用 JMS,JMS 用于用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

Transactions 事务模块:支持编程和声明式事务管理

2、Web 模块

Spring 的核心容器是其他模块建立的基础,由 Beans 模块、Core 核心模块、Context 上下文模块和 SpEL 表达式语言模块组成,没有这些核心容器,也不可能有 AOP、Web 等上层的功能。具体介绍如下。

Beans 模块:提供了框架的基础部分,包括控制反转和依赖注入。

Core 核心模块:封装了 Spring 框架的底层部分,包括资源访问、类型转换及一些常用工具类。

Context 上下文模块:建立在 Core 和 Beans 模块的基础之上,集成 Beans 模块功能并添加资源绑定、数据验证、国际化、Java EE 支持、容器生命周期、事件传播等。ApplicationContext 接口是上下文模块的焦点。

SpEL 模块:提供了强大的表达式语言支持,支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从 Spring 容器获取 Bean,它也支持列表投影、选择和一般的列表聚合等。

3、Core Container(Spring 的核心容器)

Spring 的核心容器是其他模块建立的基础,由 Beans 模块、Core 核心模块、Context 上下文模块和 SpEL 表达式语言模块组成,没有这些核心容器,也不可能有 AOP、Web 等上层的功能。具体介绍如下。

Beans 模块:提供了框架的基础部分,包括控制反转和依赖注入。

Core 核心模块:封装了 Spring 框架的底层部分,包括资源访问、类型转换及一些常用工具类。

Context 上下文模块:建立在 Core 和 Beans 模块的基础之上,集成 Beans 模块功能并添加资源绑定、数据验证、国际化、Java EE 支持、容器生命周期、事件传播等。ApplicationContext 接口是上下文模块的焦点。

SpEL 模块:提供了强大的表达式语言支持,支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从 Spring 容器获取 Bean,它也支持列表投影、选择和一般的列表聚合等。

4、AOP、Aspects、Instrumentation 和 Messaging

在 Core Container 之上是 AOP、Aspects 等模块,具体介绍如下:

AOP 模块:提供了面向切面编程实现,提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,并且能动态的把这些功能添加到需要的代码中,这样各司其职,降低业务逻辑和通用功能的耦合。

Aspects 模块:提供与 AspectJ 的集成,是一个功能强大且成熟的面向切面编程(AOP)框架。

Instrumentation 模块:提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用。

messaging 模块:Spring 4.0 以后新增了消息(Spring-messaging)模块,该模块提供了对消息传递体系结构和协议的支持。

5、Test 模块

Test 模块:Spring 支持 Junit 和 TestNG 测试框架,而且还额外提供了一些基于 Spring 的测试功能,比如在测试 Web 框架时,模拟 Http 请求的功能。

第二节:SSM搭建过程

    第一步:点击new create project创建maven项目,选择webapp项目,如下图所示:

    创建过程中只需一直下一步即可,直至完成。完成后,对项目进行调试,如下图所示:

在项目中分别建立如下package工作包,具体含义分别为:控制层(Controller)、数据层(DAO)、实体类(Model)、业务逻辑层(Service)、工具类(utils)。

    项目中,resource为静态资源,一般存放配置文件;webapp为web项目存放路径,例如JSP页面、CSS、JS等;pom.xml为项目所用的依赖配置文件,用于引入jar包或其它组件等。

    项目搭建完成后,并且依赖也导入成功即可,验证依赖导入如下图所示:

    第二步:配置tomcat,首先建立如下图所示的模块,保证tomcat有可用的项目加载模块:

其次,打开tomcat配置页面进行配置,如下图所示:

注意第二个标签页配置,如图所示:

    第三步:修改如下配置文件:

1)log4j.properties

log4j.rootLogger=DEBUG, stdout,CONSOLE, ERROR, WARN, INFO, DEBUG, ALL
###############Log4j 4 SQL Output start#################
#mybatis部分
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
#与sql相关
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
#-----------------------------------------------------------------------------------------------------
#输出信息到控制台CONSOLE
log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender 
log4j.appender.CONSOLE.Target = System.out
log4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
#-----------------------------------------------------------------------------------------------------
#输出ERROR 级别以上的日志到error.log
log4j.logger.ERROR=ERROR
log4j.appender.ERROR = org.apache.log4j.DailyRollingFileAppender
log4j.appender.ERROR.File =E:/log/error.log
log4j.appender.ERROR.Threshold = ERROR 
log4j.appender.ERROR.Append = true
log4j.appender.ERROR.layout = org.apache.log4j.PatternLayout
log4j.appender.ERROR.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
#-----------------------------------------------------------------------------------------------------
#输出WARN 级别以上的日志到warn.log
log4j.logger.WARN=WARN
log4j.appender.WARN = org.apache.log4j.DailyRollingFileAppender
log4j.appender.WARN.File =E:/log/warn.log
log4j.appender.WARN.Threshold = WARN
log4j.appender.WARN.Append = true
log4j.appender.WARN.layout = org.apache.log4j.PatternLayout
log4j.appender.WARN.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
#-----------------------------------------------------------------------------------------------------
#输出INFO级别以上的内容到info.log中
log4j.logger.INFO=INFO
log4j.appender.INFO = org.apache.log4j.DailyRollingFileAppender
log4j.appender.INFO.File = E:/log/info.log
log4j.appender.INFO.Threshold = INFO 
log4j.appender.INFO.Append = true
log4j.appender.INFO.layout = org.apache.log4j.PatternLayout
log4j.appender.INFO.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
#-----------------------------------------------------------------------------------------------------
#输出DEBUG 级别以上的日志到debugger.log
log4j.logger.DEBUG=DEBUG
log4j.appender.DEBUG = org.apache.log4j.DailyRollingFileAppender
log4j.appender.DEBUG.File = E:/log/debugger.log
log4j.appender.DEBUG.Threshold = DEBUG
log4j.appender.DEBUG.Append = true
log4j.appender.DEBUG.layout = org.apache.log4j.PatternLayout
log4j.appender.DEBUG.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
#-----------------------------------------------------------------------------------------------------
#输出ALL级别的日志到all.log
log4j.logger.ALL=ALL
log4j.appender.ALL = org.apache.log4j.DailyRollingFileAppender
log4j.appender.ALL.File = E:/log/all.log
log4j.appender.file.DatePattern ='.'yyyy-MM-dd
log4j.appender.ALL.Threshold = ALL 
log4j.appender.ALL.Append = true
log4j.appender.ALL.layout = org.apache.log4j.PatternLayout
log4j.appender.ALL.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
​

2)mybatis-config.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>    <settings>        <setting name="lazyLoadingEnabled" value="false" />        <setting name="logImpl" value="STDOUT_LOGGING" />    </settings></configuration>

3)mybatis-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mybaits-spring="http://mybatis.org/schema/mybatis-spring"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans.xsd
     http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context.xsd
     http://www.springframework.org/schema/aop
     http://www.springframework.org/schema/aop/spring-aop.xsd
     http://www.springframework.org/schema/tx
     http://www.springframework.org/schema/tx/spring-tx.xsd
     http://mybatis.org/schema/mybatis-spring
     http://mybatis.org/schema/mybatis-spring.xsd">
​
    <!-- 配置数据源(方式二时采用开启context:property-placeholder,方式一时需关闭) -->
    <!--<context:property-placeholder location="classpath:mysqldb.properties"/>-->
    <!-- 方式一 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <!-- 方式一 -->
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf8&amp;serverTimezone=GMT%2B8&amp;useSSL=false" />
        <property name="username" value="root" />
        <property name="password" value="yourpassword" />
        <!-- 方式二 -->
        <!--<property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />-->
        <!-- 其他信息 -->
        <property name="initialSize" value="1" />
        <property name="minIdle" value="1" />
        <property name="maxActive" value="20" />
        <property name="maxWait" value="60000" />
        <!-- 超过时间限制是否回收 -->
        <property name="removeAbandoned" value="true" />
        <!-- 超过时间限制多长;-->
        <property name="removeAbandonedTimeout" value="180" />
        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000" />
        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="300000" />
        <!-- 用来检测连接是否有效的sql,要求是一个查询语句-->
        <property name="validationQuery" value="SELECT 1" />
        <!-- 申请连接的时候检测 -->
        <property name="testWhileIdle" value="true" />
        <!-- 申请连接时执行validationQuery检测连接是否有效,配置为true会降低性能 -->
        <property name="testOnBorrow" value="false" />
        <!-- 归还连接时执行validationQuery检测连接是否有效,配置为true会降低性能  -->
        <property name="testOnReturn" value="false" />
    </bean>
​
    <!-- Mybatis文件 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation" value="classpath:mybatis-config.xml" />
        <property name="dataSource" ref="dataSource" />
        <!-- 映射文件路径 -->
        <property name="mapperLocations" value="classpath:dao/*.xml" />
    </bean>
​
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="dao" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
    </bean>
​
    <!-- 事务管理器 -->
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
​
    <tx:annotation-driven transaction-manager="transactionManager" />
</beans>
​

4)spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd
     http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context.xsd
     http://www.springframework.org/schema/aop
     http://www.springframework.org/schema/aop/spring-aop.xsd
     http://www.springframework.org/schema/tx 
     http://www.springframework.org/schema/tx/spring-tx.xsd">
​
    <!-- 自动注入 -->
    <context:component-scan base-package="service.impl" />
    <!-- 引用redis管理文件 -->
    <!--<import resource="classpath:application-redis.xml" />-->
</beans>

5)spring-mvc

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
     http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context-3.0.xsd
     http://www.springframework.org/schema/mvc
     http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
     ">
​
    <!-- 启用spring mvc 注解 -->
    <context:annotation-config />
​
    <!-- 设置使用注解的类所在的jar包 -->
    <context:component-scan base-package="controller" />
​
    <!-- 完成请求和注解POJO的映射 -->
    <mvc:annotation-driven/>
​
    <!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
        p:prefix="/" p:suffix=".jsp" />
​
</beans>

6)web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app
    version="4.0"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:javaee="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xml="http://www.w3.org/XML/1998/namespace"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd">
  <display-name>Archetype Created Web Application</display-name>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring.xml,classpath:mybatis-spring.xml</param-value>
  </context-param>
  <servlet>
    <servlet-name>springDispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springDispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

当然,在上述web.xml文件中的<web-app></web-app>之间也可以写入欢迎页的默认页面,通常是index.html或index.jsp等,如:

<welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.jsp</welcome-file></welcome-file-list>

至此,框架已经基本搭建完成,但目前为止还无法实际应用,后续如何修改使用,我们看下一个章节!

相关文章:

  • maxDataPointsPerRollingArg must be at least 1
  • 斐波那契数列----C语言
  • ⭐算法OJ⭐俄罗斯套娃信封问题【排序 + LIS】Russian Doll Envelopes
  • AF3 process_tensors_from_config函数解读
  • True strength lies in embracing vulnerability as a gateway to growth.
  • 清晰易懂的TypeScript安装与开发环境配置教程
  • 主流云厂商的云原生技术栈(Cloud-native stack)及其核心组件对比
  • AIGC1——AIGC技术原理与模型演进:从GAN到多模态融合的突破
  • 备份是个好习惯
  • Android学习总结之通信篇
  • 基于 vue 做数字滚轮效果
  • UE5学习笔记 FPS游戏制作26 UE中的UI
  • Cline源码分析
  • 【力扣hot100题】(016)缺失的第一个正数
  • 一键实现:谷歌表单转word(formtoword)
  • springboot jpa Instant
  • Dubbo(22)如何配置Dubbo的服务提供者?
  • 【LeetCode】算法详解#2 ---和为k的子数组
  • 当AI代写作业成为常态:重构智能时代的教育范式
  • 关于JVM和OS中的栈帧的区别和内存浅析
  • 利用wordpress赚钱/北京seo服务商
  • 郑州网络推广方案/整站快速排名优化
  • h5网站开发培训哪里好/网站运营推广方案
  • 企智网站建设/百度经验官网首页
  • 网站后台无法审核/线上推广网络公司
  • 国内最新新闻摘抄30字/东莞seo代理