学习反射之后写一个简单的mvc框架

整儿思路如下

  1. 将各种重要的信息放到xml中
  2. 在过滤器中配置好,需要访问的路径
  3. 读取xml,拿到数据,跳转,这样就实现springmvc的小部分功能

所以需要下面的知识点

  • 会定义xml文件的dtd
  • 读取xml文件 (dom4j)
  • 反射基础
  • javaweb基础
  • 过滤器

首先我的项目目录如下
在这里插入图片描述

所以下面就开始了,我按照步骤来取标题

1. 定义xml的DTD文件

<?xml version="1.0" encoding="UTF-8" ?>
<!ELEMENT hhymvc (action*)>
<!ELEMENT action (result+)>
<!ELEMENT result (#PCDATA)>
<!--配置三个属性-->
<!ATTLIST action name ID #REQUIRED class CDATA #REQUIRED>
<!ATTLIST result name CDATA #REQUIRED>

ELEMENT是标签
ATTLIST是属性。
*代表有0个或者是多个
+代表是有一个或者多个
#PCDATA 和 CDATA 是填写文字
ID 是代表唯一不可以重复
#REQUIRED 代表必填

对应的xml如下

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE hhymvc SYSTEM "hhy.dtd">
<hhymvc>
    <action name="s1" class="mymvc.servlet.MyServlet01">
        <result name="0">0.jsp</result>
        <result name="1">1.jsp</result>
    </action>
    <action name="s2" class="mymvc.servlet.MyServlet02">
        <result name="yes">yes.jsp</result>
        <result name="no">no.jsp</result>
    </action>
</hhymvc>

2. 定义一个接口代替httpservlet

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

接口很简单。

servlet实现接口

public class MyServlet01 implements HhyAction {
    @Override
    public String execute(HttpServletRequest request, HttpServletResponse response) {
        return "0";
    }
}

3. 配置过滤器

public class HhyFilter implements Filter {
	@Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    }
       
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <filter>
        <filter-name>myfilter</filter-name>
        <filter-class>mymvc.filter.HhyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>myfilter</filter-name>
        <url-pattern>*.do</url-pattern>
    </filter-mapping>
    <context-param>
        <param-name>hhymvc</param-name>
        <param-value>hhymvc.xml</param-value>
    </context-param>
</web-app>

可以看到这个地方我除了过滤器的标签,还有一个context-param标签,
这个标签是,保存一个全局的变量。。。方便待会拿。

public class HhyFilter implements Filter {
    private Map<String,String> resultMap = new HashMap<>();
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;
        //截取字符串
        String requestURL = new String(req.getRequestURL());
        String servletName = requestURL.substring(requestURL.lastIndexOf("/") + 1, requestURL.indexOf("."));
//        System.out.println(servletName);
        HhyAction action = getAction(req, servletName);
        //这里拿到返回值,然后通过map获取参数让后跳转
        String executeResult = action.execute(req, resp);
        if (resultMap.containsKey(executeResult)){
            //这里就跳转
            resp.sendRedirect(resultMap.get(executeResult));
        }
    }

    public HhyAction getAction(HttpServletRequest request, String servletName) {
        HhyAction hhyAction = null;
        String className = "";
        //这一步可以拿到web.xml 中存储的xml名字。
        String hhymvc = request.getServletContext().getInitParameter("hhymvc");
        //这里就是拿到xml的绝对路径
        String xmlPath = request.getRealPath("./") + hhymvc;
        System.out.println(xmlPath);

        //拿到xml的名字之后就是解析xml
        try {
            SAXReader saxReader = new SAXReader();
            Document read = saxReader.read(new File(xmlPath));
            Element hhymvcElement = read.getRootElement();
            List<Element> actionElements = hhymvcElement.elements();
            for (Element actionElement : actionElements) {
                if (servletName.equals(actionElement.attributeValue("name"))){
                    //要在这里获取全类名,待会方便反射
                    className = actionElement.attributeValue("class");
                    for (Element resultElement : actionElement.elements()) {
                        //这里把对应的请求放到了map中。。
                        resultMap.put(resultElement.attribute(0).getValue(),resultElement.getText());
                    }
                }
            }

            resultMap.forEach((k,v)->{
                System.out.println(k+":"+v);
            });

            //拿到这个class之后就可以开始反射了
            hhyAction = (HhyAction) Class.forName(className).newInstance();

        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }

        return hhyAction;
    }
}

这里可能有点多,那到底干了什么呢,

  1. 从web.xml中拿到了xml的文件名
  2. 拿到这个文件名的绝对路径,然后使用SAXReader对象读取这个xml
  3. 读取xml中的数据,然后拿出来放到map中。
  4. 从map中拿到数据(需要跳转的网页),然后跳转
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值