通过HttpServletRequest找到处理请求的Controller类和方法

从其他类中通过 request获取处理请求的Controller类和方法,进而通过反射处理一些事情

具体代码如下:

//通过ApplicationContext上下文(spring)找到RequestMappingHandlerMapping这个bean
RequestMappingHandlerMapping handlerMapping = ApplicationContextUtil.getBean(RequestMappingHandlerMapping.class);
//RequestMappingHandlerMapping是对应url和处理类方法的一个类
HandlerExecutionChain handlerChain = handlerMapping.getHandler(request);
//通过处理链找到对应的HandlerMethod类
HandlerMethod handler = (HandlerMethod) handlerChain.getHandler();
//HandlerMethod中有bean和method
Object bean = handler.getBean();//处理请求的类
Method method = handler.getMethod();//处理请求的方法

 ApplicationContextUtil工具类,用于获取应用上下文

package *;

import *;

@Component
public class ApplicationContextUtil implements ApplicationContextAware{

    private static ApplicationContext applicationContext;

    /**
     * 实现ApplicationContextAware接口的回调方法,设置上下文环境
     *
     * @param applicationContext spring上下文对象
     * @throws BeansException 抛出spring异常
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ApplicationContextUtil.applicationContext = applicationContext;
    }

    /**
     * @return ApplicationContext
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 获取对象
     *
     * @param name spring配置文件中配置的bean名或注解的名称
     * @return 一个以所给名字注册的bean的实例
     * @throws BeansException 抛出spring异常
     */
    @SuppressWarnings("unchecked")
    public static <T> T getBean(String name) throws BeansException {
        return (T) applicationContext.getBean(name);
    }

    /**
     * 获取类型为requiredType的对象
     *
     * @param clazz 需要获取的bean的类型
     * @return 该类型的一个在ioc容器中的bean
     * @throws BeansException 抛出spring异常
     */
    public static <T> T getBean(Class<T> clazz) throws BeansException {
        return applicationContext.getBean(clazz);
    }

    /**
     * 如果ioc容器中包含一个与所给名称匹配的bean定义,则返回true否则返回false
     *
     * @param name ioc容器中注册的bean名称
     * @return 存在返回true否则返回false
     */
    public static boolean containsBean(String name) {
        return applicationContext.containsBean(name);
    }
}

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于Spring的HttpInvoker实现改写服务器端调用:    HttpInvoker.invoker 方法,设置InvokerProcess处理客户端调用:    ProxyFactory.proxy 方法,生成接口的代理对象,直接调用方法客户端和服务器端的接口和实体要一致,实体必须是可以序列化的比如:定义Bean:   public class DemoBean implements java.io.Serializable{         /**          *           */         private static final long serialVersionUID = -5401380996187961689L;         private String name;         private String passWork;         //省略get,set     }定义接口:  public interface DemoService {         public DemoBean  doTest(DemoBean bean);     }客户端调用:  import com.egova.rpc.proxy.ProxyFactory;     public class ClientDemo {         public static void main(String[] args) {             String bindUrl = "服务器端请求地址/egova_invoker/invoker";             DemoService demoService = ProxyFactory.proxy(DemoService.class, bindUrl);             DemoBean  demo = new DemoBean();             DemoBean  value = demoService.doTest(demo);             System.out.println(value);         }     }服务端处理: import javax.servlet.http.HttpServletRequest;     import javax.servlet.http.HttpServletResponse;     import org.springframework.stereotype.Controller;     import org.springframework.web.bind.annotation.RequestMapping;     import com.egova.rpc.remote.HttpInvoker;     import com.egova.rpc.remote.InvokerProcess;     import com.egova.rpc.support.RemoteInvocation;     @Controller     @RequestMapping(value="/egova_invoker")     public class ServerDemo{         @RequestMapping(value="invoker")         public void invoker(HttpServletRequest requestHttpServletResponse  response) {             HttpInvoker.invoker(request, response, new InvokerProcess(){                 public Object process(RemoteInvocation invocation){                     //获取targetObject,即接口invocation.getInterfaceClazz()实现                     Object targetObject = new Object();                     invocation.invoke(targetObject);                 }             });         }     } 标签:egova
【资源说明】 1、该资源内项目代码都是经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能。 1.1 登陆模块: * 数据库中查询用户,所以存储用户用session.setAttribute。验证用户用session.getAttribute。 * 一般进行加密存储,方式是用token(用户令牌)进行用户状态保持和验证. * 登录验证流程: ![a525034e1b26357865938eb8e1356c1](https://user-images.githubusercontent.com/52690597/155254453-c1ab8d56-a9fc-4242-97cd-e97a77670947.jpg) * 建数据库表:id,用户名,md5密码,token,是否删除,添加时间 * Dao:在配置文件中的User mapper中配置具体方法实现,原始dao层只有接口. * 方法:通过查询用户名,密码和token值返回用户对象. * 业务层(service):作为User对象获取dao层数据,判断是否需要更新token,然后返回user对象. * 控制层(controller):用StringUtils工具判断输入的用户名和密码是否为空,再调用业务层返回user对象,最后再返回result。 * Result单独说:返回的结果不止包含数据,还有message告诉成功还是失败,一个code200,404来告诉具体状态,用一个const存不同状态对应的code值,用resultgenerator来按照controller的逻辑修改result的参数(通过setter), 最后result的值和信息通过@RequestMapping指定的路径在访问这个路径时调用login方法然后显示结果. * 登录状态保持:后端实现token值是否有效,因为大部分接口都需要验证登陆,所以进行方法抽取,用aop注解切面来返回用户信息(需要自定义注解:1.@interface + 注解名,2. 元注解:修饰注解的注解,@Target:注解用在哪种java元素上, @Retention:注解的生命周期,@Documented),再用自定义方法参数解析器HandlerMethodArgumentResolver取出request header中的user,调用service层方法比较token,返回user对象。 最后在spring-mvc配置文件中配置参数解析器,直接在controller中需要用这个注解的方法or参数上添加注解就可以自动验证token。 1.2 分页功能 * 后端按照前端的需求将分页所需数据查询出来。后端只需要提供总页数,必不可少的两个参数1 需要的页码 2 每页条数 * 数据交互流程: 1. 前端将页码和条数两个参数通过 HTTP 请求传输给后端; 2. 后端获取到这两个参数后进行参数验证,查询后将当前页的所有数据实体和数据总量封装; 3. 后端将封装数据返回给前端; 4. 前端获取到数据和数据量后分别对当前页数据进行渲染和展示,同时完成分页信息区的计算和展示。 之后定义后端数据的响应格式,在Result里,然后定义分页结果集的数据格式。 * DAO层:实现分页功能都需要在对应实体的DAO Mapper的xml文件中添加查询总数目和查询列表的sql语句(其中要包含分页的两个参数:start页数和limit每页条数)。 * Controller层:获得前端的param,验证页数和条数是否为空,最后调用业务层将PageUtil(页数,用于获取前端发送过来的map数据中的页数和条数)对象传递过去。 * Service层:调用DAO层两个方法,返回PageResult也就是结果集,其实最后进入了result和code与message一起到前端。 2.1 图片管理模块:主要使用mvc的multipartResolver工具实现文件上传。如果接受到了文件上传请求,dispatcher调用resolveMultipart方法装饰请求HttpServletRequest并返回multiHttpServletRequest型(包含文件对象)。 具体流程: 1. 首先判断请求对象request,然后对请求头的contentType进行判断。 2. 当请求不为空&&contentType不为空&&contentType值以multipart开头,

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值