7.IOC容器
Spring的IoC(Inversion of Control,控制反转)容器是Spring框架的核心。它负责管理应用程序中的对象(也称为Bean)的创建、配置和使用,实现了**IoC和依赖注入(DI)**的机制。
7.1 控制反转
IoC是一种设计模式,通过将程序中的控制权从应用程序代码转移到框架中,将对象的创建和依赖关系的处理交给容器来完成。而不是由应用程序显式地创建和管理对象。这样可以降低代码的耦合度,提高代码的可维护性和可测试性。
IOC的主要思想是将组件之间的依赖关系的控制权从应用程序代码中转移给一个容器。容器负责创建和管理组件对象,并且根据组件之间的依赖关系进行自动注入,从而实现了控制反转。
以下是一些常见的IOC容器的特征和约定:
-
组件的声明:IOC容器通常提供一种机制来声明组件,这可以是通过配置文件(如XML、JSON)或通过注解来表示。
-
依赖注入:IOC容器负责组件对象的创建和管理,它会自动将组件所需的依赖注入到组件对象中。依赖注入可以通过构造函数、属性注入或方法注入等方式来实现。
-
生命周期管理:IOC容器通常负责管理组件的生命周期,例如创建组件对象、初始化组件、销毁组件等。
-
解耦组件:通过将组件之间的依赖关系交给IOC容器来管理,可以实现组件之间的解耦。每个组件只需要关注自己的功能,而不需要关心其他组件的实现细节。
-
配置灵活性:IOC容器通常允许开发人员灵活地配置组件的依赖关系,以满足不同的需求。
7.1.1Spring的IoC容器
Spring的IoC容器提供了以下主要功能:
-
Bean的创建和管理:IoC容器负责实例化和管理Bean对象的生命周期。可以通过配置文件(如XML、注解等)或编程方式指定Bean的创建方式、属性值、依赖关系等。
-
依赖注入:IoC容器负责将Bean之间的依赖关系在运行时自动注入。它通过依赖注入的方式将所需的依赖关系传递给Bean,而不是Bean自己创建或查找依赖。
-
生命周期管理:IoC容器管理Bean的整个生命周期,可以在Bean创建前、创建后、销毁前等进行相应的操作。
-
配置管理:IoC容器可以从配置文件或注解中读取和解析Bean的相关配置信息。配置文件可以包含Bean的定义、属性值、依赖关系、切面配置等。
Spring的IoC容器有多种实现,其中最常用的是ApplicationContext接口的实现类。ApplicationContext可以从XML、注解、Java配置等多种方式进行配置,并提供了许多附加功能,如国际化支持、事件发布、AOP等。
以下是一个简单的使用Spring IoC容器的Java示例:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
// 创建并初始化IoC容器
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 从容器中获取Bean
HelloWorldService helloWorldService = (HelloWorldService) context.getBean("helloWorldService");
// 使用Bean
System.out.println(helloWorldService.getGreeting());
// 关闭容器
((ClassPathXmlApplicationContext) context).close();
}
}
在上述示例中,我们使用ClassPathXmlApplicationContext
来创建一个IoC容器,并通过指定的XML配置文件来初始化容器。然后,我们使用getBean方法从容器中获取一个名为"helloWorldService"
的Bean,并将其转换为HelloWorldService
类型的对象。最后,我们使用该对象调用相应的方法。
7.2 依赖注入
DI(Dependency Injection,依赖注入)是实现IOC(Inversion of Control,控制反转)的一种具体的技术手段。它通过将组件所需的依赖关系从组件内部提取出来,并由外部容器负责创建和注入依赖对象,从而实现了解耦和灵活性。
在依赖注入中,组件不再负责创建或获取自己的依赖对象,而是通过容器动态注入它所需要的依赖。这样做的好处是,组件只需要关注自己的核心逻辑,而不用关心依赖对象的创建和管理。
依赖注入可以通过以下方式实现:
- 构造函数注入:容器通过组件的构造函数来注入依赖对象。在创建组件对象时,容器将依赖对象作为参数传入构造函数中。
public class UserService {
private UserDao userDao;
public UserService(UserDao userDao) {
this.userDao = userDao;
}
}
- 属性注入:容器通过组件的属性来注入依赖对象。在创建组件对象后,容器通过反射或其他方式将依赖对象设置给组件的属性。
public class UserService {
@Autowired
private UserDao userDao;
// 访问userDao对象
}
- 方法注入:容器通过调用组件的方法来注入依赖对象。在创建组件对象后,容器调用指定的方法,并将依赖对象作为参数传入。
public class UserService {
private UserDao userDao;
@Autowired
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
通过依赖注入,我们可以更方便地对组件进行测试和修改,而无需修改组件内部的代码。同时,依赖注入也提高了代码的可维护性和可扩展性,因为我们可以通过配置或注解来改变组件的依赖关系,而不用修改代码。
在实践中,DI通常与IOC容器一起使用,容器负责管理组件的生命周期和依赖注入。
7.3 Bean工厂
BeanFactory是Spring框架中的一个核心接口,用于管理和提供应用程序中的对象(也称为Bean)。它是Spring IoC容器的基础,负责创建、配置和管理Bean的生命周期。
BeanFactory提供了以下主要功能:
-
创建Bean:BeanFactory能够根据配置信息,实例化和创建Bean对象。
-
依赖注入:BeanFactory能够根据配置中的依赖关系,在Bean创建时自动注入依赖的其他Bean。
-
生命周期管理:BeanFactory管理Bean的生命周期,可以在Bean创建前进行操作,以及在Bean销毁后进行清理。
-
配置管理:BeanFactory能够根据配置文件或注解,读取和解析Bean的相关配置信息。
以下是一个简单的使用BeanFactory的Java示例:
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
public class MainApp {
public static void main(String[] args) {
// 创建BeanFactory,读取配置文件
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
// 获取Bean
HelloWorldService helloWorldService = (HelloWorldService) factory.getBean("helloWorldService");
// 使用Bean
System.out.println(helloWorldService.getGreeting());
}
}
在上述示例中,我们通过XmlBeanFactory
来创建一个BeanFactory
,并通过ClassPathResource
指定了配置文件的路径。然后我们使用getBean
方法从BeanFactory
中获取了一个名为"helloWorldService"
的Bean
,并将其转换为HelloWorldService
类型的对象。接下来,我们可以使用该对象调用相应的方法。
需要注意的是,XmlBeanFactory
已经过时,推荐使用更现代化的ApplicationContext
来代替,因为ApplicationContext
除了提供BeanFactory
的功能外,还提供了其他的高级特性,如国际化支持、事件发布、AOP等。
8. Filter
过滤器(Filter)是一种在Servlet容器中用于对请求和响应进行预处理和后处理的组件。
8.1 应用场景
过滤器常用于以下情况:
-
访问控制:使用过滤器来实现对特定资源或URL的访问控制,例如验证用户权限、身份验证等。
-
编码转换:使用过滤器将请求和响应的编码格式进行转换,以确保数据在不同环境中正确解析和传输。
-
日志记录:使用过滤器对请求和响应进行日志记录,用于调试和监控应用程序的运行情况。
-
数据压缩:使用过滤器对响应进行压缩,以减少网络传输的数据量。
8.2 任务实现
使用过滤器可以实现以下任务:
-
预处理请求:对请求进行验证、身份验证、数据解析或修改。
-
修改请求参数:更改请求的参数值,例如追加额外的参数或更改参数值。
-
过滤敏感信息:从请求中删除或屏蔽敏感信息,以确保安全性。
-
决定是否继续执行:基于特定的条件,决定是否继续执行其他的过滤器或者直接访问目标资源。
-
后处理响应:在响应返回给客户端之前,对响应进行修改、添加或封装。
过滤器通过实现javax.servlet.Filter
接口来创建。过滤器可以在Web应用程序的web.xml
文件中进行配置,指定需要拦截和处理的URL模式。过滤器可以拦截请求,并在请求到达目标Servlet之前执行一些预处理操作,然后可以拦截响应,并在响应返回给客户端之前执行一些后处理操作
过滤器可以按照配置的顺序依次执行,可以同时存在多个过滤器。过滤器可以通过FilterChain
来将请求传递给下一个过滤器或目标Servlet。
过滤器只能对请求和响应进行处理,不能直接生成响应。如果需要直接生成响应,应该使用Servlet来处理。
8.3 Filter开发步骤
下面是开发一个Filter的一般步骤:
-
定义
Filter
类:创建一个Java类,实现javax.servlet.Filter
接口。该接口包含三个方法需要实现:init()
、doFilter
()和destroy()
。 -
实现
init()
方法:在这个方法中,可以进行一些初始化的操作。比如,可以获取或设置一些需要使用的配置信息,或者创建和初始化一些对象。 -
实现
doFilter()
方法:这是Filter的核心方法,在这里对请求进行处理。doFilter()
方法有三个参数:ServletRequest
、ServletResponse
和FilterChain
。通过ServletRequest
可以获取请求的信息,通过ServletResponse
可以操作响应结果,通过FilterChain
可以控制请求的链路。 -
在
doFilter()
方法中编写过滤逻辑:根据需求,在请求到达目标资源之前或响应返回给客户端之后进行相应的处理。比如,可以进行身份认证、权限判断、日志记录等操作。 -
在
doFilter()
方法中调用FilterChain
的doFilter()
方法:通过调用FilterChain
的doFilter()
方法,将请求传递给下一个Filter
或目标资源。 -
实现
destroy()
方法:在这个方法中,进行一些清理和资源释放的操作。比如,关闭数据库连接、释放资源等。 -
配置
Filter
:将Filter配置到Web服务器中。对于Java Web应用,可以在web.xml文件中通过配置<servlet>
和<filter>
元素来定义Filter。
需要注意的是,Filter是按照在web.xml中的定义顺序依次执行的。另外,还可以通过配置Filter的URL模式(如路径匹配、通配符等)来控制Filter的应用范围。
8.4 示例
下面是一个简单的过滤器示例:
import javax.servlet.*;
import java.io.IOException;
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化过滤器
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 对请求进行处理
// ...
// 继续调用下一个过滤器或者目标资源
chain.doFilter(request, response);
// 对响应进行处理
// ...
}
@Override
public void destroy() {
// 销毁过滤器
}
}
此外,还可以使用@WebFilter注解来配置过滤器的映射信息,例如:
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(urlPatterns = "/protected/*")
public class MyFilter implements Filter {
// ...
}
上述示例将过滤器映射到以"/protected/"
开头的URL模式。
9. DispatcherServlet
DispatcherServlet是Spring MVC框架的核心组件之一,用于分发HTTP请求并提供统一的请求处理机制。
在Spring MVC中,DispatcherServlet是一个前端控制器(Front Controller),它接收所有的请求并将其分发给合适的处理器(Controller)。
9.1 负责任务
DispatcherServlet负责以下任务:
-
接收HTTP请求:DispatcherServlet会监听指定的URL,并拦截所有到达该URL的HTTP请求。
-
请求处理流程:一旦DispatcherServlet接收到请求,它将使用HandlerMapping组件来确定哪个Controller负责处理该请求。然后,该请求将传递给Controller进行处理。
-
视图解析和渲染:Controller处理请求后,会返回一个逻辑视图名(Logical View Name),DispatcherServlet将使用ViewResolver来解析逻辑视图名,并找到对应的视图模板进行渲染。最终,生成的结果将作为HTTP响应返回给客户端。
-
请求生命周期管理:DispatcherServlet负责管理整个请求的生命周期,包括请求参数解析、数据绑定、处理器适配等。
9.2 示例
以下是一个简单的使用DispatcherServlet
的配置示例:
- 在
web.xml
文件中配置DispatcherServlet
:
<servlet>
<servlet-name>myDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
在这个配置中,我们指定了DispatcherServlet
使用的Servlet
类(org.springframework.web.servlet.DispatcherServlet)和配置文件的位置(/WEB-INF/spring-config.xml)。这将使DispatcherServlet能够处理所有的HTTP请求,并根据配置文件来分发和处理请求。
- 创建
spring-config.xml
文件并配置Spring MVC相关的组件:
<!-- 配置HandlerMapping -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- 配置Controller -->
<bean name="/hello" class="com.example.HelloController"/>
<!-- 配置ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF
10. 事务管理
在 Java Web 中,事务管理是一种重要的机制,用于确保数据库操作的一致性和完整性。事务是一系列操作的逻辑单元,要么全部成功提交,要么全部回滚,以保持数据的一致性。
在 Java Web 中,常用的事务管理方式有两种:编程式事务管理和声明式事务管理。
10.1 编程式事务管理
编程式事务管理:开发者在代码中手动控制事务的开始、提交和回滚。
基本步骤如下:
- 获取数据库连接
- 手动开启事务
- 执行一系列数据库操作
- 根据操作结果决定提交或回滚事务
- 关闭数据库连接
示例代码如下:
Connection conn = null;
try {
conn = dataSource.getConnection();
conn.setAutoCommit(false);
// 执行一系列数据库操作
conn.commit(); // 提交事务
} catch (SQLException e) {
if (conn != null) {
conn.rollback(); // 回滚事务
}
} finally {
if (conn != null) {
conn.close();
}
}
10.2 声明式事务管理
声明式事务管理:通过配置文件或注解的方式,将事务管理交给容器来处理。常用的框架有 Spring 和 JavaEE。开发者只需声明哪些方法需要进行事务管理,容器会自动处理事务的开始、提交和回滚。
示例代码如下:
使用 Spring 框架的 @Transactional
注解:
@Transactional
public void saveData() {
// 执行一系列数据库操作
}
使用 JavaEE 的 @Transactional
注解:
import javax.transaction.Transactional;
@Transactional
public void saveData() {
// 执行一系列数据库操作
}
通过适当的配置和注解,容器会自动管理事务,并确保数据操作的一致性。
10.3 事务管理设计组件
在设计事务管理的组件时,可以考虑以下几个关键组件:
-
事务管理器(Transaction Manager):事务管理器负责管理数据库事务的生命周期,包括事务的开始、提交或回滚。它提供了一种统一的接口,使得应用程序可以进行事务的控制和管理。
-
事务定义(Transaction Definition):事务定义用于定义一个事务的属性,包括事务的隔离级别、传播行为、超时等。不同的事务定义可以根据不同的业务需求而定义,以满足事务操作的要求。
-
事务管理配置(Transaction Management Configuration):事务管理配置用于配置事务管理器和事务定义,指定哪些方法或类需要进行事务管理。这通常可以通过注解或XML配置来实现。
-
事务拦截器(Transaction Interceptor):事务拦截器是一个AOP切面,用于拦截需要进行事务管理的方法调用。它在方法执行前后织入事务相关的逻辑,如事务的开启、提交或回滚。事务拦截器可以通过代理模式或动态代理来实现。
-
事务切入点(Transaction Pointcut):事务切入点用于定义事务拦截器拦截的方法范围,即哪些方法需要进行事务管理。可以通过正则表达式、注解或其他方式来定义事务切入点。
-
事务异常处理(Transaction Exception Handling):事务管理中需要考虑异常处理,以确保在事务处理过程中发生异常时能够回滚事务或进行其他指定的处理。可以通过try-catch块、异常处理器或AOP切面来实现事务异常处理。
-
事务日志记录(Transaction Logging):为了保证事务的可靠性和可恢复性,在事务管理中通常需要进行事务日志记录。事务日志记录可以用于记录事务的操作和状态信息,并在发生故障时进行恢复。
-
事务状态管理(Transaction State Management):事务管理中需要对事务的状态进行管理,包括事务的开始、提交、回滚、完成等。事务状态管理可以使用状态变量、状态机或标志位等方式来实现。
10.4 ThreadLocal
ThreadLocal与事务管理可以结合使用来实现在多线程环境下的事务隔离。在事务管理中,每个线程需要有自己独立的事务上下文,以确保事务操作之间的隔离性。ThreadLocal可以用于保存线程的事务上下文,以便在代码中进行访问和控制。
一种常见的应用场景是Web应用中的事务管理。在一个Web请求中,多个线程可能同时处理不同的请求,每个请求对应一个独立的事务。使用ThreadLocal可以在每个请求的处理线程中保存事务上下文,以便在不同的业务逻辑中使用。
具体实现步骤如下:
-
在事务管理器中使用ThreadLocal:事务管理器可以在每个事务开始时创建并设置一个ThreadLocal对象,用于保存当前线程的事务上下文。此时,可以将事务上下文信息,如连接、事务状态等,存储在ThreadLocal对象中。
-
通过ThreadLocal获取事务上下文:在业务逻辑代码中,可以通过ThreadLocal的get()方法获取当前线程的事务上下文。这使得在同一线程中的不同方法或组件中可以共享同一个事务上下文。
-
提交或回滚事务:在事务结束时,可以从ThreadLocal对象中获取事务上下文,并根据其中的事务状态来决定是提交事务还是回滚事务。在提交或回滚操作完成后,需要显式地删除ThreadLocal中的事务上下文,以防止内存泄漏。
需要注意的是,使用ThreadLocal进行事务隔离时,需要保证在整个事务过程中,只有一个事务管理器实例创建了ThreadLocal对象,并且在合适的时机进行删除,以避免线程间的数据混淆和内存泄漏的问题。
11. listener
Listener(监听器)是JavaEE应用程序中的一种机制,它可以用来监听特定事件的发生,并在事件触发时执行相应的操作。在JavaEE中,常见的监听器包括ServletContextListener、HttpSessionListener、ServletRequestListener
等。
监听器一般是按照某种接口规范来实现的,这个接口规范定义了一组事件回调方法,用来处理监听到的事件。当事件发生时,容器会自动调用相应的回调方法。
11.1 监听器类型
常见的监听器及其作用如下:
-
ServletContextListener
(全局上下文监听器):用于监听Web应用程序的启动和关闭事件。 它有两个回调方法:contextInitialized()
用于处理Web应用程序初始化时的操作,contextDestroyed()
用于处理Web应用程序关闭时的操作。可以在contextInitialized()
方法中做一些初始化工作,如加载配置文件、初始化数据库连接池等;在contextDestroyed()
方法中进行一些资源释放操作。 -
HttpSessionListener
(会话监听器):用于监听用户会话的创建和销毁事件。 它有两个回调方法:sessionCreated()
用于处理会话创建时的操作,sessionDestroyed()
用于处理会话销毁时的操作。可以在sessionCreated()
方法中记录用户访问日志、统计在线用户数等;在sessionDestroyed()
方法中清理会话相关的资源。 -
ServletRequestListener
(请求监听器):用于监听请求的创建和销毁事件。 它有两个回调方法:requestInitialized()
用于处理请求创建时的操作,requestDestroyed()
用于处理请求销毁时的操作。可以在requestInitialized()
方法中记录请求日志、设置请求属性等;在requestDestroyed()
方法中进行一些资源释放操作。
11.2 特点
监听器具有以下几个主要特点:
-
声明和注册:监听器需要通过实现特定的接口,并在web.xml或注解配置中进行声明和注册,以便容器识别和管理。
-
事件侦听:监听器通过定义特定的方法来侦听和响应事件。当事件发生时,容器会调用监听器中相应的方法进行处理。
-
事件处理:监听器可以在事件发生时执行一些自定义的操作,如日志记录、资源清理、权限验证等。它可以与其他组件交互,修改或补充事件的处理结果。
-
生命周期管理:监听器的生命周期由容器管理,包括初始化、销毁和回收资源等。容器会在适当的时机创建和销毁监听器对象。
监听器在Java EE中扮演着重要的角色,可以用于各种场景,如记录日志、权限验证、性能监控等。通过使用监听器,可以实现系统的可扩展性、可重用性和灵活性。
11.3 应用举例 –ServletContextListener
一个常见的ServletContextListener的应用例子是在Web应用程序启动和关闭时执行一些初始化和清理操作。
下面是一个简单的示例,展示了如何在应用程序启动和关闭时执行一些操作:
- 创建一个实现
ServletContextListener
接口的类:
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
// Web应用程序启动时执行的初始化操作
System.out.println("Web应用程序启动");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
// Web应用程序关闭时执行的清理操作
System.out.println("Web应用程序关闭");
}
}
- 在
web.xml
文件中配置ServletContextListener
:
在web.xml
文件中添加以下配置,将MyServletContextListener
类作为一个监听器:
<listener>
<listener-class>com.example.MyServletContextListener</listener-class>
</listener>
- 在应用程序启动和关闭时,
MyServletContextListener
的方法会被调用:
当Web应用程序启动时,会自动创建MyServletContextListener
实例,并调用其contextInitialized
方法。当Web应用程序关闭时,会调用MyServletContextListener
的contextDestroyed
方法。
通过实现ServletContextListener
接口,可以在Web应用程序启动和关闭时执行一些初始化和清理操作。例如,可以在contextInitialized
方法中初始化数据库连接池或加载一些配置信息,在contextDestroyed
方法中关闭数据库连接或释放资源等。
12. Thymeleaf
Thymeleaf是一种Java服务器端渲染引擎,用于构建动态的Web应用程序。它作为一款模板引擎,能够将服务器端的数据与用户界面进行数据绑定和渲染,生成最终的HTML页面。Thymeleaf提供了一套自然的模板语法,简化了前端开发的工作量。
Thymeleaf的主要特性包括:
-
自然的模板语法:Thymeleaf的模板语法类似于HTML,具有很好的可读性和可维护性。它通过将动态数据绑定到HTML标签和属性中,使得页面渲染更加直观和易于理解。
-
数据绑定和表达式:Thymeleaf支持在模板中使用表达式和变量来实现数据绑定。可以将动态数据填充到HTML标签、属性和文本中,以实现不同的需求,如循环、条件判断和动态样式等。
-
国际化和本地化:Thymeleaf提供了国际化和本地化支持,可以根据用户的语言设置来切换不同的文本和消息资源。开发人员可以在模板中使用Thymeleaf的内置语法来处理多语言,使得应用程序更具可扩展性和适应性。
-
布局和片段:Thymeleaf支持布局和片段概念,使得页面可以进行模块化和重用。可以定义通用的布局模板,并使用片段来动态填充内容。这样可以减少重复的代码,并提高页面的可维护性和可重用性。
-
表单处理:Thymeleaf提供了方便的表单处理功能,可以自动生成表单元素,并处理表单的提交和验证。开发人员可以在模板中使用Thymeleaf的表单处理语法来处理表单相关的操作,简化了表单处理的流程。
Thymeleaf广泛应用于Java Web应用程序开发中,与Spring框架、Spring Boot等集成性能良好。它可以与Java后端进行无缝集成,通过服务器端渲染生成动态的HTML页面。与其他模板引擎相比,Thymeleaf的语法简单直观,并且具有强大的功能和扩展性。
14.Ajax
Ajax,全称Asynchronous JavaScript and XML,直译为异步JavaScript和XML。它是一种用于创建快速动态网页的技术,主要通过在后台与服务器进行少量数据交换,实现网页的异步更新。这意味着在不需要刷新整个页面的情况下,就可以对网页的某部分进行更新。传统的网页(不使用 AJAX)在用户提交表单或点击链接时,会向服务器发送请求并等待服务器的响应,这个过程会阻塞用户的操作。而使用 AJAX 技术,可以在不重新加载整个页面的情况下,向服务器发送请求并处理响应,提高用户体验。
虽然Ajax中的X代表XML,但是JSON才是首选,因为它更加轻量,而且是用JavaScript编写的。在Ajax模型中,JSON和XML都被用来包装信息。此外,Ajax最吸引人的特性是它的“异步”性质,这意味着它可以与服务器通信、交换数据并更新页面,而无需刷新页面。
JSON
JSON,全称JavaScript Object Notation,是一种轻量级的数据交互格式。它基于ECMAScript (European Computer Manufacturers Association制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。JSON类似XML,但比XML更小、更快,更易解析,且易于人阅读和编写。
JSON的主要用途是作为Web应用程序中的数据传输格式。例如,在Ajax中,JSON和XML都被用来包装信息,但由于JSON更轻量且易于理解,所以被广泛使用。此外,许多编程语言(如C、Python、C++、Java、PHP、Go等)都支持JSON,这使得JSON成为了理想的数据交换语言。