自定义MVC

学习MVC的技能点:

MVC设计模式——XML文件的编写(DTD的基本定义格式,使用DTD规范的编写)——Dom4J解析XML文档——反射机制

DTD:

<?xml version="1.0"?>
<!DOCTYPE myframe[
        <!ELEMENT myframe (actions)>
        <!ELEMENT actions (action*)>
        <!ELEMENT action (result*)>
        <!ATTLIST action
                name CDATA #REQUIRED
                class CDATA #REQUIRED>
        <!ELEMENT result (#PCDATA)>
        <!ATTLIST result
                name CDATA #IMPLIED
                redirect (true|false) "false">
]>
<myframe>
    <actions>
        <action name="login" class="cn.action.LoginAction">
            <result name="success">/success.jsp</result>
            <result name="login">/login.jsp</result>
        </action>
    </actions>
</myframe>

Action 定义Action 的接口

public interface Action {
    //自定义Action接口
    public static  final  String SUCCESS="success";
    public static  final  String LOGIN="login";
    public String excute(HttpServletRequest request, HttpServletResponse response)throws Exception;
}

ActionMapping 把解析出来的xml属性存放在ActionMapping这个类中

public class ActionMapping {
    //xml的实体类
    private String name;
    private String className;
    private Map<String,String> map=new HashMap<String, String>();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public String getValue(String key) {
        return map.get(key);
    }

    public void addMap(String key, String value) {
        map.put(key, value);
    }
}

ActionMapping是ActionManager的管理和解析

public class ActionMappingManager {
    //ActionMappingManage是ActionManager的管理类
    private Map<String,ActionMapping> maps=new HashMap<String, ActionMapping>();

    public  ActionMapping getValue(String key) {
        return maps.get(key);
    }

    public void addMaps(String key, ActionMapping value) {
        maps.put(key, value);
    }

    public ActionMappingManager(String[] files)throws Exception{
        for (String path:files){
            init(path);
        }

    }
    public void init(String path) throws Exception {
        //开始解析XML
        InputStream is=this.getClass().getResourceAsStream("/"+path);
        //读取XML文件,获得Document对象
        Document doc=new SAXReader().read(is);
        //获取文档的根元素
        Element root=doc.getRootElement();
        //取得某节点的单个子节点
        Element actions= (Element) root.elements("actions").iterator().next();
        for(Iterator<Element> action = actions.elementIterator("action"); action.hasNext();){
            Element actionnext=action.next();
            //得到ActionMapping中要存放的属性
            ActionMapping am=new ActionMapping();
            am.setName(actionnext.attributeValue("name"));
            am.setClassName(actionnext.attributeValue("class"));
            //遍历某节点的所有属性
            for(Iterator<Element> result=actionnext.elementIterator("result");result.hasNext();){
                Element resultnext=result.next();
                String name=resultnext.attributeValue("name");
                String value=resultnext.getText();
                if(name==null||"".equals(name)){
                    name="success";
                }
                am.addMap(name,value);
            }
            maps.put(am.getName(),am);
        }

    }
}
通过反射获取Action实现类
public class ActionManager {
    //通过反射获取Action实现类
    public static  Action getActionClass(String className)throws Exception{
        Class clazz=null;
        Action action=null;
        clazz=Thread.currentThread().getContextClassLoader().loadClass(className);
        System.out.println(className+"=======================");
        if(clazz==null){
            clazz=Class.forName(className);
        }
        action=(Action)clazz.newInstance();
        return action;
    }
}

Action 的实现

public class LoginAction implements Action {
    //Action实现类
    public String excute(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String name=request.getParameter("name");
        if(name.equals("sa")){
            return  SUCCESS;
        }else {
            return LOGIN;
        }
    }
}

Servlet中

public class LoginServlet extends HttpServlet {
    ActionMappingManager manager=null;

    private String getClassName(HttpServletRequest request){
        //通过Request 系统的类来获取属性值
        String uri=request.getRequestURI(); //cn.action.LoginServlet
        
        String content=request.getContextPath();//8080后的项目名称
        
        String result=uri.substring(content.length()); //截取Login.action
        return result.substring(1,result.lastIndexOf("."));
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      //返回Servlet的地址
        String result=getClassName(request);
        //获取到ActionMapping中的属性值
        ActionMapping actionMapping=manager.getValue(result);
        String className=actionMapping.getClassName();
        try {
            System.out.println(className+"=================-----------");
            //反射出login.action里的属性值
            Action action=ActionManager.getActionClass(className);
            String excuteresult= action.excute(request, response);
            String path=actionMapping.getValue(excuteresult);
            request.getRequestDispatcher(path).forward(request,response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

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

    @Override
    public void init(ServletConfig config) throws ServletException {
        String urls=config.getInitParameter("config");
        String[] files=null;
        if(urls==null){
            files=new String[]{"myframe.xml"};
        }else{
            files=urls.split(",");
        }
        try {
            manager=new ActionMappingManager(files);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Web.xml

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>MyFrame</servlet-name>
    <servlet-class>cn.servlet.LoginServlet</servlet-class>
  <load-on-startup>0</load-on-startup>
  </servlet>
<servlet-mapping>
  <servlet-name>MyFrame</servlet-name>
  <url-pattern>*.action</url-pattern>
</servlet-mapping>
  <welcome-file-list>
    <welcome-file>/login.jsp</welcome-file>
  </welcome-file-list>
</web-app>

Login.jsp页面

<form action="login.action" method="post">
    <input name="name"> <br>
    <input type="submit">
</form>
原文地址:https://www.cnblogs.com/xiaoyu1997/p/6558062.html