java实现简单的MVC框架

.title { background: blue; height: 50px; line-height: 50px; border: 1px solid; color: red }

一、mvc的模式如下图所示

二、基于路径访问的控制器

控制器BaseServlet类如下

package com.wangyang.web;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import javax.servlet.ServletConfig;
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 com.wangyang.model.ShopSc;
import com.wangyang.util.PropertiesUtil;

@WebServlet("/")
public class BaseServlet extends HttpServlet{
    private Map<String, String> map = new HashMap<String, String>();
    private static final long serialVersionUID = 1L;
    @Override
    public void init(ServletConfig config) throws ServletException {
        Properties prop = PropertiesUtil.getMvcProp();
        for(String key : prop.stringPropertyNames()){
            map.put(key, prop.getProperty(key));
        }
        System.out.println(map);
    }
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        path(req, resp);
    }/**
     * 基于路径的映射
     */
    public void path(HttpServletRequest req, HttpServletResponse resp){
        String method = req.getRequestURI().replace(req.getServletContext().getContextPath()+"/", "");
        try {
            String[] str = method.split("/");
            String className;
            String methodName;
            if(str.length<=1){
                className=str[0];
                methodName="execute";
            }else{
                className = str[0];
                methodName = str[1];
            }

            System.out.println(className+"--"+methodName);
            Class<?> clz;
            try {
                clz = Class.forName(map.get(className));
            } catch (NullPointerException e1) {
                error("没有找到处理的类!!", req, resp);
                return;
            }
            Method m;
            try {
                m = clz.getMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
            } catch (NoSuchMethodException e) {
                error("该类没有要执行的方法!!", req, resp);
                return;
            }
            String path = (String)m.invoke(clz.newInstance(), req,resp);
            req.getRequestDispatcher("/WEB-INF/"+path).forward(req, resp);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }  catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ServletException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public void error(String msg,HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException{
        req.setAttribute("error",msg);
        req.getRequestDispatcher("/WEB-INF/error.jsp").forward(req, resp);
    }
}

配置文件PropertiesUtil的编写

package com.wangyang.util;

import java.io.IOException;
import java.util.Properties;

public class PropertiesUtil {private static Properties mvcProp;public static Properties getMvcProp(){
        try {
            if(mvcProp==null){
                mvcProp = new Properties();
                mvcProp.load(PropertiesUtil.class.getClassLoader().getResourceAsStream("mvc.properties"));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return mvcProp;
    }
}
mvc.properties的编写

user=com.wangyang.web.UserServlet
address=com.wangyang.web.AddressServlet
package com.wangyang.web;

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

public class AddressServlet {
    public String list(HttpServletRequest req, HttpServletResponse resp){
        req.setAttribute("address", "list");
        return "address.jsp";
    }
    public String execute(HttpServletRequest req, HttpServletResponse resp){
        req.setAttribute("address", "execute addredss");
        return "address.jsp";
    }
}
package com.wangyang.web;

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

public class AddressServlet {
    public String list(HttpServletRequest req, HttpServletResponse resp){
        req.setAttribute("address", "list");
        return "address.jsp";
    }
    public String execute(HttpServletRequest req, HttpServletResponse resp){
        req.setAttribute("address", "execute addredss");
        return "address.jsp";
    }
}

结果如下图

三、基于参数访问的控制器

package com.wangyang.web;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

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

import com.wangyang.model.ShopSc;

public class BaseServlet extends HttpServlet{

    private static final long serialVersionUID = 1L;
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        method2(req, resp);
    }

    public void method2(HttpServletRequest req,HttpServletResponse resp){
        String methodName = req.getParameter("method");
        try {
            Method method = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
            String path = (String)method.invoke(this, req,resp);
            req.getRequestDispatcher("WEB-INF/"+path).forward(req, resp);;
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ServletException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
package com.wangyang.web;

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

import com.wangyang.model.ShopSc;

@WebServlet("/user")
public class UserServlet extends BaseServlet{

    static final long serialVersionUID = 1L;
    //@ShopSc("user/index.jsp")
    public String add(HttpServletRequest req, HttpServletResponse resp){
        req.setAttribute("name", "wangyang");
        return "user/index.jsp";
    }

}

无论使那种控制器,都是获取url的参数,之后利用反射去调用相应的方法

原文地址:https://www.cnblogs.com/wangyang1749/p/9805385.html

时间: 2024-10-14 08:02:13

java实现简单的MVC框架的相关文章

AsMVC:一个简单的MVC框架的Java实现

当初看了<从零开始写一个Java Web框架>,也跟着写了一遍,但当时学艺不精,真正进脑子里的并不是很多,作者将依赖注入框架和MVC框架写在一起也给我造成了不小的困扰.最近刚好看了一遍springMVC的官方文档,对过去一段时间的使用做了一下总结,总结了一些MVC的使用需求,打算自己开坑写一个MVC框架,虽然是重复造轮子的过程,但也是学习提高的过程. 1.我们可能需要一个什么样的MVC框架 (1)用户一:我讨厌配置文件,最好能用注解的全用注解注解,能扫描直接扫描 (2)用户二:最好我导入一个j

PHP之简单实现MVC框架

PHP之简单实现MVC框架 1.概述 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑.MVC被独特的发展起来用于映射传统的输入.处理和输出功能在一个逻辑的图形化用户界面的结构中. 2.代码结构 3.代码实现 1 2 3 4 5 6 7 8 9 10 1

自己动手写一个简单的MVC框架(第二版)

一.ASP.NET MVC核心机制回顾 在ASP.NET MVC中,最核心的当属“路由系统”,而路由系统的核心则源于一个强大的System.Web.Routing.dll组件. 在这个System.Web.Routing.dll中,有一个最重要的类叫做UrlRoutingModule,它是一个实现了IHttpModule接口的类,在请求处理管道中专门针对ASP.NET MVC请求进行处理.首先,我们要了解一下UrlRoutingModule是如何起作用的. (1)IIS网站的配置可以分为两个块:

JSR 371——Java 8新的MVC框架

MVC是一种软件架构模式,它将业务逻辑.数据和界面显示的代码分离,将业务逻辑聚集到一个模块里面,当用户需要改进或定制个性化界面及用户交互 的时候不需要重新编写业务逻辑.在过去的十几年中,JSF所提供的面向组件的MVC是Java EE平台仅有的用户界面技术.而另一边Spring MVC以及Struts等技术却已经被广泛采用并产品化.MVC 1.0规范( JSR 371 )的产生既是为了填补这一空白,同时也是为了满足广大J2EE开发者的要求. 那么与之前的JSF相比,JSR 371规范有哪些不同之处

封装简单的mvc框架

mvc 自己封装一个框架 MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式. MVC把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller). PHP中MVC模式也称Web MVC,从上世纪70年代进化而来. MVC的目的是实现一种动态的程序设计,便于后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能. 除此之外,此模式通过对复杂度的简化,使程序结构更加直观. MVC各部分的职能: 模型Model – 管

Java实现简单的RPC框架

一.RPC简介 RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议.它允许像调用本地服务一样调用远程服务.它可以有不同的实现方式.如RMI(远程方法调用).Hessian.Http invoker等.另外,RPC是与语言无关的. RPC示意图 如上图所示,假设Computer1在调用sayHi()方法,对于Computer1而言调用sayHi()方法就像调用本地方法一样,调用 –>返回.但从后续调用可以看出Computer1调用的是Computer2

Java 实现简单的RPC框架

0 引言 RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议.它允许像调用本地服务一样调用远程服务.它可以有不同的实现方式.如RMI(远程方法调用).Hessian.Http invoker等.另外,RPC是与语言无关的. 假设Computer1在调用sayHi()方法,对于Computer1而言调用sayHi()方法就像调用本地方法一样,调用 –>返回.但从后续调用可以看出Computer1调用的是Computer2中的sayHi()方法,RPC屏

一个简单的MVC框架的实现-基于注解的实现

1.@Action注解声明 package com.togogo.webtoservice.annotations; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotatio

一个简单的MVC框架的实现

1.Action接口 package com.togogo.webtoservice; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public interface Action { /** * 默认的执行方法 * @param request 传入处理的请求对象 * @param response 传入处理的响应对象 * @return 返回一个跳转的路