Jetty学习 【九】 修改jetty.xml为服务器添加功能
2014-06-02 23:20
417 查看
jetty.xml用于配置服务器Server。默认的情况下,配置了线程池,connector,还有处理请求的handler。我们可以通过添加handler来为服务器添加一些默认的功能。
下面的例子,用于为服务器添加统计功能,统计各个web应用的访问数量。
在这之前先看看默认的handler,
handler的类型是HandlerCollection,之前的文章中提到了HandlerCollection的作用:多个Handler的集合,请求到来时,依次调用各个handler处理这请求,即使某个请求已经做出响应,仍然继续执行。第一个handler是ContextHandlerCollection用于根据context path请求相应的webapp。这个handler会对请求做出响应。
那么我们可以将我们自定义的handler添加到这个handler之后。这个handler的实现如下,
主要就是定义一个hashmap用于存放路径和访问数,主要的处理流程如注释所示,不是很复杂。注意编写handler的时候,需要引入相应的包。
将文件打包,如test.jar。那么这个包放置到哪里比较合适呢?
查看start.ini文件,
其中ext,文件用于存放扩展文件。那么我们的扩展功能放置到这里还是比较合适的。
接下来修改jetty.xml,将handler添加上去。
其中的CountHandler就是我们新定义的handler。
假设这时我们已经放置了webapp,webapp的context path是“webapp1”。
启动服务器,分别访问路径,
http://localhost:8080/webapp1/ http://localhost:8080/webapp12/ http://localhost:8080/webapp/ http://localhost:8080/webapp333/ http://localhost:8080/webapp1/
那么可以看到控制打印出的信息,
![](http://img.blog.csdn.net/20140602225850484?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGxuanVscA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
也就是说上面访问的地址中2~4都是不存在的。
接下来看看webapp1被访问了几次。修改上面的代码,如下
添加新的context path用于在页面上显示访问的数据。由于countContidion在webapps目录下没有对应的webapp,因此ContextHandlerCollection不会对这个请求做出响应,因此在我们自定义的handler中对这个请求做出响应,将其拦截,防止调用DefaultHandler返回404页面。
通过在页面上输入地址,
http://localhost:8080/countCondition
可以看到如下页面,
![](http://img.blog.csdn.net/20140602231740921?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGxuanVscA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
可以看到前面访问页面/webapp1了两次,数据正确。
总结:
通过上面的小例子发现:我们可以通过修改jetty.xml实现一些服务器的功能,也就是针对任何的webapp都适用的功能。而handler是其中可塑性较强的部分,不但可以添加新的Handler,还可以修改默认Handler的类型为HandlerList等。
下面的例子,用于为服务器添加统计功能,统计各个web应用的访问数量。
在这之前先看看默认的handler,
<Set name="handler"> <New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection"> <Set name="handlers"> <Array type="org.eclipse.jetty.server.Handler"> <Item> <New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/> </Item> <Item> <New id="DefaultHandler" class="org.eclipse.jetty.server.handler.DefaultHandler"/> </Item> </Array> </Set> </New> </Set>
handler的类型是HandlerCollection,之前的文章中提到了HandlerCollection的作用:多个Handler的集合,请求到来时,依次调用各个handler处理这请求,即使某个请求已经做出响应,仍然继续执行。第一个handler是ContextHandlerCollection用于根据context path请求相应的webapp。这个handler会对请求做出响应。
那么我们可以将我们自定义的handler添加到这个handler之后。这个handler的实现如下,
package org.eclipse.jetty.myhandler; import java.io.IOException; import java.util.concurrent.ConcurrentHashMap; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.handler.AbstractHandler; public class MyHandler extends AbstractHandler { // 多线程保证 private ConcurrentHashMap<String, Integer> record = new ConcurrentHashMap<String, Integer>(); @Override public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // 判断请求是否被处理,也就是context path是否存在 if (baseRequest.isHandled()){ // path已经访问过 ,count + 1 if (record.containsKey(target)){ record.replace(target, record.get(target) + 1); } // path还未访问过, count = 1 else{ record.put(target, 1); } return; } // 不存在时,打印信息 System.out.println(target + "is not existed."); } }
主要就是定义一个hashmap用于存放路径和访问数,主要的处理流程如注释所示,不是很复杂。注意编写handler的时候,需要引入相应的包。
将文件打包,如test.jar。那么这个包放置到哪里比较合适呢?
查看start.ini文件,
OPTIONS=Server,jsp,jmx,resources,websocket,ext,plus,annotations
其中ext,文件用于存放扩展文件。那么我们的扩展功能放置到这里还是比较合适的。
接下来修改jetty.xml,将handler添加上去。
<Set name="handler"> <New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection"> <Set name="handlers"> <Array type="org.eclipse.jetty.server.Handler"> <Item> <New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/> </Item> <Item> <New id="CountHandler" class="org.eclipse.jetty.myhandler.MyHandler"/> </Item> <Item> <New id="DefaultHandler" class="org.eclipse.jetty.server.handler.DefaultHandler"/> </Item> </Array> </Set> </New> </Set>
其中的CountHandler就是我们新定义的handler。
假设这时我们已经放置了webapp,webapp的context path是“webapp1”。
启动服务器,分别访问路径,
http://localhost:8080/webapp1/ http://localhost:8080/webapp12/ http://localhost:8080/webapp/ http://localhost:8080/webapp333/ http://localhost:8080/webapp1/
那么可以看到控制打印出的信息,
也就是说上面访问的地址中2~4都是不存在的。
接下来看看webapp1被访问了几次。修改上面的代码,如下
// 判断请求是否被处理,也就是context path是否存在 if (baseRequest.isHandled()) { // path已经访问过 ,count + 1 if (record.containsKey(target)) { record.replace(target, record.get(target) + 1); } // path还未访问过, count = 1 else { record.put(target, 1); } return; } if ("/countCondition".equalsIgnoreCase(target)) { response.setContentType("text/html;charset=utf-8"); response.setStatus(HttpServletResponse.SC_OK); baseRequest.setHandled(true); response.getWriter().print(record.toString()); return; } // 不存在时,打印信息 System.out.println(target + "is not existed.");
添加新的context path用于在页面上显示访问的数据。由于countContidion在webapps目录下没有对应的webapp,因此ContextHandlerCollection不会对这个请求做出响应,因此在我们自定义的handler中对这个请求做出响应,将其拦截,防止调用DefaultHandler返回404页面。
通过在页面上输入地址,
http://localhost:8080/countCondition
可以看到如下页面,
可以看到前面访问页面/webapp1了两次,数据正确。
总结:
通过上面的小例子发现:我们可以通过修改jetty.xml实现一些服务器的功能,也就是针对任何的webapp都适用的功能。而handler是其中可塑性较强的部分,不但可以添加新的Handler,还可以修改默认Handler的类型为HandlerList等。
相关文章推荐
- XML中对于一个books.xml的详情显示,删除按钮,修改并保存按钮 和 添加按钮。完成这些按钮所对应的功能(XmlDocument)。
- 在昨天作业的基础上添加 :删除按钮,修改并保存按钮 和 添加按钮。完成这些按钮所对应的功能(XmlDocument)。
- XML删除按钮,修改并保存按钮 和 添加按钮。完成这些按钮所对应的功能(XmlDocument)。
- mybatis学习笔记-实现添加修改删除用户功能
- XML---添加 删除、编辑、修改并保存、添加、查找、生成XML按钮并完成对应的功能
- 使用XmlDocument将dropdownlist中显示的书名的其它信息读入到相应的文本框中。添加 :删除按钮,修改并保存按钮 和 添加按钮。完成这些按钮所对应的功能(XmlDocument)
- 这是一个关于XML文档的操作管理器XMLHelper类,类中包括XML文档的创建,文档节点和属性的读取,添加,修改,删除的方法功能的实现
- 30天轻松学习javaweb_Eclipse在修改了web.xml后将自动更新到tomcat服务器中
- 为FCKeditor2.6添加行距功能(最新修改)
- xml文档的添加,删除,修改(一)
- FileSystemObject组件新建/读取/添加/修改/删除功能实例
- Ajax 和 XML: 使用 Ajax 实现打分评级和添加评论功能
- XML 数据岛之三数据修改与添加
- xml文档的添加,删除,修改(三)
- XML文件操作(查询,添加,修改,删除 结点)
- 用JAVA创建XML文档,为java API文档添加搜索功能
- 学习XML(修改一个节点)
- 在blog中添加attachments功能 (修改系统Control)
- 四.用户管理页面(显示所有的用户信息,同时为用户的添加,编辑,修改密码,删除,修改权限等功能提供相应的链接) UserMange.aspx
- 怎样给没有源代码的.net程序添加修改功能