优雅天平

享受喧嚣 安于平静
posts(18) comments(167) trackbacks(0)
  • BlogJava
  • 联系
  • RSS 2.0 Feed 聚合
  • 管理

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论

留言簿

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔档案(18)

  • 2006年4月 (1)
  • 2006年3月 (1)
  • 2005年12月 (3)
  • 2005年10月 (2)
  • 2005年9月 (1)
  • 2005年7月 (2)
  • 2005年6月 (3)
  • 2005年3月 (2)
  • 2005年2月 (3)

文章分类(62)

  •  eclipse(2)
  •  Guitar(11)
  •  J2EE相关(5)
  •  JAVA基础(7)
  •  Solaris相关(1)
  •  WAP相关(1)
  •  web services(12)
  •  web页面基础(4)
  •  开源相关(16)
  •  数据库/仓库(2)
  •  模式相关(1)

文章档案(61)

  • 2006年2月 (1)
  • 2006年1月 (3)
  • 2005年12月 (32)
  • 2005年11月 (8)
  • 2005年9月 (6)
  • 2005年8月 (1)
  • 2005年6月 (6)
  • 2005年5月 (1)
  • 2005年3月 (1)
  • 2005年2月 (2)

相册

  • 大事记
  • 我的照片

blog

  • 小江西
  • 铁手剑谱的blog-strust
  • 陶永胜书法艺术中心

站点搜藏

  • Matrix-与Java共舞
  • OpenSource
  • 中国java开发网

搜索

  •  

积分与排名

  • 积分 - 142171
  • 排名 - 438

最新评论

  • 1. re: JFreeChart完全攻略示例各种方法和属性[未登录]
  • sdfg
  • --111
  • 2. re: JFreeChart完全攻略示例各种方法和属性
  • 分数线烦不烦很舒服发个号发给合适的给他发所提供合适的土壤规范不能是纳税人他呢过生日能接受洒脱人呢是vae回复身体然后呢托管人粉红丝带让他反感 受托人复活币善待他人回事
  • --倒萨倒
  • 3. re: Jcreator注册码[未登录]
  • 有谁有jcreator 5.0 pro的注册码呀?跪求
  • --liu
  • 4. re: 开启log4j的记录源代码行号的配置,会对系统性能产生影响!
  • 怎么说呢?理解的有点片面。。。jdk1.4之前的话的确对性能影响比较大,自从1.4开始引入了StackTraceElement之后,对性能影响不是那么大。。。
  • --黄大仙
  • 5. re: 请问MYECLIPSE在哪里输入注册码呀?[未登录]
  • 对我这个初学者有帮助,嘿嘿。
  • --Flyer

阅读排行榜

  • 1. Jcreator注册码(22630)
  • 2. java日期相减问题(20239)
  • 3. Myeclipse注册码(13937)
  • 4. jbuilder 2006 破解文件(13684)
  • 5. 修改 Oracle9i 8080端口问题(2884)

评论排行榜

  • 1. jbuilder 2006 破解文件(58)
  • 2. Jcreator注册码(50)
  • 3. Myeclipse注册码(18)
  • 4. JBuilder2005光标问题更好的解决方法(6)
  • 5. B/S结构程序等待查询结果超时问题(5)

View Post

Hibernate+Spring+Struts扩展Struts 2(转)

Request是如何被处理的

  ActionServlet是Struts框架中唯一的Servlet,它负责处理所有request。无论何时接收到一个request,它都会先尝试为当前的request寻找一个sub-application。一旦一个sub-application被找到,ActionServlet就会为那个sub-application创建一个RequestProcessor对象,调用这个对象的process()方法并把HttpServletRequest和HttpServletResponse对象传入。

  RequestProcessor.process()就是大部分request被处理的地方。process()方法使用了Template Method模式实现,其中有很多独立的方法来执行请求处理的每一步骤,这些方法将会在process方法中依次被调用。比如,将会有一个独立的方法用来寻找当前request对应的ActionForm类,一个方法来检查当前用户是否有执行action mapping所必须的权限。这些给与我们极大的灵活性。在发布的Struts包中有一个RequestProcessor类提供了请求处理每一步骤的默认实现。这就意味着你可以仅仅重写你感兴趣的方法,其它的使用默认的实现。举例来说,默认地Struts调用request.isUserInRole()来检查用户是否有权限执行当前的ActionMapping;这时如果你想通过查询数据库来实现,你所要做的就是重写processRoles()方法,通过查询出的用户是否拥有必须的权限来返回true或false。

  首先我们将会看到缺省情况下,process()方法是如何实现的,然后我将会详细解释默认的RequestProcessor类中的每一个方法,这样你就可以决定哪一部分是你想要改变的。

public void process(HttpServletRequest request,HttpServletResponse response)
throws IOException, ServletException {
 // Wrap multipart requests with a special wrapper
 request = processMultipart(request);
 // Identify the path component we will
 // use to select a mapping
 String path = processPath(request, response);
 if (path == null) {
  return;
 }
 if (log.isDebugEnabled()) {
  log.debug("Processing a '" + request.getMethod() + "' for path '" + path + "'");
 }
 // Select a Locale for the current user if requested
 processLocale(request, response);
 // Set the content type and no-caching headers
 // if requested
 processContent(request, response);
 processNoCache(request, response);
 // General purpose preprocessing hook
 if (!processPreprocess(request, response)) {
  return;
 }
 // Identify the mapping for this request
 ActionMapping mapping =
 processMapping(request, response, path);
 if (mapping == null) {
  return;
 }
 // Check for any role required to perform this action
 if (!processRoles(request, response, mapping)) {
  return;
 }
 // Process any ActionForm bean related to this request
 ActionForm form = processActionForm(request, response, mapping);
 processPopulate(request, response, form, mapping);
 if (!processValidate(request, response, form, mapping)) {
  return;
}
// Process a forward or include specified by this mapping
if (!processForward(request, response, mapping)) {
 return;
}
if (!processInclude(request, response, mapping)) {
 return;
}
// Create or acquire the Action instance to
// process this request
Action action =
processActionCreate(request, response, mapping);
if (action == null) {
 return;
}
// Call the Action instance itself
ActionForward forward = processActionPerform(request, response,action, form, mapping);
// Process the returned ActionForward instance
processForwardConfig(request, response, forward);
}

  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来读取,并且自己解析它来获得参数值。

  2、processPath():在这个方法中,Struts将会读取request的URI,来确定路径元素,这个元素是用来获取ActionMappint元素。

  3、processLocale():在这个方法中,Struts将会为当前request取得Locale,如果配置过的话,还可以将这个对象作为HttpSession中org.apache.struts.action.LOCALE属性的值而保存。作为这个方法的副作用,HttpSession将会被创建,如果你不想创建的话,你可以在ControllerConfig中将locale属性设为false,在struts-config.xml中象如下这样:

<controller>
 <set-property property="locale" value="false"/>
</controller>

  4、processContent():通过调用response.setContentType()来为response设置contentType。这个方法首先会尝试从struts-config.xml配置中得到contentType。缺省情况下使用text/html。如果想覆盖它,可以象如下这样:

<controller>
<set-property property="contentType" value="text/plain"/>
</controller>

  5、processNoCache():如果配置是no-cache,Struts将会为每个response设置下面三个headers:

requested in struts config.xml
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 1);

  如果你想设置no-cache header,在struts-config.xml中加入下面信息:

<controller>
<set-property property="noCache" value="true"/>
</controller>

  6、processPreprocess():这个方法为预处理提供一个hook,可以在子类中覆盖它。它的缺省实现没有作任何事情,总是返回true。返回false的话将会终止当前请求的处理。

  7、processMapping():这个方法将会用路径信息得到一个ActionMapping对象。也就是struts-config.xml文件中的<action>元素:

<action path="/newcontact" type="com.sample.NewContactAction" name="newContactForm" scope="request">
<forward name="sucess" path="/sucessPage.do"/>
<forward name="failure" path="/failurePage.do"/>
</action>

  ActionMapping元素包含了Action类的名称和处理请求使用的ActionForm等等信息。它还包含当前ActionMapping配置的ActionForwards信息。

  8、processRoles():Struts web应用提供了一个授权方案。也就是说,一旦一个用户登入了容器,struts的processRoles()方法将会通过调用request.isUserInRole(),来检查他是否有必须的角色来运行一个给定的ActionMapping。

<action path="/addUser" roles="administrator"/>

  假设你有一个AddUserAction并且你只想让administrator能够增加新的user。你所要做的就是给你的AddUserAction元素增加一个role属性,这个属性的值为administrator。这样,在运行AddUserAction之前,这个方法会确保用户拥有administraotr的角色。

  9、processActionForm():每一个ActionMapping都一个相应的ActionForm类。当Struts处理一个ActionMapping的时候,它将会从<action>元素的name属性中找出对应的ActionForm类的名称。

<form-bean name="newContactForm" type="org.apache.struts.action.DynaActionForm">
 <form-property name="firstName" type="java.lang.String"/>
 <form-property name="lastName" type="java.lang.String"/>
</form-bean>

  在我们的例子中,它会先在request scope中检查是否有一个org.apache.struts.action.DynaActionForm类的对象存在。如果有它将会使用这个对象,如果没有它将会创建一个新的对象并把它设置在request scope。

  10、processPopulate():在这个方法中,Struts将会用相匹配的request参数装配ActionForm的实例变量。

  11、processValidate():Struts将会调用你的ActionForm类的validate方法。如果你从validate()返回ActionErrors,它将会将user重定向到<action>元素的input属性指定的页面。

  12、processForward()和processInclude():在这些方法中,Struts将会检查<action>元素的forward或include属性,如果找到了,将会把forward或include请求放置到配置的页面中。

<action forward="/Login.jsp" path="/loginInput"/>
<action include="/Login.jsp" path="/loginInput"/>

  你可以从这些方法的名字上猜测它们的不同:processForward()最终调用RequestDispatcher.forward(),而processInclude()调用RequestDispatcher.include()。如果你同时配置了forward和include属性,它将会总是调用forward,因为forward先被处理。

  13、processActionCreate():这个方法从<action>元素的type属性中获取获得Action类的名字并且创建返回它的实例。在我们的例子中,它将会创建一个com.sample.NewContactAction类的实例。

  14、processActionPerform():这个方法调用你的Action类的excute()方法,你的业务逻辑也就是在excute方法中。

  15、processForwardConfig():你的Action类的excute()方法将会返回一个ActionForward对象,这个对象将指出哪个页面是显示给用户的页面。因此,Struts将会为那个页面创建一个RequestDispatcher,并且调用RequestDispatcher.forward()。

  上面的列表说明了默认的RequestProcessor实现在处理请求时每一步作的工作,以及执行的顺序。正如你所看到的,RequestProcessor是非常灵活的,允许你通过设置<controller>元素的属性来配置它。举例来说,如果你的应用准备生成XML内容来代替HTML,你就可以通过设置controller元素的属性来通知Struts这些情况。

posted on 2005-09-14 13:07 Victor 阅读(515) 评论(0)  编辑  收藏 所属分类: 开源相关

新用户注册  刷新评论列表  

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问   管理
相关文章:
  • JFreeChart完全攻略示例各种方法和属性
  • 开启log4j的记录源代码行号的配置,会对系统性能产生影响!
  • Java开源Blog实现,Roller 2.0 的安装手记! (转)
  • Jakarta-Common-BeanUtils研究心得(2)[转载]
  • Jakarta-Common-BeanUtils研究心得(1)[转载]
  • 实施Jakarta Commons-DbUtils
  • 实现图形JSF组件
  • 用Spring改进J2EE编程
  • NetUI页面流:Struts的发展
  • Ajax简介(转自EBA)
 
 
Powered by:
BlogJava
Copyright © Victor