• 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 。

      

      

  • 相关阅读:
    spring配合junit测试 initializationError 错误
    hashmap为什么不安全
    关于使用iframe标签自适应高度的使用
    关于highcharts(功能强大、开源、美观、图表丰富、兼容绝大多数浏览器的纯js图表库)
    富文本web编辑器(UEditor)
    css行级块级区别总结摘录
    jquery mobile 主题
    jquery mobile selectmenu下拉菜单
    jquery mobile popup 弹出窗口
    jquery mobile navbar
  • 原文地址:https://www.cnblogs.com/chuiyuan/p/4612138.html
Copyright © 2020-2023  润新知