文档章节

接受 Request 请求并获取请求参数

哈库纳
 哈库纳
发布于 2016/09/30 11:36
字数 1719
阅读 216
收藏 1
点赞 0
评论 0

    首先一个好的 API 一定是易于理解的,这样可以大大的减少开发者学习成本。Hasor 在设计上非常注重 API 的设计。功能的实现的优先级都没有 API 设计的优先级高,可见 Hasor 并不是简单的为了实现一个轮子而去设计,它是站在开发者角度来思考的。

    前面我们在《https://my.oschina.net/u/1166271/blog/753001》一文中看到了几种处理方式,那么这一次在详细的扒一扒使用 Hasor 接受 Request 请求的那些事。

- 使用Filter拦截请求

    Filter 是一种非常非常常见的接受请求方式,它有很多优点这里就不在仔细展开。一般我们要用到 Filter 就必须要在 web.xml 中注册它,或者标记 Servlet3.0 的注解进行注册。虽然可以实现 Filter 的注册。但是我们无法控制具体过程。如果 Filter 没有生效很难直接定位问题。

    这个时候如果能够非常明确的在代码中加一个断点让我知道跑过这一行代码之后 Filter 就会被注册进去,那么我会很欣慰。Hasor 可以提供你这样的帮助,下面看例子:

public class StartModule extends WebModule {
    public void loadModule(WebApiBinder apiBinder) throws Throwable {
        ...
        apiBinder.filter("/*").through(new EncodingFilter());
        // or
        apiBinder.filter("/*").through(EncodingFilter.class);
        ...
    }
}

    如果你有多个 Filter 要注册到 环境中还可以为它们指定顺序。

apiBinder.filter("/*").through(0,new EncodingFilter());
apiBinder.filter("/*").through(1,new JumpFilter());
// or
apiBinder.filter("/*").through(0,EncodingFilter.class);
apiBinder.filter("/*").through(1,new JumpFilter());

    如果你指定了顺序,就不需要太在意真实的插入顺序。因为 Hasor 会在初始化的时候自动为它们排序,如果你没有指定顺序,那么默认顺序都是0。

    而 Filter 就是一个普通的 Filter,例:

public class EncodingFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {
        ...
    }
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        final HttpServletRequest httpReq = (HttpServletRequest) request;
        final HttpServletResponse httpRes = (HttpServletResponse) response;
        httpReq.setCharacterEncoding("utf-8");
        httpRes.setCharacterEncoding("utf-8");
        chain.doFilter(request, response);
    }
    public void destroy() {
        ...
    }
}

 

- 使用Servlet接受请求

    下面再把传统的 Servlet 添加进来。怎么样是不是很简单呢?

public class StartModule extends WebModule {
    public void loadModule(WebApiBinder apiBinder) throws Throwable {
        ...
        apiBinder.serve("echo.data").with(MyServlet.class);
        // or 
        apiBinder.serve("echo.data").with(new MyServlet());
        ...
    }
}

    使用 Hasor 提供的这种做法,可以大大减少对 web.xml 的配置需求。甚至你都可以做一些判断然后决定具体装载哪个 Filter 或者 Servlet。这样一来你的程序完全由你自己做主,你完全掌控所有细节。

    即使出现问题,排查起来也非常方便。打打 log 就可以清楚的知道,在何时加载了什么东西。

 

- 使用 Controller 接受请求

    这个功能稍微高级一些,它会默认拦截 “*.html、*.htm、*.do、*.json” 这四类请求。我们先看一个最简单的 Controller。

@MappingTo("/index.htm")
public class Index {
    public void execute() {
        System.out.println("Hello Request");
    }
}

    在这个例子中我们使用 @MappingTo 注解告诉 Hasor,这个 Controller 负责接收来自“/index.htm”的请求。当我们访问这个页面的时候,控制台会打印出“Hello Request”。

    上面这个例子恐怕很难有什么实际使用场景,拿来最触发后台任务的入口还差不多。

    下面我们改造一下这个 Controller 让它可以接收来自 Request 的请求参数。

@MappingTo("/index.htm")
public class Index {
    public void execute(@ReqParam("name") String name) {
        System.out.println("Hello Request ,the name is " + name);
    }
}

    这次我们增加了一个参数并且给参数标记上注解,告诉 Hasor,把名称为 name 的请求参数传递进来。然后我们把它打印到控制台中。再次访问这个地址并传入参数:“/index.htm?name=zyc”。

    控制台上会打印出“Hello Request ,the name is zyc”。

    接下来让我们在看一看稍微酷炫一点传参技能,把参数作为 int 传递进来。

@MappingTo("/index.htm")
public class Index {
    public void execute(@ReqParam("name") String name, @ReqParam("age") int age) {
        System.out.println("Hello Request ,the name is " + name + ", age is " + age);
    }
}

    请求链接“/index.htm?name=sss&age=30”,控制台上可以看到“Hello Request ,the name is sss, age is 30”。

    下面再来一个更酷炫的传参数技能,把传入的参数自动转成 Date。

@MappingTo("/index.htm")
public class Index {
    static {
        DateConverter converter = new DateConverter();
        converter.setPattern("yyyy-mm-dd");
        ConverterUtils.register(converter, Date.class);
    }

    public void execute(@ReqParam("name") String name, @ReqParam("age") int age, @ReqParam("date") Date date) {
        System.out.println("Hello Request ,the name is " + name + ", age is " + age);
        System.out.println("date is " + date);
    }
}

    默认情况下 Hasor 是无法处理 String 到 Date 的转换。你会得到“DateConverter does not support default String to 'Date' conversion.”一个类型转换错误。有关这个错误的说明可以在这里看到:http://stackoverflow.com/questions/5757242/java-beanutilsbean-convert-date-to-string

    因此我们有必要在访问这个 Controller 之前把初始化工作做好,在上面例子中我把它写在静态代码块里以确保可以被先初始化。

    接下来我们访问URL:“http://localhost:8080/index.htm?name=sss&age=30&date=2016-09-22”,就会得到这个时间对象。

Hello Request ,the name is sss, age is 30
date is Fri Jan 22 00:09:00 CST 2016

    怎么样还算酷炫吧。

    通常一个请求有很多参数,如果像这样一个一个的排下去。实在是太不优雅了,可不可以把传入的参数都封装到一个Bean里,这样获取参数时候会很方便呢? 

    来,上例子,先做一个封装Bean

public class LoginForm {
    @ReqParam("email")
    private String email;
    @ReqParam("account")
    private String account;
    @ReqParam("password")
    private String password;
    @ReqParam("redirectURI")
    private String redirectURI;
    ...
}

    然后使用这个封装 Bean 来接收请求参数。

@MappingTo("/login.do")
public class Longin {
    public void execute(@Params LoginForm loginForm) {
        System.out.println("login data is " + JSON.toString(loginForm));
    }
}

    接着请求“login.do”并且代入各种参数,接下来在控制台上就会看到这些参数都乖乖的躺在那里了。

    请求地址:“/login.do?email=zyc@hasor.net&account=zyc&password=zycpwd”

 

- 传入参数数组

    如果遇到页面上的 checkbox 参数传入是不是犯难了,你可能会想:“还是给我 Request 把”。

    Hasor 对于这种要求早已想到了,来看下面这个例子:

@MappingTo("/arrayParams.htm")
public class ArrayParams {
    public void execute(@ReqParam("name") String[] nameArray) {
        System.out.println("Hello Request ,the name is " + JSON.toString(nameArray));
    }
}

    请求链接:“http://localhost:8080/arrayParams.htm?name=zyc&name=hahada”或者自己搞一个表单递交上来。

    你会看到控制台上打印出“Hello Request ,the name is ["zyc","hahada"]”  参数也乖乖的躺在这里了。

 

- 我还是觉得 Request 更舒服一点

    如果你觉得这一切还是不够,必须要拿到 Request!!那好吧,使用下面这样几种方式,你可以拿到心目中梦寐以求的 Request。

@MappingTo("/givemeRequest.do")
public class GiveMeRequest {
    public void execute(RenderData data) {
        data.getHttpRequest();
        data.getHttpResponse();
    }
    // or
    public void execute(HttpServletRequest request,HttpServletResponse response) {

    }
}

    或者使用继承类来拿到Request。

@MappingTo("/action.do")
public class Action extends WebController {
    public void execute() {
        this.getRequest();
        this.getResponse();
    }
}

    继承类可不是简简单单的给你提供 Request/Response。通过继承类的“getPara”你可以可以拿到请求参数。WebController 的用法和 JFinal 是一样的,它的原身就是来自 JFinal。

    怎么样亲切吧?

© 著作权归作者所有

共有 人打赏支持
哈库纳

哈库纳

粉丝 953
博文 81
码字总数 149803
作品 4
杭州
后端工程师
EL param与requestScope的区别

${param.name} 等价于 request.getParamter("name"),一般是从页面或者客户端获取的内容, ${requestScope.name} 等价于 request.getAttribute("name"),一般是从服务器段传过来的,可以传到客...

mr桀骜不驯 ⋅ 2013/03/13 ⋅ 0

我的python学习--第十三天

nginx + uwsgi + flask 一、安装 1、安装uwsgi [root@yaoliang day_13]# wget http://projects.unbit.it/downloads/uwsgi-2.0.4.tar.gz[root@yaoliang day_13]# tar xf uwsgi-2.0.4.tar.gz -......

yaoliang833 ⋅ 2016/10/24 ⋅ 0

nodejs-koa context上下文

Koa Context 将 node 的 和 对象封装在一个单独的对象里面,其为编写 web 应用和 API 提供了很多有用的方法。 这些操作在 HTTP 服务器开发中经常使用,因此其被添加在上下文这一层,而不是更...

问题达人 ⋅ 2016/03/02 ⋅ 0

python之HTTP处理模块urllib和urllib2

python2主要涉及两个模块来处理HTTP请求:urllib和urllib2 urllib模块: urllib.urlopen(url[,data[,proxies]]) 打开一个url的方法,返回一个文件对象,然后可以进行类似文件对象的操作 urlo...

zhpfxl ⋅ 2016/12/26 ⋅ 0

requests库的入门

requests库的入门 1.发送请求 导入Requests >>> import requests1 HTTP的请求类型: 1.GET:它本质就是发送一个请求来取得服务器上的某一资源。资源通过一组HTTP头和呈现数据(如HTML文本,或...

木木成洋 ⋅ 2017/11/04 ⋅ 0

使用 RESTful 的方式开发 Web应用

RESTful是火了很久的一种开发方式。这里有一篇文章对于 RESTful 的定义介绍的还比较详细:https://my.oschina.net/u/2369492/blog/656717。而本文就不再这里对于 RESTful 定义做过多介绍了。...

哈库纳 ⋅ 2016/10/02 ⋅ 0

参数(parameter)和属性(Attribute)的区别

在JAVA WEB开发中经常遇到获取请求参数的值和在request对象中set或者get属性,初学者往往容易混淆,那么二者之间关系到底如何呢?下面是个人的总结: 区别: 来源不同: 参数(parameter)是...

JackMo2015 ⋅ 2016/12/07 ⋅ 0

React开发中使用fetch进行异步请求

React开发中使用fetch进行异步请求 最新的Web API接口中提供了一个全局fetch方法,从而以一种更为简单、合理的方式来支持跨网络异步获取资源。 这种功能以前是使用 XMLHttpRequest实现的。F...

googlingman ⋅ 06/06 ⋅ 0

Python urllib urllib2

urlli2是对urllib的扩展。 相似与区别: 最常用的urllib.urlopen和urllib2.urlopen是类似的,但是参数有区别,例如超时和代理。 urllib接受url字符串来获取信息,而urllib2除了url字符串,也...

shawnplaying ⋅ 2016/12/22 ⋅ 0

phalapi-入门篇3(请求和返回)

先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架. 这一小节主要讲一下请求(参数验证),返回(怎么返回自己想要的结果),官方文档也有比较详细的说明所以在有些比较基...

喵了_个咪 ⋅ 2015/09/29 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Mahout推荐算法API详解

前言 用Mahout来构建推荐系统,是一件既简单又困难的事情。简单是因为Mahout完整地封装了“协同过滤”算法,并实现了并行化,提供非常简单的API接口;困难是因为我们不了解算法细节,很难去根...

xiaomin0322 ⋅ 17分钟前 ⋅ 0

WampServer默认web服务器根目录位置

安装WampServer之后的web服务器根目录默认位置在WampServer安装目录下的www:

临江仙卜算子 ⋅ 19分钟前 ⋅ 0

Redux的一些手法记录

Redux Redux的基本概念见另一篇文。 这里记录一下Redux在项目中的实际操作的手法。 actions 首先定义action.js,actions的type,可以另起一个action-type.js文件。 action-type.js用来存...

LinearLaw ⋅ 20分钟前 ⋅ 0

android 手势检测(左右滑动、上下滑动)

GestureDetector类可以让我们快速的处理手势事件,如点击,滑动等。 使用GestureDetector分三步: 1. 定义GestureDetector类 2. 初始化手势类,同时设置手势监听 3. 将touch事件交给gesture...

王先森oO ⋅ 34分钟前 ⋅ 0

java 方法的执行时间监控 设置超时(Future 接口)

java 方法的执行时间监控 设置超时(Future 接口) import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor......

青峰Jun19er ⋅ 38分钟前 ⋅ 0

一名开源小白的Apache成长自述

今天收到了来自Apache Vote我成为Serviceomb项目Committer的邮件,代表自己的贡献得到了充分的肯定;除了感谢团队的给力支持,我更希望将自己的成长经历——如何践行Apache Way的心得介绍给大...

微服务框架 ⋅ 41分钟前 ⋅ 0

vim介绍、颜色显示和移动光标、一般模式下复制、剪切和粘贴

1.vim 是 vi 的升级版 vim 是带有颜色显示的 mini安装的系统,一般都不带有vim [root@aminglinux-128 ~]# yum install -y vim-enhanced已加载插件:fastestmirror, langpacksLoading mir...

oschina130111 ⋅ 41分钟前 ⋅ 0

Deepin 操作系统四面楚歌

作为国内做的最好的 Linux 发行版,源自 Debian sid 的 Deepin 目前正面临重重困境,新版本不断延期,开发人员离职,bug 长期得不到修复,和 Debian/Ubuntu 的兼容性问题也面临越来越严重的挑...

六库科技 ⋅ 41分钟前 ⋅ 0

MyBatis之动态sql

我们需要知道的是,使用mybatis重点是对sql的灵活解析和处理。在原先的UserMappser.xml中,我们这样查询表中满足条件的记录 : 123 <select id="findUserList" parameterType="userQuery...

瑟青豆 ⋅ 42分钟前 ⋅ 0

这届俄罗斯世界杯的冷门那么多怎么办?

最纯粹的世界杯,最神奇的大冷门。 德国0比1被墨西哥摩擦了。 日本历史性的赢了哥伦比亚。 C罗也挑平了西班牙。 梅西被冰岛狮吼吼愣神了。 就连11次进世界杯4强的巴西也被瑞士逼平了。 天台已...

开源中国众包平台 ⋅ 42分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部