• 自定义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>
  • 相关阅读:
    前端之 http
    事务、存储、索引与慢查询及数据库设计的三大范式
    Navcat 软件使用及 pymysql模块
    MySQL单表查询与多表查询
    IO 模型
    Unable to round-trip http request to upstream: read tcp 192.168.xx.xxx:xxxxx->xx.xxx.xxx.x:xxx: read: operation timed out
    恶补计算机基础知识(一)
    2020 年终总结
    自我总结Java并发编程基础篇(一)
    jvm系列(三):GC算法、垃圾收集器
  • 原文地址:https://www.cnblogs.com/xiaoyu1997/p/6558062.html
Copyright © 2020-2023  润新知