`

spring控制扩展

阅读更多

/**
*在spring中onSubmit作为普通的提交方法,这样一个控制器的onSubmit只能处理一个请求,
*当我们想只用一个控制器来处理所有简单的表单操作,而在不同的业务对象里进行操作时,应用反射可以做到。
*在前端页面上设置一个隐藏域绑定在command里,在控制器里对注入的业务对象进反射,从command取得相应的标志,
*如果反射出来的方法名与传入的标志相等,就执行此业务操作,如果出现重载的方法,将通过参数的个数和类型来区别。
*/
protected ModelAndView onSubmit(HttpServletRequest request,HttpServletResponse response, Object command, BindException error)throws Exception {
String returnURL = getSuccessView() + ".admin"; // return URL by default

boolean invoked = false; // set true when method has invoked

//反射业务层的方法
ArrayList doo = getDo(objectBA);

// all commandMethods
Method[] commandMethods = command.getClass().getMethods();

try {
Method[] allMethod = objectBA.getClass().getMethods();
for (int i = 0; i < allMethod.length; i++) {

//如果找到有validator这样的方法,就会执行它
if (allMethod[i].getName().equals("validator")) {
if (allMethod[i].getParameterTypes().length == 2) {
allMethod[i].invoke(objectBA, new Object[] { command,
error });
if (error.hasErrors())
return showForm(request, response, error);
break;
}
}
}

Method submit = getSubmit(command);
if (submit != null) {
// invoke getSubmitXxx() method. If user press a button
// submitValue is not null and it length > 0

//取得前端设置的标志,标志表示要执行的业务方法,这个标志就绑定在command里。
String submitValue = (String) submit.invoke(command, new Object[]{});
if (submitValue != null && submitValue.length() != 0) {
Iterator doIter = doo.iterator(); // do methods iterator
String urlAddress = request.getParameter(addressPrefix
+ submitValue);
//循环业务对象的方法
while (!invoked && doIter.hasNext()) { // looking for the
// same do method
Method doMethod = (Method) doIter.next();
//将业务对象的方法与传入的标志(submitValue)进行对比,如果相等,就执行此业务方法
if (isDo(doMethod).equals(toFirstCharToLowerCase(submitValue))) {
//再根据业务对象的方法的参数个数进行反射调用
if (doMethod.getParameterTypes().length == 1) {
doMethod.invoke(objectBA,
new Object[] { command });
invoked = true;
} else if (doMethod.getParameterTypes().length == 2) {
doMethod.invoke(objectBA, new Object[] {
request, command });
invoked = true;
} else if (doMethod.getParameterTypes().length == 3) {
doMethod.invoke(objectBA, new Object[] {
request, command, error });
if (error.hasErrors())
return showForm(request, response, error);
invoked = true;
} else if (doMethod.getParameterTypes().length == 4) {
doMethod.invoke(objectBA, new Object[] {
request, response, command, error });
if (error.hasErrors())
return showForm(request, response, error);
invoked = true;
}
}
}

// check if this button have special URL address?
if (urlAddress != null)
returnURL = urlAddress;
}
}

if (!invoked) {
for (int i = 0; i < allMethod.length; i++)
if (allMethod[i].getName().equals("onSubmit")) {
if (allMethod[i].getParameterTypes().length == 1) {
allMethod[i].invoke(objectBA,
new Object[] { command });
invoked = true;
break;
} else if (allMethod[i].getParameterTypes().length == 2) {
allMethod[i].invoke(objectBA, new Object[] {
request, command });
invoked = true;
break;
}
}
}

Method redirect = getRedirect(command);
if (redirect != null) {
String redirectValue = (String) redirect.invoke(command, new Object[]{});
if (redirectValue != null && redirectValue.length() != 0)
returnURL = redirectValue;
}

// try to locate method getUrlParams() into command class
for (int i = 0; returnURL != null && i < commandMethods.length; i++) {
Method method = commandMethods[i];
if (method.getName().equals(urlParamsName)
&& method.getParameterTypes().length == 0
&& method.getReturnType().getName().equals(
String.class.getName())) {
// if method is exist in command - invoke it and store
// result
String addParams = (String) method.invoke(command,
new Object[] {});

// if additional CGI-parameters exist add it to URL
if (addParams != null && addParams.length() != 0) {
// append additional parameters to URL
if (returnURL.indexOf("?") == -1)
returnURL += "?" + addParams;
else
returnURL += "&" + addParams;
}

break;

}
}
} catch (IllegalAccessException e) {
throw new ControllerException(e);
} catch (ExceptionInInitializerError e) {
throw new ControllerException(e);
} catch (InvocationTargetException e) {
if (e.getTargetException() instanceof MessageException) {
MessageException me = (MessageException) e.getTargetException();
try {
String message = getMessageSourceAccessor().getMessage(
me.getMessageId(), me.getParams());
me.setMessage(message);

throw me;
} catch (NoSuchMessageException ne) {
// if message was not found in property file
// throw controller exception
throw new ControllerException(ne);
}
} else {
throw (Exception) e.getTargetException();
}
}

if (returnURL == null || returnURL.startsWith("return_to_request_page")) {
return showForm(request, response, error);
}
return new ModelAndView(new RedirectView(returnURL));
}

分享到:
评论

相关推荐

    史上最全spring以及扩展功能jar

    4. **Spring MVC**:模型-视图-控制器架构,是Spring处理Web请求的主要方式,使得后端服务与前端视图解耦。 5. **Spring JDBC**和**Spring ORM**:提供了数据库访问的抽象层,支持JDBC操作以及各种ORM框架,如...

    4.Spring应用扩展.pptx

    总结来说,Spring应用扩展主要包括灵活的配置管理、Bean的作用域控制以及自动装配机制,这些都是提高Spring应用可扩展性和可维护性的关键要素。通过掌握这些技术,开发者能够更好地构建和管理复杂的企业级应用。

    Spring3.0.5扩展支持AOP获取HttpServletResponse

    总结来说,Spring 3.0.5通过AOP提供对`HttpServletResponse`的扩展支持,允许开发者在不侵入业务逻辑的情况下,灵活地控制HTTP响应。这种能力对于实现诸如日志记录、性能监控、异常处理、安全性控制等跨切面的功能...

    对spring做java注解扩展

    本文将深入探讨如何在Spring框架中利用Java注解进行扩展,以提升代码的可读性和可维护性。 首先,我们需要了解Java注解(Annotation)。注解是Java语言的一种元数据,它提供了在编译时或运行时对代码进行信息附加的...

    Spring控制反转(IoC)的理解

    **Spring控制反转(IoC)理解** Spring框架的核心特性之一是控制反转(Inversion of Control,简称IoC),也常被称为依赖注入(Dependency Injection,简称DI)。IoC是一种设计模式,它将对象的创建和管理从应用代码...

    spring扩展点测试示例代码

    6. **AspectJ集成**: Spring支持与AspectJ的深度集成,可以使用AspectJ的语法来定义更复杂的切面,包括类型级别的匹配和更精细的控制流分析。 在提供的压缩包`src`中,很可能包含了实现上述一种或多种扩展点的示例...

    spring-扩展点-namespacehandler(Spring自定义标签)

    在Spring框架中,扩展点是允许用户自定义行为的关键组件,而`NamespaceHandler`就是其中的一个重要扩展点,主要用于处理自定义的XML命名空间。当我们需要在Spring配置文件中引入自定义标签时,`NamespaceHandler`起...

    Spring Security 权限控制中文API

    9. **集成其他技术**:Spring Security可以轻松与Spring MVC、Spring Boot、Hibernate等其他技术集成,提供了丰富的扩展点,使得定制和扩展变得容易。 10. **Web安全配置**:Spring Security 提供了`...

    Spring Cache扩展功能实现过程解析

    Spring 4.3 提供了一个 sync 参数,可以避免多个请求打到数据库,系统做了一个并发控制优化,同時只有一个线程会去数据库取数据其它线程会被阻塞。 3. 扩展 RedisCacheManager 可以通过继承 RedisCacheManager,...

    基于Java的guerlab-spring设计源码,全面整合Spring扩展工具集

    工具集全面整合了Spring框架的扩展功能,包括云项目常用依赖、通用工具包、自动配置、通用Mapper与分页支持、MyBatis自动配置与类型转换、数据库如MySQL和Redis的自动配置、参数搜索支持、Swagger文档、基于Redis的...

    声明式事务控制spring+hibernate集成

    在"声明式事务控制,spring2.5+hibernate3集成源码"中,开发者可以学习如何配置Spring的事务管理器,以及如何在Hibernate的SessionFactory和SessionFactoryBuilder上使用Spring的TransactionProxyFactoryBean来创建...

    一个简单的spring-jdbctemplate扩展

    1. **事务管理**:扩展可能集成了Spring的事务管理,允许开发者在多个数据库操作之间进行事务控制,确保数据的一致性。 2. **SQL构造工具**:提供了更友好的API来动态构建SQL语句,避免SQL注入问题,并支持参数化...

    spring攻略 第2版

    另外,Spring Cloud扩展了Spring Boot的功能,提供了服务发现、负载均衡、配置中心等一系列微服务相关的工具,为构建大规模分布式系统提供了便利。 Spring框架还包含对消息处理的支持,如Spring AMQP,它提供了对...

    java spring AOP权限控制

    Java Spring AOP 权限控制 Java Spring AOP 权限控制是指在 Java Spring 框架下使用 Aspect-Oriented Programming(面向方面编程)技术来实现权限控制。权限控制是指对用户的访问权限进行控制和管理,以确保系统的...

    Spring5.pdf

    Spring Boot是Spring框架的一个重要扩展,它提供了一种快速配置的方式来简化新Spring应用的初始搭建以及开发过程。它包含了一系列默认配置来帮助开发者快速开始项目,并且支持自动配置特性,能够自动配置Spring应用...

    Spring技术内幕:深入解析Spring架构与设计原理.pdf

    Spring的目标是提供一个简洁、灵活、可扩展的框架,以帮助开发者快速构建企业级应用程序。 Spring架构 Spring架构主要由以下几个组件组成: 1. Core Container:提供基本的Bean管理和依赖注入功能。 2. AOP:...

    struts2+spring+velocity扩展实例V1版本

    在这个"struts2+spring+velocity扩展实例V1版本"中,我们可以看到这三个框架的集成与应用。 首先,Struts2是一个基于MVC(Model-View-Controller)设计模式的Java Web框架,它的主要职责是处理用户的请求,并将其...

    Spring Cloud Gateway 整合 Spring Security 统一登录认证鉴权

    它是一个灵活且可扩展的安全框架,支持多种认证和授权机制。在微服务架构中,Spring Security 可以帮助我们保护每个微服务的入口点,确保只有经过验证的用户才能访问受保护的资源。 整合Spring Security到Spring ...

    SpringCloud中文文档

    Spring Cloud 是一个用于快速构建分布式系统的工具集,提供了配置管理、服务发现、断路器、智能路由、微代理、控制总线等多种功能。这些功能可以帮助开发人员快速地支持实现分布式系统中的常见模式,例如服务注册和...

    spring6pdf详细讲解

    Spring 框架的核心是控制反转(IoC)和依赖注入(DI)模式,它们使得应用程序更加灵活、可维护和可扩展。 在 Spring 中, Bean 是应用程序的核心组件,它们可以是任何 Java 对象。 Spring 提供了多种方式来实例化...

Global site tag (gtag.js) - Google Analytics