MVC核心文件Application.class.php设计实例

本文介绍了一个基于MVC架构的应用程序核心文件Application.class.php的设计实例,包括了字符编码设置、系统常量定义、错误处理配置、配置加载、自动加载机制、Session处理、URL解析、权限验证及分发机制等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MVC核心文件Application.class.php设计实例


<?php
//通过判断ACCESS常量,判断来源是否为非法请求
if(!defined('ACCESS')) {
	echo '非法入侵';
	exit;
}
class Application {
	//设置字符编码
	private static function setHeader() {
		header('Content-type:text/html;charset=utf-8');
	}
	//设置系统常量
	private static function setConst() {
		define('ROOT_DIR',str_replace('\\', '/', dirname(__DIR__)));
		define('CORE_DIR',ROOT_DIR.'/Core');
		define('ACTION_DIR',ROOT_DIR.'/Action');
		define('MODEL_DIR',ROOT_DIR.'/Model');
		define('VIEW_DIR',ROOT_DIR.'/View');
		define('Config_DIR',ROOT_DIR.'/Config');
		define('PUBLIC_DIR',ROOT_DIR.'/Public');
	}
	//设置错误信息
	private static function setErrors() {
		//ini_set('display_errors', 0);
		//error_reporting(E_ALL);
	}
	
	//初始化配置信息
	private static function setConfig() {
		$GLOBALS['config'] = include_once Config_DIR.'/config.php';
	}
	
	//加载Core核心文件
	public static function loadCore($class) {
		if(is_file(CORE_DIR."/$class.class.php")) {
			include_once CORE_DIR."/$class.class.php";
		}
	}
	
	//加载控制器文件
	public static function loadAction($class) {
	if(is_file(ACTION_DIR."/$class.class.php")) {
			include_once ACTION_DIR."/$class.class.php";
		}
	}
	
	//加载模型文件
	public static function loadModel($class) {
		if(is_file(MODEL_DIR."/$class.class.php")) {
			include_once MODEL_DIR."/$class.class.php";
		}
	}
	
	//自动加载机制
	private static function setAutoLoad() {
		//通过以下方式可以将loadCore,loadAction,loadModel追加到系统__autoload函数栈中
		//当系统初始化对象时,系统会自动到以下三个函数中寻找,但是有顺序要求,先注册先使用,如在当
		//前文件中已找到,其将不会继续向下寻找
		spl_autoload_register(array('Application','loadCore'));
        spl_autoload_register(array('Application','loadAction'));
        spl_autoload_register(array('Application','loadModel'));
	}
	
	//设置session
	private static function setSession() {
		@session_start();
        //$user=array();
		//$user['id']=1;
		//$user['username']='zhangsan';
		//$_SESSION['user']=$user;
	}
	
	//设置url
	private static function setUrl() {
		$module = isset($_REQUEST['module'])?$_REQUEST['module']:'privilege';
		$action = isset($_REQUEST['action'])?$_REQUEST['action']:'index';
		
		//把接收到的所有参数转化为小写
		$module = strtolower($module);
		$action = strtolower($action);
		//由于命名习惯问题,我们需要将模块参数的首字母转化为大写
		$module = ucfirst($module);
		
		define('MODULE',$module);
		define('ACTION',$action);
	}
	
	//设置权限
	private static function setPrivilege() {
		
		if(!(MODULE=='Privilege' && (ACTION=='login' || ACTION=='sigin' || ACTION=='captcha'))) {
			if(!isset($_SESSION['user'])) {
				header('Location:index.php');
			}
		}
	}
	
	//设置分发
	private static function setDispatch() {
		$module = MODULE.'Action';
		$action = ACTION;
		//创建对象
		$module = new $module();
		$module->$action();
	}
	
	//定义初始化方法
	public static function run() {

		//1)初始化字符集
		self::setHeader();
		//2)初始化系统常量
		self::setConst();
		//3 )初始化错误配置
		self::setErrors();
		//4)初始化配置信息
		self::setConfig();
		//5)自动加载
		self::setAutoLoad();
		//6)开启session
		self::setSession();
		////////// 测试session//////////////////////////
		//7)url初始化
		self::setUrl();
		//8)权限验证
		//self::setPrivilege();
		//9)分发
		self::setDispatch();
	}
}
?>


<think>我们正在讨论的是Spring MVC项目(非Spring Boot),并且用户希望使用application.xml(实际上是spring-mvc.xml)来全局配置JSON返回的时间日期格式。 根据引用[1]中的配置示例,我们可以通过配置`<mvc:annotation-driven>`中的`MappingJackson2HttpMessageConverter`来设置日期格式。 步骤: 1. 在spring-mvc.xml文件中,配置`<mvc:annotation-driven>`,并在其中定义`MappingJackson2HttpMessageConverter`。 2. 在`MappingJackson2HttpMessageConverter`中注入一个自定义的`ObjectMapper`。 3. 在`ObjectMapper`中设置`dateFormat`属性为一个`SimpleDateFormat`实例,并指定日期格式。 具体配置如下(参考引用[1]的方式三): ```xml <mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg value="yyyy-MM-dd HH:mm:ss"/> </bean> </property> <!-- 如果需要设置时区,可以添加timeZone属性 --> <property name="timeZone" value="Asia/Shanghai"/> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven> ``` 注意: - 这个配置会覆盖默认的`MappingJackson2HttpMessageConverter`,从而全局生效。 - 这里我们设置了日期格式为"yyyy-MM-dd HH:mm:ss",并且设置了时区为"Asia/Shanghai"(避免时区问题)。 但是,请注意引用[4]中提到的:在Spring MVC项目中,通常有两个配置文件: - `applicationContext.xml`:全局配置文件,由`ContextLoaderListener`加载,用于配置业务层、数据层等。 - `spring-mvc.xml`:DispatcherServlet的配置文件,用于配置控制器、视图解析器、消息转换器等。 由于JSON消息转换器属于Spring MVC的组件,因此我们应该在`spring-mvc.xml`中配置(而不是`applicationContext.xml`)。 另外,引用[5]中提示了相关依赖,确保项目中已经引入了Jackson的依赖(如`spring-webmvc`会传递依赖Jackson,但为了确保版本,可以显式引入`jackson-databind`)。 如果项目使用的是Java 8的日期时间类型(如`LocalDateTime`),上述配置只对传统的`java.util.Date`生效。对于Java 8日期时间类型,需要额外配置模块和序列化器(在Spring MVC的XML配置中较复杂,通常建议使用Java配置类)。 因此,如果项目中有Java 8日期时间类型,可以考虑以下两种方式之一: 1. 在实体类字段上使用注解(如`@JsonFormat`)来指定格式。 2. 在`ObjectMapper`中注册Java 8日期时间模块(需要额外依赖`jackson-datatype-jsr310`),并在XML配置中配置该模块。 对于第二种方式,配置示例: 首先,在pom.xml中添加依赖: ```xml <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>2.13.0</version> <!-- 使用与项目匹配的版本 --> </dependency> ``` 然后,修改上面的配置,在`ObjectMapper`中注册Java 8日期时间模块并设置日期格式: 由于XML配置较为复杂,我们可以通过创建一个自定义的`ObjectMapper`工厂bean,并在其中注册模块和设置日期格式。但通常更推荐使用Java配置类。 考虑到用户要求使用XML配置,我们可以这样调整: ```xml <mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <!-- 设置传统的日期格式 --> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg value="yyyy-MM-dd HH:mm:ss"/> </bean> </property> <property name="timeZone" value="Asia/Shanghai"/> <!-- 注册Java 8日期时间模块 --> <property name="registerModule"> <bean class="com.fasterxml.jackson.databind.Module" factory-bean="javaTimeModule" factory-method="getModule"/> </property> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven> <!-- 定义JavaTimeModule的bean --> <bean id="javaTimeModule" class="com.fasterxml.jackson.datatype.jsr310.JavaTimeModule"/> ``` 但是,请注意:上述配置中,我们直接注册了`JavaTimeModule`,但并没有设置该模块的序列化格式。因为默认情况下,`JavaTimeModule`使用ISO格式。如果我们想自定义格式,需要在模块中注册自定义的序列化器。这在XML配置中非常复杂,几乎不可能直接实现。 因此,对于Java 8日期时间类型,建议在字段上使用`@JsonFormat`注解,或者使用Java配置类来配置`ObjectMapper`。 总结: 1. 对于传统日期类型(java.util.Date),可以使用上述XML配置。 2. 对于Java 8日期时间类型,如果使用上述配置,将使用默认的ISO格式(除非使用注解覆盖)。如果需要全局自定义Java 8日期时间格式,建议使用Java配置类。 下面给出一个使用Java配置类的方式(作为备选方案): 在Spring MVC中,我们可以通过实现`WebMvcConfigurer`接口来配置消息转换器。 ```java @Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { // 创建Jackson消息转换器 MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); converter.setObjectMapper(objectMapper()); converters.add(converter); } @Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); // 设置传统日期格式 mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); mapper.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); // 注册Java 8日期时间模块,并自定义序列化格式 JavaTimeModule javaTimeModule = new JavaTimeModule(); javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss"))); mapper.registerModule(javaTimeModule); return mapper; } } ``` 这样,就可以同时处理传统日期和Java 8日期时间类型。 但是,由于用户要求使用application.xml(即spring-mvc.xml)进行配置,我们只能提供传统日期的配置方案,或者接受Java 8日期时间类型使用默认格式(或使用注解)。 因此,在XML配置中,我们只能做到: 1. 配置传统日期格式。 2. 注册JavaTimeModule(但不改变其默认格式,除非使用注解)。 如果用户坚持在XML中配置Java 8日期时间类型的全局格式,目前没有直接的方法,需要借助Java配置。 所以,在回答中,我们将提供传统日期的XML配置方案,并说明Java 8日期时间类型的局限性。 最后,注意引用[3]提到的`<context:annotation-config/>`,它用于激活注解,但这里我们不需要,因为`<mvc:annotation-driven>`已经包含了类似功能。 根据引用[2]和[4],确保这个配置是放在`spring-mvc.xml`中,而不是`applicationContext.xml`中。 因此,最终回答如下:</think>在 Spring MVC 项目中,可以通过配置 `spring-mvc.xml` 文件实现全局 JSON 日期格式设置。以下是完整配置步骤和原理说明: ### 配置步骤 1. **添加 Jackson 依赖**(确保 pom.xml 已包含): ```xml <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.0</version> <!-- 使用匹配项目的版本 --> </dependency> ``` 2. **在 `spring-mvc.xml` 中配置消息转换器**: ```xml <mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <!-- 配置全局日期格式 --> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg value="yyyy-MM-dd HH:mm:ss" /> </bean> </property> <!-- 解决时区问题 --> <property name="timeZone" value="Asia/Shanghai"/> <!-- 禁用时间戳格式 --> <property name="serialization"> <bean class="com.fasterxml.jackson.databind.SerializationFeature"> <property name="WRITE_DATES_AS_TIMESTAMPS" value="false"/> </bean> </property> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven> ``` ### 关键配置说明 | **配置项** | **作用** | **必选** | |--------------------------|--------------------------------------------------------------------------|----------| | `<mvc:annotation-driven>` | 启用 Spring MVC 注解驱动,包含 `@ResponseBody` 支持 | ✅ | | `dateFormat` | 定义日期格式模板(示例:`yyyy-MM-dd HH:mm:ss`) | ✅ | | `timeZone` | 解决时区偏差(如 `Asia/Shanghai`) | ✅ | | `WRITE_DATES_AS_TIMESTAMPS` | 禁用时间戳格式(默认返回毫秒值),设为 `false` 启用格式化输出 | ✅ | ### 工作原理 1. **消息转换器机制** `MappingJackson2HttpMessageConverter` 负责处理 `@ResponseBody` 返回的 JSON 数据[^1]。通过覆盖其默认的 `ObjectMapper`,实现全局日期格式控制。 2. **配置生效范围** 此配置仅作用于 `DispatcherServlet` 管理的控制器(Controller 层),对其他层(如 Service/Dao)无影响[^2][^4]。 3. **与传统 Spring Boot 的区别** Spring Boot 通过 `application.yml` 简化配置,而传统 Spring MVC 需在 XML 中显式声明消息转换器[^1][^4]。 ### 注意事项 1. **Java 8 时间类型支持** 若使用 `LocalDateTime` 等类型,需额外添加依赖并注册模块: ```xml <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>2.13.0</version> </dependency> ``` 在 `ObjectMapper` 中添加配置: ```xml <property name="registerModule"> <bean class="com.fasterxml.jackson.databind.Module" factory-bean="javaTimeModule" factory-method="getModule"/> </property> <bean id="javaTimeModule" class="com.fasterxml.jackson.datatype.jsr310.JavaTimeModule"/> ``` 2. **配置文件位置** 确保配置在 `spring-mvc.xml`(而非 `applicationContext.xml`)中,因日期格式化属于 Web 层组件[^4]。 3. **与其他配置的兼容性** 若存在多个消息转换器,需移除默认的 Jackson 转换器,避免配置冲突。 ### 备选方案:注解方式 对于特定字段的个性化格式,可用 `@JsonFormat` 覆盖全局配置: ```java public class User { @JsonFormat(pattern = "yyyy/MM/dd", timezone = "GMT+8") private Date birthday; } ``` > **提示**:此配置对 `java.util.Date` 生效,如需支持 `java.time.*` 类型,必须注册 `JavaTimeModule`[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值