模拟 Struts 自定义框架的实现

08/14/2010

一. MVC 模式 创建自定义框架 理解 Struts 运行机制

1.实现自定义框架

  • 1.基于 Servlet 技术
  • 2.是 MVC 模式的实现
  • 3.类似 Struts 框架

2.框架技术 帮我们更快,更好的创建应用程序

  • 1.是一个应用程序的半成品
  • 2.按一定规则组织的一组组建
  • 3.提供可重用的公共结构

3.框架技术的优势

  • 1.不用再考虑公共问题
  • 2.专心再业务实现上
  • 3.结构同一,易于学习维护
  • 4.新手也可以写出好程序

4.MVC 模型的含义

  • M – Model (模型层) //处理业务逻辑
  • V – View (视图层) //展现数据,获得用户输入
  • C – Controllor (控制层) //接收用户输入,调用业务代码(M),返回数据到视图(V)

二.自定义框架实例

自定义框架结构图

customframes

自定义框架实现加法器流程图

customframe_demo

1.创建委托模型的接口

package net.royakon.customframe;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;     

public interface Action {
	public String execute(HttpServletRequest request,HttpServletResponse response);
}

2.FrameConfig.xml 文件格式

<?xml version="1.0" encoding="UTF-8"?>
     <frame>
     	<action>
     		<path>add</path>
     		<action-class>demo.AddAction</action-class>
     	</action>
     </frame>

3.创建框架主流程模块

package net.royakon.customframe;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ActionServlet extends HttpServlet {

	//定义业务逻辑委托容器
	private Map actionMap;

	//初始化
 	public void init() throws ServletException {
		//计算xml配置文件路径
		String xmlpath=this.getServletConfig().getServletContext().getRealPath("/")
						+"WEB-INF" + java.io.File.separator + "FrameConfig.xml";
		//读取xml配置,获得路径与action的映射关系
		actionMap = new XmlUtil().initActionMap(xmlpath);
 	}

 	/**
 	 * 根据path判断由哪个action执行操作。
 	 */
 	private Action determinActionByPath(String path) {
 		String actionName = path.substring(path.lastIndexOf('/') + 1, path.length() - 3);
 		Action ret = (Action)actionMap.get(actionName);
 		return ret;
 	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
 		//接收客户请求URL
 		String path = request.getServletPath();
 		//判断请求所对应的业务
 		Action action = (Action)this.determinActionByPath(path);
 		//调用对应的业务
 		String outcome=action.execute(request, response);
 		//跳转
 		if (null!=outcome){
 			request.getRequestDispatcher(outcome).forward(request, response);
 		}
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request,response);
	}

}

4.配置 web.xml

<servlet>
    	<servlet-name>ActionServlet</servlet-name>
    	<servlet-class>frame.ActionServlet</servlet-class>
</servlet>
<servlet-mapping>
    	<servlet-name>ActionServlet</servlet-name>
    	<url-pattern>*.do</url-pattern>
</servlet-mapping>

5.自定义框架下开发 简单加法器

5.1.设计运算模型

package demo;

public class Calculator {

	/**
	 * 模型层实现计算器运算模型
	 */
	public double add(double x,double y) {
		return x+y;
	}

	/**
	 * 模型层实现计算器运算模型
	 */
	public double sub(double x,double y) {
		return x-y;
	}

}

5.2.制作请求及结果页面

<!--index.jsp-->
<%@ page language="java" pageEncoding="gb2312"%>
<form name="Calculator" action="AddAction.do" method="post">
	第一个数:<input type="text" size="10" name="num1"/><br/>
	第二个数:<input type="text" size="10" name="num2"/><br/>
	<input type="submit" value="+" />
</form>

<!--result.jsp-->
<%@ page language="java" pageEncoding="gb2312"%>
<h1>${result}</h1>

5.3.设计基于框架的动作请求Action完成功能

package demo;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.net.royakon.customframe.Action;

public class AddAction implements Action {

	public String execute(HttpServletRequest request,
			HttpServletResponse response) {
		// 获得页面输入
		double num1 =Double.parseDouble(request.getParameter("num1"));
		double num2 =Double.parseDouble(request.getParameter("num2"));
		//调用模型
		Calculator c=new Calculator();
		double s=c.add(num1,num2);
		//存储结果
		request.setAttribute("result", ""+s);
		//返回页面名称
		return "/result.jsp";
	}

}

5.4.配置FrameConfig.xml文件将Action加入到框架

<?xml version="1.0" encoding="UTF-8">

<frame>
	<action>
     	<path>add</path>
     	<action-class>demo.AddAction</action-class>
    </action>
    <action>
     	<path>sub</path>
     	<action-class>demo.SubAction</action-class>
    </action>
</frame>