重写到边缘–充分利用它! 在GlassFish上!

现代应用程序开发的一个重要主题是重写。 自从Java Server Faces引入和Java EE 6中新的轻量级编程模型以来,您一直在努力使用漂亮,简单,可添加书签的URL。 PrettyFaces很久以来就一直存在,即使它在3.3.3版本中可以说是成熟的,我也不敢相信。

主要是因为我必须在xml中配置它。 如果您曾经做过JSF项目,那么您就会知道这是您稍后要做的事情。 或永远不会。 最后一个选项是我看到的很多东西。 重写将改变这一点。 程序化,易于使用和高度可定制的。 正是我想要的。

入门

从其中一个RedHat家伙那里获得的东西入门非常容易。 启动NetBeans,创建一个新的基于Maven的Webapp,将JSF和Primefaces添加到混合中并在GlassFish上运行。 向应用程序添加重写魔术的第一步是向项目添加重写依赖项。

<dependency><groupId>org.ocpsoft.rewrite</groupId><artifactId>rewrite-servlet</artifactId><version>1.1.0.Final</version></dependency>

这还不够,因为我将它与JSF一起使用,您还需要jsf-integration。

<dependency><groupId>org.ocpsoft.rewrite</groupId><artifactId>rewrite-integration-faces</artifactId><version>1.1.0.Final</version></dependency>

接下来实现您自己的ConfigurationProvider。 这是发生大多数魔术的核心部分。现在我们将其称为TricksProvider,我们还将扩展抽象的HttpConfigurationProvider。 一个简单的第一个版本如下所示:

public class TricksProvider  extends HttpConfigurationProvider
{@Overridepublic int priority(){return 10;}@Overridepublic Configuration getConfiguration(final ServletContext context){return ConfigurationBuilder.begin().addRule(Join.path("/").to("/welcomePrimefaces.xhtml"));}
}

现在,您必须注册您的ConfigurationProvider。 为此,您可以在应用程序/ META-INF / services /文件夹中添加一个名为org.ocpsoft.rewrite.config.ConfigurationProvider的简单文本文件。 向其添加ConfigurationProvider实现的标准名称,即可完成操作。 如果您启动应用程序。

重写基础

复制上述提供程序时,您隐式添加了第一个重写规则。 通过请求http:// host:8080 / yourapp /,您将直接转到NetBeans生成的Primefaces欢迎页面。 所有规则都基于相同的原则。 每个规则都由一个条件和一个运算组成。 类似“如果发生X,则执行Y”。 重写知道两种不同的规则。 一些预配置的(加入)以“ addRule()”开头,而流畅的接口以defineRule()开头。 这有点令人困惑,因为下一个主要版本将弃用defineRule()并将其重命名为addRule()。 因此,您发现的大多数示例(尤其是最新主干中的测试用例)都无法在1.1.0.Final中使用。 重写知道两个不同的方向。 入站和出站。 入站很有可能像您知道的每个重写引擎(例如mod_rewrite)一样工作。 请求到达并被转发或重定向到规则中定义的资源。 出站方向几乎没有。 它基本上在HttpServletRequest的encodeURL()方法中具有一个钩子,并重写您页面中的链接(如果它们完全是在encodeURL的帮助下呈现的)。 JSF开箱即用。 如果您打算将其与JSP一起使用,则必须确保自己调用它。

用一些魔法将.html转发到.xhtml

让我们看一下您可以用重写做的一些事情。 首先,我们将以下内容添加到TricksProvider中:

.defineRule()
.when(Direction.isInbound()
.and(Path.matches("{name}.html").where("name").matches("[a-zA-Z/]+")))
.perform(Forward.to("{name}.xhtml"));

这是一条规则,用于检查入站请求,并检查所有与正则表达式模式[a-zA-Z /] +确认的补丁匹配{name} .html,并将其转发到{name} .xhtml文件。

如果执行此规则,则对http:// host:8080 / yourapp / something.html的所有请求最终都将转发到something.xhtml。 现在,您的用户将不再知道您在下面使用的是花哨的JSF内容,并认为您正在使用html :)如果请求的URL与正则表达式不匹配,例如类似http:// host:8080 / yourapp / something123.html根本不会转发,如果您的应用程序中不存在something123.html,您最终将收到404错误。

改写出站链接

相反,您还可以添加以下规则:

.defineRule()
.when(Path.matches("test.xhtml")
.and(Direction.isOutbound()))
.perform(Substitute.with("test.html"))

你想像这是在做什么,对吗? 如果您的facelet包含以下内容:

<h:outputLink value="test.xhtml">Normal Test</h:outputLink>

呈现给用户的链接将被重写为test.html。 这是您永远需要的出站链接的最基本操作。 大多数魔术都发生在入站链接上。 看到encodeURL()挂钩的作用范围非常有限,这并不让人感到意外。

OutputBuffer

重写中最令人惊讶的东西称为OutputBuffer。 至少直到我们正在使用的发行版为止。 它会在2.0中重命名,但现在让我们简单地看一下您可以做什么。 OutputBuffer是您对响应的了解。 在响应真正到达客户浏览器之前,您想对响应做什么。 考虑转换标记? 转换CSS? 甚至GZIP压缩? 太好了,这正是您所能做的。 让我们实现一个简单的ZipOutputBuffer

public class ZipOutputBuffer implements OutputBuffer {private final static Logger LOGGER = Logger.getLogger(ZipOutputBuffer.class.getName());@Overridepublic InputStream execute(InputStream input) {String contents = Streams.toString(input);LOGGER.log(Level.FINER, "Content {0} Length {1}", new Object[]{contents, contents.getBytes().length});byte[] compressed = compress(contents);LOGGER.log(Level.FINER, "Length: {0}", compressed.length);return new ByteArrayInputStream(compressed);}public static byte[] compress(String string) {ByteArrayOutputStream os = new ByteArrayOutputStream(string.length());byte[] compressed = null;try {try (GZIPOutputStream gos = new GZIPOutputStream(os)) {gos.write(string.getBytes());} compressed = os.toByteArray();os.close();} catch (IOException iox) {LOGGER.log(Level.SEVERE, "Compression Failed: ", iox);}return compressed;}
}

如您所见,我在弄乱一些流,并使用java.util.zip.GZIPOutputStream缩小通过此方法接收的流。 接下来,我们必须将相关规则添加到TricksProvider中:

.defineRule()
.when(Path.matches("/gziptest").and(Direction.isInbound()))
.perform(Forward.to("test.xhtml")
.and(Response.withOutputBufferedBy(new ZipOutputBuffer())
.and(Response.addHeader("Content-Encoding", "gzip"))
.and(Response.addHeader("Content-Type", "text/html"))))

入站规则(我们不愿意在此处重写页面中的链接..因此必须入站),该规则将ZipOutputBuffer添加到Response中。 还要注意额外的响应标头(两个),除非您想让浏览器抱怨我混在一起的内容:)就是这样。 现在,请求http:// host:8080 / yourapp / gziptest提供了具有GZIP压缩功能的te​​st.xhtml。 那是2,6KB和1.23 KB! 不到尺寸的一半! 使用流和byte []并不是很方便。 而且我不确定这是否可以在较大的页面大小上使用内存碎片,但是如果您没有压缩过滤器或者只需要压缩应用程序的单个部分,这是一个简单的解决方法。

通过重写增强安全性

但这还不是您能做的:您还可以通过重写来增强安全性。 林肯发表了关于用重写保护您的应用程序的精彩文章。 关于如何使用此功能,有很多可能的示例。 我想到了一个用例,其中不想使用欢迎文件功能,而是希望单独分派用户。 在执行此操作时,我还将检查他们的路径,并检查他们输入的内容是否恶意。 您可以使用.matches()条件或使用自定义约束来执行此操作。 将以下内容添加到TricksProvider中:

Constraint<String> selectedCharacters = new Constraint<String>() {@Overridepublic boolean isSatisfiedBy(Rewrite event,EvaluationContext context, String value) {return value.matches("[a-zA-Z/]+");}};

并定义以下规则:

.defineRule()
.when(Direction.isInbound()
.and(Path.matches("{path}").where("path").matches("^(.+)/$")
.and(Path.captureIn("checkChar").where("checkChar").constrainedBy(selectedCharacters))))
.perform(Redirect.permanent(context.getContextPath() + "{path}index.html"))

另一个入站修改。 检查路径是否具有文件夹模式,并将其捕获到根据自定义约束进行检查的变量中。 大! 现在,您已经有了保存和轻松转发的机制。 现在,所有http:// host:8080 / yourapp / folder /请求都被重写为http:// host:8080 / yourapp / index.html。 如果您从上方查看其他规则,那么.html将被转发到.xhtml……,您就完成了!

底线

我非常喜欢重写。 与配置prettyfaces的xml文件相比,这感觉要容易得多,在使用林肯和Christian的第一步中,我真的很享受Lincoln和Christian的支持。 我很好奇2.0即将推出的产品,我希望我能为规则配置获得更多调试输出,以便了解正在发生的事情。 默认值是空,并且找到具有工作规则的条件的正确组合可能非常棘手。 寻找完整的资源? 在github上找到它们 。 很高兴阅读您的经历。

GlassFish部分在哪里?

哦耶。 我在标题中提到了吧? 那应该更像是默认值。 我正在使用最新的GlassFish 3.1.2.2运行所有程序,因此可以确保它可以正常运行。 NetBeans目前为7.2 ,如果尚未尝试,则应尝试一下。 我没有遇到任何与GlassFish相关的问题,我很高兴在此强调这一点。 做得好! 最后一句话:在疯狂地实现OutputBuffer之前,请看一下您最喜欢的应用服务器所拥有的库存。 GlassFish已经了解GZIP压缩 ,因此可以将其打开! 在这里实施之前,请三思而后行是一个好主意。

参考: 重写边缘-充分利用它! 在GlassFish上! 来自我们的JCG合作伙伴 Markus Eisele在Java的企业软件开发博客中。


翻译自: https://www.javacodegeeks.com/2012/08/rewrite-to-edge-getting-most-out-of-it.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371566.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php yii框架路由,yii框架路由配置

首先要在服务器配置(httpd.conf)中开启重写模块#开启重写模块&#xff0c;将其前面的#去掉LoadModule rewrite_module modules/mod_rewrite.so#Directory中允许覆盖开启## Possible values for the Options directive are "None", "All",# or any combinat…

前端面试总结二

一、响应式和自适应的区别&#xff1a; 联系(相同点)&#xff1a; 响应式设计(responsive design)和自适应设计(adaptive design)都是用来解决网页在不同分辨率的屏幕和设备上展示的一项技术(或者说一种方法)。 区别&#xff1a; 响应式设计&#xff1a;通过CSS Media Queries(…

【看番杂感】Clannad系列观后感(剧透慎入)

前言 之前看第一季时&#xff0c;弹幕里总有人在刷“写作cl&#xff0c;读作人生”。当时我想&#xff0c;盲目把一部催泪番上升到人生的高度&#xff0c;这未免有些武断&#xff0c;也是对作品本身的不尊重。当看完第二季的我蓦然回首&#xff0c;发现这才是最最贴切的评价&am…

Centos7 开机显示 ERST: Failed to get Error Log Address Range” 导致无法开机解决方法

开机显示 ERST: Failed to get Error Log Address Range” 导致无法开机&#xff0c;也无法重新安装系统&#xff0c;解决方法&#xff1a;开机进入BIOS &#xff0c; 关闭ACPI选项即可正常开机 转载于:https://www.cnblogs.com/zhangjianghua/p/6376811.html

Spring MVC 3模板和Apache Tiles

对于任何Web应用程序而言&#xff0c;有效的设计考虑因素是使用模板引擎&#xff08;或工具&#xff09;&#xff0c;并且由于具有Spring的“可插拔”特性&#xff0c;因此集成模板机制&#xff08;例如Apache Tiles&#xff09;的确要容易得多。 在这篇简单的文章中&#xff0…

js 判断浏览器是否64位

js判断是否64位 浏览器 navigator.userAgent.match(/x64/i); 转载于:https://www.cnblogs.com/fanlinglong/p/7298733.html

浙江大学linux网络通信,浙江大学钟财军副教授——“Wireless Powered Communication Networks”...

2016年5月17日&#xff0c;浙江大学钟财军副教授应徐正元教授邀请在中科大西区科技实验楼东楼十层1011会议室做了一场题为“Wireless Powered Communication Networks”的学术报告。报告会由龚晨教授主持&#xff0c;共50余名师生参加。此次报告会得到了“中科院无线光电通信重…

[基础]PeopleSoft中的作业和调度作业集合定义

PeopleSoft进程调度器可以使一个或多个进程作为一个组。这个组在PeopleSoft中被称为作业(Job)。 PeopleSoft进程被定义为单个任务&#xff0c;程序或例程&#xff0c;例如cobol程序或AE程序或客户端运行的SQR。 作业由一个或多个相同或不同类型的进程组成&#xff0c;他们作为一…

win10 hyper-v 虚拟机ping不通宿主机问题

在Windows10 Hyper-V 中安装 Linux (Centos6.9)虚拟机无法 ping 通宿主机 这种情况下关闭 Windows 防火墙就能ping通了&#xff0c;当然关闭防火墙不安全。所以需要 做以下步骤: 控制面板-》系统和安全-》Windows防火墙-》高级设置-》入站规则 启用下图被红框选中的两个选…

Java枚举:您拥有优雅,优雅和力量,这就是我所爱!

当Java 8即将面世时&#xff0c;您确定您对Java 5中引入的枚举很了解吗&#xff1f; Java枚举仍然被低估了&#xff0c;很可惜&#xff0c;因为它们比您想象的要有用&#xff0c;它们不仅仅用于通常的枚举常量&#xff01; Java枚举是多态的 Java枚举是可以包含行为甚至数据的…

2)网页请求顺序

&#xff08;1&#xff09;分析浏览器访问一个网页的完整流程逻辑过程&#xff1a;http&#xff1a;//www.abc.com/def/ 转载于:https://www.cnblogs.com/xiaoyoucai/p/7306246.html

JavaOne 2012:调查JVM水晶球

我回到了希尔顿的A / B广场参加星期一的第四届会议&#xff0c;但首先去了希尔顿的顶层收拾午餐。 我每年都在JavaOne的第一天被提醒&#xff0c;涉及到每个人的第一天的午餐获取过程令人惊讶地令人沮丧。 我知道我在JavaOne的第一年的经历使我有些困惑&#xff0c;因为我不确定…

Jquery Memo

jQuery选择器 $( "#id" ) $( ".class" )$( "element" )全选择器&#xff08;*选择器&#xff09; * {padding: 0; margin: 0;}//子选择器 //$(div > p) 选择所有div元素里面的子元素P//后代选择器 //$(div p) 选择所有div元素…

使用JMSTester对JMS层进行基准测试

对于我去过的大多数客户端&#xff0c;使用ActiveMQ扩展JMS消息传递层是一个优先事项。 有多种方法可以实现这一目标&#xff0c;但毫无疑问&#xff0c;创建基准测试并在实际硬件上分析架构&#xff08;或者正如我的同事Gary Tully所说的“询问机器”&#xff09;是第一步。 但…

Js引擎解析执行 阅读笔记

Js引擎解析执行 阅读笔记 一篇阅读笔记http://km.oa.com/group/2178/articles/show/145691?kmrefsearch&from_page1&no1 早期:遍历语法树 Js引擎最早使用的是遍历语法树方式 &#xff08;syntax tree walker&#xff09; 分为两步 词法分析语法分析词法分析 i a b *…

c语言长空格的代码是什么,c语言中表示空格的是什么代码?

分析如下&#xff1a;不是所有字符都需要转义的&#xff0c;空格直接就敲空格&#xff0c;或者使用ASCII码值赋值为32。空格没有转义字符。合法转义字符如下&#xff1a;\a 响铃(BEL) 、\b 退格(BS)、\f 换页(FF)、\n 换行(LF)、\r 回车(CR)、\t 水平制表(HT)、\v 垂直制表(VT)…

JavaOne 2012:101种改进Java的方法-开发人员参与为何如此重要

Bruno Souza &#xff0c; Martijn Verburg和Heather Vancura在希尔顿酒店的大陆宴会厅4中展示了“ 101种改进Java的方法&#xff1a;开发人员参与为何如此重要”。 他们将其分为自己最熟悉的领域。 SouJava的创始人兼协调员 Souza谈到了通过用户组的更大参与。 Verberg也在伦敦…

评论:Arun Gupta撰写的“ Java EE 6 Pocket Guide”

这是我很高兴写的评论。 我的朋友阿伦&#xff08;Arun&#xff09;发布了Java EE 6袖珍指南&#xff0c;该指南将在您订购时尽早提供。 我很早就知道这本书&#xff0c;因为我很乐意对其进行回顾&#xff0c;也感谢有机会为本书做出一点贡献&#xff01; Kindle版本已经可用&a…

双android手机同步工具,手机同步软件Android Manager使用图文教程

类型&#xff1a;手机工具大小&#xff1a;23.6M语言&#xff1a;繁体 评分&#xff1a;6.6标签&#xff1a;立即下载Android Manager 可透过五个简单的步骤设定&#xff1a;步骤一. 在计算机上安装 Android Manager请点选以下之下载按钮或直接于计算机上输入下载网址&#xff…

android拍照截图组件,Android截图命令screencap与视频录制命令screenrecord(示例代码)...

查看帮助命令[email protected] ~$ adb shell screencap -vscreencap: invalid option -- vusage: screencap [-hp] [-d display-id] [FILENAME]-h: this message-p: save the file as a png.-d: specify the display id to capture, default 0.If FILENAME ends with .png it …