栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

自定义MVC框架02

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

自定义MVC框架02

目录

一、中央控制器动态加载子控制器信息

二、参数 传递封装问题优化

三、方法执行机构转发、重定向优化

四、框架配置文件名修改


自定义MVC存在的问题

基于上次我们所写的自定义MVC框架01时的基础上解决一下问题

基本工作

导入以下类,导入jar包

 

一、中央控制器动态加载子控制器信息

 中央控制器:

package com.lucy.web;

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

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.PageContext;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;

import com.lucy.framework.Action;
import com.lucy.framework.ActionModel;
import com.lucy.framework.ConfigModelFactory;
import com.lucy.framework.ForwardModel;
import com.lucy.framework.ModelDriven;
import com.lucy.framework.configModel;


//@WebServlet("*.action")
public class DispatcherServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    private Map actions=new HashMap();

    
    private configModel configmodel;
   
    
//处程序启动 会加载一次初始化
    @Override
    public void init() throws ServletException {
//        actions.put("/book", new BookAction());
//        actions.put("/order", new OrderAction());
//        解决这种做法的方法
        try {
//            getInitParameter的作用是拿到web.xml中的servlet的信息配置的参数
            String configLocation =this.getInitParameter("configLocation");//配置地址
            if(configLocation==null||"".equals(configLocation)) {
                configmodel=ConfigModelFactory.bulid();
            }
            else {
                configmodel=ConfigModelFactory.bulid(configLocation);    
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }

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

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String url=request.getRequestURI();//http://locatio:8080/mvc/book.action?methodName=list
//            要拿到/book 就是最后一个.为止--截取地址
        url=url.substring(url.lastIndexOf("/"),url.lastIndexOf("."));
//        System.out.println("路径"+url),当前需要config.xml的全路径敏,然后反射实例化
        Action action=actions.get(url);//路径
//        相对于上一种从map集合里获取总控制器,
        ActionModel am=configmodel.pop(url);
        if(am==null) {
            throw new RuntimeException("action 配置有误");
        }
        String type=am.getType();//是action子控制器的全路径名
        try {
            Action action1 =(Action)Class.forName(type).newInstance();
//            action1.execute(request, response);
            
        } catch (Exception  e) {
            e.printStackTrace();
        }
        
    }

}
 

 子控制器================================================================================================

package com.lucy.framework;

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


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

二、参数 传递封装问题优化

 Demo.jsp界面代码

 参数传递封装问题优化
        bid=9898&bname=laoliu&price=123">增加

 创建一个实体类---book

package com.lucy.entity;

public class Book {
    private int bid;
    private String bname;
    private float price;
    public int getBid() {
        return bid;
    }
    public void setBid(int bid) {
        this.bid = bid;
    }
    public String getBname() {
        return bname;
    }
    public void setBname(String bname) {
        this.bname = bname;
    }
    public float getPrice() {
        return price;
    }
    public void setPrice(float price) {
        this.price = price;
    }
    
    public Book() {
        // TODO Auto-generated constructor stub
    }
    public Book(int bid, String bname, float price) {
        this.bid = bid;
        this.bname = bname;
        this.price = price;
    }
    @Override
    public String toString() {
        return "Book [bid=" + bid + ", bname=" + bname + ", price=" + price + "]";
    }
}
 

package com.lucy.web;

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

import com.lucy.entity.Book;
import com.lucy.framework.Action;
import com.lucy.framework.ActionSupport;
import com.lucy.framework.ModelDriven;


public class BookAction extends ActionSupport  implements ModelDriven{
			private Book book=new Book();

	private void load(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("在同一个orderservlet中调用load方法");
	}

	private String list(HttpServletRequest request, HttpServletResponse response) {
			System.out.println("在同一个orderservlet中调用list方法");
			return "success" ;
	}

	private void edit(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("在同一个orderservlet中调用edit方法");
		
	}

	private void del(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("在同一个orderservlet中调用del方法");
		
	}

	private String add(HttpServletRequest request, HttpServletResponse response) {
//		方法1 接收参数
//		String  bid=request.getParameter("bid");
//		String  bname=request.getParameter("bname");
//		String  price=request.getParameter("price");
//		Book book=new Book();
//		book.setBid(Integer.valueOf(bid));
//		book.setBname(bname);
//		book.setPrice(Integer.valueOf(price));
		
		System.out.println("在同一个orderservlet中调用add方法");
		return "failed";
	}
//正式调方法前,book中的属性 要被赋值
	@Override
	public Book getModel() {
		return book;
	}
		
}

package com.lucy.framework;


public interface ModelDriven {
    
            T getModel();
    
}
 

三、方法执行机构转发、重定向优化

 子控制器

package com.lucy.framework;

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


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

package com.lucy.web;

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

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.PageContext;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;

import com.lucy.framework.Action;
import com.lucy.framework.ActionModel;
import com.lucy.framework.ConfigModelFactory;
import com.lucy.framework.ForwardModel;
import com.lucy.framework.ModelDriven;
import com.lucy.framework.configModel;


//@WebServlet("*.action")
public class DispatcherServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
//       ?
    private Map actions=new HashMap();
    
    
    private configModel configmodel;
    
    
//处程序启动 会加载一次初始化
    @Override
    public void init() throws ServletException {
//        actions.put("/book", new BookAction());
//        actions.put("/order", new OrderAction());
//        解决这种做法的方法
        try {
//            getInitParameter的作用是拿到web.xml中的servlet的信息配置的参数
            String configLocation =this.getInitParameter("configLocation");//配置地址
            if(configLocation==null||"".equals(configLocation)) {
                configmodel=ConfigModelFactory.bulid();
            }
            else {
                configmodel=ConfigModelFactory.bulid(configLocation);    
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }

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

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String url=request.getRequestURI();//http://locatio:8080/mvc/book.action?methodName=list
//            要拿到/book 就是最后一个.为止--截取地址
        url=url.substring(url.lastIndexOf("/"),url.lastIndexOf("."));
//        System.out.println("路径"+url),当前需要config.xml的全路径敏,然后反射实例化
        Action action=actions.get(url);//路径
//        相对于上一种从map集合里获取总控制器,
        ActionModel am=configmodel.pop(url);
//        System.out.println("ActionModel:"+am);//?
        if(am==null) {
            throw new RuntimeException("action 配置有误");
        }
        String type=am.getType();//是action子控制器的全路径名
        try {
            Action action1 =(Action)Class.forName(type).newInstance();
            
            //action 是bookAction
            if(action instanceof ModelDriven) {
                ModelDriven md=(ModelDriven) action;
            Object    model=md.getModel();
            //要给model里的属性赋值,首先要接收前台jsp的参数 ,req.getpmap()
//                PropertyUtils.getProperty(, name);//从某一个对象中取一个参数
//            将前台参数封装进实体类
            BeanUtils.populate(model, request.getParameterMap());
            System.out.println(model);
            
            }
            action1.execute(request, response);

        } catch (Exception  e) {
            e.printStackTrace();
        }
        
    }

}
 

config.xml类=======================================================================

 

    
        
        
    
    
        
        
    

四、框架配置文件名修改

 



  0624_MVC
  
 
  mvc
  com.lucy.web.DispatcherServlet
 
  configLocation
  Lucy
 

 

  
 
  mvc
  *.action
 

package com.lucy.web;

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

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.PageContext;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;

import com.lucy.framework.Action;
import com.lucy.framework.ActionModel;
import com.lucy.framework.ConfigModelFactory;
import com.lucy.framework.ForwardModel;
import com.lucy.framework.ModelDriven;
import com.lucy.framework.configModel;


//@WebServlet("*.action")
public class DispatcherServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
//       ?
    private Map actions=new HashMap();
    
    
    private configModel configmodel;
    
    
//处程序启动 会加载一次初始化
    @Override
    public void init() throws ServletException {
//        actions.put("/book", new BookAction());
//        actions.put("/order", new OrderAction());
//        解决这种做法的方法
        try {
//            getInitParameter的作用是拿到web.xml中的servlet的信息配置的参数
            String configLocation =this.getInitParameter("configLocation");//配置地址
            if(configLocation==null||"".equals(configLocation)) {
                configmodel=ConfigModelFactory.bulid();
            }
            else {
                configmodel=ConfigModelFactory.bulid(configLocation);    
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }

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

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String url=request.getRequestURI();//http://locatio:8080/mvc/book.action?methodName=list
//            要拿到/book 就是最后一个.为止--截取地址
        url=url.substring(url.lastIndexOf("/"),url.lastIndexOf("."));
//        System.out.println("路径"+url),当前需要config.xml的全路径敏,然后反射实例化
        Action action=actions.get(url);//路径
//        相对于上一种从map集合里获取总控制器,
        ActionModel am=configmodel.pop(url);
//        System.out.println("ActionModel:"+am);//?
        if(am==null) {
            throw new RuntimeException("action 配置有误");
        }
        String type=am.getType();//是action子控制器的全路径名
        try {
            Action action1 =(Action)Class.forName(type).newInstance();
            
            //action 是bookAction
            if(action instanceof ModelDriven) {
                ModelDriven md=(ModelDriven) action;
            Object    model=md.getModel();
            //要给model里的属性赋值,首先要接收前台jsp的参数 ,req.getpmap()
//                PropertyUtils.getProperty(, name);//从某一个对象中取一个参数
//            将前台参数封装进实体类
            BeanUtils.populate(model, request.getParameterMap());
            System.out.println(model);
            
            }
//            在正式调用方法前,book的属性要被赋值
            String result=action1.execute(request, response);
            ForwardModel forwardmodel =ActionModel.pop(result);
            if(forwardmodel==null) {
                throw new RuntimeException("forward config error!");
        }
            String path=forwardmodel.getPath();//路径
            request.getRequestDispatcher(path).forward(request, response);//转发
//            拿到是否需要转发的配置
            boolean redirect=forwardmodel.isRedirect();
            if(redirect) {
                response.sendRedirect(request.getServletContext().getContextPath()+path);
            }
            else {
                request.getRequestDispatcher(path).forward(request, response);
            }
//            
//            action1.execute(request, response);//
            
        } catch (Exception  e) {
            e.printStackTrace();
        }
        
    }

}
 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/998716.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号