- 浏览: 359412 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
呆呆DE萌萌:
不可以吗?Timer里不是有一个指定首次运行时间firstDa ...
在Spring中使用 Java Timer 调度任务 -
accpchf:
不太明白,Error jvm都已经停止线程了,怎么还能转译?
深入探索 高效的Java异常处理框架。 -
bo_hai:
讲的详细。谢谢!
详解spring2.0的scope -
hpjianhua:
学习下...
线程池的实现 -
eltonto:
以后你可以来这里看看favicon在线转换
Tomcat中使用Favicon
闲来无事翻了下以前写的项目,发现一个还算不错的东西,就是基于约定的Spring MVC扩展,这段代码是好早以前的东西了(大概四五年了吧),那个时候Spring还远没有现在这么“强大”,哦不,应该说是杂,现在的Spring似乎无所不能,却再也不那么专注了,基于让我有点怀念Spring1.X时代了。本人是Spring的忠实用户,但思想却一直局限于1.X时代,基本上不用Annotation,看着网络上大家对Annotation褒贬不一,呵呵,本人虽不用,但也不掺和,每个人都有自己的习惯。 这个扩展是当时没有Annotation时代,为了解决XML配置文件膨胀而产生的,原理很简单,就是依据请求的urlPath,动态的解析到所对应的处理类,然后实例化处理类,注入所需要的依赖,再执行。记录一下当年Coding的影子,虽然青涩,却也值得怀念。 /**
*
*/
package cn.edu.ccnu.inc.webtemplate.spring.mvc;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactoryUtils;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping;
import org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver;
import org.springframework.web.servlet.mvc.multiaction.MethodNameResolver;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
import cn.edu.ccnu.inc.webtemplate.cache.SystemCacheManager;
import cn.edu.ccnu.inc.webtemplate.util.ClassUtils;
/**
* Convention based url handler mapping, to find a handle class based on the url hierarchy if no
* handler found with the mapping-configuration.
* Example:
* <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
* <property name="defaultHandler">
* <!-- It also could configure a reference to an exist handler -->
* <bean class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />
* </property>
* <property name="packages">
* <value>cn.edu.ccnu.inc.webtemplate.controller, cn.edu.ccnu.inc.webtemplate.spring.controller</value>
* </property>
* <property name="mappings">
* <value>
* /login.html = filenameController
* /index.html = filenameController
* /main.html = filenameController
* /security/userManage.html = filenameController
* /security/roleManage.html = filenameController
* </value>
* </property>
* </bean>
* the path "/security/methodPrivilegeManage.html" doesn't match any item of above, so it will be mapped
* to the security.UserManager class under the package cn.edu.ccnu.inc.webtemplate.controller or under
* cn.edu.ccnu.inc.webtemplate.spring.controller package to handle. When no controller found with this strategy,
* a defaultHandler will be used if it is configured(eg..
* @author <a href="mailto:huangfengjing@gmail.com">Ivan</a>
* @created 2005-10-29 下午12:41:30
*/
public class ConventionBasedUrlHandlerMapping extends SimpleUrlHandlerMapping implements InitializingBean {
SystemCacheManager systemCacheManager = null;
private String CACHE_NAME_IN_SYSTEM = "_system_cache_handler";
/** Default handler when no handler mapped */
private Object defaultHandler;
/** Packages to look for the Handler class */
private String packages;
/**
* Config the packages
* @param packages
*/
public void setPackages(String packages) {
this.packages = packages;
}
/**
* @param defaultHandler the defaultHandler to set
*/
public void setDefaultHandler(Object defaultHandler) {
this.defaultHandler = defaultHandler;
}
/**
* Override the default lookup strategy, when the parent can not find an appropriate one to handle.
* Lookup strategy:
* 1. ask parent mapping to look up handler.
* 2. if no handler found, then use url hierarchy build a short name to retrieve the bean as the handler.
* 3. if still no handler found, assemble a full class name with package and url hierarchy, then load and
* initiate a class with reflection, inject all needed properties, finally use this object as the handler.
* 4. finally, if no handler found through all of above ways, use a default one.
* 5. if no default handler specified, return null.
*/
@Override
protected Object lookupHandler(String urlPath, HttpServletRequest request) throws Exception {
Object handler = super.lookupHandler(urlPath, request);
Map<Object, Object> handlerCache = systemCacheManager.getCache(CACHE_NAME_IN_SYSTEM);
// get handler from the cache
handler = handlerCache.get(urlPath);
if(handler != null) {
return handler;
}
// load the Controller as the handler
String className;
String[] pkgs = StringUtils.commaDelimitedListToStringArray(packages);
for(String pkg : pkgs) {
className = pkg + "." + ClassUtils.convertUrlPathToClassName(urlPath, true);
handler = ClassUtils.loadModelWithApplicationContextFirst(className, getApplicationContext(), null);
if((handler != null && handler instanceof MultiActionController) && ((MultiActionController)handler).getMethodNameResolver().getClass().equals(InternalPathMethodNameResolver.class)) {
try {
MethodNameResolver methodNameResolver = (MethodNameResolver)BeanFactoryUtils.beanOfTypeIncludingAncestors(getApplicationContext(), MethodNameResolver.class, true, true);
((MultiActionController)handler).setMethodNameResolver(methodNameResolver);
} catch (BeansException be) {
// ignore
}
break;
}
}
// use the default handler if it is specified
if(handler == null && defaultHandler != null) {
handler = defaultHandler;
}
// if find one, put it to the cache
if(handler != null) {
handlerCache.put(urlPath, handler);
}
return handler;
}
/* (non-Javadoc)
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
*/
public void afterPropertiesSet() throws Exception {
Assert.notNull(packages, "Packages can not be null.");
if(systemCacheManager == null) {
systemCacheManager = (SystemCacheManager)BeanFactoryUtils.beanOfTypeIncludingAncestors(getApplicationContext(), SystemCacheManager.class);
}
}
}
/**
*
*/
package cn.edu.ccnu.inc.webtemplate.util;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.util.ReflectionUtils.FieldFilter;
/**
*
* @author <a href="mailto:huangfengjing@gmail.com">Ivan</a>
* @created 2005-11-1 上午12:40:04
*/
public abstract class ClassUtils extends org.springframework.util.ClassUtils {
/**
* Normalize the control/userManage.html/.htm/.jsp/.vm... name to the standard
* class name like control.UserManage
* @param urlPath
* @return
*/
public static String convertUrlPathToClassName(String urlPath, boolean hasSuffix) {
if(urlPath.startsWith("/")) {
urlPath = urlPath.substring(1);
}
urlPath = urlPath.replaceAll("/", ".");
int index = urlPath.length();
if(hasSuffix) {
// get rid of resource suffix such as .html/.htm/.jsp/.vm and so no
index = urlPath.lastIndexOf(".");
if(index < 0) {
return "";
}
}
String handlerName = urlPath.substring(0, index);
index = handlerName.lastIndexOf(".");
StringBuffer sb = new StringBuffer(handlerName);
if(index < handlerName.length() && Character.isLowerCase(handlerName.charAt(index + 1))) {
sb.setCharAt(index + 1, Character.toUpperCase(handlerName.charAt(index + 1)));
}
return sb.toString();
}
/**
* Load a module class from application context, if not found, then use reflection to initiate one
* and inject all it's properties which is not set yet and the value has been configured in context.
* @param fullname
* @param context
* @return
*/
public static Object loadModelWithApplicationContextFirst(String fullname, ApplicationContext context, FieldFilter filter) {
Object model = null;
String shortName = ClassUtils.getShortName(fullname);
StringBuffer sb = new StringBuffer(shortName);
sb.setCharAt(0, Character.toLowerCase(shortName.charAt(0)));
try {
model = context.getBean(sb.toString());
} catch (BeansException be) {
// ignore
}
if(model != null) {
return model;
}
try {
model = ClassUtils.forName(fullname).newInstance();
injectDependencies(model, context, filter);
} catch (ClassNotFoundException e) {
// ignore, continue
} catch (InstantiationException e) {
// ignore, continue
} catch (IllegalAccessException e) {
// ignore, continue
}
return model;
}
/**
* Initialize all the properties which has Setter, the value comes from Spring ApplictionContext
* By default, the static/final/volatile/native field will no be injected.
* @param bean
*/
public static void injectDependencies(Object bean, ApplicationContext context, FieldFilter filter) {
Method[] methods = ReflectionUtils.getAllDeclaredMethods(bean.getClass());
Field[] fields = ReflectionUtils.getAllFields(bean.getClass());
for(Field field : fields) {
if(filter == null) {
filter = new FieldFilter() {
public boolean matches(Field field) {
int modifier = field.getModifiers();
if(Modifier.isStatic(modifier) || Modifier.isFinal(modifier)
|| Modifier.isVolatile(modifier) || Modifier.isNative(modifier)) {
return false;
}
return true;
}
};
}
if(!filter.matches(field)) {
continue;
}
ReflectionUtils.makeAccessible(field);
try {
if(field.get(bean) != null) {
continue;
}
} catch (Exception e) {
continue;
}
// make sure it has a Setter or we will skip this field
StringBuffer startdMethodName = new StringBuffer(field.getName());
startdMethodName.setCharAt(0, Character.toUpperCase(field.getName().charAt(0)));
startdMethodName.insert(0, "set");
for(Method method : methods) {
if((startdMethodName.toString()).equals(method.getName())) {
try {
ReflectionUtils.invokeMethod(method, bean, new Object[] {context.getBean(field.getName())});
break;
} catch (BeansException be) {
// ignore
}
}
}
}
}
}
发表评论
-
关于OpenSessionInViewFilter
2008-03-04 16:05 1510用了OpenSessionInViewFilter之后,程序开 ... -
Spring 事务简化配置
2008-03-02 19:44 1224在 spring 中, 事务管理一般是通过声明一个 txPro ... -
详解spring2.0的scope
2008-02-25 19:14 9561如何使用spring的作用域: <bean id=& ... -
扩展Spring——外部属性文件安全(三)
2008-02-17 16:13 1990要完成属性文件的加密工作,首先,必须获取一个密钥文件, ... -
扩展Spring——外部属性文件安全(二)
2008-02-17 16:11 2430编写支持加密属性文件的实现类 通过以上分析,我们设计 ... -
扩展Spring——外部属性文件安全(一)
2008-02-17 16:02 4186前言 在Spring的开发中, ... -
Spring 中与 Aware相关的接口
2008-02-17 15:49 3889Spring中提供一些Aware相关接口,像是BeanFact ... -
用 Spring 发送邮件的注意事项
2008-01-23 19:32 2820使用Spring 的封装的MailSender,确实省事多了! ... -
利用Spring简单使用quartz实现定时作业
2008-01-18 00:47 1548定时批处理作业是J2EE企业应用里很重要的一环,用来在晚间进行 ... -
利用Spring按调度计划调用方法
2008-01-18 00:39 1969为了调度报表邮件,你不得不编写EmailReportJob B ... -
在Spring中使用Quartz调度器
2008-01-18 00:32 9221Quartz调度器为调度工作提供了更丰富的支持。和Java定时 ... -
在Spring中使用 Java Timer 调度任务
2008-01-18 00:10 5754从Java 1.3开始,Java SDK就通过java.uti ... -
Send mail with spring mail support and velocity
2008-01-16 23:42 2121One of the requirements on my c ... -
Spring 中关于文件上传与 MultipartResolver
2008-01-16 14:16 12874在 Spring 中, MultipartResolver 主 ... -
spring mvc的异常处理
2008-01-16 14:06 5192在 Spring 中,框架自动集成了异常处理,其主要核心是由 ... -
Spring2.0 声明式事务配置
2008-01-11 16:14 2786<!-- 声明一个事务管理器 --> <b ...
相关推荐
Spring MVC 是一款基于 Java 的 Web 应用框架,它遵循 MVC(Model-View-Controller)设计模式。Spring MVC 提供了一种结构化的开发方式,旨在简化 Web 层的开发过程,同时提供了高度灵活性和扩展性。 #### Spring ...
SSM框架是Java Web开发中常用的一种组合,由Spring MVC、Spring和Mybatis三个组件构成,用于构建高效、灵活的Web应用。这个基于SSM的客户关系管理系统(CRM)毕业设计,利用了Maven进行项目构建,确保了依赖管理的便捷...
开发者可以在此基础上添加业务逻辑,扩展功能,或者结合其他Spring模块创建更复杂的应用。同时,由于这是一个纯净项目,没有预设特定的业务逻辑,因此非常适合初学者学习和实践Spring MVC、Spring和Maven的集成使用...
Spring MVC 是一种基于 Java 的实现了 MVC 设计模式的请求驱动类型的轻量级 Web 框架,它是 Spring Framework 的一部分。Spring MVC 通过分离模型、视图和控制器组件来简化 Web 开发。Spring MVC 4.2.4.RELEASE 是 ...
4. 开源和社区支持:Spring MVC是开源项目,拥有庞大的社区支持和丰富的资源,便于开发者进行扩展和自定义。 5. 松耦合:与Spring依赖注入框架的集成使得控制器和业务逻辑的组件之间解耦,便于测试和维护。 6. ...
根据 Spring MVC 的约定,我们需要创建以下目录: - `src/main/java`: 存放源代码 - `src/main/resources`: 存放配置文件 - `src/main/webapp`: 存放Web应用资源,如静态文件、Web-INF等 **步骤四:编写配置** 1....
Spring MVC则是Spring框架的一部分,专门用于构建Web应用程序的前端控制器。当我们需要将这三个框架整合在一起时,可以实现一个高效、灵活且易于维护的系统。下面将详细阐述Spring、MyBatis和Spring MVC整合的关键...
Spring MVC 是一款强大的Java Web开发框架,它为构建基于模型-视图-控制器(MVC)架构的Web应用提供了灵活且可扩展的解决方案。本项目是一个简单的在线考试系统,充分利用了Spring MVC 的特性来实现管理、出题、考试...
Spring MVC 是一个强大的Java web开发框架,用于构建可维护、可扩展且高度模块化的Web应用程序。在处理复杂的表单提交时,Spring MVC 提供了多种解决方案。本文将深入探讨Spring MVC3在处理复杂表单场景下的最佳实践...
Spring MVC与JPA的集成,不仅简化了数据访问层的开发工作,还提高了应用的可扩展性和可维护性。通过以上示例和步骤,开发者可以快速掌握Spring与JPA的集成技术,从而在实际项目中高效地构建出稳定、健壮的Java应用...
Spring MVC 是一个基于 Java 的模型-视图-控制器(MVC)架构,是 Spring 框架的一部分,用于构建Web应用程序。它提供了丰富的功能和松散耦合的组件,使得开发人员可以高效地创建、测试和维护Web应用。 ### 1. 模型...
MVC模式将应用分为三个核心组件:模型(Model)、视图(View)和控制器(Controller),以此来降低各个组件之间的耦合度,提高系统的可扩展性和可维护性。下面我们将详细解析SpringMVC的请求处理过程,工程配置文件...
Spring MVC 是一个基于Java的轻量级Web应用框架,它为构建Web应用程序提供了一种模型-视图-控制器(MVC)架构。Spring3 MVC 是该框架的一个特定版本,这里我们将探讨其核心类与接口以及核心流程。 1. **...
该餐饮管理系统基于一系列先进的Java技术构建,包括Spring MVC、Hibernate、Spring、Bootstrap、Maven以及MySQL数据库。这些技术栈的组合为系统提供了高效、稳定且易于维护的基础。 首先,Spring MVC是Spring框架的...
这是一个基于Java技术栈的运动会管理系统源码,使用了Spring、Spring MVC、MyBatis、Bootstrap、jQuery和MySQL数据库。下面将详细介绍这套系统的核心技术和组成部分。 首先,Spring框架是整个系统的基石,它提供了...
而对于追求高度灵活性和扩展性的复杂项目而言,Spring MVC则更能满足需求。无论是哪种框架,了解其背后的MVC设计模式都是非常重要的,这有助于开发者更好地利用这些工具来提高开发效率和软件质量。
**Spring Web MVC** 是一种轻量级的、基于MVC(Model-View-Controller)设计模式的Web应用框架,是Spring框架的重要组成部分之一。它为开发者提供了构建可维护性高、易于扩展的Web应用程序的强大工具。 ##### ...
它基于"约定优于配置"的原则,通过提供开箱即用的功能,让开发者能够快速地创建独立运行的、生产级别的基于Spring的应用。 **构建RESTful服务** REST(Representational State Transfer)是一种网络应用程序的设计...
Spring MVC的Controller是基于DispatcherServlet,它更加强调依赖注入和面向接口的设计,使得业务逻辑更加解耦。Model部分可以通过Spring的Bean管理,视图部分可以使用任何模板引擎,如JSP、FreeMarker或Thymeleaf。...