首页 > 代码库 > 提高生产性工具 - 各种工具的集成(三)

提高生产性工具 - 各种工具的集成(三)

这周学习了一下Struts2的一些知识,按照网络上各种博文的指点,跌跌撞撞,捣鼓出了一个Struts2的Demo了。

原来一直是学习NET的,一下子开始玩Java的东西,还需要一点时间来适应Eclapse。

Struts的Jar包导入都是依靠Maven进行的,据说Maven可以直接生成Struts的工程,尝试了一下,公司网络不给力,没有成功。

Struts的Helloworld环境配置,网络上有很多文章了,这里也不多唠叨了。有一点请注意,

如果你使用Maven的话,在百度上检索 Maven Struts,第一个检索结果是 Spring-Struts-PlugIn,这个是Spring结合Struts用的,

正确的Maven,应该是 struts2-core

groupIdartifactIdversionscope説明
org.apache.strutsstruts2-core2.3.20compile 
javassistjavassist3.12.1.GAcompile 

本着一切工具化的目标,将Struts的路由做成了工具。

按照老规矩,还是从Excel读取数据,然后用NET写XML

    非必须项目
Action名称类名称结果字符(Result)迁移目标Model备注
SearchUsersearchAction    
  listResult/listResult.jsp  
  listData/more.jsp  
  wordPre/officePre.jsp  
  manager/manager.jsp  
  success/success.jsp  
SearchPersonRunAction    
  listResult2/listResult.aspx  
  listData2/more.aspx  
  wordPre2/officePre.aspx  
  manager2/manager.aspx  
  success2/success.aspx  

自动生成的XML如下:

<struts>  <package name="com.chuwa.route" extends="struts-default">    <action name="success" class="searchAction">      <result>/listResult.jsp</result>      <result>/more.jsp</result>      <result>/officePre.jsp</result>      <result>/manager.jsp</result>      <result>/success.jsp</result>    </action>    <action name="success2" class="RunAction">      <result>/listResult.aspx</result>      <result>/more.aspx</result>      <result>/officePre.aspx</result>      <result>/manager.aspx</result>      <result>/success.aspx</result>    </action>  </package></struts>

生成的代码也不是很复杂,这里就是XML的一些操作,熟悉了,基本上什么样子的XML文档都能代码自动生成了。

下面是Excel数据转XML数据的一个很好的例子,

using Microsoft.VisualBasic;using System;using System.Xml;namespace DevKit.MVCTool{    /// <summary>    /// Route (Struts2)    /// </summary>    internal static class Struts2RouteRule    {        internal static void GenerateRouteXml(string ExcelFilename, string XMLfilename, string PackageName)        {            if (String.IsNullOrEmpty(ExcelFilename))            {                ExcelFilename = Common.Utility.PickFile(Common.Utility.FileDialogMode.Open, Common.Utility.XlsxFilter);            }            dynamic excelObj = Interaction.CreateObject("Excel.Application");            excelObj.Visible = true;            dynamic workbook = excelObj.Workbooks.Open(ExcelFilename);            dynamic worksheet = workbook.Sheets(1);            int seekrow = 8;            XmlDocument struts = new XmlDocument();            XmlNode strutsRoot = struts.CreateElement("struts");            XmlNode package = struts.CreateElement("package");            ((XmlElement)package).SetAttribute("name", PackageName);            ((XmlElement)package).SetAttribute("extends", "struts-default");            XmlNode action = null;            while (!String.IsNullOrEmpty(worksheet.Cells(seekrow, 3).Text) || !String.IsNullOrEmpty(worksheet.Cells(seekrow, 5).Text))            {                //ActionName或者Result不为空                if (!String.IsNullOrEmpty(worksheet.Cells(seekrow, 3).Text))                {                    if (action != null)                    {                        package.AppendChild(action);                    }                    action = struts.CreateElement("action");                    ((XmlElement)action).SetAttribute("name", (worksheet.Cells(seekrow, 3).Text));                    ((XmlElement)action).SetAttribute("class", (worksheet.Cells(seekrow, 4).Text));                }                else                {                    XmlNode result = struts.CreateElement("result");                    ((XmlElement)action).SetAttribute("name", (worksheet.Cells(seekrow, 5).Text));                    result.InnerText = worksheet.Cells(seekrow, 6).Text;                    action.AppendChild(result);                }                seekrow++;            }            package.AppendChild(action);            strutsRoot.AppendChild(package);            struts.AppendChild(strutsRoot);            struts.Save(XMLfilename);            workbook.Close();            excelObj.Quit();            excelObj = null;        }    }}

 

Native转ASCII

Java的世界,不知道为什么,对于多语言支持不是很好,很多时候需要将Native转为ASCII

例如将错误信息放在资源文件里面的时候,那个文件需要将文字进行转码。

下面这个工具就是做转码用的,可以临时看一个字符的转码内容,当然,老规矩,可以批量将Excel表格里面的东西都转码。

Native2ASCII的逻辑是从Java源代码里面直接复制过来的。

Java代码复制到VS里面,大部分代码都可以通过简单修改,变成C#的代码。。。

 

技术分享

注意:Java的 Substring 函数,和C#的,功能有些不一样。带2个参数的版本,Java是从第几位到第几位,C#是从第几位,取多少位。

Java的方法大都首字母小写,骆驼命名,C#的是Pascal命名。。。

using Microsoft.VisualBasic;using System;using System.Text;namespace DevKit.Common{    public class Native2AsciiUtils    {        /// <summary>        ///         /// </summary>        private static String PREFIX = "\\u";        /// <summary>        ///         /// </summary>        /// <param name="str"></param>        /// <returns></returns>        public static String native2Ascii(String str)        {            char[] chars = str.ToCharArray();            StringBuilder sb = new StringBuilder();            for (int i = 0; i < chars.Length; i++)            {                sb.Append(char2Ascii(chars[i]));            }            return sb.ToString();        }        /// <summary>        ///         /// </summary>        /// <param name="c"></param>        /// <returns></returns>        private static String char2Ascii(char c)        {            if (c > 255)            {                StringBuilder sb = new StringBuilder();                sb.Append(PREFIX);                int code = (c >> 8);                String tmp = Convert.ToString(code, 16);                if (tmp.Length == 1)                {                    sb.Append("0");                }                sb.Append(tmp);                code = (c & 0xFF);                tmp = Convert.ToString(code, 16);                if (tmp.Length == 1)                {                    sb.Append("0");                }                sb.Append(tmp);                return sb.ToString();            }            else            {                return Char.ToString(c);            }        }        /// <summary>        ///         /// </summary>        /// <param name="str"></param>        /// <returns></returns>        public static String ascii2Native(String str)        {            StringBuilder sb = new StringBuilder();            int begin = 0;            int index = str.IndexOf(PREFIX);            while (index != -1)            {                sb.Append(str.Substring(begin, index - begin));                sb.Append(ascii2Char(str.Substring(index, 6)));                begin = index + 6;                index = str.IndexOf(PREFIX, begin);            }            sb.Append(str.Substring(begin));            return sb.ToString();        }        /// <summary>        ///         /// </summary>        /// <param name="str"></param>        /// <returns></returns>        private static char ascii2Char(String str)        {            if (str.Length != 6)            {                throw new ArgumentException(                        "Ascii string of a native character must be 6 character.");            }            if (!PREFIX.Equals(str.Substring(0, 2)))            {                throw new ArgumentException(                        "Ascii string of a native character must start with \"\\u\".");            }            String tmp = str.Substring(2, 2);            int code = Convert.ToInt16(tmp, 16) << 8;            tmp = str.Substring(4, 2);            code += Convert.ToInt16(tmp, 16);            return (char)code;        }        /// <summary>        ///         /// </summary>        /// <param name="p"></param>        public static void BatchConvert(string ExcelFilename)        {            dynamic excelObj = Interaction.CreateObject("Excel.Application");            excelObj.Visible = true;            dynamic workbook;            workbook = excelObj.Workbooks.Open(ExcelFilename);            dynamic worksheet = workbook.Sheets(1);            int row = 5;            while (!String.IsNullOrEmpty(worksheet.Cells(row,2).Text))            {                if (!String.IsNullOrEmpty(worksheet.Cells(row, 3).Text))                {                    worksheet.Cells(row, 4).Value = http://www.mamicode.com/Common.Native2AsciiUtils.native2Ascii(worksheet.Cells(row, 3).Text);                }                else                {                    worksheet.Cells(row, 3).Value = http://www.mamicode.com/Common.Native2AsciiUtils.ascii2Native(worksheet.Cells(row, 4).Text);                }                row++;            }            workbook.Save();            workbook.Close();            excelObj.Quit();            excelObj = null;        }    }}

 最后,花了些时间,做了一个根据Model自动生成CreateTable的功能。

对于EF不是很熟悉,然后发现EF貌似不能自动为MySql建表,所以,就自己写了一个CreateTable自动生成功能。

结合以前的工具,Model设计书,一键生成MVC的Model类(CodeFirst??),然后生成Mysql的建表CreateTable的SQL文。

DROP TABLE IF EXISTS `test`.`Candidate`;CREATE TABLE  `test`.`Candidate` (  `No` int(0)  NOT NULL AUTO_INCREMENT,  `Position` varchar(20)  NOT NULL,  `Name` varchar(20)  NOT NULL,  `Contact` varchar(20)  NOT NULL,  `Language` smallint(2)  NOT NULL,  `University` varchar(50)  NOT NULL,  `Major` varchar(20)  NOT NULL,  `MarketBackground` tinyint(1)  DEFAULT NULL,  `ITBackground` tinyint(1)  DEFAULT NULL,  `Comments` varchar(100)  DEFAULT NULL,  PRIMARY KEY (`No`)) ENGINE=InnoDB AUTO_INCREMENT=45 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

这些工具,其实就是给设计人员使用的,我们这些万能的程序员们一切都可以手工完成的。

但是如果项目很庞大,对方一直改数据定义,那么直接将工具仍给设计人员,然他们自己动手,生成Model和CreateTable文,我想生产性应该可以提高很多了吧。

程序员应该多学习领域知识,那个地方才是最值钱的,学习的好,可以转做咨询,职业生涯上一个档次。

不要把时间花在CreateTable,Model类这些地方。如果在工作中,觉得有很多重复劳动,一定要做工具。保证正确性,节约时间。

提高生产性工具 - 各种工具的集成(三)