技术中心

这里象征着我们的态度和能力

>适用于初学者的struts简单案例分析
作者:中国IT实验室    来源:中国IT实验室    发布时间:2012-01-09      浏览次数:6148
分享到:
欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

  前言:

      虽然现在ssh开发满天飞,但是对于初学者来说,未必是好事,从基础学起,一步一个脚印,也许对他们来说更好。

  接下来的时间里,讲解一个struts的简单案例,从基础学起,有兴趣的朋友可以慢慢看来。

  概要:Front Controller(模式)

  说明:讲解struts具体例子之前,先说明一下Front Controller模式(前端控制器模式)。struts就是它的具体实现,得以扩展,并且是Model2结构的完整实现。

  Model2结构通过一个控制组件来接受请求,这个控制组件本身可以为请求提供服务,也可以把这项任务分配给其他一些组件。生成响应信息的任务接着被分配给适当的视图组件。实现这种要求的方式很多,Front Controller就是其中一种。

  香港精准正版资料

  实现前端控制器可以采取不同的策略,一种典型的策略是使用一个servlet问题:如果把所有的功能集中起来会出现一个大而臃肿的控制器组件,它将负责整个Web的相关处理。

  解决:办法之一是使用多个前端控制器,分别负责某一方面的处理任务。另一种解决方案是使用Command and Controller(命令与控制器)(稍候介绍)

  下面是这种Front Controller模式示例程序框架实现:


     public class FrontController extends HttpServlet {
  protected void processRequest(HttpServletRequest req, HttpServletResponse res)
  throws ServletException, IOException {
  RequestDispatcher dispatcher =
  getServletContext().getRequestDispatcher(nextView);
  dispatcher.forward(req, res);
  }
  protected void doGet(HttpServletRequest req, HttpServletResponse res)
  throws ServletException, IOException {
  processRequest(req, res);
  }
  protected void doPost(HttpServletRequest req, HttpServletResponse res)
  throws ServletException, IOException {
  processRequest(req, res);
  }
  }

  在这里,它只是HttpServlet一个简单的扩充,默认实现了doGet()和doPost()方法,这两个方法负责把请求分配给另一个叫processRequest()的方法。这是为了保证不论发出什么请求,前端控制器都能为之提供服务。

  在processRequest()的方法中我们省去主要部分,但实际上前端控制器将先执行与请求关联的处理,然后再把它分配给一个视图组件来生成相关的响应信息。视图组件一般是JSP页面。控制器完成了自己的业务逻辑之后,它就可以通过RequestDispatcher把处理分配给一个JSP.到此你可能会提出一个问题。如果控制器要负责处理所有的请求,那么它怎么知道各请求都是什么以及如何处理呢?(Command and Controller,上面问题所提到的,现在开始讲解)

  Command and Controller策略

  在Command and Controller策略中,处理每个具体请求的逻辑被转移到了一个单独的组件中。

  20080726-2.gif

  这些额外组件各表示一个具体的命令(或操作,既action),并且组件中封装着执行相关操作的逻辑。

  前端控制器把对请求的处理分配给适当的命令组件。

  操作类

  为了实现Command and Controller策略,首先需要定义位于控制器和操作组件之间的接口。


 public abstract class Action {
  public abstract String process(HttpServletRequest req, HttpServletResponse res);
  }

  关于请求类型的通信

  这里的处理如下:FrontController Servlet和URI/controller/*之间定义了一个映射


<servlet>
<servlet-name>FrontController</servlet-name>
<servlet-class>com.wxhx.controller.FrontController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FrontController</servlet-name>
<url-pattern>/controller/*</url-pattern>
</servlet-mapping>

  为了从附加路径信息中获得的字符串映射到一个特定的操作实例上,当然,同样有很多策略可供选择,其中最灵活的就是把这种映射外部化,例如可以通过一个XML文件。

  为了简单起见,我们在这里建立一个单独的组件,用于封装这种映射。


 public class ActionHelper {
  private static HashMap actions = new HashMap();
  static {
  actions.put(”Login”, “com.sample.LoginAction”);
  }
  public static Action getAction(String name) {
  Action action = null;
  try {
  Class c = Class.forName((String) actions.get(name));
  action = (Action) c.newInstance();
  } catch (Exception e) {
  e.printStackTrace();
  }
  return action;
  }
  }

  好了,以上就是要实现的一个简单的框架类FrontController,Action以及辅助的ActionHelper类

  下一步是把所有这些处理插入到FrontController的processRequest方法中,这将是Web应用程序中所有请求的单一入口:


     public class FrontController extends HttpServlet {
  protected void processRequest(HttpServletRequest req, HttpServletResponse res)
  throws ServletException, IOException {
  String actionName =req.getPathInfo().substring(1);
  Action action =ActionHelper.getAction(actionName);
  String nextView =action.process(req, res);
  RequestDispatcher dispatcher =
  getServletContext().getRequestDispatcher(nextView);
  dispatcher.forward(req, res);
  }
  protected void doGet(HttpServletRequest req, HttpServletResponse res)
  throws ServletException, IOException {
  processRequest(req, res);
  }
  protected void doPost(HttpServletRequest req, HttpServletResponse res)
  throws ServletException, IOException {
  processRequest(req, res);
  }
  }

  具体相关内容可参见实例!

4000-880-989
(24小时热线)
联系客服
微信公众号

官方公众号

小程序

©2008-2022 CORPORATION ALL Rights Reserved. 香港精准正版资料版权所有 滇ICP备09003328号-1 滇公网安备 53011102000818号 增值电信业务经营许可证号:滇B2-20110045
昆明那家网络公司好,新媒体运营,网站优化,网络推广,网站建设,网页设计,网站设计,网站推广,云南网站公司,昆明新媒体公司,云南网红主播,昆明SEO公司,昆明网站建设,昆明网络推广,昆明网站优化,昆明网站推广,红河网站建设,大理网络公司,曲靖网络公司,丽江网站设计,昭通网络公司,保山大数据服务,智慧高速建设,智慧校园服务,云南IDC服务商,网络安全测评,等保测评,网站关键词排名优化服务,服务客户尽超2000余家,一切尽在香港精准正版资料,服务电话:13888956730