好·色之徒

struts简单案例-适合初学者(一)

Posted on 2008-07-30 12:55 城市劣人 阅读(1517) 评论(1)  编辑  收藏

前言:
虽然现在ssh开发满天飞,但是对于初学者来说,未必是好事,从基础学起,一步一个脚印,也许对他们来说更好。更多详情请参见:我的博客 我的生活


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

概要:Front Controller(模式)

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

Model2结构通过一个控制组件来接受请求,这个控制组件本身可以为请求提供服务,也可以把这项任务分配给其他一些组件。生成响应信息的任务接着被分配给适当的视图组件。实现这种要求的方式很多,Front Controller就是其中一种。
20080726-1.gif
实现前端控制器可以采取不同的策略,一种典型的策略是使用一个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);
}
}

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

Feedback

# re: struts简单案例-适合初学者(一)  回复  更多评论   

2008-07-31 03:15 by 深圳旅游资讯网
强人

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


网站导航:
 

posts - 39, comments - 91, trackbacks - 0, articles - 1

Copyright © 城市劣人

好·色之徒