• 简单自定义MVC优化


    前言

    这篇文章接上一篇文章,上一篇文章分享了简单的自定义了MVC。本片文章就来分享自定义MVC优化。


    一、中央控制器动态加载储存子控制器

    我们自定义MVC最后要将它导出成jar包,那如果我们要加的子控制器怎么办,都导成jar包。

    这里我们就要用到之前分享的内容XML。

    通过之前的建模我们可以知道,configModel对象会包含config.xml中的所有子控制器信息
    同时为了解决中央控制器能够动态的加载保存子控制器的信息,我们只需要引入configModel对象即可

                                                                   DispatcherServlet

    1. package com.zhw.framework;
    2. import java.io.IOException;
    3. import java.util.HashMap;
    4. import java.util.Map;
    5. import javax.servlet.ServletException;
    6. import javax.servlet.annotation.WebServlet;
    7. import javax.servlet.http.HttpServlet;
    8. import javax.servlet.http.HttpServletRequest;
    9. import javax.servlet.http.HttpServletResponse;
    10. import com.zhw.web.BookAction;
    11. import com.zhw.xml.ActionModel;
    12. import com.zhw.xml.ConfigModel;
    13. import com.zhw.xml.ConfigModelFactory;
    14. //@WebServlet("*.action")
    15. public class DispatcherServlet extends HttpServlet{
    16. // private Map<String,Action> actions = new HashMap<String,Action>();
    17. private ConfigModel configModel;
    18. /*
    19. * 通过之前的建模我们可以知道,configModel对象会包含config.xml中的所有子控制器信息
    20. * 同时为了解决中央控制器能够动态的加载保存子控制器的信息,我们只需要引入configModel对象即可
    21. */
    22. @Override
    23. public void init() throws ServletException {
    24. // actions.put("/book",new BookAction());
    25. // actions.put("/order",new BookAction());
    26. try {
    27. configModel = ConfigModelFactory.bulid();
    28. } catch (Exception e) {
    29. e.printStackTrace();
    30. }
    31. }
    32. @Override
    33. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    34. doPost(req, resp);
    35. }
    36. @Override
    37. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    38. //http://localhost:8080/mvc/book.action?methodName=list
    39. String uri = req.getRequestURI();
    40. uri = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));
    41. // Action action = actions.get(uri);
    42. // action.execute(req, resp);
    43. //
    44. ActionModel actionModel = configModel.pop(uri);
    45. if(actionModel == null) {
    46. throw new RuntimeException("action 配置错误 ");
    47. }
    48. //是action子控制器的全路径名
    49. String type = actionModel.getType();
    50. try {
    51. //类类是反射的开始,通过子控制器的全路径名用newInstance方法得到子控制器。
    52. Action action = (Action) Class.forName(type).newInstance();
    53. } catch (Exception e) {
    54. e.printStackTrace();
    55. }
    56. }
    57. }

                                                   config.xml

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <config>
    3. <action path="/book" type="com.zhw.web.BookAction">
    4. <forward name="failed" path="/login.jsp" redirect="false" />
    5. <forward name="success" path="/main.jsp" redirect="true" />
    6. </action>
    7. </config>

                                                       ConfigModel

    1. package com.zhw.xml;
    2. import java.util.HashMap;
    3. import java.util.Map;
    4. /**
    5. * 对应标签
    6. * @author zhw
    7. *
    8. */
    9. public class ConfigModel {
    10. private Map<String,ActionModel> aMap = new HashMap<String,ActionModel>();
    11. public void push(ActionModel actionModel) {
    12. aMap.put(actionModel.getPath(), actionModel);
    13. }
    14. public ActionModel pop(String path) {
    15. return aMap.get(path);
    16. }
    17. }

                                                ConfigModelFactory           

    1. package com.zhw.xml;
    2. import java.io.InputStream;
    3. import java.util.List;
    4. import org.dom4j.Document;
    5. import org.dom4j.DocumentException;
    6. import org.dom4j.Element;
    7. import org.dom4j.io.SAXReader;
    8. /**
    9. * 23种设计模式之工厂模式
    10. * sessionfactory
    11. *
    12. * @author zhw
    13. *
    14. */
    15. public class ConfigModelFactory {
    16. public static ConfigModel bulid() throws Exception {
    17. String defaultPath = "/config.xml";
    18. InputStream in = ConfigModelFactory.class.getResourceAsStream(defaultPath);
    19. SAXReader s = new SAXReader();
    20. Document doc = s.read(in);
    21. ConfigModel configModel = new ConfigModel();
    22. List<Element> actionEles = doc.selectNodes("/config/action");
    23. for (Element ele : actionEles) {
    24. ActionModel actionModel = new ActionModel();
    25. actionModel.setPath(ele.attributeValue("path"));
    26. actionModel.setType(ele.attributeValue("type"));
    27. //将forwardModel 赋值并添加到ActionModel
    28. List<Element> forwardEles = ele.selectNodes("forward");
    29. for (Element fele : forwardEles) {
    30. ForwardModel forwardModel = new ForwardModel();
    31. forwardModel.setName(fele.attributeValue("name"));
    32. forwardModel.setPath(fele.attributeValue("path"));
    33. forwardModel.setRedirect("true".equals(fele.attributeValue("redirect")));
    34. actionModel.push(forwardModel);
    35. }
    36. configModel.push(actionModel);
    37. }
    38. return configModel;
    39. }
    40. }

    优化后运行:

     

     二、参数传递封装

    假设我们需要新增一本书籍,需要传的为书籍编号,书籍名称,书籍价格。三个参数,很方便,但是如果需要传三十个参数呢?为了这个问题,对参数传递封装

    未优化前:              

                                    Demo

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    4. <html>
    5. <head>
    6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    7. <title>Insert title here</title>
    8. </head>
    9. <body>
    10. <h3>目前增删改查的方法</h3>
    11. <a href="${pageContext.request.contextPath }/book/add">增加</a>
    12. <a href="${pageContext.request.contextPath }/book/del">删除</a>
    13. <a href="${pageContext.request.contextPath }/book/edit">修改</a>
    14. <a href="${pageContext.request.contextPath }/book/list">查询</a>
    15. <!-- r
    16. 上述问题:
    17. 1、关于单个实体/表操作场景越多,需要新建的类也就越多,造成了项目中类的数量过于庞大
    18. 2、当新增了业务,除了要添加该业务对应的方法(load),同时还要改动原有的方法
    19. 3、反射相关代码、在每一个实体类对应的Servlet中都存在
    20. 4、每一个Servlets中都有doget、dopost
    21. -->
    22. <h3>类数量过多问题的优化</h3>
    23. <a href="${pageContext.request.contextPath }/book.action?methodName=add">增加</a>
    24. <a href="${pageContext.request.contextPath }/book.action?methodName=del">删除</a>
    25. <a href="${pageContext.request.contextPath }/book.action?methodName=edit">修改</a>
    26. <a href="${pageContext.request.contextPath }/book.action?methodName=list">查询</a>
    27. <a href="${pageContext.request.contextPath }/book.action?methodName=load">回显</a>
    28. <h3>订单类CRUD</h3>
    29. <a href="${pageContext.request.contextPath }/order.action?methodName=add">增加</a>
    30. <a href="${pageContext.request.contextPath }/order.action?methodName=del">删除</a>
    31. <a href="${pageContext.request.contextPath }/order.action?methodName=edit">修改</a>
    32. <a href="${pageContext.request.contextPath }/order.action?methodName=list">查询</a>
    33. <a href="${pageContext.request.contextPath }/order.action?methodName=load">回显</a>
    34. <h3>xx</h3>
    35. <a href="${pageContext.request.contextPath }/book.action?methodName=add&bid=123&bname=logo&price=99">增加</a>
    36. <a href="${pageContext.request.contextPath }/book.action?methodName=del">删除</a>
    37. <a href="${pageContext.request.contextPath }/book.action?methodName=edit">修改</a>
    38. <a href="${pageContext.request.contextPath }/book.action?methodName=list">查询</a>
    39. <a href="${pageContext.request.contextPath }/book.action?methodName=load">回显</a>
    40. </body>
    41. </html>

                                                 BookAction 

    1. package com.zhw.web;
    2. import javax.servlet.http.HttpServletRequest;
    3. import javax.servlet.http.HttpServletResponse;
    4. import com.zhw.entity.Book;
    5. import com.zhw.framework.ActionSupport;
    6. public class BookAction extends ActionSupport{
    7. private void list(HttpServletRequest req, HttpServletResponse resp) {
    8. System.out.println("在同样一个Servlet中调用list方法");
    9. }
    10. private void edit(HttpServletRequest req, HttpServletResponse resp) {
    11. System.out.println("在同样一个Servlet中调用edit方法");
    12. }
    13. private void del(HttpServletRequest req, HttpServletResponse resp) {
    14. System.out.println("在同样一个Servlet中调用del方法");
    15. }
    16. private void add(HttpServletRequest req, HttpServletResponse resp) {
    17. String bid = req.getParameter("bid");
    18. String bname = req.getParameter("bname");
    19. String price = req.getParameter("price");
    20. Book book = new Book();
    21. book.setBid(Integer.valueOf(bid));
    22. book.setBname(bname);
    23. book.setPrice(Float.valueOf(price));
    24. System.out.println("在同样一个Servlet中调用add方法");
    25. }
    26. private void load(HttpServletRequest req, HttpServletResponse resp) {
    27. System.out.println("在同样一个Servlet中调用load方法");
    28. }
    29. }

                                                            Book

    1. package com.zhw.entity;
    2. public class Book {
    3. private int bid;
    4. private String bname;
    5. private float price;
    6. public int getBid() {
    7. return bid;
    8. }
    9. public void setBid(int bid) {
    10. this.bid = bid;
    11. }
    12. public String getBname() {
    13. return bname;
    14. }
    15. public void setBname(String bname) {
    16. this.bname = bname;
    17. }
    18. public float getPrice() {
    19. return price;
    20. }
    21. public void setPrice(float price) {
    22. this.price = price;
    23. }
    24. public Book() {
    25. // TODO Auto-generated constructor stub
    26. }
    27. @Override
    28. public String toString() {
    29. return "Book [bid=" + bid + ", bname=" + bname + ", price=" + price + "]";
    30. }
    31. }

    优化后:

                                            DispatcherServlet

    1. package com.zhw.framework;
    2. import java.io.IOException;
    3. import java.util.HashMap;
    4. import java.util.Map;
    5. import javax.servlet.ServletException;
    6. import javax.servlet.annotation.WebServlet;
    7. import javax.servlet.http.HttpServlet;
    8. import javax.servlet.http.HttpServletRequest;
    9. import javax.servlet.http.HttpServletResponse;
    10. import org.apache.commons.beanutils.BeanUtils;
    11. import com.zhw.web.BookAction;
    12. import com.zhw.xml.ActionModel;
    13. import com.zhw.xml.ConfigModel;
    14. import com.zhw.xml.ConfigModelFactory;
    15. import com.zhw.xml.ForwardModel;
    16. //@WebServlet("*.action")
    17. public class DispatcherServlet extends HttpServlet{
    18. // private Map<String,Action> actions = new HashMap<String,Action>();
    19. private ConfigModel configModel;
    20. /*
    21. * 通过之前的建模我们可以知道,configModel对象会包含config.xml中的所有子控制器信息
    22. * 同时为了解决中央控制器能够动态的加载保存子控制器的信息,我们只需要引入configModel对象即可
    23. */
    24. @Override
    25. public void init() throws ServletException {
    26. // actions.put("/book",new BookAction());
    27. // actions.put("/order",new BookAction());
    28. try {
    29. String configLocation = this.getInitParameter("configLocation");
    30. if(configLocation == null ||"".equals(configLocation)) {
    31. }
    32. configModel = ConfigModelFactory.bulid();
    33. } catch (Exception e) {
    34. e.printStackTrace();
    35. }
    36. }
    37. @Override
    38. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    39. doPost(req, resp);
    40. }
    41. @Override
    42. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    43. //http://localhost:8080/mvc/book.action?methodName=list
    44. String uri = req.getRequestURI();
    45. uri = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));
    46. // Action action = actions.get(uri);
    47. // action.execute(req, resp);
    48. //
    49. ActionModel actionModel = configModel.pop(uri);
    50. if(actionModel == null) {
    51. throw new RuntimeException("action 配置错误 ");
    52. }
    53. //是action子控制器的全路径名
    54. String type = actionModel.getType();
    55. try {
    56. //类类是反射的开始,通过子控制器的全路径名用newInstance方法得到子控制器。
    57. Action action = (Action) Class.forName(type).newInstance();
    58. if(action instanceof ModelDriven) {
    59. ModelDriven md = (ModelDriven)action;
    60. Object model = md.getModel();
    61. //将前端所有参数值封装进实体类
    62. BeanUtils.populate(model, req.getParameterMap());
    63. }
    64. // 正式调用放法,book中的属性要被赋值
    65. // action.execute(req, resp);
    66. } catch (Exception e) {
    67. e.printStackTrace();
    68. }
    69. }
    70. }

                                                            Demo 

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    4. <html>
    5. <head>
    6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    7. <title>Insert title here</title>
    8. </head>
    9. <body>
    10. <h3>参数传递封装的优化</h3>
    11. <a href="${pageContext.request.contextPath }/book.action?methodName=add&bid=989898&bname=laoliu&price=89">增加</a>
    12. <a href="${pageContext.request.contextPath }/book.action?methodName=del">删除</a>
    13. <a href="${pageContext.request.contextPath }/book.action?methodName=edit">修改</a>
    14. <a href="${pageContext.request.contextPath }/book.action?methodName=list">查询</a>
    15. <a href="${pageContext.request.contextPath }/book.action?methodName=load">回显</a>
    16. </body>
    17. </html>

                                                    BookAction 

    1. package com.zhw.web;
    2. import javax.servlet.http.HttpServletRequest;
    3. import javax.servlet.http.HttpServletResponse;
    4. import com.zhw.entity.Book;
    5. import com.zhw.framework.ActionSupport;
    6. import com.zhw.framework.ModelDriven;
    7. public class BookAction extends ActionSupport implements ModelDriven<Book>{
    8. private Book book = new Book();
    9. private String list(HttpServletRequest req, HttpServletResponse resp) {
    10. System.out.println("在同样一个Servlet中调用list方法");
    11. return "success";
    12. }
    13. private void edit(HttpServletRequest req, HttpServletResponse resp) {
    14. System.out.println("在同样一个Servlet中调用edit方法");
    15. }
    16. private void del(HttpServletRequest req, HttpServletResponse resp) {
    17. System.out.println("在同样一个Servlet中调用del方法");
    18. }
    19. private String add(HttpServletRequest req, HttpServletResponse resp) {
    20. // String bid = req.getParameter("bid");
    21. // String bname = req.getParameter("bname");
    22. // String price = req.getParameter("price");
    23. // Book book = new Book();
    24. // book.setBid(Integer.valueOf(bid));
    25. // book.setBname(bname);
    26. // book.setPrice(Float.valueOf(price));
    27. System.out.println("在同样一个Servlet中调用add方法");
    28. return "failed";
    29. }
    30. private void load(HttpServletRequest req, HttpServletResponse resp) {
    31. System.out.println("在同样一个Servlet中调用load方法");
    32. }
    33. @Override
    34. public Book getModel() {
    35. return book;
    36. }
    37. }

     

    三、方法执行结果优化

    对方法的执行结果进行优化,如果增加成功就用转发,失败就用重定向。 

                                                    DispatcherServlet 

    1. package com.zhw.framework;
    2. import java.io.IOException;
    3. import java.util.HashMap;
    4. import java.util.Map;
    5. import javax.servlet.ServletException;
    6. import javax.servlet.annotation.WebServlet;
    7. import javax.servlet.http.HttpServlet;
    8. import javax.servlet.http.HttpServletRequest;
    9. import javax.servlet.http.HttpServletResponse;
    10. import org.apache.commons.beanutils.BeanUtils;
    11. import com.zhw.web.BookAction;
    12. import com.zhw.xml.ActionModel;
    13. import com.zhw.xml.ConfigModel;
    14. import com.zhw.xml.ConfigModelFactory;
    15. import com.zhw.xml.ForwardModel;
    16. //@WebServlet("*.action")
    17. public class DispatcherServlet extends HttpServlet{
    18. // private Map<String,Action> actions = new HashMap<String,Action>();
    19. private ConfigModel configModel;
    20. /*
    21. * 通过之前的建模我们可以知道,configModel对象会包含config.xml中的所有子控制器信息
    22. * 同时为了解决中央控制器能够动态的加载保存子控制器的信息,我们只需要引入configModel对象即可
    23. */
    24. @Override
    25. public void init() throws ServletException {
    26. // actions.put("/book",new BookAction());
    27. // actions.put("/order",new BookAction());
    28. try {
    29. String configLocation = this.getInitParameter("configLocation");
    30. if(configLocation == null ||"".equals(configLocation)) {
    31. }
    32. configModel = ConfigModelFactory.bulid();
    33. } catch (Exception e) {
    34. e.printStackTrace();
    35. }
    36. }
    37. @Override
    38. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    39. doPost(req, resp);
    40. }
    41. @Override
    42. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    43. //http://localhost:8080/mvc/book.action?methodName=list
    44. String uri = req.getRequestURI();
    45. uri = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));
    46. // Action action = actions.get(uri);
    47. // action.execute(req, resp);
    48. //
    49. ActionModel actionModel = configModel.pop(uri);
    50. if(actionModel == null) {
    51. throw new RuntimeException("action 配置错误 ");
    52. }
    53. //是action子控制器的全路径名
    54. String type = actionModel.getType();
    55. try {
    56. //类类是反射的开始,通过子控制器的全路径名用newInstance方法得到子控制器。
    57. Action action = (Action) Class.forName(type).newInstance();
    58. if(action instanceof ModelDriven) {
    59. ModelDriven md = (ModelDriven)action;
    60. Object model = md.getModel();
    61. //将前端所有参数值封装进实体类
    62. BeanUtils.populate(model, req.getParameterMap());
    63. }
    64. // 正式调用放法,book中的属性要被赋值
    65. action.execute(req, resp);
    66. String result = action.execute(req, resp);
    67. ForwardModel forwardModel = actionModel.pop(result);
    68. boolean redirect = forwardModel.isRedirect();
    69. if(forwardModel == null) {
    70. throw new RuntimeException("forward config error");
    71. }
    72. String path = forwardModel.getPath();
    73. if(redirect)
    74. resp.sendRedirect(req.getServletContext().getContextPath()+path);
    75. else
    76. req.getRequestDispatcher(path).forward(req, resp);
    77. } catch (Exception e) {
    78. e.printStackTrace();
    79. }
    80. }
    81. }

                                                                    xml 

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <config>
    3. <action path="/book" type="com.zhw.web.BookAction">
    4. <forward name="success" path="/Demo2.jsp" redirect="false" />
    5. <forward name="failed" path="/Demo3.jsp" redirect="true" />
    6. </action>
    7. </config>

                                     forwardModel

    1. package com.zhw.xml;
    2. /**
    3. * @author zhw
    4. *
    5. */
    6. public class ForwardModel {
    7. // <forward name="failed" path="/reg.jsp" redirect="false" />
    8. private String name;
    9. private String path;
    10. private Boolean redirect;
    11. public String getName() {
    12. return name;
    13. }
    14. public void setName(String name) {
    15. this.name = name;
    16. }
    17. public String getPath() {
    18. return path;
    19. }
    20. public void setPath(String path) {
    21. this.path = path;
    22. }
    23. public Boolean getRedirect() {
    24. return redirect;
    25. }
    26. public void setRedirect(Boolean redirect) {
    27. this.redirect = redirect;
    28. }
    29. public boolean isRedirect() {
    30. return redirect;
    31. }
    32. }

     

    四、框架配置文件可变

                                    DispatcherServlet

    1. package com.zhw.framework;
    2. import java.io.IOException;
    3. import java.util.HashMap;
    4. import java.util.Map;
    5. import javax.servlet.ServletException;
    6. import javax.servlet.annotation.WebServlet;
    7. import javax.servlet.http.HttpServlet;
    8. import javax.servlet.http.HttpServletRequest;
    9. import javax.servlet.http.HttpServletResponse;
    10. import org.apache.commons.beanutils.BeanUtils;
    11. import com.zhw.web.BookAction;
    12. import com.zhw.xml.ActionModel;
    13. import com.zhw.xml.ConfigModel;
    14. import com.zhw.xml.ConfigModelFactory;
    15. import com.zhw.xml.ForwardModel;
    16. //@WebServlet("*.action")
    17. public class DispatcherServlet extends HttpServlet{
    18. // private Map<String,Action> actions = new HashMap<String,Action>();
    19. private ConfigModel configModel;
    20. /*
    21. * 通过之前的建模我们可以知道,configModel对象会包含config.xml中的所有子控制器信息
    22. * 同时为了解决中央控制器能够动态的加载保存子控制器的信息,我们只需要引入configModel对象即可
    23. */
    24. @Override
    25. public void init() throws ServletException {
    26. // actions.put("/book",new BookAction());
    27. // actions.put("/order",new BookAction());
    28. try {
    29. String configLocation = this.getInitParameter("configLocation");
    30. if(configLocation == null ||"".equals(configLocation)) {
    31. }
    32. configModel = ConfigModelFactory.bulid();
    33. } catch (Exception e) {
    34. e.printStackTrace();
    35. }
    36. }
    37. @Override
    38. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    39. doPost(req, resp);
    40. }
    41. @Override
    42. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    43. //http://localhost:8080/mvc/book.action?methodName=list
    44. String uri = req.getRequestURI();
    45. uri = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));
    46. // Action action = actions.get(uri);
    47. // action.execute(req, resp);
    48. //
    49. ActionModel actionModel = configModel.pop(uri);
    50. if(actionModel == null) {
    51. throw new RuntimeException("action 配置错误 ");
    52. }
    53. //是action子控制器的全路径名
    54. String type = actionModel.getType();
    55. try {
    56. //类类是反射的开始,通过子控制器的全路径名用newInstance方法得到子控制器。
    57. Action action = (Action) Class.forName(type).newInstance();
    58. if(action instanceof ModelDriven) {
    59. ModelDriven md = (ModelDriven)action;
    60. Object model = md.getModel();
    61. //将前端所有参数值封装进实体类
    62. BeanUtils.populate(model, req.getParameterMap());
    63. }
    64. // 正式调用放法,book中的属性要被赋值
    65. action.execute(req, resp);
    66. String result = action.execute(req, resp);
    67. ForwardModel forwardModel = actionModel.pop(result);
    68. boolean redirect = forwardModel.isRedirect();
    69. if(forwardModel == null) {
    70. throw new RuntimeException("forward config error");
    71. }
    72. String path = forwardModel.getPath();
    73. if(redirect)
    74. resp.sendRedirect(req.getServletContext().getContextPath()+path);
    75. else
    76. req.getRequestDispatcher(path).forward(req, resp);
    77. } catch (Exception e) {
    78. e.printStackTrace();
    79. }
    80. }
    81. }

                            web.xml 

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <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">
    3. <display-name>ss</display-name>
    4. <servlet>
    5. <servlet-name>mvc</servlet-name>
    6. <servlet-class>com.zhw.framework.DispatcherServlet</servlet-class>
    7. <init-param>
    8. <param-name>configLocation</param-name>
    9. <param-value>laoliu</param-value>
    10. </init-param>
    11. </servlet>
    12. <servlet-mapping>
    13. <servlet-name>mvc</servlet-name>
    14. <url-pattern>*.action</url-pattern>
    15. </servlet-mapping>
    16. </web-app>

    将config.xml改为laoliu.xml


    总结

    在上一次的简单的自定义mvc后,我们对此进行了优化,优化后减少了代码量,缩短开发时间。

    本次的内容分享到这。如有错误,还望指正。

  • 相关阅读:
    小波变换学习笔记【1】
    kafka-- 安装kafka manager及简单使用
    android代码中打开系统设置界面(无线和网络设置,日期和时间设置, 辅助功能设置,电池信息)
    Redis--线程模型详解
    MySQL基础
    2022年10月27日下午工作日志
    微信小程序-常用视图容器类组件[图文并茂 通俗易懂]
    在T3开发板上实现SylixOS最小系统(一)创建BSP工程
    Mini Homer——几百块钱也能搞到一台远距离图数传链路?
    abp(net core)+easyui+efcore实现仓储管理系统——ABP升级7.3上(五十八)
  • 原文地址:https://blog.csdn.net/qq_62331938/article/details/125491165