弃成见,反省,并重新认识struts.i18n.encoding

2023-10-29 16:40

本文主要是介绍弃成见,反省,并重新认识struts.i18n.encoding,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

[size=medium]之前和大家讨论了struts2.0中struts.i18n.encoding参数的作用,但是由于自己的不严谨的态度使自己得出了片面得结论,在此表示道歉.当然我们程序员的目的只有一个,就是寻找真相.所以下面我会和大家一起来重新理解struts.i18n.encoding参数的含义.

下面我从一个例子来重新审视这个参数的作用.首先我们来做一个实验,看看改参数是否用在了请求流程,是否用在了返回流程.首先下载struts2.0所有的包,我们会得到一个blank的例子程序.

首先有三个返回类型:
<constant name="struts.enable.DynamicMethodInvocation" value="true" /><constant name="struts.devMode" value="false" />
<constant name="struts.i18n.encoding" value="UTF-8" />
<constant name="struts.velocity.manager.classname" value="demo.DemoVelocityManager"/><package name="/" namespace="/" extends="struts-default"><action name="test" class="demo.HelloWorldAction"><result name="jsp">helloworld.jsp</result><result name="velocity" type="velocity">helloworld.vm</result><result name="freemarker" type="freemarker">helloworld.ftl</result></action></package>


接着定义action:
访问:
http://localhost:8080/demo/test!jsp.action

http://localhost:8080/demo/test!freemarker.action


http://localhost:8080/demo/test!velocity.action

看上去返回流的编码没有变化,都是iso-8859-1.
struts.i18n.encoding换成GBK之后,3个页面的requestEncoding:都变成了requestEncoding:GBK,也就是该参数确实用在了请求流程中.
而且response的encoding还是iso-8859-1,看到这个结果可能有人会产生疑惑,不是说这个参数可以用在返回流中的吗,为什么没有体现出来呢?

其实问题出在一个时间上,但是请大家看看HelloWorldAction里的代码,其实是有问题的,因为在check方法是在action里的方法里调用的.而这个时候没有执行到result,struts2.0会在result中会设置response的一些参数(如果需要设置的话),所以这个时候的response中的encoding其实不是response最终的encoding.如何才能看到response中最终的encoding呢,只有在result被执行之后.

于是下面我们写一个filter.如下:

然后在web.xml中配置在struts2的filter之前:

然后分别请求

http://localhost:8080/demo/test!jsp.action

http://localhost:8080/demo/test!freemarker.action

http://localhost:8080/demo/test!velocity.action
由此可见在freemarker和velocity中struts.i18n.encoding确实被用来作为response返回流中content-type的charset值.

那么为什么jsp不是这样的呢.
因为jsp并不是模板,而是一个类,在真正运行的时候,servlet容器会把jsp编译成一个类.我们的HelloWorld.jsp就变成了HelloWorld_jsp.java,在这个类中我们可以看到如下代码:
修改jsp中@page标签中的charset为GBK之后,控制台也输出了responseEncoding:GBK
这说明,在jsp中,返回流的参数是由jsp的@page标签指定的,而不是有truts.i18n.encoding指定的.

由此可见, struts.i18n.encoding确实用在了请求和返回两个阶段,而且在返回阶段不同的view技术可能使用或者不使用struts.i18n.encoding,freemarker和velocity会以该值作为返回流的charset,而jsp会以页面上的@page标签中的charset作为返回流的charset.

至于源代码,它们分别在VelocityResult,freemarkermanager,dispatcher, FilterDispatcher,大家有兴趣可以自行查看.

对于之前误导大家认为该参数只用在返回流程中,我向大家说一声对不起.从这件事情中我也学习到很多,尤其是态度上,之前做实验的时候发现这个参数用在一个地方,便认为它只会用在这个地方,但是事实上这种想法是不对的,它用在一个地方不代表不能用在另外一个地方.我们应该抱着更为严谨的态度去看待所有的问题,其实当时只要在源码里search “struts.i18n.encoding”这个字符串就会立刻得到完整的结论,但是正因为自己不严谨的态度导致之前作出了片面的结论.

最后共享一些我放在之前放在一边的座右铭:态度决定高度,所以不管做什么事情都要先端正自己的态度,希望能与大家共勉.

附,由于ahuaxuan水平有限,很有可能还是没有挖掘出更深层次的见解,希望您能多指正.
[/size]  

这篇关于弃成见,反省,并重新认识struts.i18n.encoding的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/301933

相关文章

在struts.xml中,如何配置请求转发和请求重定向!

<span style="font-size:18px;"><span style="white-space:pre"> </span><!--<strong>下面用请求转发action </strong>,<strong>这样过去id不会丢</strong>,如果用重定向的话,id会丢 --><result name="updatePopedom"<span style="color:#ff00

修改struts中:fielderror.ftl 模板

在项目登录页面: 当验证码输入有误时,应该提示:验证码输入有误,请重新输入 ,但是页面出现乱了! 错误原因: 在产生错误信息时,页面中增加了<ul> <li><span></span></li></ul>标签,该如何修改改, 解决方法(一): 在项目的src下,新建文件夹:template.simple,在文件夹里面放修改好的fielderror.ftl文件。 fi

Struts 2的工作流程

基本简要流程如下:1、客户端浏览器发出HTTP请求。2、根据web.xml配置,该请求被 FilterDispatcher接收。3、根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton。4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。5、Action执行完毕,根据 struts.xml中的配置找到对应的返回结果result

自我反省(一)

上个学期队友陈彤问我想和他一起做项目不,我想有项目当然答应了下来,这个项目是和信管院一起做的——哈尔滨日租房开发软件。我和陈彤负责技术,他们学院的人负责销售,一开始我们都信心满满,但是我和陈彤现在除了c/c++其它什么都不会,逼着自己学安卓开发,项目中间陈彤把浩然大神也加进来了,有他在我们都觉得这个项目一定可以完成。但是我们把事情想简单了,或许浩然大神做软件没问题,但由于我和陈彤是小白,什么都

[LeetCode] 820. Short Encoding of Words

题:https://leetcode.com/problems/short-encoding-of-words/ 题目大意 参考题目 思路 set 集合 将所有word 放入set中,然后遍历所有set中的word,将word的从头的子串都从set中删除,最后统计 set中所有(word 的长度 + 1)(’#’) class Solution {public int minimumL

struts2 struts.xml常用常量配置

<constant name="struts.i18n.encoding" value="UTF-8" /> 指定Web应用的默认编码集,相当于调用HttpServletRequest的setCharacterEncoding方法 <constant name="struts.ui.theme" value="simple" /> 设置页面struts标签的样式     <consta

struts 页面取值问题

Struts2中的OGNL表达式语言是对Xwork的OGNL的封装。我们要理解一下几点:  1 . Struts2 中将 ActionContext 作为 OGNL 的上下文环境( ActionContext 内部含有一个 Map 对象)   2 . Struts2 中的 OGNL 表达式语言的根对象是一个 ValueStack , ValueStack 中的每一

whose UTF8 encoding is longer than the max length 32766

问题描述:java.lang.IllegalArgumentException: Document contains at least one immense term in field=“cf_jg.keyword” (whose UTF8 encoding is longer than the max length 32766) 原因:设置为keyword类型的字段,插入很长的大段内容后,报

struts和struts2的区别

2012-07-08 14:30 liujunzyf | 分类:JAVA相关 | 浏览8116次 分享到: 2012-07-08 14:41 提问者采纳 你问的应该是 struts1 和struts2 的区别:Struts2与Struts1的对比 1,在Action实现类方面: Struts1要求Action类继承一个抽象基类;Str

struts通配符配置

通配符配置 <!--method属性值为1表示匹配一个*。如用户的请求是book_add.action。则name的属性值是book_add,method的属性值是add  --><action name="book_*" class="action.AddBook" method="{1}"><result name="success">/success.jsp</result><