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