MVC之Servlet控制器(二)

MVC之Servlet控制器(一)中,我们将业务逻辑的代码都写在了Servlet中,让Servlet显得非常的复杂,为了避免这个问题,我们将业务逻辑代码提取到

独立的controller类中。两个controller类都实现了Controller接口,Controller接口只有handleRequest一个方法,接口实现类通过这个方法访问当前请求的

HttpServletRequest/HttpServletResponse对象 。

一、整体思路 

二、代码清单 

  • Controller接口
public interface Controller {
	public String handleRequest(HttpServletRequest request,
			HttpServletResponse response) ;
}
  • 两个controller类
package app02b.controller;

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

public class InputProductController implements Controller{

	@Override
	public String handleRequest(HttpServletRequest request,
			HttpServletResponse response) {
		return "/WEB-INF/jsp/ProductForm.jsp";
	}

}

另外一个

package app02b.controller;

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

import app02b.domain.Product;
import app02b.form.ProductForm;

public class SaveProductController implements Controller {

	@Override
	public String handleRequest(HttpServletRequest request,
			HttpServletResponse response) {
		ProductForm productForm = new ProductForm();
		productForm.setName(request.getParameter("name"));
		productForm.setDescription(request.getParameter("description"));
		productForm.setPrice(request.getParameter("price"));
		
		//create model
		Product product = new Product();
		product.setName(productForm.getName());
		product.setDescription(productForm.getDescription());
		try {
			product.setPrice(Float.parseFloat(productForm.getPrice()));
		} catch (Exception e) {
			e.printStackTrace();
		}
		//code to add product to the DB
		request.setAttribute("product", product);
		return "/WEB-INF/jsp/ProductDetails.jsp" ;
	}

}
  • DispatcherServlet
package app02b.servlet;

import java.io.IOException;

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

import app02b.controller.InputProductController;
import app02b.controller.SaveProductController;

/**
 * 这里只分发请求,业务的处理转移到了controller中
 * @author lsj
 */
public class DispatcherServlet extends HttpServlet{
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		process(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		process(req, resp);
	}
	
	private void process(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String uri = request.getRequestURI() ;
		int lastIndex = uri.lastIndexOf("/") ;
		String action = uri.substring(lastIndex+1);
		
		//dispatch request to controllers according to action 
		//and return View name in dispatchUrl 
		String dispatchUrl = null ;
		if (action.equals("product_input.action")){
			System.out.println("product_input.action");
			InputProductController controller = new InputProductController() ;
			dispatchUrl = controller.handleRequest(request, response);
		}else if (action.equals("product_save.action")) {
			System.out.println("product_save.action");
			SaveProductController controller = new SaveProductController() ;
			dispatchUrl = controller.handleRequest(request, response) ;
		}
		
		if (dispatchUrl!= null){
			RequestDispatcher rd = request.getRequestDispatcher(dispatchUrl);
			rd.forward(request, response);
		}
		
	}
}

我们输入   http://localhost:8080/app02b/product_input.action后,

请求先到DispatcherServlet,然后按照请求的action名,分发请求到Controller中,controller返回View的name ,再跳转到view 。

  

  

 

posted @ 2015-06-30 23:51  chuiyuan  阅读(775)  评论(0编辑  收藏  举报