`
leeqq
  • 浏览: 138565 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

通过annotation获取request中的attribute

阅读更多

在spring web工程中的controller可以通过@RequestParam获取request中的参数,也可以通过@PathVariable获取请求url中的参数。但是如果想要从request中获取attribute却是没有现在的注解(也许是没有找到吧),那只有自己对手,丰衣足食了。

 

注解定义

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestAttribute {

    String value() default "";
    boolean required() default true;
}

 

注解处理定义

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;

import org.springframework.core.MethodParameter;
import org.springframework.web.bind.ServletRequestBindingException;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver;

import path to RequestAttribute;


public class RequestAttributeMethodArgumentResolver extends AbstractNamedValueMethodArgumentResolver {


    public RequestAttributeMethodArgumentResolver() {
        super(null);
    }

    @Override
    protected NamedValueInfo createNamedValueInfo(MethodParameter parameter) {
        RequestAttribute annotation = parameter.getParameterAnnotation(RequestAttribute.class);
        return new RequestAttributeNamedValueInfo(annotation);
    }

    @Override
    protected Object resolveName(String name, MethodParameter parameter, NativeWebRequest request) throws Exception {
        HttpServletRequest httpServletRequest = request.getNativeRequest(HttpServletRequest.class);
        Object attribute = httpServletRequest.getAttribute(name);
        return attribute;
    }


    @Override
    protected void handleMissingValue(String name, MethodParameter parameter) throws ServletException {
        String paramType = parameter.getParameterType().getSimpleName();
        String methodName = parameter.getMethod().getName();
        throw new ServletRequestBindingException(String.format("call %s, Missing request attribute: %s for method parameter type[%s]", methodName, name, paramType));
    }

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(RequestAttribute.class);
    }

    private class RequestAttributeNamedValueInfo extends NamedValueInfo {
        private RequestAttributeNamedValueInfo() {
            super("", false, null);
        }

        public RequestAttributeNamedValueInfo(RequestAttribute annotation) {
            super(annotation.value(), annotation.required(), null);
        }
    }

}

 

接下来就要在spring的配置文件中添加配置了

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="customArgumentResolvers">
        <list>
            <bean class="path to RequestAttributeMethodArgumentResolver" />
        </list>
    </property>
</bean>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>

 

不同的工程配置方式可能有点不一样,但是大同小异都差不多

 

 

分享到:
评论

相关推荐

    annotation-springMVC.rar_springmvc_springmvc API chm

    《SpringMVC注解详解与应用》 SpringMVC作为Java Web开发中广泛使用的轻量级框架,极大地简化了Web应用程序的构建...通过阅读"springMVC详解以及注解说明.doc",你可以获得更深入的理解和实例,进一步提升自己的技能。

    JAVA_API1.6文档(中文)

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java....

    SpringMVC实现controller中获取session的实例代码

    例如,假设我们有一个用户对象存储在Session中,可以通过以下方式访问: ```java @RestController public class UserController { @GetMapping("/user") public User getUser(@SessionScope("user") User user) ...

    spring spEL 表达式详解

    - 还可以访问`@Request`, `@Session`, `@Attribute`等上下文变量。 7. **AOP中的应用** - 在切点表达式中使用SpEL,如:`@Before("@annotation(expression='#{T(com.example.MyAnnotation).value()}'")` - 在...

    Java 1.6 API 中文 New

    org.omg.CORBA 提供 OMG CORBA API 到 JavaTM 编程语言的映射,包括 ORB 类,如果已实现该类,则程序员可以使用此类作为全功能对象请求代理(Object Request Broker,ORB)。 org.omg.CORBA_2_3 CORBA_2_3 包定义对 ...

    SSM笔记-SpringMVC基本使用

    - `@PathVariable`:从URL路径中获取参数值。 - `@RequestParam`:从请求参数中获取值。 - `@ModelAttribute`:用于绑定表单数据到模型对象。 - `@ResponseBody`:将方法返回的对象直接写入HTTP响应体,通常用于返回...

    JavaAPI1.6中文chm文档 part1

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java....

    JavaAPI中文chm文档 part2

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java....

    [Java参考文档].JDK_API 1.6

    org.omg.CORBA 提供 OMG CORBA API 到 JavaTM 编程语言的映射,包括 ORB 类,如果已实现该类,则程序员可以使用此类作为全功能对象请求代理(Object Request Broker,ORB)。 org.omg.CORBA_2_3 CORBA_2_3 包定义对 ...

    java api最新7.0

    org.omg.CORBA 提供 OMG CORBA API 到 JavaTM 编程语言的映射,包括 ORB 类,如果已实现该类,则程序员可以使用此类作为全功能对象请求代理(Object Request Broker,ORB)。 org.omg.CORBA_2_3 CORBA_2_3 包定义对 ...

    JDK_1_6 API

    org.omg.CORBA 提供 OMG CORBA API 到 JavaTM 编程语言的映射,包括 ORB 类,如果已实现该类,则程序员可以使用此类作为全功能对象请求代理(Object Request Broker,ORB)。 org.omg.CORBA_2_3 CORBA_2_3 包定义对...

    SpringBoot整合freemarker的讲解

    spring.freemarker.request-context-attribute=request spring.freemarker.suffix=.ftl ``` 在resources文件夹下新建templates文件夹,并在其中新建index.ftl文件: ```html &lt;!DOCTYPE html&gt; &lt;title&gt;&lt;/title&gt;...

    springframework.5.0.12.RELEASE

    Exporting a lazily initialized bean (which implements SelfNaming and is annotated with ManagedResource annotation) gives IllegalStateException [SPR-17592] #22124 MockHttpServletRequest changes Accept-...

    [Java参考文档]

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java....

    spring mvc step by step

    import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org....

Global site tag (gtag.js) - Google Analytics