先转载下中文文档的前几页cetia4学习笔记(1)

tou3921 2008-09-18
http://our.bizairshop.com/note/post/cetia4-1.html
cetia4学习笔记(1)
学习cetia4,下面是随手记录的笔记 (1)

(水平有限,语句很多不通顺,别骂俺就行)

Cetia4使用简单而强大的抽象来很容易地创建基于Java Servlet的应用程序,可以做到
  1. 可以被web浏览器或者任何web状态支持的客户端 和
  2. 可以应答HTTP无序状态请求的Rest web service应用


HTTP URL概念是REST构架风格的核心。

在Cetia4框架中,render请求应答HTTP的Get请求,action请求应答HTTP的POST,PUT和DELETE方法请求。

http://www.xxx.com/forum/topics/123 这样的url中 forum是web app部署目录,/topics/* 是映射到 TopicsServlet (继承RestServlet)
这样的servlet必须映射到/topics/和它的所有子路径。

package com.example.forum.controller;
import com.acsinet_solutions.cetia4.controller.rest.RestServlet;
import com.acsinet_solutions.cetia4.controller.RenderContext;
public class TopicsServlet extends RestServlet {
public String render( RenderContext context ) {
  return "display_topics";

}
这个render方法能被识别因为以“render”开头,并且返回String值。
此方法参数是可变的,通常接受至少一个参数RenderContext。在servlet
环境中,RenderContext可以看成是servlet请求、应答和配置对象
(javax.servlet.http.HttpServletRequest等对象)的标准接收者。
RenderRequest很方便地提供可以访问那些servlet相关对象的方法

-------------------------------------------------------------------------------------------
【注意配置】
比较特殊的 web.xml中  <servlet-name> 必须跟 匹配的url中字符串一致!
(有些javax.servlet.ServletConfig.getServletName()方法返回这个配置值)
我开始servlet-name配置错了,一直出问题,例如: com.xxx.AdminServlet
你想映射到 /admin/* ,那么servlet-name 必须配置成 admin 的名字!
我开始以为servlet-name值无所谓配置成AdminServlet,结果一直出错
-------------------------------------------------------------------------------------------


render方法返回String对象,这个值代表客户端响应要显示的view,可以
是绝对路径,也可以是相对路径。
  ★ 绝对路径值,比如 /jsp/display_topics.jsp 指向一个固定文件
或资源。因为有接收html的传统浏览器客户或接收XML的Web service。
因此通过绝对路径指定的View需要知道如何适应不同客户端,这不是
view,而是controller的工作,所以不推荐使用绝对路径作返回值

  ★ 相对路径,比如 "display_topics",指向一个在默认目录和
默认扩展名的文件, 对于传统的web请求是 /WEB-INF/html和REST
servlet对应的路径。默认扩展名是.jsp。 例如"topics"的servlet返回
"display_topics",则指向 /WEB-INF/html/topics/display_topics.jsp
如果是header accept txt/xml的web service客户端访问,则调用到
/WEB-INF/html/topics/display_topics.jspx

如果想web service和web浏览器到达的view都是一个,则render方法返回值
指定后缀名,例如***.jsp 即可

如果请求有时候需要html返回,有时候需要xml返回,例如ajax应用中,
则需要使用参数 _type

显式的传统web响应url例子:
http://example.com/forum/topics?_type=web
显示的xml web service响应例子:
http://example.com/forum/topics?_type=ws_stateless
  或者用短参数:
http://example.com/forum/topics?_type=ws



RenderContext是ServletConfig,HttpServletRequest,HttpServletResponse
这些对象的facade,可以方便的和这些servlet相关的对象以及ServletContext,
HttpSession对象。但是它又远不止是简单的facade,他还抽象了一些不同于
传统的web模型和web service模型的方法。

在他们之间最大的区别是传统的web模型是有状态的,通过session来保存用户的
状态,在web service模型中,交互是无状态的,session不被允许。

RenderContext的获取HTTP参数的方法是:
public String getParameter( String param )
public Map<String,String[]> getParameterMap()
cetia4也可以实现自动的参数映射,后续讨论。

得到request,session,application级别的attribute存储值:
public Object getRequestAttribute( String key )
public Object getSessionAttribute( String key )
public Object getContextAttribute( String key )

前面说过,在无状态的web service环境,是不允许拿到session的,
所以调用 getSessionAttribute()和调用getRequestAttribute()方法
是一样的效果。 这一开始看起来很怪异,但是可以使用一个方法同时处理
web和web service两种请求,

VonNeumann 2008-10-22
顶完再看
用过RESTlet正好对比一下
Global site tag (gtag.js) - Google Analytics