struts2自定义MVC框架



自定义MVC:(首先了解Model1和Model2的概念)

Model1与Model2:

  Model1:就是一种纯jsp开发技术,将业务逻辑代码和视图渲染代码杂糅在一起。

  Model2:Model2是在Model1的基础上,将业务逻辑的代码分离开来,单独形成一个Servlet,Model2也是基于MVC开发。



总结MVC特点如下:

  (1)数据的获取和显示分离

    (2)控制器将不同的模型和视图组合在一起

    (3)应用分为三部分,三部分之间松耦合并协同工作,从而提高应用的可扩展性和可维护性

   (4)各层负责不同的功能,各司其职,每一层的组件具有相同的特征,便于通过工程化和工具化产生程序代码



MVC思想及其优势(很强势)

MVC是一种架构模式,目的是将模型(业务逻辑)、视图(表示层)分离,使模型和视图可以独立修改互不影响。大多数软件在设计架构时都采用此模式。使用MVC模式有很多处,当一个通过浏览器浏览的系统想要开发手机版本时,只需要重新开发视图,模型部分的业务逻辑可以重用。许多软件需要同时推出B/S和C/S版本,采用MVC模式,模型部分可以重用,只需要开发不同的视图即可。MVC思想将一个应用分成三个基本部分M(Model,模型)V(View,视图)C(Controller,控制器)。其中M表示处理业务逻辑的部分,V表示显示数据和获取用户输入的部分,C类似中介,保证M和V不会直接交互。


基本步骤如下:

  1.创建XML文档Framework.xml

  2.定义Action接口

  3.定义一个actionMapping类,视为action节点

  4.定义ActionMappingManage类来管理ActionMapping类(actions节点)

  5.定义ActionManager类使用反射机制根据字符串类型的类名获取到具体的类(web.xml标签的书写)

  6.编写servlet进行运行时机的控制

  7.定义LoginAction类进行测试


1.创建XML文档Framework.xml 

<?xml version="1.0" encoding="UTF-8"?>
<!-- 定义约束文件 -->(标注)
<!-- ELEMENT 表示元素 -->
<!-- ATTLIST 表示属性 -->
<!-- CDATA 表示字符串类型 -->
<!-- REQUIRED 表示此属性必须的写 -->
<!-- *代表多个 -->
<!-- IMPLIED 表示此属性可写 -->
<!-- redirect 重定向或转发 -->

<!DOCTYPE Framework[

	<!ELEMENT Framework (actions)>
	<!ELEMENT actions (action)>
	<!ELEMENT action (result*)>(*表示可以多个)

	<!ATTLIST action name CDATA #REQUIRED
                     class CDATA #REQUIRED
        >
	<!ATTLIST RESULT name CDATA #IMPLIED
		 redirect (true|false) "false"
	>
]>
<Framework>
	<!-- 进行测试 -->
<actions>
   <action name="loginAction" class="cn.hq.Action.LoginAction">
   <result name="success">success.jsp</result>
   <result name="login">index.jsp</result>
   </action>
</actions>
</Framework>

注意:空格和<>的书写规范。

   节点的层次。


2.定义Action接口

 

注意:excute参数的书写,请求和响应。



3.定义一个actionMapping类,视为action节点(进行action节点的标签的书写)

  

    

进行封装字段和results集合的添加数据。

注意:添加数据的书写。(Map集合)



4.定义ActionMappingManage类来管理ActionMapping类(actions节点)

/*
 * action节点不止一个
 * 用来来管理ActionMapping类
 */
public class ActionMappingManager {
	//actionMapping类的集合
	private Map<String,ActionMapping> maps=new HashMap<String,ActionMapping>();	

	public ActionMapping getActionMapping(String name)
	{
		  return maps.get(name);
	}

	//解析在src项目下的所有配置文件
	//实例化完毕后进行解析
	public ActionMappingManager(String[] file){
		for (String filename : file) {
			Init(filename);
		}
	}
	//init初始化方法
	//解析xml文档
	public void Init(String path){

		try {
			  InputStream is=this.getClass().getResourceAsStream("/"+path);
			  //解析xml
			  Document doc=new SAXReader().read(is);
			  //获取根节点
			  Element root = doc.getRootElement();
			  //获取actions节点
			  Element actions=(Element)root.elementIterator("actions").next();
			  //使用for循环来遍历actions节点下的所有action节点
			  for(Iterator<Element> action=actions.elementIterator("action");action.hasNext();)
			  {
				  //获取到<action>节点
				  Element actionnext = action.next();
				  //分别获取到action节点中的name属性和class属性
				  String name = actionnext.attributeValue("name");
				  String classname = actionnext.attributeValue("class");
				  //将以上两个属性保存到ActionMapping类中
				  ActionMapping mapp=new ActionMapping();
				  mapp.setClassname(classname);
				  mapp.setName(name);
				  //由于一个action节点下有多个result节点 遍历action下所有的result节点
				  for(Iterator<Element> result=actionnext.elementIterator("result");result.hasNext();)
				  {
					  //获取到result节点
					  Element resultnext = result.next();
					  //提取result节点的name属性值和result节点中的值
					  String resultname = resultnext.attributeValue("name");
					  String resultvalue=resultnext.getText();
					  //将其分别存入到actionMapping中的双列集合中去,方便调用actionMapping类(actionMapping类中就有数据了!)
					  mapp.addResult(resultname, resultvalue);
					  System.out.println(mapp.getName());
				  }
				  //得到所有action节点的集合
				  maps.put(mapp.getName(), mapp);
			  }

		} catch (Exception e) {
			// TODO: handle exception
		}
	  }
	}

概括:

通过dom4j解析Framework.xml配置文件。从而获取根节点,以及actions节点,并通过for循环遍历actions节点下的action节点拿到name和class的属性值,由于一个action节点下有多个result节点 及遍历action下所有的result节点,分别存入到actionMapping中的双列集合中,最后得到所有action节点的集合。

注意:Init方法的书写,以及ActionMappingManager带参数组的书写。



5.定义ActionManager类使用反射机制根据字符串类型的类名获取到具体的类

public class ActionManager {

	public static Action getActionClass(String classname)
	{
		Class clazz=null;
		Action action=null;
		//获取当前线程的类加载器
		try {
			//如果线程中的有那么一个类,直接根据类名获取该类的类型
			clazz=Thread.currentThread().getContextClassLoader().loadClass(classname);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		if(clazz==null)
		{
			try {
				//如果该线程中没有,那么使用class.forname方法获取
				clazz=Class.forName(classname);
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if(action==null)
		{
			try {
				//将获取到的类型转换为action,调用无参构造函数,某种程度上相当于new,不过new需要指定类型
				action=(Action)clazz.newInstance();
			} catch (InstantiationException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return action;
	}
} 

web.xml的节点配置:



6.编写servlet进行运行时机的控制(servlet,初始化所有的类)

public class MyServlet extends HttpServlet {

	/**
	 *你很菜
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doPost(request, response);
	}
	/**
	 *继续努力
	 */
	ActionMappingManager man=null;
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		//获取ActionMapping对象
		ActionMapping actionMapping = man.getActionMapping(getPath(request));
		//获取action接口反射机制
		Action action = ActionManager.getActionManager(actionMapping.getClassname());

		try {
			String message=action.execute(request, response);
			String results = actionMapping.getResults(message);

			response.sendRedirect(results);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/*
	 * 获取请求的路径名
	 */
	public String getPath(HttpServletRequest request){
		//项目+请求地址
		String requestURI = request.getRequestURI();
		//项目名称
		String contextPath = request.getContextPath();
		//具体请求
		String path = requestURI.substring(contextPath.length());
		String filename = path.substring(1,path.lastIndexOf("."));

		return filename;
	}
	/*
	 *重写init,程序运行加载所有类
	 *
	 */
	@Override
	public void init(ServletConfig config) throws ServletException {

		//config对象是javax.servlet.ServletConfig的对象,功能是获得初始化配置信息
		//config.getInitParameter是取得指定名称的初始化参数内容
		String filename = config.getInitParameter("config");
		String [] filenames=null;
		if(filename==null){
			//如果为空 ,
			filenames=new String[]{"Framework.xml"};
		}else{
			//若果有其他的配置参数信息,那么以,分隔存入数组中
			filenames=filename.split(",");
		}
		//使用init方法进行初始化
		man=new ActionMappingManager(filenames);
	}
}

注意:代码的层次及注释。



7.定义LoginAction类进行测试

public class LoginAction implements Action{

	@Override
	public String execute(HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		String name = request.getParameter("name");
		String pwd = request.getParameter("pwd");
		if(name.equals("1")&&pwd.equals("1")){
			return SUCCESS;
		}else{
			return LOGIN;
		}
	}
}

jsp代码:

实现效果:



再长的路,一步步也能走完,再短的路,不迈开双脚也无法到达。

                      --告诫自己

时间: 2024-10-06 19:44:47

struts2自定义MVC框架的相关文章

Struts2 自定义MVC框架

一.Model1与Model2: Model1:就是一种纯jsp开发技术,将业务逻辑代码和视图渲染代码杂糅在一起. Model2:Model2是在Model1的基础上,将业务逻辑的代码分离开来,单独形成一个Servlet,Model2也是基于MVC开发 二.MVC设计模式: 由3个部分组成,各部分作用如下: Model:模型,主要用于数据和业务的处理 View:视图,用于数据的显示 Controller:控制器,用于进行流程控制 MVC设计模式的特点: ①一个模型可以对应多个视图 ②显示与逻辑控

Java Web自定义MVC框架详解 (转)

转自:http://blog.csdn.net/jackfrued/article/details/42774459 最近给学生讲Java Web,希望他们能够在学完这部分内容后自己实现一个MVC框架.但是突然发现百度上能搜索到的靠谱的资料并不是很多,有些只是原理没有代码实现,有些有 代码实现但是对于初学者来说理解起来还是比较困难,于是决定把自己讲自定义MVC框架的内容放在这里分享给大家,不仅仅是代码,也有原理和探讨.内容会比 较长,因为我打算用递增的方式讲解如何写一个自定义MVC框架,重点是前

自定义MVC框架之工具类-图像处理类

截止目前已经改造了4个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 图像处理类: 1,图片加水印处理( 支持任意位置与九宫格位置 ) 2,图片缩放处理( 等比缩放,不变形裁剪 ) 1 <?php 2 3 class Image{ 4 //文件路径 5 protected $path; 6 //是否允许随机文件名称 7 protected $enableRandName; 8 //文件类型 9 pro

自定义MVC框架之工具类-模型类

截止目前已经改造了5个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 自定义MVC框架之工具类-图像处理类 这个模型类支持以下功能: >连贯操作,js叫链式操作,连贯操作的函数可以打乱顺序,最后一个函数必须是执行语句的那个函数,如select, delete, update, add等 如 $db->table( 'user' )->where( 'id=1' )->select() 等

ideat使用struts2之自定义MVC框架

今天我学习了自定义一个简单的MVC框架,这个我们首先要知道什么是MVC框架! MVC框架: MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑.MVC被独特的发展起来用于映射传统的输入.处理和输出功能在一个逻辑的图形化用户界面的结构中. 我们今天自己定义的

使用Intellij Idea自定义MVC框架

今天我学习了自定义一个简单的MVC框架,这个我们首先要知道什么是MVC框架! MVC框架: MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑.MVC被独特的发展起来用于映射传统的输入.处理和输出功能在一个逻辑的图形化用户界面的结构中. 我们今天自己定义的

简单封装自定义MVC框架

自定义Mvc框架结构及其使用方法 一,什么是MVC框架 MVC框架全名是model(模型)controller(控制器)view(视图文件)所构成的一种开发框架,是一种典型的软件设计典范,用一种业务逻辑,数据,显示相分离的方法组织代码,其好处是将业务逻辑聚集到一个部件里面,在改进和指定个性化页面的同时不需要重新编写业务逻辑,MVC被独特的发展起来用于映射传统的输入,处理,显示在一个业务逻辑的图形化业务界面中. 二,组成 ①,model(模型):主要负责具体功能的实现,一个模型对应一种功能 ②,v

自定义MVC框架

一.实现自定义MVC的体系结构图 1.Model I模式开发Web应用时,分两种情况: *纯JSP技术方式开发 *JSP+JavaBean方式开发 2.Model I模式开发的不足: *JSP页面中嵌入大量的Java代码,可读性差. *大量代码在JSP中难以复用. *后期维护及扩展的难度大. 3.为了克服Model I模式的缺陷,引入了Model II的模式开发 *Model II模式体现了基于MVC(Model-View-Controller,模型-视图-控制器)的设计模式,简单的说,Mode

springmvc执行原理及自定义mvc框架

springmvc是spring的一部分,也是一个优秀的mvc框架,其执行原理如下: (1)浏览器提交请求经web容器(比如tomcat)转发到中央调度器dispatcherServlet. (2)中央调度器调用处理器映射器handerMapping,处理器映射器根据请求的url找到处理该请求对应的处理器hander及相关的拦截器intercepter,将它们封装成一个处理器执行链并返回给中央调度器 (3)中央调度器根据处理器执行链中的处理器找到对应的处理器适配器handerAdaptor (4