【SSH进阶之路】一步步重构MVC实现Struts框架——封装业务逻辑和跳转路径(四)

原创 2014年09月05日 08:01:41

目录:

      【SSH进阶之路】Struts基本原理 + 实现简单登录(二)

      【SSH进阶之路】一步步重构MVC实现Struts框架——从一个简单MVC开始(三)

      【SSH进阶之路】一步步重构MVC实现Struts框架——封装业务逻辑和跳转路径(四)

      【SSH进阶之路】一步步重构MVC实现Struts框架——彻底去掉逻辑判断(五)

      【SSH进阶之路】一步步重构MVC实现Struts框架——完善转向页面,大功告成(六)

 

       Struts的第二篇博客【SSH进阶之路】Struts基本原理 + 实现简单登录(二),我们介绍了MVC和Struts的基本理论,上篇博客【SSH进阶之路】一步步重构MVC实现Struts框架——从一个简单MVC开始(三),我们实现了一个MVC模型,这篇博客我们解决一下上篇博客留下的第一个问题:封装业务逻辑和跳转路径。

       我们先回顾一下上篇博客中的TestServlet的代码:

package com.liang.servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 使用servlet做相关的控制,转向多个(V)视图
 * @author liang
 *
 */
public class TestServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//取得访问的URI
		String reqeuestURI = request.getRequestURI();
		System.out.println(reqeuestURI);
		//截取URI,获得路径
		String path = reqeuestURI.substring(reqeuestURI.indexOf("/",1), reqeuestURI.indexOf("."));
		System.out.println(path);
		//获得表单数据
		String username = request.getParameter("username");
		
		UserManager userManager = new UserManager();
		
		String forward ="";
		//根据url执行相关的功能
		//等于添加,调用添加方法,添加成功转到添加页面
		if("/servlet/addUser".equals(path)){
			//调用添加的业务逻辑
			userManager.add(username);
			forward ="/add_success.jsp";
			//删除,调用删除方法,删除成功转到删除
		}else if("/servlet/delUser".equals(path)){
			//调用删除的业务逻辑
			userManager.del(username);
			forward ="/del_success.jsp";
		//修改,调用修改方法,修改成功转到修改页面
		}else if("/servlet/modifyUser".equals(path)){
			//调用修改的业务逻辑
			userManager.modify(username);
			forward ="/modify_success.jsp";
		//查询,调用查询方法,查询成功转到查询成功页面
		}else if("/servlet/queryUser".equals(path)){
			//调用查询的业务逻辑
			List userList = userManager.query(username);
			request.setAttribute("userList", userList);
			forward ="/query_success.jsp";
		}else{
			throw new RuntimeException("请求失败");
		}
		//统一完成转向
		request.getRequestDispatcher(forward).forward(request, response);
	}

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

}

       

       从TestServlet中我们发现,它就是一个简单的Servlet,它是Struts的前端控制器,负责把所有的URL截取下来,通过IF语句根据URL的不同执行相关的功能,并且添加,删除,修改和查询各自有各自的业务逻辑和跳转路径,我们可以各自的业务逻辑和跳转路径封装成不同的类,并抽象出一个公共接口,如下所示:




下面,我们看一下接口和实现类的代码:


接口Action

package com.liang.servlet;

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

public interface Action {
	
	public String execute(HttpServletRequest req, HttpServletResponse resp)
	throws Exception;
}

添加用户AddUserAction

package com.liang.servlet;

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

public class AddUserAction implements Action {

	@Override
	public String execute(HttpServletRequest req, HttpServletResponse resp)
			throws Exception {
		//获取参数
		String username = req.getParameter("username");
		
		UserManager userManager = new UserManager();
		//调用业务逻辑
		userManager.add(username);
		//返回跳转页面
		return "/add_success.jsp";
	}

}

删除用户DelUserAction

package com.liang.servlet;

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

public class DelUserAction implements Action {

	@Override
	public String execute(HttpServletRequest req, HttpServletResponse resp)
			throws Exception {
<span style="white-space:pre">		</span>//获取参数
		String username = req.getParameter("username");
		
		UserManager userManager = new UserManager();
		//调用业务逻辑
		userManager.del(username);
		//返回跳转页面
		return "/del_success.jsp";
	}

}

修改用户ModifyUserAction

package com.liang.servlet;

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

public class ModifyUserAction implements Action {

	@Override
	public String execute(HttpServletRequest req, HttpServletResponse resp)
			throws Exception {
		//获取参数
		String username = req.getParameter("username");

		//调用业务逻辑
		UserManager userManager = new UserManager();

		userManager.modify(username);
		//返回跳转页面
		return "/modify_success.jsp";
	}

}

查询用户QueryUserAction

package com.liang.servlet;

import java.util.List;

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

public class QueryUserAction implements Action {

	@Override
	public String execute(HttpServletRequest req, HttpServletResponse resp)
			throws Exception {
		//获取参数
		String username = req.getParameter("username");
		
		//调用业务逻辑
		UserManager userManager = new UserManager();

		List userList = userManager.query(username);
		req.setAttribute("userList", userList);
	
		userManager.query(username);
		//返回跳转页面
		return "/query_success.jsp";
	}

}

我们再对比看一下我们封装之后的TestServlet

package com.liang.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.liang.action.Action;
import com.liang.action.AddUserAction;
import com.liang.action.DelUserAction;
import com.liang.action.ModifyUserAction;
import com.liang.action.QueryUserAction;
/**
 * 使用servlet做相关的控制,转向多个(V)视图
 * @author liang
 *
 */
public class TestServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//取得访问的URI
		String reqeuestURI = request.getRequestURI();
		System.out.println(reqeuestURI);
		//截取URI,获得路径
		String path = reqeuestURI.substring(reqeuestURI.indexOf("/",1), reqeuestURI.indexOf("."));
		System.out.println(path);
		
		Action action = null;
		//等于添加,调用AddUserAction
		if ("/servlet/addUser".equals(path)) {
			action = new AddUserAction();
		//等于删除,调用DelUserAction
		}else if ("/servlet/delUser".equals(path)) {
			action = new DelUserAction();
		//等于修改,调用ModifyUserAction
		}else if ("/servlet/modifyUser".equals(path)) {
			action = new ModifyUserAction();
		//等于查询,调用QueryUserAction
		}else if ("/servlet/queryUser".equals(path)) {
			action = new QueryUserAction();
		}else {
			throw new RuntimeException("请求失败");
		}
		String forward = null;
		//返回不同的转向页面
		try {
			forward = action.execute(request, response);
		} catch (Exception e) {
			e.printStackTrace();
		}
		//根据路径,统一完成转向
		request.getRequestDispatcher(forward).forward(request, response);
	}

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

}

      通过对比,我们可以发现简单了很多,但是实现的道理基本一样,仍然是将path截取出来,做相应的判断,进入对应的分支,New一个刚写的Action,New谁调谁,但是此时仅仅是完成了功能,系统并不灵活,IF...ELSE并没有去掉,扩展性不好,不能适用需求。


      下篇博客【SSH进阶之路】一步步重构MVC实现Struts框架——彻底去掉判断逻辑(五),我们解决第二个问题:IF...ElSE的问题。


       源码下载



版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiuqiyuliang/article/details/39054165

【SSH进阶之路】一步步重构容器实现Spring框架——彻底封装,实现简单灵活的Spring框架(十一)

不仅形似Spring,而且神似Spring。。。
  • jiuqiyuliang
  • jiuqiyuliang
  • 2015-03-16 08:26:25
  • 8841

Spring框架的简单实现

  • 2015年03月09日 08:15
  • 1.08MB
  • 下载

SpringIoC的简单实现

  • 2015年03月07日 11:30
  • 398KB
  • 下载

【SSH进阶之路】Struts + Spring + Hibernate 进阶开端(一)

Long Long ago,就听说过SSH,起初还以为是一个东东,具体内容更是不详,总觉得高端大气上档次,经过学习之后才发现,不仅仅是高大上,更是低调奢华有内涵,经过一段时间的研究和学习SSH框架的基...
  • jiuqiyuliang
  • jiuqiyuliang
  • 2014-08-29 07:56:11
  • 20417

【SSH进阶之路】Hibernate映射——一对多关联映射(七)

一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端。关联关系都是由多端维护,一端维护多端的关系,在加载一端时,可以将多端加载上来。...
  • jiuqiyuliang
  • jiuqiyuliang
  • 2014-11-16 08:10:16
  • 17010

【SSH进阶之路】一步步重构MVC实现Struts框架——从一个简单MVC开始(三)

上篇【SSH进阶之路】Struts基本原理 + 实现简单登录(二),我们介绍MVC和Struts的基本理论,并实现了一个简单登录的实例。从中我们知道了,Struts是MVC的框架,MVC其实是Mode...
  • jiuqiyuliang
  • jiuqiyuliang
  • 2014-09-05 08:01:05
  • 10986

【SSH进阶之路】一步步重构容器实现Spring框架——从一个简单的容器开始(八)

最近一直在和容器打交道,甚至前面的博文,我们也介绍了Spring的IoC的原理以及源码,但是回头看看,介绍的还是深了,不够通俗易懂,深入浅出。从这篇博文开始,一步步的重构,最后实现一个基本的Sprin...
  • jiuqiyuliang
  • jiuqiyuliang
  • 2015-03-09 08:30:01
  • 7353

【SSH进阶之路】一步步重构MVC实现Struts框架——完善转向页面,大功告成(六)

第四篇博客【SSH进阶之路】一步步重构MVC实现Struts框架——封装业务逻辑和跳转路径(四),我们解决了第一个问题:封装业务逻辑和跳转路径。第五篇博客【SSH进阶之路】一步步重构MVC实现Stru...
  • jiuqiyuliang
  • jiuqiyuliang
  • 2014-09-12 08:13:25
  • 6947
收藏助手
不良信息举报
您举报文章:【SSH进阶之路】一步步重构MVC实现Struts框架——封装业务逻辑和跳转路径(四)
举报原因:
原因补充:

(最多只允许输入30个字)