xml建模以及自定义mvc增删改查案例

xml建模的作用

今天给大家介绍一下xml建模的2.0版本(加强版),–》之前的博文

xml建模案例

其实在之前的博文也已经介绍过xml文件建模的作用以及好处了,最主要的作用其实就是节约资源和减少代码量,详细介绍可以参考上面博文链接

这次的案例是建模一个web.xml的案例:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet>
  	<servlet-name>jrebelServlet</servlet-name>
  	<servlet-class>com.xiaoyang.xml.JrebelServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>jrebelServlet</servlet-name>
  	<url-pattern>/jrebelServlet</url-pattern>
  </servlet-mapping>
  
  <servlet>
  	<servlet-name>jrebelServlet2</servlet-name>
  	<servlet-class>com.xiaoyang.xml.JrebelServlet2</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>jrebelServlet2</servlet-name>
  	<url-pattern>/jrebelServlet2</url-pattern>
  	<url-pattern>/jrebelServlet3</url-pattern>
  </servlet-mapping>
</web-app>

首先就是把元素节点看成类对象去建模:
在这里插入图片描述
建模顺序是从里到外,依次建立的:
servlet-name建模类:

package com.xiaoyang;
/**
 * 
 * @author xiaoyang
 *         2020年5月23日
 */
public class ServletNameModel {

	private String name;//servlet-name标签值

	public String getName() {
		return name;
	}

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

	@Override
	public String toString() {
		return "ServletNameModel [name=" + name + "]";
	}
	
	
	
}

servlet-class建模类同理:

在这里插入代码片package com.xiaoyang;

public class ServlerClassModel {

	
	private String Sclass;//servlet-class

	public String getSclass() {
		return Sclass;
	}

	public void setSclass(String sclass) {
		Sclass = sclass;
	}

	@Override
	public String toString() {
		return "ServlerClassModel [Sclass=" + Sclass + "]";
	}
	
	
	
}

这两个节点建模好后,servlet节点就可以开始建模了:

package com.xiaoyang;

public class ServletModel {

	private ServletNameModel snm;//servlet-name节点
	private ServlerClassModel scm;//servlet-class节点
	public ServletNameModel getSnm() {
		return snm;
	}
	public void setSnm(ServletNameModel snm) {
		this.snm = snm;
	}
	public ServlerClassModel getScm() {
		return scm;
	}
	public void setScm(ServlerClassModel scm) {
		this.scm = scm;
	}
	@Override
	public String toString() {
		return "ServletModel [snm=" + snm + ", scm=" + scm + "]";
	}
	
}

然后就是url-pattern节点类:

package com.xiaoyang;

public class UrlPatterModel {

	
	private String pattern;//url-pattern内容

	public String getPattern() {
		return pattern;
	}

	public void setPattern(String pattern) {
		this.pattern = pattern;
	}

	@Override
	public String toString() {
		return "UrlPatterModel [pattern=" + pattern + "]";
	}
	
	
	
}

由于url-pattern元素节点在servlet-mapping中可多个,所以用集合存储,servlet-mapping节点建模::

package com.xiaoyang;

import java.util.ArrayList;
import java.util.List;

public class ServletMappinModel {

	private ServletNameModel snm;
	private List<UrlPatterModel> urlpatterModel=new ArrayList<UrlPatterModel>();
	public ServletNameModel getSnm() {
		return snm;
	}
	public void setSnm(ServletNameModel snm) {
		this.snm = snm;
	}
	//存值
	public void pop(UrlPatterModel up) {
		urlpatterModel.add(up);
	}
	//取值
	public List<UrlPatterModel> upm() {
		return urlpatterModel;
	}
	@Override
	public String toString() {
		return "ServletMappinModel snm=" + snm + ", urlpatterModel=" + urlpatterModel;
	}
	
	
}

最后一个就是根元素web-app建模:

package com.xiaoyang;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class WebModel {

	private Map<String, ServletModel> sm = new HashMap<String, ServletModel>();
	private Map<String, ServletMappinModel> smm = new HashMap<String,ServletMappinModel>();
	private ServletNameModel key;
	// ServletModel存值
	

	// ServletMappinModel存值
	public void mapPop(ServletMappinModel sms) {
		smm.put(key.getName(), sms);
	}

	//ServletMappinModel取值
	public ServletMappinModel mapGet(String name) {
		return smm.get(name);
	}
	//通过url获取name值(键)
	public String getName(String url) {
		String name=null;
	    //set集合entry方法遍历
		Set<Entry<String, ServletMappinModel>> entrySet = smm.entrySet();
		for (Entry<String, ServletMappinModel> entry : entrySet) {
			//遍历获取值
			ServletMappinModel value = entry.getValue();
			//如果内容中含有url值那么则获取到servletModel对象
			if(value.toString().contains(url)) {
				ServletNameModel snm = value.getSnm();
				//返回键名
				name=snm.getName();
			}
		}
		return name;
	}
	
	public void servletPop(ServletModel serm) {
	       sm.put(key.getName(), serm);
	}

	public ServletNameModel getKey() {
		return key;
	}

	public void setKey(ServletNameModel key) {
		this.key = key;
	}

	// ServletModel取值
	public ServletModel servletGet(String name) {
		return sm.get(name);
	}

	@Override
	public String toString() {
		return "WebModel [sm=" + sm + ", smm=" + smm + ", key=" + key + "]";
	}
	
	
}

到这里我们建模还差最后一步,就是方法的调用和创建,这里我用到的是设计模式中的工厂模式去生产方法:

package com.xiaoyang;

import java.io.InputStream;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

/**
 * 工厂类
 * 
 * @author xiaoyang 2020年5月23日
 */
public class WebModelFactory {
	WebModel wm = new WebModel();

	public static WebModel bulid(String path) throws DocumentException {
		// 读取
		InputStream is = WebModelFactory.class.getResourceAsStream(path);
		// 读取
		SAXReader sax = new SAXReader();
		Document read = sax.read(is);
		// 获取节点解析
		//把堆的实例化放在循环外,节约资源
		WebModel wm = new WebModel();
		ServletModel sm = null;
		ServletMappinModel smm = null;
		ServletNameModel sname = null;
		ServlerClassModel sclass = null;
		UrlPatterModel url = null;
		//获取/web-app/servlet下的元素节点集合
		List<Element> servletNodes = read.selectNodes("/web-app/servlet");
		for (Element element : servletNodes) {
			//实例化ServletNameModel对象
			sname = new ServletNameModel();
			//实例化ServlerClassModel对象
			sclass = new ServlerClassModel();
			sm = new ServletModel();
			Element servletName = (Element) element.selectSingleNode("servlet-name");
			Element servletClass = (Element) element.selectSingleNode("servlet-class");
			sname.setName(servletName.getText());
			sclass.setSclass(servletClass.getText());
			sm.setSnm(sname);
			sm.setScm(sclass);
			wm.setKey(sname);
			wm.servletPop(sm);
		}
		List<Element> servletMapNodes = read.selectNodes("/web-app/servlet-mapping");
		for (Element element : servletMapNodes) {
			smm = new ServletMappinModel();
			sname = new ServletNameModel();
			Element nameNode = (Element) element.selectSingleNode("servlet-name");
			sname.setName(nameNode.getText());
			smm.setSnm(sname);
			List<Element> urlNode = element.selectNodes("url-pattern");
			for (Element element2 : urlNode) {
				url = new UrlPatterModel();
				url.setPattern(element2.getText());
				smm.pop(url);
				//System.out.println(smm);
				wm.setKey(sname);
				wm.mapPop(smm);
			}

		}
		return wm;
	}

	public static WebModel bulid() throws DocumentException {
		return bulid("/web.xml");
	}

最后调用建模方法,看运行是否成功:

public static void main(String[] args) throws DocumentException {
		//实例化webModel根元素
		WebModel bulid = bulid();
		//通过xml中url-pattern中的url路径获取servlet下的class内容
		String name = bulid.getName("/jrebelServlet");
		System.out.println(name);
		//通过路径返回name后,获取servletModel对象
		ServletModel servletGet = bulid.servletGet(name);
		ServlerClassModel clz = servletGet.getScm();
		String sclass = clz.getSclass();
		System.out.println(sclass);
	}

结果:

jrebelServlet
com.zking.xml.JrebelServlet

这里我是通过url-pattern去获取对应的servlet-class内容的!

自定义mvc框架的搭建

这里是之前搭建好的框架和查询功能—》自定义mvc框架案例详解

案例

接着把增删改功能贴上:

首先是增加:

public String add(HttpServletRequest req,HttpServletResponse resp) {
		//获取要删除的id值
		//调用方法
		jd.Add(job);
		//返回删除name值
		return "success";
	}
<form action="JobAction.action" method="post">

在增加提交的表单提交到后台后,调用上面的add方法,根据返回值重新跳转回子控制器查询刷新数据:

<forward name="success" path="/JobAction.action?opt=find" redirect="true" /> 

效果图:
在这里插入图片描述在这里插入图片描述
这里的样式就没调了,将就一下,能用就行

然后就是删除功能,删除功能和增加功能跳转一样,删除完成后,都需要重新刷新数据:

public String del(HttpServletRequest req,HttpServletResponse resp) {
		//获取要删除的id值
		//调用方法
		jd.del(job);
		//返回删除name值
		return "success";
	}

在这里插入图片描述最后就是修改和查看详情功能了,其实在框架搭建好后,方法的调用变简单了,只需要判断一下跳转界面,在配置文件里配置一下就行:


	public String load(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException {
		Job j = jd.load(job);
//		req.setAttribute("j", j);
		HttpSession session = req.getSession();
		session.setAttribute("j", j);
		String optName=req.getParameter("optName");
		//调用方法
		//返回删除name值
		if(StringUtils.isBlank(optName)) {//如果没传optName参数,代表跳转至修改界面
			optName="edit";
		}
		return optName;
	}

详情界面:
在这里插入图片描述
修改和查看详情功能大同小异,只不过需要表单再提交一次数据进行修改,框架统一提交数据至子控制器处理:

<form action="JobAction.action" method="post">

子控制器修改:

public String edit(HttpServletRequest req,HttpServletResponse resp) {
		//获取要修改的id值
		String parameter = req.getParameter("id");
		//调用方法
		jd.edit(job,parameter);
		//返回删除name值
		return "success";
	}

这里可以看到修改返回值也是和增加删除一样,都是需要重新刷新数据的

尾言

到这里,自定义mvc框架案例就好了,其实框架的设计是为了我们方便使用,框架只是一个架构,具体怎么往上加东西,需要自己多结合项目实际场景运用。最后,有不足的地方,欢迎大家评论区留言交流…

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值