Play Framework分析1

Stella981
• 阅读 657

Play是标准的Request-Response型框架,类似于Struts。
Play把HTTP请求封装为4个类:Header,Cookie,Request,Response。

和Servlet类似的是,他也是通过处理Request和Response两个对象来完成一次访问的处理。
和Servlet不同的是,在Servlet中你想获得ServletRequest/ServletResponse,你必须通过HttpServlet set到你的Object中。
而Play不这样做,通过Threadlocal机制,可以在程序的任何地方通过调用静态方法
Request.current.get()方法获得当前线程正在处理的Request.
这就相当于你不需要写set方法,你就可以在任何地方都取到当前的Request.
这是非常巧妙的做法,能做到这一点也和服务器本身的处理机制有关。
如果我们只用一个线程来处理所有的请求,那么Play这样的做法就行不通了。

Play整合Servlet API是这样的:
他有一个类叫做ServletWapper,ServletWapper继承了HTTPServlet.当一次请求进来,它首先把HttpServletRequest的内容拷贝到当前的Request中,等Play框架处理完以后,再把Response的内容拷贝到HttpServletResponse中。
这样Play和Servlet API就整合到一起了,非常的简单

Play Framework分析1

可以发现,Play对Servlet API的入侵性很小,可以说它就是一个Servlet.
这只是一个Play的冰山一角,它的代码还有很多有趣的地方,可以用非主流来形容。
比如它使用抛异常的方式返回执行的结果等等,Play的代码阅读起来很简单,推荐有兴趣的朋友可以阅读。

这就是ServletWapper的service方法

Java代码   Play Framework分析1

  1. @Override
  2. protected void service(HttpServletRequest httpServletRequest, HttpServletResponse httpServletRespo
  3. nse) throws ServletException, IOException {
  4. Logger.trace("ServletWrapper>service " + httpServletRequest.getRequestURI());
  5. Request request = null;
  6. try {
  7. request = parseRequest(httpServletRequest);
  8. Logger.trace("ServletWrapper>service, request: " + request);
  9. Response response = new Response();
  10. Response.current.set(response);
  11. response.out = new ByteArrayOutputStream();
  12. boolean raw = false;
  13. for (PlayPlugin plugin : Play.plugins) {
  14. if (plugin.rawInvocation(request, response)) {
  15. raw = true;
  16. break;
  17. }
  18. }
  19. if (raw) {
  20. copyResponse(Request.current(), Response.current(), httpServletRequest, httpServletResponse);
  21. } else {
  22. Invoker.invokeInThread(new ServletInvocation(request, response, httpServletRequest, httpServletResponse));
  23. }
  24. } catch (NotFound e) {
  25. Logger.trace("ServletWrapper>service, NotFound: " + e);
  26. serve404(httpServletRequest, httpServletResponse, e);
  27. return;
  28. } catch (RenderStatic e) {
  29. Logger.trace("ServletWrapper>service, RenderStatic: " + e);
  30. serveStatic(httpServletResponse, httpServletRequest, e);
  31. return;
  32. } catch (Throwable e) {
  33. throw new ServletException(e);
  34. }
  35. }
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java_servlet
1.什么是Servlet  servlet就是java里面一种类,只不过这种java类有一些特殊的应用,称呼他为servlet2.servlet的作用  可以让浏览器直接通过一个路径取访问。(一般Java类做不到这一点)3.如何写一个servlet类  3.1.三种实现方式:  a.实现接口:javax.servlet.Servlet
虾米大王 虾米大王
2年前
java代码012
code012.jspInserttitlehere<%JSP内置对象1.request用于处理HTTP请求中的各项参数。如,删除可以通过request对象的getParameter()方法获取如,request.getParameter("id")在请求转发时,需要把一些数据传递到转发后的页面处理。就需要用到request的se
Stella981 Stella981
3年前
HttpServletRequest、通过request获得请求头、请求体等、解决中文乱码等问题
1、HttpServletRequest概述:我们在创建Servlet时,会重写service()方法、doGet()\\、doPost()方法,这些方法都有两个参数request(请求)和response(响应),service中的request是ServletRequset,而doGet()和doPost()方法中的是:HttpServletRe
Wesley13 Wesley13
3年前
JSP 九大内置对象及其作用域
JSP中一共预先定义了9个这样的对象,分别为:request、response、session、application、out、pagecontext、config、page、exception,下面就简单介绍下。1、request对象request对象是javax.servlet.httpServletRequest类型的对象
Easter79 Easter79
3年前
SpringMVC第一天HelloWorld
1,普通Servlet的流程是通过配置<servlet</servlet和<servletmapping</servletmapping来拦截请求交给对应的Servlet来处理使用SpringMVC需要配置一个SpringMVC自带的Servlet,DispatcherServlet,使用他来拦截请求交给SpringMVC处理 we
Stella981 Stella981
3年前
Servlet三大域对象解析
在javaweb开发中就不能不谈Servlet三大域对象的应用(request、session、application(ServletContext))。1\.request   request是表示一个请求,只要发出一个请求就会创建一个request,它的作用域:仅在当前请求中有效。用处:常用于服务器间同一请求
Stella981 Stella981
3年前
Play 2.0 用户指南 - 调用WebServices -- 针对Scala开发者
   PlayWSAPI   有时候我们需要在Play应用中调用外部HTTP服务。Play通过play.api.libs.ws.WS库提供支持,它提供了一种异步HTTP调用的方法。   任何play.api.libs.ws.WS的调用將返回Promise\play.api.libs.ws.Response
Stella981 Stella981
3年前
Servlet容器,过滤器,拦截器,监听器整理
Servlet容器JavaServlet是与平台无关的服务器端组件,运行于Servlet容器中(如Tomcat),Servlet容器负责Servlet和客户端的通信以及调用Servlet的方法,Servlet和客户端的通信采用“请求/响应”的模式。Servlet可完成以下功能:1、创建并返回基于客户请求的动态HTML页面。2、创建可以嵌入到
Stella981 Stella981
3年前
JavaWeb学习篇之
前篇说到了Response容器对象,这篇我们就来看一下Request容器对象,之前也说过了,这个两个容器对象是相对应的,每次用户请求服务器的时候web容器就会给创建这对容器对象,他们是共存亡的,当然Request除了有一个容器对象的角色,他还有一个角色就是Request域,我们之前在讲解Servlet的时候,说到一个ServletContext域,这个域的范
Stella981 Stella981
3年前
Play Framework2.1源码分析
_转载请注明出处,保持署名__作者:joymufeng_1. 介绍大家翘首以盼的Play2.1终于发布了,目前可用版本是Play2.1RC4。在此感谢Play!开发团队付出的辛勤努力!Play2.1以后版本中将会加入导出符合Servlet3.1规范的War