【用函数判断pȝ是Big Endianq是Little Endian?/font>
Generic Connections
In the CLDC Generic Connection framework, all connections are created using
the open
static method from the Connector
class. If
successful, this method returns an object that implements one of the generic
connection interfaces. Figure 1 shows how these interfaces form an is-a
hierarchy. The Connection
interface is the base interface such
that StreamConnectionNotifier
is a Connection
and
InputConnection
is a Connection
too.
Connection
interface is the most basic connection type. It
can only be opened and closed.InputConnection
interface represents a device from which
data can be
read. Its openInputStream
method returns an input stream for the
connection.
OuputConnection
interface represents a device to which data
can be
written. Its openOutputStream
method returns an output stream for
the connection.
StreamConnection
interface combines the input and output
connections.
ContentConnection
is a subinterface of
StreamConnection
. It
provides access to some of the basic meta data information provided by HTTP
connections.
StreamConnectionNotified
waits for a connection to be
established.
It returns a StreamConnection
on which a communication link has ben
established.
DatagramConnection
represents a datagram endpoint.
The open
method of the Connector
class has the
following syntax, where the String
parameter has the format
"protocol:address;parameters"
.
Here are a few examples:
HTTP Connection
Datagram Connection
Communicate with a Port
Open Files
In the setup state the following methods can be invoked:
setRequestMethod
setRequestProperty
For example, suppose you have this connection:
Then, you can set the request method to be of type POST
as follows:
And likewise, you can set some of the HTTP properties. For example, you
can set the User-Agent
as follows:
If there is a method that requires data to be sent or received from the server, there is a state transition from Setup to Connected. Examples of methods that cause the transition include:
And while the connection is open, some of these methods that may be invoked:
发现/usr/share/vim/vimrc?etc/vim/vimrc指向是同一个文Ӟ即vimrcQؓvi和vim的配|文Ӟ修改q个文g卛_。这个\径在不同的LINUX版本中可能会不同?/p>
2、配|颜?/p>
配轩VI和VIM的颜色显C,使它能够高亮度显CZ些特别的单词Q这对编写程序很有用。后来打开文g发现里面其实已经有一行了Q只是用引号注释掉了Q只需 syntax on 所在行前面的引号去掉即可。或者另外独立添加一行:syntax on 也行Q另外编?etc/profile 增加一行alias vi="vim"p了?/p>
3、设|鼠?/p>
使用VI~辑文本Ӟ如果想修文g中改d标较q的位置Q这时候想用鼠标定位,可默认情况下Q鼠标是不可用的。如果你想用鼠标,只需另v一行,写上Qset mouse=a 卛_
4、设|自动羃q?/p>
默认情况下,VI和VIM都没有羃q的Q每换一行,光标均定位在格Q如果你惌动对齐,请将 set autoindent所在行前面的引号去掉,或者另外添加一行:set autoindent也可。这与配|颜色类伹{这L讄的结果是按回车后新行与上一行自动对齐?/p>
5、设|tab的羃q量
如果用python~写E序Q那么行~进量是一个极光要的概念Q同一个块的羃q量必须相同。你可能喜欢在行前加I格来表C羃q,但每ơ必L多次I格 键,如果你喜Ƣ用按TAB键来表示~进Q你可能觉得写的文本或程序不太好看,因ؓ默认情况下,VI和VIM的TAB~进量比较大Q至六Q七个字W)。设 |TAB键羃q量的方法:set shiftwidth=3 你也可以选一 个你自己喜欢的羃q量Q比?Q或4.
----------------------------------------------
首先从视觉方?
W一个要做的是羃q?/strong>,修改你的VIM配置文g_vimrc,在最后加?span style="color: rgb(0, 128, 0);">set cindent,q样p|了c风格的羃q?在这里羃q的大小?span style="color: rgb(51, 153, 102);">shiftwidth的倹{?/p>
W二个要做的是语法高?/strong>Q这个是必须的,在中_vimrc加入syntax enable?/p>
W三个要做的字体的设|?/strong>Q设|一个舒服的字体可以让你~程的时候舒服好多,用editplus的时候我q的ConsolasQ在vim中我q是用的q种字体Q在_vimrc中加?/p>
if has(”gui_running”)
set guifont=Consolas:h9
endif
表示q行界面vim的时候就用这U字体?/p>
W四Q设|配色方?/strong>Q可以到点击q儿下蝲Q然后放?span style="color: rgb(0, 128, 0);">$VIM"vimfiles"colorsq个目录下,然后在中加入如下配置
if has(”gui_running”)
set guifont=Consolas:h9
” set color schema
colorscheme colorscheme_name
endif
colorscheme_nameZ需要设|的配色Ҏ的名U?/span>
接下来是在运行程序中用到的:
W一Q用ctag
VIM中已l带了Ctagsq个E序。尽ctags也可以支持其它编辑器Q但是它正式支持的只?a class="st_tag internal_tag" rel="tag" title="Posts tagged with vim">VIM。Ctags可以帮助E序员很Ҏ地浏览源代码。用下面的命令可以在源代码的根目录下创徏“tags”文gQ?/p>
[/home/brimmer/src]$ ctags -R
“-R”表示递归创徏Q也包括源代码根目录下的所有子目录下的源程序?#8220;tags”文g中包括这些对象的列表Q?/p>
l ?define定义的宏
l 枚D型变量的?/p>
l 函数的定义、原型和声明
l 名字I间QnamespaceQ?/p>
l cd定义QtypedefsQ?/p>
l 变量Q包括定义和声明Q?/p>
l c(classQ、结构(structQ、枚丄型(enumQ和联合QunionQ?/p>
l cR结构和联合中成员变量或函数
VIM用这?#8220;tags”文g来定位上面这些做了标记的对象Q下面介l一下定位这些对象的ҎQ?/p>
1) 用命令行。在q行vim的时候加?#8220;-t”参数Q例如:
[/home/brimmer/src]$ vim -t foo_bar
q个命o打开定义“foo_bar”Q变量或函数或其它)的文Ӟq把光标定位到这一行?/p>
2) ?a class="st_tag internal_tag" rel="tag" title="Posts tagged with vim">vim~辑器内?#8220;:ta”命oQ例如:
:ta foo_bar
3) 最方便的方法是把光标移到变量名或函数名上,然后按下“Ctrl-]”。用“Ctrl-o”退回原来的地方?/p>
注意Q运?a class="st_tag internal_tag" rel="tag" title="Posts tagged with vim">vim的时候,必须?#8220;tags”文g所在的目录下运行。否则,q行vim的时候还要用“:set tags=”命o讑֮“tags”文g的\径,q样vim才能扑ֈ“tags”文g?/p>
你还可以选择使用taglistq个插gQ这个插件可以在右侧昄函数Q变量等的列?/p>
W二Q改正程序中的错?/strong>
?a class="st_tag internal_tag" rel="tag" title="Posts tagged with vim">VIM~辑器的环境下用“:make”Qmake工具的用已l在我昨天的文章? 提到的云风的几篇文章中详l介l到Q就可以~译E序Q当然其前提是在当前目录下有Makefile文g。运行完“:make”之后Q如果程序中有错误,? 会显C出来。这时候,光标会自动指向第一个出现错误的地方Q而且你还可以看到错误的提C。然后,你就可以Ҏ错误Q而不用手工找到出错的那一行。记住下? 几个有用的命令:
l “:cl”列出错误
l “:cn”让光标指向下一个错?/p>
l “:cp”让光标指向上一个错?/p>
l “:cnew”从头开?/p>
你甚臛_以让VIM识别出其它编译器而不是gcc的错误提C。这对一些开发嵌入式pȝ的程序员q很有用Q因Z们很可能用的不是gcc而是其它~译器。通过讄“errorformat”的|可以?a class="st_tag internal_tag" rel="tag" title="Posts tagged with vim">VIM识别出编译器的出错提C。因Z同的~译器的出错提示是不同的Q所以如果用的不是gccp重新讄?/p>
“errorformat”的值是一个字W串Q它的格式和C语言的scanf的字W串格式相识?/p>
gcc?#8220;errorformat”的gؓQ?f:%l:"%m。其?#8220;%f”表示文g名,“%l”表示行号Q?#8220;%m”表示出错信息?/p>
?#8220;:h errorformat”查看详细的帮助信息?/p>
?span style="color: rgb(0, 128, 0);">“:h quickfix”?#8220;:h make”?#8220;:h makeprg”?#8220;:h errorfile”查看其它的信息?/p>
W三Q用快捷键
下面的这些快捷键对程序员很有帮助Q?br /> 在函CUd光标
[[ 转到上一个位于第一列的“{”
]] 转到下一个位于第一列的“{”
{ 转到上一个空?/p>
} 转到下一个空?/p>
gd 转到当前光标所指的局部变量的定义
* 转到当前光标所指的单词下一ơ出现的地方
# 转到当前光标所指的单词上一ơ出现的地方
括号的匹?/p>
% 用来q行括受中括号和大括号的匹配。这要看当前光标指向的是什么符号了?/p>
----------------------------------------------
一个ubuntu 下的vimrc配置例子:
servlet API中最重要的一个功能就是能够ؓservlet和JSP面定义qo器。过滤器提供了某些早期服务器所支持的非标准“servlet链接”的一U功能强大且标准的替代品?br />
qo器提供了几个重要好处 Q?/p>
<xml version="1.0" encoding="ISO-8859-1"?> xml version="1.0" encoding="ISO-8859-1"?> <filter> <filter> xml version="1.0" encoding="ISO-8859-1"?> web.xml加配|?/p>
<!-- qo?--> EncodingFilter.java package com.hibernate.util; import java.io.IOException; import javax.servlet.Filter; public class EncodingFilter implements Filter { protected String Encoding = null; public void init(FilterConfig config) throws ServletException { this.config = config; } public void doFilter(ServletRequest request, ServletResponse response, if (request.getCharacterEncoding() == null) { OK!!!
qo器是一个程序,它先于与之相关的servlet或JSP面q行在服务器上。过滤器可附加到一个或多个servlet或JSP面上,q且可以查进入这些资源的h信息。在q之后,qo器可以作如下的选择Q?br />
1. 以常规的方式调用资源Q即Q调用servlet或JSP面Q?br />
2.利用修改q的h信息调用资源?br />
3. 调用资源Q但在发送响应到客户机前对其q行修改
4. L该资源调?/font>Q代之以转到其他的资源,q回一个特定的状态代码或生成替换输出?/p>
首先Q它以一U模块化的或可重用的方式装公共的行为。你?0个不同的serlvet或JSP面Q需要压~它们的内容以减下载时间吗Q没问题Q构造一个压~过滤器Q然后将它应用到30个资源上卛_?br />
其次Q利用它能够高U访问决{与表现代码相分R这对于JSP特别有h|其中一般希望将几乎整个面集中在表CQ而不是集中在业务逻辑上。例如,?
望阻塞来自某些站点的讉K而不用修改各面Q这些页面受到访问限Ӟ吗?没问题:建立一个访问限制过滤器q把它应用到惌限制讉K的页面上卛_?br />
最后,qo器你能够对许多不同的资源进行批量性的更改。你有许多现存资源,q些资源除了公司名要更改外其他的保持不变Q能办到么?没问题:构造一个串替换qo器,只要合适就使用它?br />
但要注意Q过滤器只在与servlet规范2.3版兼容的服务器上有作用。如果你的Web应用需要支持旧版服务器Q就不能使用qo器?br />
1Q?nbsp; 建立基本qo?/span>
建立一个过滤器涉及下列五个步骤Q?br />
1Q徏立一个实现Filter接口的类。这个类需要三个方法,分别是:doFilter、init和destroy?br />
doFilterҎ包含主要的过滤代码(见第2步)QinitҎ建立讄操作Q而destroyҎq行清楚?br />
2Q在doFilterҎ中放入过滤行为。doFilterҎ的第一个参CؓServletRequest对象。此对象l过滤器提供了对q入的信?
Q包括表单数据、cookie和HTTPh_的完全访问。第二个参数为ServletResponseQ通常在简单的qo器中忽略此参数。最后一个参
CؓFilterChainQ如下一步所qͼ此参数用来调用servlet或JSPc?br />
3Q调用FilterChain对象的doFilterҎ。Filter接口的doFilterҎ取一个FilterChain对象作ؓ它的一个参
数。在调用此对象的doFilterҎӞȀzM一个相关的qo器。如果没有另一个过滤器与servlet或JSP面兌Q则servlet或JSP
面被激zR?br />
4Q对相应的servlet和JSP面注册qo器。在部v描述W文Ӟweb.xmlQ中使用filter和filter-mapping元素?br />
5Q禁用激zdservlet。防止用户利用缺省servlet URLl过qo器设|?br />
1.1 建立一个实现Filter接口的类
所有过滤器都必d现javax.servlet.Filter。这个接口包含三个方法,分别为doFilter、init和destroy?br />
public void doFilter(ServletRequset request,
ServletResponse response,
FilterChain chain)
thows ServletException, IOException
每当调用一个过滤器Q即Q每ơ请求与此过滤器相关的servlet或JSP面Q时Q就执行其doFilterҎ。正是这个方法包含了大部分过滤逻辑?
W一个参Cؓ与传入请求有关的ServletRequest。对于简单的qo器,大多数过滤逻辑是基于这个对象的。如果处理HTTPhQƈ且需要访问诸
如getHeader或getCookies{在ServletRequest中无法得到的ҎQ就要把此对象构造成
HttpServletRequest?br />
W二个参CؓServletResponse。除了在两个情Ş下要使用它以外,通常忽略q个参数。首先,如果希望完全d对相关servlet或JSP?
面的讉K。可调用response.getWriterq直接发送一个响应到客户机。其ơ,如果希望修改相关的servlet或JSP面的输出,可把?
应包含在一个收集所有发送到它的输出的对象中。然后,在调用serlvet或JSP面后,qo器可查输出,如果合适就修改它,之后发送到客户机?br />
DoFilter的最后一个参CؓFilterChain对象。对此对象调用doFilter以激zMservlet或JSP面相关的下一个过滤器。如果没有另一个相关的qo器,则对doFilter的调用激zservlet或JSP本n?br />
public void init(FilterConfig config) thows ServletException
initҎ只在此过滤器W一ơ初始化时执行,不是每次调用qo器都执行它。对于简单的qo器,可提供此Ҏ的一个空体,但有两个原因需要用init?
首先QFilterConfig对象提供对servlet环境及web.xml文g中指zqo器名的访问。因此,普遍的办法是利用init?
FilterConfig对象存放在一个字D中Q以便doFilterҎ能够讉Kservlet环境或过滤器?其次QFilterConfig对象?
有一个getInitParameterҎQ它能够讉K部v描述W文Ӟweb.xmlQ中分配的过滤器初始化参数?br />
public void destroy( )
大多数过滤器单地为此Ҏ提供一个空体,不过Q可利用它来完成诸如关闭qo器用的文g或数据库q接池等清除d?br />
1.2 过滤行为放入doFilterҎ
doFilterҎ为大多数qo器地关键部分。每当调用一个过滤器Ӟ都要执行doFilter。对于大多数qo器来_doFilter执行的步骤是
Z传入的信息的。因此,可能要利用作为doFilter的第一个参数提供的ServletRequest。这个对象常常构造ؓ
HttpServletRequestcdQ以提供对该cȝ更特D方法的讉K?br />
1.3 调用FilterChain对象的doFilterҎ
Filter接口的doFilterҎ以一个FilterChain对象作ؓ它的W三个参数。在调用该对象的doFilterҎӞȀzM一个相关的
qo器。这个过E一般持l到链中最后一个过滤器为止。在最后一个过滤器调用其FilterChain对象的doFilterҎӞȀzservlet?
面自n?br />
但是Q链中的Lqo器都可以通过不调用其FilterChain的doFilterҎ中断q个q程。在q样的情况下Q不再调用JSP面的serlvetQƈ且中断此调用q程的过滤器负责输出提供给客户机?br />
1.4 寚w当的servlet和JSP面注册qo?/span>
部v描述W文件的2.3版本引入了两个用于过滤器的元素,分别是:filter和filter-mapping。filter元素向系l注册一个过滤对象,filter-mapping元素指定该过滤对象所应用的URL?br />
1.filter元素
filter元素位于部v描述W文Ӟweb.xmlQ的前部Q所有filter-mapping、servlet或servlet-mapping元素之前。filter元素h如下六个可能的子元素Q?br />
1?icon q是一个可选的元素Q它声明IDE能够使用的一个图象文件?br />
2、filter-name q是一个必需的元素,它给qo器分配一个选定的名字?br />
3、display-name q是一个可选的元素Q它l出IDE使用的短名称?br />
4?description q也是一个可选的元素Q它l出IDE的信息,提供文本文档?br />
5?filter-class q是一个必需的元素,它指定过滤器实现cȝ完全限定名?br />
6?init-param q是一个可选的元素Q它定义可利用FilterConfig的getInitParameterҎd的初始化参数。单个过滤器元素可包含多个init-param元素?br />
h意,qo是在serlvet规范2.3版中初次引入的。因此,web.xml文g必须使用DTD?.3版本。下面介l一个简单的例子Q?/p>
DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<filter>
<filter-name>MyFilterfilter-name>
<filter-class>myPackage.FilterClassfilter-class>
filter>
<filter-mapping>...filter-mapping>
<web-app>
2.filter-mapping元素
filter-mapping元素位于web.xml文g中filter元素之后serlvet元素之前。它包含如下三个可能的子元素Q?br />
1?filter-name q个必需的元素必M用filter元素声明时给予过滤器的名U相匚w?br />
2?url-pattern
此元素声明一个以斜杠Q?Q开始的模式Q它指定qo器应用的URL。所有filter-mapping元素中必L供url-pattern?
servlet-name。但不能对单个filter-mapping元素提供多个url-pattern元素V如果希望过滤器适用于多个模式,可重?
整个filter-mapping元素?br />
3?servlet-name
此元素给Z个名Uͼ此名U必M利用servlet元素l予servlet或JSP面的名U相匚w。不能给单个filter-mapping元素提供
多个servlet-name元素V如果希望过滤器适合于多个servlet名,可重复这个filter-mapping元素?br />
下面举一个例子:
DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<filter>
<filter-name>MyFilterfilter-name>
<filter-class>myPackage.FilterClassfilter-class>
filter>
<filter-mapping>
<filter-name>MyFilterfilter-name>
<url-pattern>/someDirectory/SomePage.jspurl-pattern>
filter-mapping>
web-app>
1.5 用Ȁzdservlet
在对资源应用qo器时Q可通过指定要应用过滤器的URL模式或servlet名来完成。如果提供servlet名,则此名称必须与web.xml?
servlet元素中给出的名称相匹配。如果用应用到一个serlvet的URL模式Q则此模式必M利用web.xml的元素servlet-
mapping指定的模式相匚w。但是,多数服务器?#8220;Ȁzdservlet”为servlet体统一个缺省的URLQhttp:
//host/WebAppPrefix/servlet/ServletName。需要保证用户不利用q个URL讉KservletQ这样会l过qo?
讄Q?br />
例如Q假如利用filter和filter-mapping指示名ؓSomeFilter的过滤器应用到名为SomeServlet的servletQ则如下Q?/font>
<filter-name>SomeFilterfilter-name>
<filter-class>somePackage.SomeFilterClassfilter-class>
<filter>
<filter-mapping>
<filter-name>SomeFilterfilter-name>
<servlet-name>SomeServletservlet-name>
<filter-mapping>
接着Q用servlet和servlet-mapping规定URL http://host/webAppPrefix/Blah 应该调用SomeSerlvetQ如下所C:
<filter-name>SomeFilterfilter-name>
<filter-class>somePackage.SomeFilterClassfilter-class>
filter>
<filter-mapping>
<filter-name>SomeFilterfilter-name>
<servlet-name>/Blahservlet-name>
<filter-mapping>
现在Q在客户Z用URL http://host/webAppPrefix/Blah 时就会调用过滤器。过滤器不应用到
http://host/webAppPrefix/servlet/SomePackage.SomeServletClass?br />
管有关闭激zd的服务器专用Ҏ。但是,可移植最强的Ҏ旉新映Web应用钟的/servlet模式Q这样所有包含此模式的请求被送到相同?
servlet中。ؓ了重新映此模式Q首先应该徏立一个简单的servletQ它打印一条错误消息,或重定向用户到顶层页。然后,使用servlet?
servlet-mapping元素发送包?servlet模式的请求到该servlet。程序清?-1l出了一个简短的例子?br />
E序清单9-1 web.xmlQ重定向~省servlet URL的摘录)
DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>Errorservlet-name>
<servlet-class>somePackage.ErrorServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>Errorservlet-name>
<url-pattern>/servlet/*url-pattern>
servlet-mapping>
<web-app>
解决q
<filter>
<filter-name>Filter</filter-name>
<filter-class>
com.util.EncodingFilter<!-- qo器类 -->
</filter-class>
<init-param>
<param-name>Encoding</param-name>
<param-value>gb2312</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
protected FilterConfig config;
this.Encoding = config.getInitParameter("Encoding");
FilterChain chain) throws IOException, ServletException {
if (Encoding != null) {
request.setCharacterEncoding(Encoding);
response.setCharacterEncoding(Encoding);
}
}
chain.doFilter(request,response);
}
public void destroy() {}
}
很简单的qo器,是Z记录一个url的请求时?filter:
一般情况下是没什么问题,但是当我下蝲一个稍微大的文件时Q蟩出确认窗口,如果选择的是cancelQ?
׃发现filterq没有返回,也就是说
q没有执? 原因?
chain.doFilter(request, response);
执行到这里时会从q里调用剩下的filter和servletQ所以这个调用将会是一个很长的q程?
在这个调用里Q将会完全通过request和resonseL作连接,取得/发送数据,如果q接出现异常Q将直接弹出Exception
你的代码里没有捕获异常,所以如果出现异常,chain.doFilter后面的就不会执行?
可以把chain.doFilter攑ֈtry finallyl构中,保证后箋会被执行