Java实现Web的ashx对接ORM

2023-11-03 06:01
文章标签 java 实现 web 对接 orm ashx

本文主要是介绍Java实现Web的ashx对接ORM,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

之前的介绍已经实现了ORM的主体和Web的调用结构主题,那么这次把Web和LIS.Core的容器和ORM做对接,通过ashx实现的业务类测试调用ORM查询数据。

首先改造容器让传入根地址

package LIS.Core.Context;import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
import java.lang.reflect.Type;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.List;
import java.util.HashMap;
import java.util.*;
import java.nio.file.Path;
import java.nio.file.Paths;//一个迷你版容器,供ORM等控制反转使用
public class ObjectContainer {///用来存类型private static List<Class> classList=new ArrayList<Class>();///存类的查找关系private static HashMap<String, Integer> classIndexMap = new HashMap<String, Integer>();/// <summary>/// 按类型返回强类型的对象,一般用接口获得实现类/// </summary>/// <typeparam name="T">对象类型</typeparam>/// <returns>返回的对象</returns>public static <T> T GetObject(){Type type = ObjectContainer.class.getClass().getGenericSuperclass();Class c=type.getClass();Class<?> parent=c.getSuperclass();String cName=c.getName();if(classIndexMap.containsKey(cName)){//创建对象Object o = GetObject(cName);return (T)o;}if(parent!=null){String parentName=parent.getName();if(classIndexMap.containsKey(parentName)){//创建对象Object o = GetObject(parentName);return (T)o;}}Class<?> interfaceArr[]=c.getInterfaces();if(interfaceArr!=null&&interfaceArr.length>0){for(int j=0;j<interfaceArr.length;j++){String interfaceName=interfaceArr[j].getName();if(classIndexMap.containsKey(interfaceName)){//创建对象Object o = GetObject(interfaceName);return (T)o;}}}return null;}/// <summary>/// 按名称返回强类型的对象/// </summary>/// <typeparam name="T">对象类型</typeparam>/// <param name="name">对象名称</param>/// <returns>返回的对象</returns>public static <T> T GetTypeObject(String name){Object o=GetObject(name);return (T)o;}/// <summary>/// 按名称返回对象/// </summary>/// <param name="name">对象名称</param>/// <returns>返回对象</returns>public static Object GetObject(String name){if(classIndexMap.containsKey(name)){try {int index=classIndexMap.get(name);Class c=classList.get(index);//创建对象Object o = c.newInstance();return o;}catch (Exception ex){ex.printStackTrace();}}return null;}/// <summary>/// 用类型全名和程序集全名获得类型/// </summary>/// <param name="typeName">类型全名</param>/// <param name="assemblyName">程序集名</param>/// <returns></returns>private static Class GetType(String typeName, String assemblyName,String bashePath){try {if(bashePath==""){//得到根路径Class<?> clazz = ObjectContainer.class;ClassLoader classLoader = clazz.getClassLoader();URL resourceURL1 = classLoader.getResource("");bashePath = resourceURL1.getFile();}//组装成jar包路径String jarPath=Paths.get(bashePath,assemblyName+".jar").toString();File file = new File(jarPath);if (!file.exists()) {throw new Exception("未能找到"+jarPath+"的文件");}//反射得到类型//自己生成jar包路径URL url = file.toURI().toURL();URL[] urls = new URL[]{url};//加载程序集URLClassLoader loader = new URLClassLoader(urls,ObjectContainer.class.getClassLoader());//加载类Class c = loader.loadClass(typeName);if(c!=null){return  c;}else{throw new Exception("未能构建类型"+typeName);}}catch (Exception ex){ex.printStackTrace();}return  null;}/// <summary>/// 从根目录的ObjConfig初始化IOC容器,还是按Spring.Net的配置格式/// </summary>public static void InitIoc(String basePath) {try {String IocPath ="";if(basePath!=""){IocPath=Paths.get(basePath,"Conf","ObjConfig.xml").toString();}else{//得到根路径Class<?> clazz = ObjectContainer.class;ClassLoader classLoader = clazz.getClassLoader();URL resourceURL = classLoader.getResource(Paths.get("Conf","ObjConfig.xml").toString());IocPath = resourceURL.getFile();}//判断配置是否存在File file = new File(IocPath);if (!file.exists()) {System.out.println(IocPath+"文件不存在,请确认!");return;}//解析xmlDocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document document = builder.parse(file);// 获得根节点Element rootElement = document.getDocumentElement();// 获得根节点下的所有子节点NodeList students = rootElement.getChildNodes();for (int i = 0; i < students.getLength(); i++) {// 由于节点多种类型,而一般我们需要处理的是元素节点Node childNode = students.item(i);// 元素节点就是非空的子节点,也就是还有孩子的子节点if (childNode.getNodeType() == Node.ELEMENT_NODE) {Element childElement = (Element) childNode;//不是对象配置元素就忽略if(childElement.getNodeName()!= "object"){continue;}//解析类型配置String type=childElement.getAttribute("type");//是否单例String singleton=childElement.getAttribute("singleton");//取对象idString id=childElement.getAttribute("id");//分割类全面和包名String [] arr=type.split(",");//反射得到类型Class c=GetType(arr[0],arr[1],basePath);//添加到类型列表classList.add(c);//存储索引int index=classList.size()-1;Class<?> parent=c.getSuperclass();//有id就存id映射if(id!=null&&id!=""){if(classIndexMap.containsKey(id)){throw new Exception("已经包含了id为:"+id+"的类型");}classIndexMap.put(id,index);}//有父类就存父类映射if(parent!=null){String parentName=parent.getName();if(!classIndexMap.containsKey(parentName)){classIndexMap.put(parentName,index);}}//得到所有实现的接口Class<?> interfaceArr[]=c.getInterfaces();//循环存接口映射if(interfaceArr!=null&&interfaceArr.length>0){for(int j=0;j<interfaceArr.length;j++){String interfaceName=interfaceArr[j].getName();if(!classIndexMap.containsKey(interfaceName)) {classIndexMap.put(interfaceName, index);}}}}}}catch (Exception ex) {ex.printStackTrace();}}
}

然后改造Web调用主体,传入地址初始化容器,通过jar包反射调用ashx类

import appcode.IBaseHttpHandler;import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.concurrent.ConcurrentHashMap;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.file.Path;
import java.nio.file.Paths;import java.util.*;@javax.servlet.annotation.WebServlet(name = "MianMiddleware")
public class MainMiddleware extends javax.servlet.http.HttpServlet {/// <summary>/// 缓存路径和类型,允许多线程读一个线程写/// </summary>private static ConcurrentHashMap<String, Class> hsType = new ConcurrentHashMap<>();///执行post请求@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//得到网站根路径String basePath = getServletContext().getRealPath("/");//尝试执行初始化主逻辑MainInit.TryInit(basePath);response.setContentType("text/html");request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");String url=request.getRequestURI();//解析得到类名String className = url.split("\\.")[0];PrintWriter writer = response.getWriter();//反射得到类型Object objDeal = GetObjectByConfString(className,writer,basePath);//转换处理接口if(objDeal!=null){//转换成接口appcode.IBaseHttpHandler baseDeal=(appcode.IBaseHttpHandler)objDeal;baseDeal.ProcessRequest(request,response);}else{Write(writer,"为找到名称为:"+className+"的处理类");}}/// <summary>/// 通过配置得当对象/// </summary>/// <param name="confStr">配置UI/login/ashx/AshDemo</param>/// <returns></returns>public static Object GetObjectByConfString(String confStr,PrintWriter writer,String basePath) {try {//取第一部分if (confStr.charAt(0) == '/') {confStr = confStr.substring(1);}System.out.println("confStr:"+confStr);if (!hsType.containsKey(confStr)) {String [] nameArr=confStr.split("/");String classFullName = "";//类代码全路径String classCodePath = basePath;for (int i = 1; i < nameArr.length; i++){//类代码文件全名classCodePath = Paths.get(classCodePath, nameArr[i]).toString();//类带命名空间的全名if(classFullName!=""){classFullName += "." + nameArr[i];}else{classFullName = nameArr[i];}}//类代码地址,后面实现用脚本编译用classCodePath = classCodePath + ".java";//编译的jar名字String clsJarPath = Paths.get(basePath, "BinAshx", classFullName + ".jar").toString();System.out.println("加载jar包:"+clsJarPath);//自己生成jar包路径URL url = new File(clsJarPath).toURI().toURL();URL[] urls = new URL[]{url};//加载程序集,这里很重要,一定要指定父加载器,否则加载的类和父加载器的类不认为是一个类URLClassLoader loader = new URLClassLoader(urls, MainMiddleware.class.getClassLoader());ClassLoader  loader1=Thread.currentThread().getContextClassLoader();//加载类Class c = loader.loadClass(classFullName);//先写死,后面执行编译和从jar包反射hsType.put(confStr, c);}Class c = hsType.get(confStr);//创建对象Object o = c.newInstance();return o;}catch (Exception ex) {ex.printStackTrace();}return null;}//get直接走post的逻辑@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request,response);}///输出数据到前台private static void Write(PrintWriter writer,String str){writer.println(str);writer.flush();writer.close();}}

然后实现两个测试的ashx

package test.ashx;
import appcode.BaseHttpHandlerNoSession;
import appcode.IBaseHttpHandler;
import LIS.Model.Entity.*;
import LIS.DAL.ORM.EntityManager.EntityManagerImpl;
import java.util.List;
import java.util.HashMap;
import java.util.*;
import LIS.Core.Dto.HashParam;
import com.alibaba.fastjson.*;
//查询数据测试
public class ashGetTableData  extends BaseHttpHandlerNoSession implements IBaseHttpHandler  {//查询工作组public String QryBTWorkGroup(){BTWorkGroup species = new BTWorkGroup();LIS.DAL.ORM.EntityManager.EntityManagerImpl entry = new EntityManagerImpl();HashParam hash = new HashParam();List<BTWorkGroup> list = entry.FindAll(species, hash,"",0,0);Object json=JSONObject.toJSON(list);return json.toString();}//查询工作小组public String QryBTWorkGroupMachine(){BTWorkGroupMachine loc = new BTWorkGroupMachine();LIS.DAL.ORM.EntityManager.EntityManagerImpl entry = new EntityManagerImpl();HashParam hash = new HashParam();List<BTWorkGroupMachine> list = entry.FindAll(loc, hash,"",0,0);Object json=JSONObject.toJSON(list);return json.toString();}
}
package AshDemo;
import appcode.BaseHttpHandlerNoSession;
import appcode.IBaseHttpHandler;
import LIS.Model.Entity.*;
import LIS.DAL.ORM.EntityManager.EntityManagerImpl;
import java.util.List;
import java.util.HashMap;
import java.util.*;
import LIS.Core.Dto.HashParam;
import com.alibaba.fastjson.*;public class ashDemo  extends BaseHttpHandlerNoSession implements IBaseHttpHandler  {public ashDemo(){super();}///测试public String Test(){return "这是ashDemo返回的文本";}///测试public String ZLZ(){return "这是名称为ZLZ的方法返回的文本";}//查询性别public String QrySysFromSpecies(){BTSpecies species = new BTSpecies();LIS.DAL.ORM.EntityManager.EntityManagerImpl entry = new EntityManagerImpl();HashParam hash = new HashParam();List<BTSpecies> list = entry.FindAll(species, hash,"",0,0);Object json=JSONObject.toJSON(list);return json.toString();}//查询科室public String QryLocation(){BTLocation loc = new BTLocation();LIS.DAL.ORM.EntityManager.EntityManagerImpl entry = new EntityManagerImpl();HashParam hash = new HashParam();List<BTLocation> list = entry.FindAll(loc, hash,"",0,0);Object json=JSONObject.toJSON(list);return json.toString();}}

在这里插入图片描述

在这里插入图片描述

然后运行测试
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

至此Web调用ashx访问数据库打通了,ORM也在给力小伙伴的努力下快速填充,给力给力

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

测试ORM代码

package com.company;
//import org.apache.commons.configuration.ConfigurationException;
//import org.apache.commons.configuration.PropertiesConfiguration;
import LIS.Core.Dto.HashParam;
import LIS.Core.Dto.OutParam;
import LIS.Core.Dto.OutStatus;
import LIS.DAL.ORM.EntityManager.EntityManagerImpl;
import LIS.Model.Entity.BTSpecies;
import LIS.Model.Entity.SYSForm;
import LIS.Model.Entity.SYSUser;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;
import java.net.URL;
import java.sql.SQLException;
import java.util.List;
import java.util.HashMap;
import java.util.*;
import com.alibaba.fastjson.*;public class Main {public static void main(String[] args) {//用容器的配置xml初始化容器LIS.Core.Context.ObjectContainer.InitIoc();//ORM通过容器取数据库驱动工厂LIS.DAL.ORM.EntityManager.EntityManagerImpl orm=new LIS.DAL.ORM.EntityManager.EntityManagerImpl();//执行查询测试orm.DBSelectTest();//测试通过实体得到SQL语句orm.InsertSqlTest(new SYSForm());orm.InsertSqlTest(new SYSUser());//调用ORM的FindAll测试HashParam hs = new HashParam();hs.Add("Code","QC");List<SYSForm> formList=orm.FindAll(new SYSForm(),hs,"RowID desc",-1,-1);Object json=JSONObject.toJSON(formList);System.out.println("查询的LIST数据:"+json.toString());System.out.println("=========================");//SaveTest();//UpdateTest();BatchDB();QryTest();}public static void QryTest(){BTSpecies species = new BTSpecies();LIS.DAL.ORM.EntityManager.EntityManagerImpl entry = new EntityManagerImpl();HashParam hash = new HashParam();List<BTSpecies> list = entry.FindAll(species, hash,"",0,0);for (BTSpecies obj : list){String ss = obj.RowID + "\t" + obj.Code + "\t" + obj.CName + "\t" + obj.Pregnant;System.out.println(ss);}}public static void UpdateTest(){BTSpecies species = new BTSpecies();species.CName = "测试性别修改";species.Code = "D";species.STDCode = "CS";species.Pregnant = false;species.RowID = 23;EntityManagerImpl entry = null;try{entry = new EntityManagerImpl();if (entry.DBConnection == null) {System.out.println("数据库未连接");return;}boolean trans = entry.DBConnection.BeginTransaction();if (trans){OutParam outParam = new OutParam();int row = entry.Update(species,null,outParam,null,null,null);if (outParam.Code == OutStatus.ERROR){System.out.println(outParam.Message);entry.DBConnection.RollTransaction();return;}boolean end = entry.DBConnection.CommitTransaction();if (!end){System.out.println("提交事务失败!");}System.out.println("更新成功数据返回:" + row);}else{System.out.println("开启事务失败!");}}catch (Exception ex){if (entry != null){entry.DBConnection.RollTransaction();}ex.printStackTrace();}}public static void SaveTest(){BTSpecies species = new BTSpecies();species.CName = "测试性别";species.Code = "E";species.STDCode = "CS";species.Pregnant = true;EntityManagerImpl entry = null;try{entry = new EntityManagerImpl();if (entry.DBConnection == null) throw new SQLException("数据库未连接");boolean trans = entry.DBConnection.BeginTransaction();if (trans){int row = entry.Save(species);boolean end = entry.DBConnection.CommitTransaction();if (!end){System.out.println("提交事务失败!");}System.out.println("保存数据返回:" + row);}else{System.out.println("开启事务失败!");}}catch (SQLException ex){if (entry != null){entry.DBConnection.RollTransaction();}ex.printStackTrace();}}public static void BatchDB(){BTSpecies species = new BTSpecies();species.CName = "测试性别2121";species.Code = "E3";species.STDCode = "CS";species.Pregnant = false;species.RowID = 22;EntityManagerImpl entry = null;try{entry = new EntityManagerImpl();if (entry.DBConnection == null) throw new SQLException("数据库未连接");boolean trans = entry.DBConnection.BeginTransaction();if (trans){OutParam outRemove = new OutParam();int row = entry.Remove(species, null, outRemove, null, null);if (outRemove.Code == OutStatus.ERROR){throw new SQLException("删除数据失败");}System.out.println("删除数据返回:" + row);BTSpecies species1 = new BTSpecies();species1.RowID = 24;species1.Pregnant = true;species1.CName = "批量修改的名称--Update";species1.HISCode = "BHIS";List<String> cols = new ArrayList<String>();cols.add("CName");cols.add("HISCode");cols.add("Pregnant");List<String> joins = new ArrayList<String>();joins.add("OR");joins.add("OR");HashParam param = new HashParam();param.Add("Code","C");param.Add("Code","B");param.Add("Code","E");OutParam out = new OutParam();row = entry.Update(species1, param, out, cols, joins, null);if (out.Code == OutStatus.ERROR){throw new SQLException("更新数据失败!" + out.Message);}boolean end = entry.DBConnection.CommitTransaction();if (!end){System.out.println("提交事务失败!");}System.out.println("更新数据返回:" + row);entry.DBConnection.Close();}else{System.out.println("开启事务失败!");}}catch (SQLException ex){if (entry != null){entry.DBConnection.RollTransaction();}ex.printStackTrace();}finally {if (entry != null && entry.DBConnection != null){entry.DBConnection.Close();}}}
}

下一个阶段全面实现ORM的api和实现ashx业务java脚本自动编译jar包到BinAshx目录供Web调用

这篇关于Java实现Web的ashx对接ORM的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/336092

相关文章

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal