﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-心如止水 一心向佛-随笔分类-java相关技术</title><link>http://www.blogjava.net/yangaiyou/category/24337.html</link><description>茶亦醉人何必酒  书能香我无须花！</description><language>zh-cn</language><lastBuildDate>Sat, 10 Nov 2007 20:53:06 GMT</lastBuildDate><pubDate>Sat, 10 Nov 2007 20:53:06 GMT</pubDate><ttl>60</ttl><item><title>applet绘制曲线图</title><link>http://www.blogjava.net/yangaiyou/archive/2007/11/11/159659.html</link><dc:creator>杨爱友</dc:creator><author>杨爱友</author><pubDate>Sat, 10 Nov 2007 18:09:00 GMT</pubDate><guid>http://www.blogjava.net/yangaiyou/archive/2007/11/11/159659.html</guid><wfw:comment>http://www.blogjava.net/yangaiyou/comments/159659.html</wfw:comment><comments>http://www.blogjava.net/yangaiyou/archive/2007/11/11/159659.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yangaiyou/comments/commentRss/159659.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangaiyou/services/trackbacks/159659.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 程序功能：利用给出的三组数据点绘制水库水位面积、水位库容两条曲线。当鼠标在applet上移动时，定位显示当前的水位、面积、库容值。为响应公司的开发规范要求，注释很多，不用多解释，如果朋友能看得懂，那说明我写的思路清晰，语言表达到位，希望大家能看懂。<br>心得体会：<br>     1. 在编写这段代码时，犯的第一个错误就是企图通过lagrange插值定理找到一条通过所有点的方程式，然后再在X轴上多取一些点，最后再利用这个方程式求出所有X值对应的Y坐标。错就错在，构造的那个方程曲线基本上不可能是一条平滑走势的曲线，而是一条波动性非常大的曲线，所以当X=91时，Y可能是200，而当X=91.001时，Y则可能会是-1000000，用这些点来绘制图线显然是不对的。正确的方法应该是通过每三个点构造一个二次方程式，在这个区间上对X进行多次插值，利用方程式求出Y值，利用这样得出的点来绘制图线才是合理的。<br>     2. 在这个例子中，有两种线：第一是显示出来的曲线；第二是鼠标移动时，十字交叉点走过的路线。很显然，显示出来的曲线是由多小段直线组成的。而十字交叉点又怎么绘出来的呢？显然要&nbsp;&nbsp;<a href='http://www.blogjava.net/yangaiyou/archive/2007/11/11/159659.html'>阅读全文</a><img src ="http://www.blogjava.net/yangaiyou/aggbug/159659.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangaiyou/" target="_blank">杨爱友</a> 2007-11-11 02:09 <a href="http://www.blogjava.net/yangaiyou/archive/2007/11/11/159659.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring mvc支持</title><link>http://www.blogjava.net/yangaiyou/archive/2007/09/09/143849.html</link><dc:creator>杨爱友</dc:creator><author>杨爱友</author><pubDate>Sun, 09 Sep 2007 15:17:00 GMT</pubDate><guid>http://www.blogjava.net/yangaiyou/archive/2007/09/09/143849.html</guid><wfw:comment>http://www.blogjava.net/yangaiyou/comments/143849.html</wfw:comment><comments>http://www.blogjava.net/yangaiyou/archive/2007/09/09/143849.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/yangaiyou/comments/commentRss/143849.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangaiyou/services/trackbacks/143849.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 由前端控制器负责判断用户的请求要分派给哪一个控制对象，借此达到控制用户请求资源的目的。&nbsp;&nbsp;<a href='http://www.blogjava.net/yangaiyou/archive/2007/09/09/143849.html'>阅读全文</a><img src ="http://www.blogjava.net/yangaiyou/aggbug/143849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangaiyou/" target="_blank">杨爱友</a> 2007-09-09 23:17 <a href="http://www.blogjava.net/yangaiyou/archive/2007/09/09/143849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring 2.0使用手册学习笔记（二） </title><link>http://www.blogjava.net/yangaiyou/archive/2007/09/06/143038.html</link><dc:creator>杨爱友</dc:creator><author>杨爱友</author><pubDate>Wed, 05 Sep 2007 16:06:00 GMT</pubDate><guid>http://www.blogjava.net/yangaiyou/archive/2007/09/06/143038.html</guid><wfw:comment>http://www.blogjava.net/yangaiyou/comments/143038.html</wfw:comment><comments>http://www.blogjava.net/yangaiyou/archive/2007/09/06/143038.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/yangaiyou/comments/commentRss/143038.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangaiyou/services/trackbacks/143038.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Spring AOP中的一些概念及Before Advice实例解析&nbsp;&nbsp;<a href='http://www.blogjava.net/yangaiyou/archive/2007/09/06/143038.html'>阅读全文</a><img src ="http://www.blogjava.net/yangaiyou/aggbug/143038.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangaiyou/" target="_blank">杨爱友</a> 2007-09-06 00:06 <a href="http://www.blogjava.net/yangaiyou/archive/2007/09/06/143038.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java2核心技术之代理模式</title><link>http://www.blogjava.net/yangaiyou/archive/2007/09/04/142484.html</link><dc:creator>杨爱友</dc:creator><author>杨爱友</author><pubDate>Mon, 03 Sep 2007 17:15:00 GMT</pubDate><guid>http://www.blogjava.net/yangaiyou/archive/2007/09/04/142484.html</guid><wfw:comment>http://www.blogjava.net/yangaiyou/comments/142484.html</wfw:comment><comments>http://www.blogjava.net/yangaiyou/archive/2007/09/04/142484.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yangaiyou/comments/commentRss/142484.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangaiyou/services/trackbacks/142484.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 代理模式：为其他对象提供一种代理以控制对这个对象的访问。这种功能只有在编译无法确定要实现哪个接口时才有必要使用。&nbsp;&nbsp;<a href='http://www.blogjava.net/yangaiyou/archive/2007/09/04/142484.html'>阅读全文</a><img src ="http://www.blogjava.net/yangaiyou/aggbug/142484.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangaiyou/" target="_blank">杨爱友</a> 2007-09-04 01:15 <a href="http://www.blogjava.net/yangaiyou/archive/2007/09/04/142484.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring2.0使用手册学习笔记（一）</title><link>http://www.blogjava.net/yangaiyou/archive/2007/09/04/142480.html</link><dc:creator>杨爱友</dc:creator><author>杨爱友</author><pubDate>Mon, 03 Sep 2007 16:22:00 GMT</pubDate><guid>http://www.blogjava.net/yangaiyou/archive/2007/09/04/142480.html</guid><wfw:comment>http://www.blogjava.net/yangaiyou/comments/142480.html</wfw:comment><comments>http://www.blogjava.net/yangaiyou/archive/2007/09/04/142480.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/yangaiyou/comments/commentRss/142480.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangaiyou/services/trackbacks/142480.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 有关spring 几个重要的概念理解和两个IoC实例解析&nbsp;&nbsp;<a href='http://www.blogjava.net/yangaiyou/archive/2007/09/04/142480.html'>阅读全文</a><img src ="http://www.blogjava.net/yangaiyou/aggbug/142480.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangaiyou/" target="_blank">杨爱友</a> 2007-09-04 00:22 <a href="http://www.blogjava.net/yangaiyou/archive/2007/09/04/142480.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate检索策略</title><link>http://www.blogjava.net/yangaiyou/archive/2007/08/31/141837.html</link><dc:creator>杨爱友</dc:creator><author>杨爱友</author><pubDate>Fri, 31 Aug 2007 13:46:00 GMT</pubDate><guid>http://www.blogjava.net/yangaiyou/archive/2007/08/31/141837.html</guid><wfw:comment>http://www.blogjava.net/yangaiyou/comments/141837.html</wfw:comment><comments>http://www.blogjava.net/yangaiyou/archive/2007/08/31/141837.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yangaiyou/comments/commentRss/141837.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangaiyou/services/trackbacks/141837.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 系型数据库之所以强大，其中一个原因就是可以统一使用表来管理同类数据信息，并且可以在相关数据之间建立关系。作为支持关系型数据库的SQL语句来说，自然要对全面发挥这种强大功能提供支持，这个支持就是连接查询。同样作为一种关系型数据库的持久层框架，&nbsp;&nbsp;<a href='http://www.blogjava.net/yangaiyou/archive/2007/08/31/141837.html'>阅读全文</a><img src ="http://www.blogjava.net/yangaiyou/aggbug/141837.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangaiyou/" target="_blank">杨爱友</a> 2007-08-31 21:46 <a href="http://www.blogjava.net/yangaiyou/archive/2007/08/31/141837.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring+hibernate+struts整合开发实例（教程）</title><link>http://www.blogjava.net/yangaiyou/archive/2007/08/31/141693.html</link><dc:creator>杨爱友</dc:creator><author>杨爱友</author><pubDate>Fri, 31 Aug 2007 04:42:00 GMT</pubDate><guid>http://www.blogjava.net/yangaiyou/archive/2007/08/31/141693.html</guid><wfw:comment>http://www.blogjava.net/yangaiyou/comments/141693.html</wfw:comment><comments>http://www.blogjava.net/yangaiyou/archive/2007/08/31/141693.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yangaiyou/comments/commentRss/141693.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangaiyou/services/trackbacks/141693.html</trackback:ping><description><![CDATA[<div class="ContentFont" id="NewaspContentLabel" style="padding-right: 10px; display: block; padding-left: 10px; padding-bottom: 0px; padding-top: 0px"><font id="font_word" style="font-size: 14px; font-family: 宋体, Verdana, Arial, Helvetica, sans-serif">简介： <br />
<br />
　　我看到很多项目中，开发者实现了自己的MVC框架，并不是因为他们想做同Struts根本不同的东西，而是因为他们并没有意识到如何扩展Struts。开发自己的MVC框架可以获得全部的控制权，但是这也意味着需要很多资源来实现它（人力物力），在紧张的日程安排下，有时候这是不可能的。 <br />
<br />
　　Struts不仅仅是一个强大的框架，同时它也是可扩展的。你可以以三种方式来扩展Struts。 <br />
<br />
　　1、PlugIn：如果你想在application startup或shutdown的时候做一些业务逻辑的话，那就创建你自己的PlugIn类。 <br />
<br />
　　2、RequestProcessor：如果你想在请求被处理的过程中某个时刻做一些业务逻辑的话，那么创建你自己的RequestProcessor类。比如说，在每次请求执行之前，你可以扩展RequestProcessor来检查用户是否登陆了以及他是否有权限去执行某个特定的action。 <br />
<br />
　　3、ActionServlet：如果你想在application startup和shutdown的时候以及请求被处理的时候做某些业务逻辑，你也可以扩张ActionServlet类。不过你应当在PlugIn和RequestProcessor都不能解决你的需求的时候来使用ActionServlet。 <br />
<br />
　　在这篇文章中，我们将使用一个Struts应用的示例来示范如何使用这三种方式来扩展Struts。示例程序的代码可以从http://www.onjava.com/onjava/2004/11/10/examples/sample1.zip下载。两个扩展Struts成功的范例是Struts自身的Validation和Tiles框架。 <br />
<br />
　　我们假设你已经比较熟悉Struts框架并且知道如何使用它创建一个简单的应用。如果你想知道更多关于Struts的内容，请参考官方主页。 <br />
<br />
　　PlugIn <br />
　　 <br />
　　PlugIn是一个接口，你可以创建一个实现该接口的类，当application startup或shutdown的时候做些事情。 <br />
<br />
　　比方说，我创建了一个使用Hibernate作为持久层的web应用，我想当应用启动的时候就初始化Hibernate，这样子当我的web应用受到第一个请求的时候，Hibernate就已经是配置好的并且可用的。同时我们想当application关闭的时候关闭Hibernate。我们可以用一个Hibernate PlugIn来实现这个需求，通过如下的两步： <br />
<br />
　　<strong>1、创建一个类实现了PlugIn接口</strong>： <br />
<br />
　　public class HibernatePlugIn implements PlugIn{ <br />
　　private String configFile; <br />
　　// This method will be called at application shutdown time <br />
　　public void destroy() { <br />
　　System.out.println("Entering HibernatePlugIn.destroy()"); <br />
　　//Put hibernate cleanup code here <br />
　　System.out.println("Exiting HibernatePlugIn.destroy()"); <br />
　　} <br />
　　//This method will be called at application startup time <br />
　　public void init(ActionServlet actionServlet, ModuleConfig config) <br />
　　throws ServletException { <br />
　　　System.out.println("Entering HibernatePlugIn.init()"); <br />
　　　System.out.println("value of init parameter " + <br />
　　　getConfigFile()); <br />
　　　System.out.println("Exiting HibernatePlugIn.init()"); <br />
　　} <br />
　　public String getConfigFile() { <br />
　　return name; <br />
　　} <br />
　　public void setConfigFile(String string) { <br />
　　configFile = string; <br />
　　} <br />
　　} <br />
<br />
　　实现PlugIn接口的类必须完成两个方法：init()和destroy()。当application startup的时候init()方法被调用，当shutdown的时候destroy()方法被调用。Struts还允许给你的PlugIn类传递初始化参数。为了传递参数，你必须在PlugIn类中为每一个参数创建JavaBean式的setter方法。在我们的HibernatePlugIn类中，我会把configFile的name作为参数传进去，而不是硬编码到程序中。 <br />
<br />
　<strong>　2、在struts-config.xml中添加如下的代码来通告Struts有新的PlugIn： <br />
</strong><br />
　　＜struts-config＞ <br />
　　... <br />
　　＜!-- Message Resources --＞ <br />
　　＜message-resources parameter= "sample1.resources.ApplicationResources"/＞ <br />
<br />
　　＜!-- Declare your plugins --＞ <br />
　　＜plug-in className="com.sample.util.HibernatePlugIn"＞ <br />
　　＜set-property property="configFile" value="/hibernate.cfg.xml"/＞ <br />
　　＜/plug-in＞ <br />
　　＜/struts-config＞ <br />
<br />
　　属性className是实现了PlugIn接口的类的全限定名。对于每一个初始化参数，可以使用＜set-property＞元素传递参数。在我们的例子中，我要把config文件的名字传进去，所以使用了一个带有配置文件路径的＜set-property＞。 <br />
<br />
　　Struts的Tiles和Validator框架都使用PlugIn来读取配置文件进行初始化。另外两件PlugIn可以帮你做到的事情是： <br />
<br />
　　&#183;如果你的application依赖于某些配置文件，那么你可以在PlugIn类中检查它们是否可用，如果不可用的话抛出一个ServletException，这样就可以使ActionServlet变为不可用。 <br />
<br />
　　&#183;PlugIn接口的init()方法是你可以改变ModuleConfig的最后机会，ModuleConfig是一组静态配置信息的集合，用来描述基于Struts模块。Struts将会在所有PlugIn处理完后释放ModuleConfig。 <br />
　　 Request是如何被处理的 <br />
<br />
　　ActionServlet是Struts框架中唯一的Servlet，它负责处理所有request。无论何时接收到一个request，它都会先尝试为当前的request寻找一个sub-application。一旦一个sub-application被找到，ActionServlet就会为那个sub-application创建一个RequestProcessor对象，调用这个对象的process()方法并把HttpServletRequest和HttpServletResponse对象传入。 <br />
<br />
　　RequestProcessor.process()就是大部分request被处理的地方。process()方法使用了Template Method模式实现，其中有很多独立的方法来执行请求处理的每一步骤，这些方法将会在process方法中依次被调用。比如，将会有一个独立的方法用来寻找当前request对应的ActionForm类，一个方法来检查当前用户是否有执行action mapping所必须的权限。这些给与我们极大的灵活性。在发布的Struts包中有一个RequestProcessor类提供了请求处理每一步骤的默认实现。这就意味着你可以仅仅重写你感兴趣的方法，其它的使用默认的实现。举例来说，默认地Struts调用request.isUserInRole()来检查用户是否有权限执行当前的ActionMapping；这时如果你想通过查询数据库来实现，你所要做的就是重写processRoles()方法，通过查询出的用户是否拥有必须的权限来返回true或false。 <br />
<br />
　　首先我们将会看到缺省情况下，process()方法是如何实现的，然后我将会详细解释默认的RequestProcessor类中的每一个方法，这样你就可以决定哪一部分是你想要改变的。 <br />
<br />
　　public void process(HttpServletRequest request,HttpServletResponse response) <br />
　　throws IOException, ServletException { <br />
　　// Wrap multipart requests with a special wrapper <br />
　　request = processMultipart(request); <br />
　　// Identify the path component we will <br />
　　// use to select a mapping <br />
　　String path = processPath(request, response); <br />
　　if (path == null) { <br />
　　return; <br />
　　} <br />
　　if (log.isDebugEnabled()) { <br />
　　log.debug("Processing a '" + request.getMethod() + "' for path '" + path + "'"); <br />
　　} <br />
　　// Select a Locale for the current user if requested <br />
　　processLocale(request, response); <br />
　　// Set the content type and no-caching headers <br />
　　// if requested <br />
　　processContent(request, response); <br />
　　processNoCache(request, response); <br />
　　// General purpose preprocessing hook <br />
　　if (!processPreprocess(request, response)) { <br />
　　return; <br />
　　} <br />
　　// Identify the mapping for this request <br />
　　ActionMapping mapping = <br />
　　processMapping(request, response, path); <br />
　　if (mapping == null) { <br />
　　return; <br />
　　} <br />
　　// Check for any role required to perform this action <br />
　　if (!processRoles(request, response, mapping)) { <br />
　　return; <br />
　　} <br />
　　// Process any ActionForm bean related to this request <br />
　　ActionForm form = processActionForm(request, response, mapping); <br />
　　processPopulate(request, response, form, mapping); <br />
　　if (!processValidate(request, response, form, mapping)) { <br />
　　return; <br />
　　} <br />
　　// Process a forward or include specified by this mapping <br />
　　if (!processForward(request, response, mapping)) { <br />
　　return; <br />
　　} <br />
　　if (!processInclude(request, response, mapping)) { <br />
　　return; <br />
　　} <br />
　　// Create or acquire the Action instance to <br />
　　// process this request <br />
　　Action action = <br />
　　processActionCreate(request, response, mapping); <br />
　　if (action == null) { <br />
　　return; <br />
　　} <br />
　　// Call the Action instance itself <br />
　　ActionForward forward = processActionPerform(request, response,action, form, mapping); <br />
　　// Process the returned ActionForward instance <br />
　　processForwardConfig(request, response, forward); <br />
　　} <br />
<br />
　　1、processMutipart()：在这个方法中，Struts将会读取request来检查request的contentType是否是multipart/form-data。如果是的话，将会解析request并且将之包装到HttpServletRequest中。当你创建了一个HTML FORM用来提交数据，那么request的contentType默认就是application/x-www-form-urlencoded。但是如果你的form使用了file类型的input控件允许用户上传文件的话，你就必须将contentType改为multipart/form-data。如果是这样的情况，你就不能再通过getParameter()来获取用户提交的数据；你必须将request作为一个InputStream来读取，并且自己解析它来获得参数值。 <br />
<br />
　　2、processPath()：在这个方法中，Struts将会读取request的URI，来确定路径元素，这个元素是用来获取ActionMappint元素。 <br />
　　3、processLocale()：在这个方法中，Struts将会为当前request取得Locale，如果配置过的话，还可以将这个对象作为HttpSession中org.apache.struts.action.LOCALE属性的值而保存。作为这个方法的副作用，HttpSession将会被创建，如果你不想创建的话，你可以在ControllerConfig中将locale属性设为false，在struts-config.xml中象如下这样： <br />
<br />
　　＜controller＞ <br />
　　＜set-property property="locale" value="false"/＞ <br />
　　＜/controller＞ <br />
<br />
　　4、processContent()：通过调用response.setContentType()来为response设置contentType。这个方法首先会尝试从struts-config.xml配置中得到contentType。缺省情况下使用text/html。如果想覆盖它，可以象如下这样： <br />
<br />
　　＜controller＞ <br />
　　＜set-property property="contentType" value="text/plain"/＞ <br />
　　＜/controller＞ <br />
<br />
　　5、processNoCache()：如果配置是no-cache，Struts将会为每个response设置下面三个headers： <br />
<br />
　　requested in struts config.xml <br />
　　response.setHeader("Pragma", "No-cache"); <br />
　　response.setHeader("Cache-Control", "no-cache"); <br />
　　response.setDateHeader("Expires", 1); <br />
<br />
　　如果你想设置no-cache header，在struts-config.xml中加入下面信息： <br />
<br />
　　＜controller＞ <br />
　　＜set-property property="noCache" value="true"/＞ <br />
　　＜/controller＞ <br />
<br />
　　6、processPreprocess()：这个方法为预处理提供一个hook，可以在子类中覆盖它。它的缺省实现没有作任何事情，总是返回true。返回false的话将会终止当前请求的处理。 <br />
<br />
　　7、processMapping()：这个方法将会用路径信息得到一个ActionMapping对象。也就是struts-config.xml文件中的＜action＞元素： <br />
<br />
　　＜action path="/newcontact" type="com.sample.NewContactAction" name="newContactForm" scope="request"＞ <br />
　　＜forward name="sucess" path="/sucessPage.do"/＞ <br />
　　＜forward name="failure" path="/failurePage.do"/＞ <br />
　　＜/action＞ <br />
<br />
　　ActionMapping元素包含了Action类的名称和处理请求使用的ActionForm等等信息。它还包含当前ActionMapping配置的ActionForwards信息。 <br />
<br />
　　8、processRoles()：Struts web应用提供了一个授权方案。也就是说，一旦一个用户登入了容器，struts的processRoles()方法将会通过调用request.isUserInRole()，来检查他是否有必须的角色来运行一个给定的ActionMapping。 <br />
<br />
　　＜action path="/addUser" roles="administrator"/＞ <br />
<br />
　　假设你有一个AddUserAction并且你只想让administrator能够增加新的user。你所要做的就是给你的AddUserAction元素增加一个role属性，这个属性的值为administrator。这样，在运行AddUserAction之前，这个方法会确保用户拥有administraotr的角色。 <br />
<br />
　　9、processActionForm()：每一个ActionMapping都一个相应的ActionForm类。当Struts处理一个ActionMapping的时候，它将会从＜action＞元素的name属性中找出对应的ActionForm类的名称。 <br />
<br />
　　＜form-bean name="newContactForm" type="org.apache.struts.action.DynaActionForm"＞ <br />
　　＜form-property name="firstName" type="java.lang.String"/＞ <br />
　　＜form-property name="lastName" type="java.lang.String"/＞ <br />
　　＜/form-bean＞ <br />
<br />
　　在我们的例子中，它会先在request scope中检查是否有一个org.apache.struts.action.DynaActionForm类的对象存在。如果有它将会使用这个对象，如果没有它将会创建一个新的对象并把它设置在request scope。 <br />
<br />
　　10、processPopulate()：在这个方法中，Struts将会用相匹配的request参数装配ActionForm的实例变量。 <br />
<br />
　　11、processValidate()：Struts将会调用你的ActionForm类的validate方法。如果你从validate()返回ActionErrors，它将会将user重定向到＜action＞元素的input属性指定的页面。 <br />
<br />
　　12、processForward()和processInclude()：在这些方法中，Struts将会检查＜action＞元素的forward或include属性，如果找到了，将会把forward或include请求放置到配置的页面中。 <br />
<br />
　　＜action forward="/Login.jsp" path="/loginInput"/＞ <br />
　　＜action include="/Login.jsp" path="/loginInput"/＞ <br />
<br />
　　你可以从这些方法的名字上猜测它们的不同：processForward()最终调用RequestDispatcher.forward()，而processInclude()调用RequestDispatcher.include()。如果你同时配置了forward和include属性，它将会总是调用forward，因为forward先被处理。 <br />
<br />
　　13、processActionCreate()：这个方法从＜action＞元素的type属性中获取获得Action类的名字并且创建返回它的实例。在我们的例子中，它将会创建一个com.sample.NewContactAction类的实例。 <br />
<br />
　　14、processActionPerform()：这个方法调用你的Action类的excute()方法，你的业务逻辑也就是在excute方法中。 <br />
<br />
　　15、processForwardConfig()：你的Action类的excute()方法将会返回一个ActionForward对象，这个对象将指出哪个页面是显示给用户的页面。因此，Struts将会为那个页面创建一个RequestDispatcher，并且调用RequestDispatcher.forward()。 <br />
<br />
　　上面的列表说明了默认的RequestProcessor实现在处理请求时每一步作的工作，以及执行的顺序。正如你所看到的，RequestProcessor是非常灵活的，允许你通过设置＜controller＞元素的属性来配置它。举例来说，如果你的应用准备生成XML内容来代替HTML，你就可以通过设置controller元素的属性来通知Struts这些情况。 <br />
　　 <br />
　　<strong>创建你自己的RequestProcessor <br />
</strong><br />
　　通过上面，我们了解到了RequestProcessor的默认实现是如何工作的。现在我们要演示一个例子来说明如何定制你自己的RequestProcessor。为了展示创建用户定制的RequestProcessor，我们将会让我们的示例实现下面两个业务需求： <br />
<br />
　　&#183;我们想创建一个ContactImageAction类，它将生成图片而不是平常的HTML页面。 <br />
<br />
　　&#183;在每个请求处理之前，我们都想通过检查session中的userName属性来确定用户是否已经登陆。如果那个属性没有找到，我们会把用户重定向到登陆页面。 <br />
<br />
　　我们将分两步实现这些业务需求。 <br />
<br />
　　<strong>1、创建你的CustomRequestProcessor类，它将继承自RequestProcessor类，如下： <br />
</strong><br />
　　public class CustomRequestProcessor <br />
　　extends RequestProcessor { <br />
　　protected boolean processPreprocess ( <br />
　　HttpServletRequest request,HttpServletResponse response) { <br />
　　　HttpSession session = request.getSession(false); <br />
　　　//If user is trying to access login page <br />
　　　// then don't check <br />
　　　if( request.getServletPath().equals("/loginInput.do") <br />
　　|| request.getServletPath().equals("/login.do") ) <br />
　　　　return true; <br />
　　　//Check if userName attribute is there is session. <br />
　　　//If so, it means user has allready logged in <br />
　　　if( session != null &amp;&amp; session.getAttribute("userName") != null) <br />
　　　　return true; <br />
　　　else{ <br />
　　　　try{ <br />
　　　　　//If no redirect user to login Page <br />
　　　　　request.getRequestDispatcher("/Login.jsp").forward(request,response); <br />
　　　　}catch(Exception ex){ <br />
　　　　} <br />
　　　} <br />
　　　return false; <br />
　　} <br />
<br />
　　protected void processContent(HttpServletRequest request, <br />
　　HttpServletResponse response) { <br />
　　//Check if user is requesting ContactImageAction <br />
　　// if yes then set image/gif as content type <br />
　　if( request.getServletPath().equals("/contactimage.do")){ <br />
　　　response.setContentType("image/gif"); <br />
　　　return; <br />
　　} <br />
　　　super.processContent(request, response); <br />
　　}　 <br />
　　} <br />
<br />
　　在CustomRequestProcessor类的processPreprocess方法中，我们检查session的userName属性，如果没有找到，就将用户重定向到登陆页面。 <br />
<br />
　　对于生成图片作为输出的需求，我们必须覆盖processContent方法，首先检查请求是否是/contactimage路径。如果是的话，我们就会将contentType设置为image/gif；否则设置为text/html。 <br />
<br />
　　<strong>2、在你的struts-config.xml文件的＜action-mappint＞元素之后加入下面的文字，告诉Struts CustomRequestProcessor应当被用作RequestProcessor类： <br />
</strong><br />
　　＜controller＞ <br />
　　＜set-property property="processorClass"value="com.sample.util.CustomRequestProcessor"/＞ <br />
　　＜/controller＞ <br />
<br />
　　请注意，当你只有很少的action类需要生成非text/html类型的输出时，你覆写processContent()方法是OK的。如果不是这样子的话，你应该创建一个Struts的子应用来处理请求生成图片的Action，并为它们将contentType设置为image/gif。 <br />
<br />
　　Struts的Tiles框架就是使用它自己的RequestProcessor来装饰Struts的输出。 <br />
<br />
　　ActionServlet <br />
<br />
　　如果你查看你的Struts web应用的web.xml，你会看到这样的文字： <br />
<br />
　　＜web-app ＞ <br />
　　＜servlet＞ <br />
　　＜servlet-name＞action=＜/servlet-name＞ <br />
　　＜servlet-class＞org.apache.struts.action.ActionServlet＜/servlet-class＞ <br />
　　＜!-- All your init-params go here--＞ <br />
　　＜/servlet＞ <br />
　　＜servlet-mapping＞ <br />
　　＜servlet-name＞action＜/servlet-name＞ <br />
　　＜url-pattern＞*.do＜/url-pattern＞ <br />
　　＜/servlet-mapping＞ <br />
　　＜/web-app ＞ <br />
<br />
　　这意味着ActionServlet负责处理你所有Struts的请求。你可以创建一个ActionServlet的子类，当应用启动，关闭，每个请求的时候做一些特定的事情。但是在继承ActionServlet类之前，你应该尽量创建一个PlugIn或RequestProcessor去解决你的问题。在Servlet1.1之前，Tiles框架是基于ActionServlet来修饰生成的响应。但是从1.1之后，它开始使用TilesRequestProcessor类。 <br />
<br />
　　总结 <br />
<br />
　　决定开发你自己的MVC框架是一个非常大的决定，你必须要考虑开发和维护框架代码所花费的时间和资源。Struts是一个非常强大和稳定的框架，你可以修改它来满足你绝大多数的业务需求。 <br />
<br />
　　但另一方面，也不要草率地做出扩展Struts的决定。如果你在RequestProcessor中写了一些性能比较低的代码，它将会在每次请求时执行，因而降低你整个应用的效率。而且还是有一些情况，开发自己的MVC框架要比扩展Struts好。</font></div>
 <img src ="http://www.blogjava.net/yangaiyou/aggbug/141693.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangaiyou/" target="_blank">杨爱友</a> 2007-08-31 12:42 <a href="http://www.blogjava.net/yangaiyou/archive/2007/08/31/141693.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.net学习中...</title><link>http://www.blogjava.net/yangaiyou/archive/2007/08/30/141445.html</link><dc:creator>杨爱友</dc:creator><author>杨爱友</author><pubDate>Thu, 30 Aug 2007 09:16:00 GMT</pubDate><guid>http://www.blogjava.net/yangaiyou/archive/2007/08/30/141445.html</guid><wfw:comment>http://www.blogjava.net/yangaiyou/comments/141445.html</wfw:comment><comments>http://www.blogjava.net/yangaiyou/archive/2007/08/30/141445.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yangaiyou/comments/commentRss/141445.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangaiyou/services/trackbacks/141445.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 公司接到一个小项目，项目经理要我一起做，也好，也好，一个很好的学习机会。毕竟是微软支持的，我相信以后会有用场的。&nbsp;&nbsp;<a href='http://www.blogjava.net/yangaiyou/archive/2007/08/30/141445.html'>阅读全文</a><img src ="http://www.blogjava.net/yangaiyou/aggbug/141445.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangaiyou/" target="_blank">杨爱友</a> 2007-08-30 17:16 <a href="http://www.blogjava.net/yangaiyou/archive/2007/08/30/141445.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>servlet filter初探</title><link>http://www.blogjava.net/yangaiyou/archive/2007/08/29/140854.html</link><dc:creator>杨爱友</dc:creator><author>杨爱友</author><pubDate>Wed, 29 Aug 2007 04:40:00 GMT</pubDate><guid>http://www.blogjava.net/yangaiyou/archive/2007/08/29/140854.html</guid><wfw:comment>http://www.blogjava.net/yangaiyou/comments/140854.html</wfw:comment><comments>http://www.blogjava.net/yangaiyou/archive/2007/08/29/140854.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yangaiyou/comments/commentRss/140854.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangaiyou/services/trackbacks/140854.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一个完整的servlet 过滤器实例&nbsp;&nbsp;<a href='http://www.blogjava.net/yangaiyou/archive/2007/08/29/140854.html'>阅读全文</a><img src ="http://www.blogjava.net/yangaiyou/aggbug/140854.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangaiyou/" target="_blank">杨爱友</a> 2007-08-29 12:40 <a href="http://www.blogjava.net/yangaiyou/archive/2007/08/29/140854.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>搞不清的Hibernate检索策略</title><link>http://www.blogjava.net/yangaiyou/archive/2007/08/28/140308.html</link><dc:creator>杨爱友</dc:creator><author>杨爱友</author><pubDate>Tue, 28 Aug 2007 01:39:00 GMT</pubDate><guid>http://www.blogjava.net/yangaiyou/archive/2007/08/28/140308.html</guid><wfw:comment>http://www.blogjava.net/yangaiyou/comments/140308.html</wfw:comment><comments>http://www.blogjava.net/yangaiyou/archive/2007/08/28/140308.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/yangaiyou/comments/commentRss/140308.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangaiyou/services/trackbacks/140308.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: batch fetch inverse cascade outer-join lazy x-to-x load() get() find() 类级别 关联级别<br>都是些啥啊，看了好多网站都不能透彻的理清思路。 或许去看书才能理得清头绪。 &nbsp;&nbsp;<a href='http://www.blogjava.net/yangaiyou/archive/2007/08/28/140308.html'>阅读全文</a><img src ="http://www.blogjava.net/yangaiyou/aggbug/140308.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangaiyou/" target="_blank">杨爱友</a> 2007-08-28 09:39 <a href="http://www.blogjava.net/yangaiyou/archive/2007/08/28/140308.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate有关</title><link>http://www.blogjava.net/yangaiyou/archive/2007/08/24/139108.html</link><dc:creator>杨爱友</dc:creator><author>杨爱友</author><pubDate>Fri, 24 Aug 2007 07:16:00 GMT</pubDate><guid>http://www.blogjava.net/yangaiyou/archive/2007/08/24/139108.html</guid><wfw:comment>http://www.blogjava.net/yangaiyou/comments/139108.html</wfw:comment><comments>http://www.blogjava.net/yangaiyou/archive/2007/08/24/139108.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yangaiyou/comments/commentRss/139108.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangaiyou/services/trackbacks/139108.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 看了几天Hibernate参考文档，看得头大了，认识了许多新东西，该记的东西太多，也不知道哪些是重点，所以也没记录什么，下面这些我也不知道在说些什么，反正是在看的过程中自己写的，先记下来了，心烦那，还是找本教程之类的书看好，看得好辛苦，晕忽忽的。&nbsp;&nbsp;<a href='http://www.blogjava.net/yangaiyou/archive/2007/08/24/139108.html'>阅读全文</a><img src ="http://www.blogjava.net/yangaiyou/aggbug/139108.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangaiyou/" target="_blank">杨爱友</a> 2007-08-24 15:16 <a href="http://www.blogjava.net/yangaiyou/archive/2007/08/24/139108.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA2核心技术——输入输出流</title><link>http://www.blogjava.net/yangaiyou/archive/2007/08/17/137427.html</link><dc:creator>杨爱友</dc:creator><author>杨爱友</author><pubDate>Thu, 16 Aug 2007 17:06:00 GMT</pubDate><guid>http://www.blogjava.net/yangaiyou/archive/2007/08/17/137427.html</guid><wfw:comment>http://www.blogjava.net/yangaiyou/comments/137427.html</wfw:comment><comments>http://www.blogjava.net/yangaiyou/archive/2007/08/17/137427.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/yangaiyou/comments/commentRss/137427.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangaiyou/services/trackbacks/137427.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 流的家族非常庞大，有60多种，貌似很乱很复杂，其实理清了个的思路也是很容易记的，而且也没必要都记住，了解几种常用的流类，知道流设计策略就OK了。好多种类的流都有相应的4种，就是基于inputStream、outputStream、Reader和Writer派生的子类。&nbsp;&nbsp;<a href='http://www.blogjava.net/yangaiyou/archive/2007/08/17/137427.html'>阅读全文</a><img src ="http://www.blogjava.net/yangaiyou/aggbug/137427.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangaiyou/" target="_blank">杨爱友</a> 2007-08-17 01:06 <a href="http://www.blogjava.net/yangaiyou/archive/2007/08/17/137427.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>迄今为止，最简单的ANT编译实例</title><link>http://www.blogjava.net/yangaiyou/archive/2007/07/13/130132.html</link><dc:creator>杨爱友</dc:creator><author>杨爱友</author><pubDate>Fri, 13 Jul 2007 09:11:00 GMT</pubDate><guid>http://www.blogjava.net/yangaiyou/archive/2007/07/13/130132.html</guid><wfw:comment>http://www.blogjava.net/yangaiyou/comments/130132.html</wfw:comment><comments>http://www.blogjava.net/yangaiyou/archive/2007/07/13/130132.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/yangaiyou/comments/commentRss/130132.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangaiyou/services/trackbacks/130132.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 迄今为止，最简单的ANT编译实例<br>fileUpload实现图象上传例子&nbsp;&nbsp;<a href='http://www.blogjava.net/yangaiyou/archive/2007/07/13/130132.html'>阅读全文</a><img src ="http://www.blogjava.net/yangaiyou/aggbug/130132.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangaiyou/" target="_blank">杨爱友</a> 2007-07-13 17:11 <a href="http://www.blogjava.net/yangaiyou/archive/2007/07/13/130132.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>fckeditor使用[转载]</title><link>http://www.blogjava.net/yangaiyou/archive/2007/07/06/128611.html</link><dc:creator>杨爱友</dc:creator><author>杨爱友</author><pubDate>Fri, 06 Jul 2007 08:26:00 GMT</pubDate><guid>http://www.blogjava.net/yangaiyou/archive/2007/07/06/128611.html</guid><wfw:comment>http://www.blogjava.net/yangaiyou/comments/128611.html</wfw:comment><comments>http://www.blogjava.net/yangaiyou/archive/2007/07/06/128611.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/yangaiyou/comments/commentRss/128611.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangaiyou/services/trackbacks/128611.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: fckeditor使用&nbsp;&nbsp;<a href='http://www.blogjava.net/yangaiyou/archive/2007/07/06/128611.html'>阅读全文</a><img src ="http://www.blogjava.net/yangaiyou/aggbug/128611.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangaiyou/" target="_blank">杨爱友</a> 2007-07-06 16:26 <a href="http://www.blogjava.net/yangaiyou/archive/2007/07/06/128611.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javascript读书笔记</title><link>http://www.blogjava.net/yangaiyou/archive/2007/07/01/127352.html</link><dc:creator>杨爱友</dc:creator><author>杨爱友</author><pubDate>Sun, 01 Jul 2007 05:50:00 GMT</pubDate><guid>http://www.blogjava.net/yangaiyou/archive/2007/07/01/127352.html</guid><wfw:comment>http://www.blogjava.net/yangaiyou/comments/127352.html</wfw:comment><comments>http://www.blogjava.net/yangaiyou/archive/2007/07/01/127352.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/yangaiyou/comments/commentRss/127352.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangaiyou/services/trackbacks/127352.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: javascript读书笔记 &nbsp;&nbsp;<a href='http://www.blogjava.net/yangaiyou/archive/2007/07/01/127352.html'>阅读全文</a><img src ="http://www.blogjava.net/yangaiyou/aggbug/127352.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangaiyou/" target="_blank">杨爱友</a> 2007-07-01 13:50 <a href="http://www.blogjava.net/yangaiyou/archive/2007/07/01/127352.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>也谈正则表达式 【转载于http://www.blogjava.net/ilovezmh/archive/2007/04/17/111120.html】 </title><link>http://www.blogjava.net/yangaiyou/archive/2007/04/21/112460.html</link><dc:creator>杨爱友</dc:creator><author>杨爱友</author><pubDate>Sat, 21 Apr 2007 09:08:00 GMT</pubDate><guid>http://www.blogjava.net/yangaiyou/archive/2007/04/21/112460.html</guid><wfw:comment>http://www.blogjava.net/yangaiyou/comments/112460.html</wfw:comment><comments>http://www.blogjava.net/yangaiyou/archive/2007/04/21/112460.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/yangaiyou/comments/commentRss/112460.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangaiyou/services/trackbacks/112460.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 30分钟内让你明白正则表达式是什么，并对它有一些基本的了解，让你可以在自己的程序或网页里使用它。&nbsp;&nbsp;<a href='http://www.blogjava.net/yangaiyou/archive/2007/04/21/112460.html'>阅读全文</a><img src ="http://www.blogjava.net/yangaiyou/aggbug/112460.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangaiyou/" target="_blank">杨爱友</a> 2007-04-21 17:08 <a href="http://www.blogjava.net/yangaiyou/archive/2007/04/21/112460.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>