1. What is the MVC
the MVC full name Model View Controller, the model (model) - view (view) - Abbreviation controller (Controller), and
it is a software design model, with a service logic, data, display interface method of separating an organization code
We need to import four packets
There are five tools
ActionModel
package com.zjj.beike; import java.io.Serializable; import java.util.HashMap; import java.util.Map; /** * 用来描述action标签 * @author Administrator * */ public class ActionModel implements Serializable{ private static final long serialVersionUID = 6145949994701469663L; private Map<String, ForwardModel> forwardModels = new HashMap<String, ForwardModel>(); private String path; private String type; public String getPath() { return path; } public void setPath(String path) { this.path = path; } public String getType() { return type; } public void setType(String type) { this.type = type; } public void put(ForwardModel forwardModel){ forwardModels.put(forwardModel.getName(), forwardModel); } public ForwardModel get(String name){ return forwardModels.get(name); } }
ConfigModel
package com.zjj.beike; import java.io.Serializable; import java.util.HashMap; import java.util.Map; /** * 用来描述config标签 * @author Administrator * */ public class ConfigModel implements Serializable{ private static final long serialVersionUID = -2334963138078250952L; private Map<String, ActionModel> actionModels = new HashMap<String, ActionModel>(); public void put(ActionModel actionModel){ actionModels.put(actionModel.getPath(), actionModel); } public ActionModel get(String name){ return actionModels.get(name); } }
ConfigModelFactory
package com.zjj.beike; import java.io.InputStream; import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class ConfigModelFactory { private ConfigModelFactory() { } private static ConfigModel configModel = null; public static ConfigModel newInstance() throws Exception { return newInstance("config.xml"); } /** * 工厂模式创建config建模对象 * * @param path * @return * @throws Exception */ public static ConfigModel newInstance(String path) throws Exception { if (null != configModel) { return configModel; } ConfigModel configModel = new ConfigModel(); InputStream is = ConfigModelFactory.class.getResourceAsStream(path); SAXReader saxReader = new SAXReader(); Document doc = saxReader.read(is); List<Element> actionEleList = doc.selectNodes("/config/action"); ActionModel actionModel = null; ForwardModel forwardModel = null; for (Element actionEle : actionEleList) { actionModel = new ActionModel(); actionModel.setPath(actionEle.attributeValue("path")); actionModel.setType(actionEle.attributeValue("type")); List<Element> forwordEleList = actionEle.selectNodes("forward"); for (Element forwordEle : forwordEleList) { forwardModel = new ForwardModel(); forwardModel.setName(forwordEle.attributeValue("name")); forwardModel.setPath(forwordEle.attributeValue("path")); forwardModel.setRedirect(forwordEle.attributeValue("redirect")); actionModel.put(forwardModel); } configModel.put(actionModel); } return configModel; } public static void main(String[] args) { try { ConfigModel configModel = ConfigModelFactory.newInstance(); ActionModel actionModel = configModel.get("/loginAction"); ForwardModel forwardModel = actionModel.get("failed"); System.out.println(actionModel.getType()); System.out.println(forwardModel.getPath()); } catch (Exception e) { e.printStackTrace(); } } }
ForwardModel
package com.zjj.beike; import java.io.Serializable; /** * 用来描述forward标签 * @author Administrator * */ public class ForwardModel implements Serializable { private static final long serialVersionUID = -8587690587750366756L; private String name; private String path; private String redirect; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPath() { return path; } public void setPath(String path) { this.path = path; } public String getRedirect() { return redirect; } public void setRedirect(String redirect) { this.redirect = redirect; } }
mvc.xml
<? XML Version = " 1.0 " encoding = " UTF-. 8 " ?> <-! config Tags: can contain 0 ~ N th action tag -> <config> ! <- action Tags: can full 0 ~ N a forward tag path: in / at the beginning of the string, and the value must be unique non-empty type: string, a non-empty -> <Action path = " / Cal " type = " com.web.AddCalAction " > <forward name = " RES " path = " / RES.jsp" redirect="false" /> </action> </config>
Let's look at our central controller
Private static Final Long serialVersionUID = 1L ; // Private the Map <String, the IAction> = new new ActionMap the HashMap <> (); // contains all the sub-control information in the object configModel Private ConfigModel configModel; public void the init () { // actionMap.put ( "/ addCal", new new AddCalAction ()); the try { String XMLPath = the this .getInitParameter ( " XMLPath " ); IF (XMLPath == null || "" .equals (XMLPath)) { configModel=ConfigModelFactory.newInstance(); }else { configModel=ConfigModelFactory.newInstance(xmlPath); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected voidthe doPost (the HttpServletRequest Request, the HttpServletResponse Response) throws ServletException, IOException { the init (); String URL = Request.getRequestURI (); // /***/addCal.action URL = url.substring (url.lastIndexOf ( " / " ) , url.lastIndexOf ( " . " )); // the IAction Action = actionMap.get (URL); . actionModel actionModel = configModel GET (URL); // IF (actionModel == null) { // the throw a RuntimeException new new ( " you do not configure the action tag, a request "not find the corresponding sub-controller processes the browser sends); // } the try { the Action Action = (the Action) the Class.forName (actionModel.getType ()) the newInstance ();. // Action is com.zking.web.CalAction IF (Action ModelDrivern the instanceof) { ModelDrivern modelDrivern = (ModelDrivern) Action; / / in this case all the attribute values of the model are null Object model = modelDrivern.getModel (); BeanUtils.populate (model, request.getParameterMap ()); } // return code String code = Action.execute (Request, Response ); forwardModel forwardModel = actionModel. GET (code); if(forwardModel!=null) { String jspPath = forwardModel.getPath(); if("false".equals(forwardModel.getRedirect())) { //做转发的处理 request.getRequestDispatcher(jspPath).forward(request, response); } else { response.sendRedirect(request.getContextPath()+jspPath); } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } // try { // action.execute(req, resp); // } catch (Exception e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } }
And our xml configuration
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>MVC</display-name> <servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>com.framework.DispatcherServlet</servlet-class> <init-param> <param-name>xmlPath</param-name> <param-value>/mvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping> </web-app>
There is also a sub-controller
Action: to directly process the request sent by the browser.
public interface Action { String execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, Exception; }
Now look at the enhanced version
The original sub-controller can only handle a user request
Action: a set of related operations placed in an Action
public class ActionSupport implements Action{ @Override public final String execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, Exception { String menthodName=request.getParameter("menthodName"); //this值的是CalAction它的一个类实例 String code=null; Method m=this.getClass().getDeclaredMethod(menthodName,HttpServletRequest.class,HttpServletResponse.class); m.setAccessible(true); code = (String) m.invoke(this,request,response); return code; } }
Java objects assignment (reflected read-write) interfaces using ModelDrivern
public interface ModelDrivern<T> { T getModel(); }
The next step is to implement business logic classes CalAction
public class CalAction extends ActionSupport implements ModelDrivern<Cal>{ private Cal cal=new Cal(); public String add(HttpServletRequest request, HttpServletResponse response) throws Exception, Exception { request.setAttribute("res", cal.getNum1()+cal.getNum2()); return "res"; } public String reduce(HttpServletRequest request, HttpServletResponse response) throws Exception, Exception { request.setAttribute("res", cal.getNum1()-cal.getNum2()); return "res"; } public String ride(HttpServletRequest request, HttpServletResponse response) throws Exception, Exception { request.setAttribute("res", cal.getNum1()*cal.getNum2()); return "res"; } public String except(HttpServletRequest request, HttpServletResponse response) throws Exception, Exception { request.setAttribute("res", cal.getNum1()/cal.getNum2()); return "really"; } @Override public Cal getModel() { // TODO Auto-generated method stub return cal; } }
The last is a JSP page
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript"> function doSub(num){ if(num == 1){ calForm.action="${pageContext.request.contextPath}/Cal.action?menthodName=add"; } else if(num==2){ calForm.action="${pageContext.request.contextPath}/Cal.action?menthodName=reduce"; } else if(num==3){ calForm.action="${pageContext.request.contextPath}/Cal.action?menthodName=ride"; } else if(num==4){ calForm.action="${pageContext.request.contextPath}/Cal.action?menthodName=except"; } calForm.submit(); } </script> </head> <body> <form name="calForm" method="post" action=""> num1:<input type="text" name="num1" ><br> num2:<input type="text" name="num2" ><br> <button onclick="doSub(1)">+</button> <button onclick="doSub(2)">-</button> <button onclick="doSub(3)">*</button> <button onclick="doSub(4)">/</button> </form> </body> </html>
I have chosen to take the
result