<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Voland.com.cn &#187; struts2</title>
	<atom:link href="http://www.voland.com.cn/tag/struts2/feed" rel="self" type="application/rss+xml" />
	<link>http://www.voland.com.cn</link>
	<description>人生百年,诸事记之</description>
	<lastBuildDate>Thu, 02 Feb 2012 23:09:02 +0000</lastBuildDate>
	<language>zh</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Struts2项目中配置多个过滤器</title>
		<link>http://www.voland.com.cn/struts2-project-using-multiple-filters</link>
		<comments>http://www.voland.com.cn/struts2-project-using-multiple-filters#comments</comments>
		<pubDate>Sun, 17 Oct 2010 14:49:17 +0000</pubDate>
		<dc:creator>Nortan</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[软件开发]]></category>
		<category><![CDATA[filter]]></category>
		<category><![CDATA[struts2]]></category>
		<category><![CDATA[过滤器]]></category>

		<guid isPermaLink="false">http://www.voland.com.cn/?p=535</guid>
		<description><![CDATA[Struts2中的项目中，都会在web.xml文件中配置org.apache.struts2.dispatcher.FilterDispatcher这个filter，使得Struts能起作用，然而如果项目中使用多个过滤器，则在web.xml中FilterDispatcher这个过滤器需要配置在所有filter的后面，防止你的过滤器被Struts的这个过滤器中断你的配置，造成你的Filter无法执行。 以前做项目没有太注意，一般情况下FilterDispatcher也是放在最后，自己总认为只要配置好了，一切只是执行顺序问题，但最近开始一个项目，把一个Filter放在了FilterDispatcher的后面，启动过程中显示Filter已经正常初始化，确总是没有执行。看了看Struts的源码，原来问题出在FilterDispatcher这个Filter上，如下是doFilter方法中的代码： public void doFilter&#40;ServletRequest req, ServletResponse res, FilterChain chain&#41; throws IOException, ServletException &#123; HttpServletRequest request = &#40;HttpServletRequest&#41; req; HttpServletResponse response = &#40;HttpServletResponse&#41; res; ServletContext servletContext = getServletContext&#40;&#41;; &#160; String timerKey = &#34;FilterDispatcher_doFilter: &#34;; try &#123; UtilTimerStack.push&#40;timerKey&#41;; request = prepareDispatcherAndWrapRequest&#40;request, response&#41;; ActionMapping mapping; try &#123; mapping = actionMapper.getMapping&#40;request, dispatcher.getConfigurationManager&#40;&#41;&#41;; &#125; catch &#40;Exception ex&#41; &#123; LOG.error&#40;&#34;error [...]]]></description>
			<content:encoded><![CDATA[<p>Struts2中的项目中，都会在web.xml文件中配置org.apache.struts2.dispatcher.FilterDispatcher这个filter，使得Struts能起作用，然而<span style="color: #ff0000;">如果项目中使用多个过滤器，则在web.xml中FilterDispatcher这个过滤器需要配置在所有filter的后面，防止你的过滤器被Struts的这个过滤器中断你的配置，造成你的Filter无法执行</span>。</p>
<p>以前做项目没有太注意，一般情况下FilterDispatcher也是放在最后，自己总认为只要配置好了，一切只是执行顺序问题，但最近开始一个项目，把一个Filter放在了FilterDispatcher的后面，启动过程中显示Filter已经正常初始化，确总是没有执行。看了看Struts的源码，原来问题出在FilterDispatcher这个Filter上，如下是doFilter方法中的代码：</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> doFilter<span style="color: #009900;">&#40;</span>ServletRequest req, ServletResponse res, FilterChain chain<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">IOException</span>, ServletException <span style="color: #009900;">&#123;</span>
        HttpServletRequest request <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>HttpServletRequest<span style="color: #009900;">&#41;</span> req<span style="color: #339933;">;</span>
        HttpServletResponse response <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>HttpServletResponse<span style="color: #009900;">&#41;</span> res<span style="color: #339933;">;</span>
        ServletContext servletContext <span style="color: #339933;">=</span> getServletContext<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #003399;">String</span> timerKey <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;FilterDispatcher_doFilter: &quot;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
            UtilTimerStack.<span style="color: #006633;">push</span><span style="color: #009900;">&#40;</span>timerKey<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            request <span style="color: #339933;">=</span> prepareDispatcherAndWrapRequest<span style="color: #009900;">&#40;</span>request, response<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            ActionMapping mapping<span style="color: #339933;">;</span>
            <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
                mapping <span style="color: #339933;">=</span> actionMapper.<span style="color: #006633;">getMapping</span><span style="color: #009900;">&#40;</span>request, dispatcher.<span style="color: #006633;">getConfigurationManager</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> ex<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                LOG.<span style="color: #006633;">error</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;error getting ActionMapping&quot;</span>, ex<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                dispatcher.<span style="color: #006633;">sendError</span><span style="color: #009900;">&#40;</span>request, response, servletContext, HttpServletResponse.<span style="color: #006633;">SC_INTERNAL_SERVER_ERROR</span>, ex<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000000; font-weight: bold;">return</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
&nbsp;
            <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>mapping <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #003399;">String</span> resourcePath <span style="color: #339933;">=</span> RequestUtils.<span style="color: #006633;">getServletPath</span><span style="color: #009900;">&#40;</span>request<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
                <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&quot;</span>.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span>resourcePath<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000066; font-weight: bold;">null</span> <span style="color: #339933;">!=</span> request.<span style="color: #006633;">getPathInfo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    resourcePath <span style="color: #339933;">=</span> request.<span style="color: #006633;">getPathInfo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
&nbsp;
                <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>serveStatic <span style="color: #339933;">&amp;&amp;</span> resourcePath.<span style="color: #006633;">startsWith</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/struts&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    findStaticResource<span style="color: #009900;">&#40;</span>resourcePath, findAndCheckResources<span style="color: #009900;">&#40;</span>resourcePath<span style="color: #009900;">&#41;</span>, request, response<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
                    chain.<span style="color: #006633;">doFilter</span><span style="color: #009900;">&#40;</span>request, response<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//激活下一个过滤器</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #666666; font-style: italic;">// The framework did its job here</span>
                <span style="color: #000000; font-weight: bold;">return</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            dispatcher.<span style="color: #006633;">serviceAction</span><span style="color: #009900;">&#40;</span>request, response, servletContext, mapping<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">finally</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
                ActionContextCleanUp.<span style="color: #006633;">cleanUp</span><span style="color: #009900;">&#40;</span>req<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">finally</span> <span style="color: #009900;">&#123;</span>
                UtilTimerStack.<span style="color: #006633;">pop</span><span style="color: #009900;">&#40;</span>timerKey<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>看上面的代码 mapping=actionMapper.getMapping(request,dispatcher.getConfigurationManager()); 这个是得到当前请求Action的信息，比如Action的名字，命名空间，result值等，只要这个mapping不为null，过滤器就会直接执行action而不会激活下一个过滤器，那么什么时候才会激活下一个过滤器呢？答案要满足两个条件，这两个条件是：<span id="more-535"></span></p>
<p>* 不能是一个存在action。</p>
<p>* serveStatic(struts.serve.static配置项值)为true时，不能是一个相对路径以”/struts”开头的请求，如（/struts.html,/struts/index.html）, 因为这样过滤器会认为你在找struts内部的静态资源，谈后它会去诸如struts的模板文件夹下去找这些静态资源。 必须是一个类似于/index.html,/news/index.html这样的请求或者serveStatic为false时请求一个不存在的action。</p>
<p>当满足以上条件时才会激活下一个过滤器。看来这限制还挺多的，所以这就提出来一个注意事项了，<span style="color: #ff0000;">当你在web.xml配置多个过滤器的时候，一定要把struts的过滤器放到最后，这样可以防止过滤器链被中断，导致你配置的其他过滤器不起作用</span>。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.voland.com.cn/struts2-project-using-multiple-filters/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>java web开发框架组合所需要的jar包</title>
		<link>http://www.voland.com.cn/java-web-development-framework-in-the-popular-combination-of-the-required-jar-package</link>
		<comments>http://www.voland.com.cn/java-web-development-framework-in-the-popular-combination-of-the-required-jar-package#comments</comments>
		<pubDate>Wed, 02 Jun 2010 01:28:56 +0000</pubDate>
		<dc:creator>Nortan</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[软件开发]]></category>
		<category><![CDATA[ibatis]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[struts2]]></category>

		<guid isPermaLink="false">http://www.voland.com.cn/?p=495</guid>
		<description><![CDATA[现在使用java开发项目,比较流行的组合是struts + ibatis +spring ,这个组合现在大伙都用2.x版本,struts是非常好的web开发框架,而ibatis则负责对数据库的直接访问,spring负责业务层,这里并没有提到hibernate,不是因为它不强大,而是因为太强大,我们有时不太好驾驭它,用得不好,效率会非常的低,所以我决定放弃它. 如下给出的组合可能版本会有些变动,不过只要不是大版本升级,应该都可以匹配上,所以打不到想要的包时,相差不大都可以用. struts 2应用只需要下列几个必须的jar： commons-logging-1.0.4.jar freemarker-2.3.8.jar ognl-2.6.11.jar struts2-core-2.0.11.jar xwork-2.0.4.jar ibatis2 应用只需要下列几个必须的jar： commons-collections.jar commons-dbcp.jar commons-pool.jar ibatis-2.3.0.677.jar mysql-connector-java-5.0.6.jar //这个数据库驱动,会根据你的数据库类型有所变化 spring2应用只需要下列几个必须的jar： spring.jar struts2-spring-plugin-2.0.11.2.jar dwr应用只需要下列一个必须的jar： dwr.jar 文件上传应用只需要下列几个必须的jar： commons-fileupload-1.2.jar commons-io-1.3.2.jar 其它插件:（只在开发的时候用到，发布时可以踢掉，tomcat自带。） jsp-api.jar servlet-api.jar log4j-1.2.15.jar]]></description>
			<content:encoded><![CDATA[<p>现在使用java开发项目,比较流行的组合是struts + ibatis +spring ,这个组合现在大伙都用2.x版本,struts是非常好的web开发框架,而ibatis则负责对数据库的直接访问,spring负责业务层,这里并没有提到hibernate,不是因为它不强大,而是因为太强大,我们有时不太好驾驭它,用得不好,效率会非常的低,所以我决定放弃它.</p>
<p>如下给出的组合可能版本会有些变动,不过只要不是大版本升级,应该都可以匹配上,所以打不到想要的包时,相差不大都可以用.<span id="more-495"></span></p>
<p>struts 2应用只需要下列几个必须的jar：<br />
commons-logging-1.0.4.jar<br />
freemarker-2.3.8.jar<br />
ognl-2.6.11.jar<br />
struts2-core-2.0.11.jar<br />
xwork-2.0.4.jar</p>
<p>ibatis2 应用只需要下列几个必须的jar：<br />
commons-collections.jar<br />
commons-dbcp.jar<br />
commons-pool.jar<br />
ibatis-2.3.0.677.jar<br />
mysql-connector-java-5.0.6.jar //这个数据库驱动,会根据你的数据库类型有所变化</p>
<p>spring2应用只需要下列几个必须的jar：<br />
spring.jar<br />
struts2-spring-plugin-2.0.11.2.jar</p>
<p>dwr应用只需要下列一个必须的jar：<br />
dwr.jar</p>
<p>文件上传应用只需要下列几个必须的jar：<br />
commons-fileupload-1.2.jar<br />
commons-io-1.3.2.jar</p>
<p>其它插件:（只在开发的时候用到，发布时可以踢掉，tomcat自带。）<br />
jsp-api.jar<br />
servlet-api.jar<br />
log4j-1.2.15.jar</p>
]]></content:encoded>
			<wfw:commentRss>http://www.voland.com.cn/java-web-development-framework-in-the-popular-combination-of-the-required-jar-package/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

