精华内容
下载资源
问答
  • java项目开发10例源代码

    千次下载 热门讨论 2014-03-18 08:36:10
    java的实例10个 源代码 供大家参考 从桌面软件到网页设计到企业项目,手游都有,可能有些已过时,但学习一下也好的
  • 浅谈JAVA项目开发

    千次阅读 2017-07-28 11:18:33
    简单聊一下JAVA项目开发的基本流程

    JAVA项目开发的基本流程

    实践是检验真理的唯一标准。不论学习哪一门编程语言,最终的目的地都是项目或者工程,JAVA也不例外。学习JAVA,不论是大学专业、自学还是培训,学到最后都需要拿项目来检验自己的学习情况。所以,在这里简单聊一下JAVA项目开发的基本流程。

    一、项目启动

    良好的开端是成功的一半。拿到一个项目,需要考虑的问题有很多,不可能在启动阶段一一分析清楚,为了能有一个良好的开端,在项目启动阶段,只需要简单讨论,确定下项目的预期目标、项目工期,成立项目组并建立组建良好的沟通机制。根据项目大小决定项目组成员数量及身份,允许一人身兼多职。

    二、业务分析--需求分析

    一个项目最终能达到什么样的档次,取决于这个项目能实现什么样的功能,就好比我的需求是做一个计算器,最终做出来的东西再华丽也只是一个计算器。所以,在这个阶段,尽可能将项目需要实现的功能分析透,分析到最小细节。

    三、编写文档--需求文档、变更记录

    将业务分析透彻,并做好相应的文档记录,包括分析到的功能点、开发环境和运行环境,估算相应的工作量,并对项目组成员进行明确分工。

    如果业务需求发生变动,需要提交变更文件,升级需求文档版本。

    四、系统设计,编写接口文档、变更记录

    磨刀不误砍柴工,设计阶段完成的好,能起到事半功倍的效果。设计阶段需要绘制完善的流程图,并编写接口文档。

    如果设计发生变动,需要提交变更文件,升级接口文档版本。

    五、程序开发

    按照编码规范以及注释规范通过代码实现功能,开发期间涉及到的命名、接口等等需要严格按照设计阶段的文档执行。

    优先编写测试用例。

    如果开发阶段发生变动与设计阶段文档不符,需要提交变更文件,升级文档版本。

    六、测试--测试计划、测试方案、测试报告

    测试人员(或开发人员)制定测试计划,编写测试方案,执行测试并撰写测试报告。

    测试完成后可以根据项目定位执行下一步计划,内部使用、上线测试或者其他。

    展开全文
  • java项目开发如何自制java打补丁工具

    千次阅读 2016-05-04 17:59:41
    目的:随着java项目开发的繁重,随之手动打补丁也是个头疼的事情。如刚修改的几个jsp页面,几个java类啊。我们是人不是机器人,不可能自己一个一个的去创建文件夹然后把修改好的文件放进去,虽然这样做也可以,但是...

    目的:随着java项目开发的繁重,随之手动打补丁也是个头疼的事情。如刚修改的几个jsp页面,几个java类啊。我们是人不是机器人,不可能自己一个一个的去创建文件夹然后把修改好的文件放进去,虽然这样做也可以,但是相对浪费时间,而且准确率也不是很高,到时候自己找问题还发现是自己的补丁打错了,漏了一个文件夹之类的。虽然现在网上有补丁工具,但是我要讲的是可以自定义的打补丁工具。用到的基本是java中io流来完成这些事情,希望能对某些同学有些帮助吧。至少我个人开发中都一直用着自己做的打补丁工具来打补丁,效果非常不错,只需要跑一下main方法即可。


    该代码主要是将原有的东西复制到自己认为的打包文件上,其实也没什么特别的。


    主要过程:先把自己想要打的代码路径拷贝到properties配置文件中,从中解析路径,用file获取到该路径下的文件,然后拷贝到自己的目标文件夹中,完成打补丁。

    网站下载jar包:commons-fileupload

    java代码如下:

    package test;


    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.Properties;
    import java.util.Set;


    import org.apache.commons.fileupload.util.Streams;


    public class Patch {
    public static String patchtype = "INT";//自定义补丁名字
    public static String versionname = "12月份常规版本V5";//自定义补丁名字
    public static String ymainpath = "D:/workspace";//源文件夹路径
    public static String mmainpath = "E:/patch";//目标文件夹路径
    public static String propath = "/Test/com.test/path.properties";//需要存放打补丁路径的配置文件,这里可以添加自己修改过的文件路径
    public static void main(String[] args) throws Exception {
    //System.out.println(getPatchName());
    File file = new File(mmainpath);//如果目标文件夹不存在就生成一个,例如不小心删除的
    if(!file.exists()){
    file.mkdirs();
    }
    List<String> targetlist = analyse();//分析配置文件循环获取路径
    for(int i=0;i<targetlist.size();i++){
    String targetpath = targetlist.get(i);
    try {
    String cleanpath = cleanPath(targetpath);//根据配置文件路径设置目标具体路径
    copy(cleanpath,targetpath);//将源路径里面的文件复制到目标具体路径
    } catch (Exception e) {
    System.out.println("patch失败:"+mmainpath+targetpath);
    }
    }
    System.out.println("patch完毕!");
    }

    public static String getPatchName(){
    Date d = new Date(); 
       SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
       String time = sdf.format(d);
    return patchtype+"_"+time+"_"+versionname;
    }

    public static List<String> analyse() throws Exception{
    List<String> list = new ArrayList<String>();
    Properties prop =  new  Properties();
    InputStream in = new FileInputStream(ymainpath+propath);
    prop.load(in);
    Set<Object> set = prop.keySet();
    for(Object obj:set){
    String path = obj.toString();
    String[] arr = path.split("/");
    if(!"".equals(arr[0])){
    System.out.println("存在数据路径配置问题,请检查!");
    return list;
    }
    String newpath = "";
    if("TPXD_CORE".equals(arr[1])&&"WebContent".equals(arr[2])){
    newpath = "/P2P_Core";
    for(int i=3;i<arr.length;i++){
    newpath = newpath+"/"+arr[i];
    }
    }else if("TPXD_CORE".equals(arr[1])&&"src".equals(arr[2])){
    newpath = "/P2P_Core/WEB-INF/classes";
    for(int i=3;i<arr.length;i++){
    newpath = newpath+"/"+arr[i];
    }
    newpath = newpath.replace(".java", ".class");
    }else if("TPGCI_CORE".equals(arr[1])&&"src".equals(arr[2])){
    newpath = "/TPGCI_CORE/bin";
    for(int i=3;i<arr.length;i++){
    newpath = newpath+"/"+arr[i];
    }
    newpath = newpath.replace(".java", ".class");
    }
    list.add(newpath);
    }
    return list;
    }

    public static String cleanPath(String targetpath){
    String sopath = "";
    if(targetpath.indexOf("P2P_Core")!=-1&&targetpath.indexOf(".jsp")!=-1){
    sopath = targetpath.replace("/P2P_Core/", "/TPXD_CORE/WebContent/");
    }else if(targetpath.indexOf("P2P_Core")!=-1&&targetpath.indexOf(".class")!=-1){
    sopath = targetpath.replace("/P2P_Core/WEB-INF/", "/TPXD_CORE/build/");
    }else{
    sopath = targetpath;
    }
    return sopath;
    }

    public static void copy(String sofilepath,String targetfilepath) throws Exception{
    File sfile =new File(ymainpath+sofilepath);
    File dir = new File(mmainpath+targetfilepath.substring(0, targetfilepath.lastIndexOf("/")));
    if(!dir.exists()){
    dir.mkdirs();
    }
    File dfile = new File(dir,""+targetfilepath.substring(targetfilepath.lastIndexOf("/"), targetfilepath.length()));
    if(sfile.exists()){
    FileInputStream fis = new FileInputStream(sfile);
    FileOutputStream fos= new FileOutputStream(dfile);
    try {
    Streams.copy(fis, fos, true);
    } catch (Exception e) {
    System.out.println("复制异常");
    }
    dfile.setLastModified(sfile.lastModified());//保留原文件的修改时间
    System.out.println("patch成功:"+mmainpath+targetfilepath);
    }else{
    System.out.println("文件不存在!");
    }
    }
    }



    配置文件内容例如下面,每行一个路径:

    /TPXD_CORE/WebContent/WebBackground/FundManage/FundAccountApplyList.jsp
    /TPXD_CORE/WebContent/WebBackground/FundManage/FundIncomeList.jsp
    /TPXD_CORE/WebContent/WebBackground/FundManage/FundInfo.jsp
    /TPXD_CORE/WebContent/WebBackground/FundManage/FundManageMain.jsp
    /TPXD_CORE/WebContent/WebBackground/FundManage/FundRedemptionList.jsp
    /TPXD_CORE/WebContent/WebBackground/FundManage/FundUsermanageList.jsp
    /TPXD_CORE/WebContent/WebBackground/FundManage/FundYearextremeList.jsp
    /TPXD_CORE/WebContent/WebBackground/HelpCenter/HelpCenterMain.jsp
    /TPXD_CORE/WebContent/WebBackground/platformCapitalManage/BankCardList.jsp
    /TPXD_CORE/WebContent/WebBackground/platformCapitalManage/ChangeCardHistoryList.jsp
    /TPXD_CORE/src/com/amarsoft/proj/itaiping/webservice/telmarket/SuppleMaterialTranscation.java


    然后执行代码的main方法即可,成功如下,速度快,准确,免去打补丁的头疼事情:


    路径分析和设置目标文件路径需要自己修改代码中的路径,生成后在目标文件夹下就可以找到自己打好的补丁,类似.java文件这种分类一下寻找编译的.class文件然后再进行复制,像其他jsp、js、html、xml、properties等文件都可以直接寻找路径进行复制,基本能做到文件的完美复制,包括修改时间,但是文件夹的修改时间不保证。其中还可以自己做成最终打包压缩形式,这些都可以进行修改,有兴趣的可以尝试一下。这个方法比较通用,更好的可以把其中多数参数改成配置文件的,可以在不同项目中使用,可以省去一些不必要的浪费的时间。

    展开全文
  • Java项目开发中一些BUG的总结

    千次阅读 2013-12-09 11:31:00
    Java项目开发中一些BUG的总结

    1,JVM Bind


    2, hbm主键生成策略错误:

    Struts Problem Report

    Struts has detected an unhandled exception:

    Messages:

    1. ids for this class must be manually assigned before calling save(): cn.itcast.bos.domain.bc.Standard
    2. ids for this class must be manually assigned before calling save(): cn.itcast.bos.domain.bc.Standard; nested exception is org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): cn.itcast.bos.domain.bc.Standard

    File:

    org/hibernate/id/Assigned.java

    Line number:

    53

    Stacktraces

    org.springframework.orm.hibernate3.HibernateSystemException:ids for this class must be manually assigned before calling save():cn.itcast.bos.domain.bc.Standard; nested exception isorg.hibernate.id.IdentifierGenerationException: ids for this class must bemanually assigned before calling save(): cn.itcast.bos.domain.bc.Standard

     

    解决:

    反向生成的PO和hbm,在hbm中的主键生成策略是assigned。如果主键是String类型的,则需要将这个修改成uuid,就可以修正错误。

     

     

    3,延迟加载出错,报没有session

    Struts Problem Report

    Struts has detected an unhandled exception:

    Messages:

    1. could not initialize proxy - no Session
    2. java.lang.reflect.InvocationTargetException
    3. org.apache.struts2.json.JSONException: java.lang.reflect.InvocationTargetException
    4. org.apache.struts2.json.JSONException: org.apache.struts2.json.JSONException: java.lang.reflect.InvocationTargetException

    File:

    org/hibernate/proxy/AbstractLazyInitializer.java

    Line number:

    167

    Stacktraces

    org.apache.struts2.json.JSONException:

     org.apache.struts2.json.JSONException:

     org.apache.struts2.json.JSONException:java.lang.reflect.InvocationTargetException

     

    注意表格中的红色加粗字,初次看到这个信息的时候,可以猜到是懒加载造成的session关闭,

    解决方法:通过在web.xml中配置过滤器解决,

    <!-- 解决延迟加载异常 -->

    <filter>

       <filter-name>OpenSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>

     </filter>

     <filter-mapping>

       <filter-name>OpenSessionInViewFilter</filter-name>

       <url-pattern>/*</url-pattern>

      </filter-mapping>

     

     

    4,由数据表外键引发的异常:

    Struts Problem Report

    Struts has detected an unhandled exception:

    Messages:

    1. Cannot add or update a child row: a foreign key constraint fails (`mvbos`.`bc_subarea`, CONSTRAINT `FK_area_region` FOREIGN KEY (`region_id`) REFERENCES `bc_region` (`id`))
    2. Could not execute JDBC batch update
    3. Could not execute JDBC batch update; SQL [update mvbos.bc_subarea set decidedzone_id=?, region_id=?, addresskey=?, startnum=?, endnum=?, single=?, position=? where id=?]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update

    File:

    com/mysql/jdbc/PreparedStatement.java

    Line number:

    1,666

    Cannot add or update a child row: a foreign keyconstraint fails (`mvbos`.`bc_subarea`, CONSTRAINT `FK_area_region` FOREIGN KEY(`region_id`) REFERENCES `bc_region` (`id`))

    这句话的意思是:bc_subarea表的外键指向了bc_region的id属性。也就是说,subarea的存在依赖于region,没有region就没有subarea,所以必须要先存在region。才可以。

    得出出现错误的原因:

    在保存subarea的时候,subarea中指向region的外键的值,在region表中不存在。

    解决方式:

    查看是否是subarea的外键输入错误,或者建立id等于subarea的外键的region数据记录。

     

    5,struts.xml中不配result


    Noresult defined for action cn.itcast.bos.web.action.subarea.SubareaAction andresult upload

    出现原因:在Action中定义了返回结果upload,但是在struts.xml中没有配置接收upload的result。

    解决方案:在struts.xml中配置result。

    6,不能实例化action

    Struts Problem Report

    Struts has detected an unhandled exception:

    Messages:

    1. regionAction
    2. Unable to instantiate Action, regionAction, defined for 'regionAction_pageQuery' in namespace '/'regionAction

    File:

    org/apache/catalina/loader/WebappClassLoader.java

    Line number:

    1,645


    Stacktraces

    Unable to instantiate Action,regionAction, defined for 'regionAction_pageQuery' in namespace '/'regionAction

    原因:spring管理action时,需要在applicationContext.xml中配置action的实现类,出现这个问题是因为在spring的核心配置文件中,这个action的实现类的id与struts.xml中的class值不一致了。

    解决:查看struts.xml的这个action的class属性和applicationContext.xml的这个action的id属性是否一致,如果不一致,修改其一,使其一致即可。

     

     

     

    7,主键生成策略设置不当产生的异常

    Struts Problem Report

    Struts has detected an unhandled exception:

    Messages:

    1. Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
    2. Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

    File:

    org/hibernate/jdbc/Expectations.java

    Line number:

    85


    Stacktraces

    org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException:Batch update returned unexpected row count from update [0]; actual row count:0; expected: 1; nested exception is org.hibernate.StaleStateException: Batchupdate returned unexpected row count from update [0]; actual row count: 0;expected: 1

     

    解决:查看hbm文件中的主键生成策略。

    8,tomcat启动时报session错误

    严重: IOExceptionwhile loading persisted sessions: java.io.EOFException

    严重: Exception loading sessions from persistent storage

    解决:

    说法一:根本原因是给tomcat设置的缓存太小,解决的办法就是在eclipse的tomcat里配置一下所使用的内存大小

    说法二:分析:EOFException表示输入过程中意外地到达文件尾或流尾的信号,导致从session中获取数据失败。异常是tomcat本身的问题,由于tomcat上次非正常关闭时有一些活动session被持久化(表现为一些临时文件),在重启时,tomcat尝试去恢复这些session的持久化数据但又读取失败造成的。此异常不影响系统的使用。

            解决办法:tomcat6.0\work\Catalina\localhost\peam\SESSIONS.ser删除。如果正常关闭服务端,该文件是自动删除的。

            
    我参照上面方法解决的问题,用的是MyEclipse6.0,tomcat6.0。通常情况下,会认为是tomcat的缓存,会直接把整个localhost文件夹删除。但是上面的方法也是可取的,在localhost文件夹下,找到部署的工程名,在该工程名下有SESSIONS.ser文件,直接删除。重启tomcat,问题解决。

     

    9,WebService发布报错

    Exception in thread "main" com.sun.xml.internal.ws.model.RuntimeModelerException: runtime modeler error: Wrapper class cn.itcast.ws.jaxws.SayHello is notfound. Have you run APT to generate them?

    原因:很可能是JDK的版本不够造成的,建议JDK1.6u17之后的版本,最好改成1.7。

    解决:升级JDK到1.7即可。


    展开全文
  • Java项目开发流程

    千次阅读 2018-04-23 10:22:41
    做了几个项目,虽然都是紧紧张张的完成了,但是没有一个很好的开发流程。在我想来,有条理的开发项目会有更高的效率。也许开发的实际情况各有不同,但是这个时候只要对流程有所取舍,那么也会对项目开发有所帮助。...

    做了几个项目,虽然都是紧紧张张的完成了,但是没有一个很好的开发流程。在我想来,有条理的开发项目会有更高的效率。也许开发的实际情况各有不同,但是这个时候只要对流程有所取舍,那么也会对项目的开发有所帮助。

    这里写图片描述

    展开全文
  • java项目开发思路求解

    2020-12-15 10:56:08
    大佬们,现在有个业务是单独把一个数据库的数据取出放入另一个数据,要把这个业务单独拿出来做一个后台程序,我现在想的是用springboot+mybatis,然后在idea新建maven项目整合,最后打成jar放在linux服务器上运行,...
  • Java项目开发案例整合》

    千次阅读 2014-07-26 13:10:49
    Java项目开发案例整合》 开发背景 系统分析 需求分析 可行性分析 系统设计 系统目标 系统功能结构 系统预览 数据库设计 数据库概要说明 数据库逻辑设计 公共...
  • java项目开发经验总结

    万次阅读 多人点赞 2016-09-05 18:02:09
    Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点: 1、掌握项目开发的基本步骤 2、具备极强的面向对象的分析与设计技巧 3、掌握用例驱动、以架构为核心的主流开发方法 ...
  • Java项目开发规范参考

    万次阅读 2016-04-23 19:40:49
    iB2Team项目开发规范 By KevinLee 2016-4-20 Email: hi@lidengju.com 小弟不才,仅供参考 1. 目的为了使软件开发过程顺畅,保证软件质量,于是有了这份开发规范文档。2. 概述 项目以功能模块来划分分工 数据库...
  • Guide连夜整理了5个开源免费的Java项目快速开发脚手架。》 Java快速开发脚手架推荐中,我一共推荐了下面这些项目。 Guns pig RuoYi Jeecg-boot iBase4J 综合来看好评度最高的是:Ruoyi,次之的是 pig,另外,有读者...
  • JAVA项目开发之文档篇

    万次阅读 多人点赞 2017-08-05 09:56:04
    项目开发过程中为了增加程序的可读性和程序的健壮性, 方便后期程序的调试和维护,所以需要在开发过程中统一技术规范,一般会在项目初期确定好相关文档作为这一统一的规范。不同公司会对文档做不同要求,划不同的...
  • java项目开发经验总结,值得收藏!

    千次阅读 多人点赞 2018-09-08 14:46:09
    Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点: 1、掌握项目开发的基本步骤 2、具备极强的面向对象的分析与设计技巧 3、掌握用例驱动、以架构为核心的主流开发方法 没有...
  • 公司java项目开发规范

    千次阅读 2014-03-14 22:15:30
    为了保密性,我将公司的简写换成了我的英文名字,其它一律...² 规范新人员的开发习惯保证与公司开发的一致性,指导新人员开发工作 1.2 定义 Ø 实体:具有相同属性描述的对象(人、地点、事物)的集合。 Ø 引用:实
  • 一般的Java项目开发思路的疏通

    千次阅读 2018-08-09 15:27:58
    一般的Java项目后台都有什么技术? 最近自己做了几个Java Web项目,有公司的商业项目,也有个人做着玩的小项目,写篇文章记录总结一下收获,列举出在做项目的整个过程中,所需要用到的技能和知识点,带给还没有真正...
  • JAVA项目开发完成后期修改BUG和测试的工作流程 功能宏观修改BUG并不断测试: 测试步骤: 0.通测一遍,出现问题记录 1.已有问题是还否解决 2.第二轮测,是否影响其它本来没有问题的功能。 不断反复重复上面的...
  • 用mysql做java项目开发

    2013-09-06 13:39:11
    做数据库的时候出了问题如下 [CSDN移动问答][1] [1]: http://zhidao.baidu.com/question/807479716527276652.html?quesup2&oldq=1 求好心的大神解答 万分感谢
  • 利用Docker搭建java项目开发环境

    千次阅读 2017-07-12 17:29:56
    一台 Ubuntu 16.0.4 LTS ,安装了Docker服务,Rancher服务,也制作了Tomcat相关的image,接下来我们就来说一下如何快速的构建一个开发环境和测试环境 二、步骤 2.1:创建本地挂载目录 在宿主host主机上面创建两个...
  • Java 项目开发及管理常用工具收集

    千次阅读 2019-01-15 20:37:07
    一个专业的问题跟踪管理的软件,也可以作为项目执行管理 、敏捷开发管理、体系流程管理 、提案跟踪、需求管理等领域 9、持续集成工具 Jenkins 它是一个自动化的周期性的集成测试过程,从检出代码、编译构建...
  • java项目开发svn配置

    千次阅读 2010-11-15 21:13:00
    项目开发没有版本管理怎么行呢。 1.准备工作:  首先下载subvision: http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91&expandFolder=91&folderID=26
  • 1、级联操作可以在Java代码中来完成。 2、很多时候的删除采用的是逻辑删除而非物理删除,级联操作不适用。 3、数据量大的时候如果设计到分库分表的时候外键约束如何使用? 4、随着业务逻辑的增加存在数据库死锁的...
  • 经验总结: 1.List.add();该方法每执行一次,便会将原先添加在list集合中的内容覆盖。
  • Java项目开发系列(端口扫描工具)

    千次阅读 2017-12-02 22:09:29
    以后本人每次写了新的项目和学习了新的知识的笔记都会放到这个博客上,希望找到一些志同道合的朋友,和大家一起进步 , 加油! 项目介绍 关于端口在计算机中一直是重中之重 , 因为计算机和外部通信都是通过端口. 本...
  • 首先自我介绍下,工作5年多,大多在做金融银行的项目,传统项目开发(一个项目大概3-8个月之间吧),由于专科学历,没啥竞争力,好点的企业也进不去,唯一的优势就是出来工作早,工作经验多点,好了下面说一下面试...
  • 项目开发过程中,经常会考虑到提高用户访问效率,降低服务器的压力,这个时候会用到数据缓存。当前实现缓存的技术有很多,例如: jCache、Ehcache以及缓存 服务器redis,redis作为分布式系统重要的组成部分,该...
  • 三层结构在JAVA项目开发中的作用

    万次阅读 2011-07-26 20:00:21
    最近在项目开发中,对三层结构的思想有了一个比较明确的总结,现将自己的一些想法列出来,希望对大家的程序开发有所帮助. 大家都知道,我们在开发程序的时候,为什么需要三层呢?因为它能带给我们很多好处,首先就是有利于...
  • MAP和实体类作为参数的优缺点比较 1、map的优点: 1、灵活性强于javabean,易扩展,耦合度低。...权衡利弊,如果团队开发还是javabean比较好,个人项目就无所谓了。追求高效开发,可以使用Map

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 96,448
精华内容 38,579
关键字:

java项目开发

java 订阅