开发过程中的疑问及解析

前言:针对在开发过程中的一些疑问进行整理,并对这些疑问进行有针对性的解析。
当前正在学习阶段,如果发现有什么错误或疑问请请在此博文中留言,我会尽快的解决!

一、Maven

1.1 eclipse中项目的Java版本为1.5,但计算机中的环境并不是1.5?

场景:创建一个新的Maven项目,其构建的Java环境显示是1.5,手动将其更改为计算机当前Java环境,但是更新Maven项目后右转换为1.5版本了!

官方文档中有如下描述:

编译器插件用来编译项目的源文件。从3.0版本开始, 用来编译Java源文件的默认编译器是javax.tools.JavaCompiler(如果你使用的是Java 1.6)。 如果你想强制性的让插件使用javac,你必须配置插件选项forceJavacCompilerUse

同时需要注意的是目前的source选项和target选项的默认设置都是1.5,与运行Maven时的JDK版本无关。如果你想要改变这些默认设置,可以参考Setting the -source and -target of the Java Compiler

总的来说:

这是Maven已知的一个特性,除非在你的POM文件中显示的指定一个版本,否则会使用编译器默认的source/target版本1.5。主要还是在于EclipseMaven的集成方式起到了关键作用, 它会从POM文件中生成项目的.project,.classpath以及.settings, 因此除非POM文件指定了正确的JDK版本, 否则你每次更新项目配置的时候它都会重置到1.5版本。

解决办法:

在pom.xml文件中增加如下配置:

<build>
    <plugins>
        <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
        </plugin>
    </plugins>
</build>

参考:

1.2 如何让Maven下Jar文件的时候下载其源码?

场景:在Eclipse中集成Maven后,查看Maven依赖中Jar包的源码

解决办法:Window → Preference → Maven

二、Eclipse

2.1 eclipse中的代码折叠功能没有了?

场景:无意间发现代码折叠功能不能用了!

解决办法:很可能是误摁了快捷键Ctrl+/(小键盘上)导致的,再摁一次就出来了!

2.2 eclipse的encoding中没有GBK字符集选项?

在导入代码的时候,会出现乱码,如果更改整体配置则需要换来换去,因此我们可以针对单个文件来配置其字符集,文件上右键 → properties → Text file encoding → other 然后选择字符集,可是没有GBK怎么办?我们可以直接清除其中内容,然后手动更改为GBK即可。

2.3 eclipse中如何安装支持Hibernate的插件?

插件名称:JBoss-Tools。插件下载及安装教程:在Eclipse里添加插件开发Hibernate

2.4 XML文件中的警告提示“No grammar constraints (DTD or XML Schema) referenced in the document.”

解决办法:加上 <!DOCTYPE xml>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>

2.5 “Target runtime Apache Tomcat v6.0 is not defined.”

出现的原因:项目配置的是使用Tomcat 6.0 ,但是eclipse中没有。

解决办法:在工程目录下的.settings文件夹里,打开org.eclipse.wst.common.project.facet.core.xml文件,将<runtime name="Apache Tomcat v6.0"/>改成你tomcat的版本比如<runtime name="自己需要更改的版本"/>

2.6 JSTL使用SQL标签时报错“Missing end tag for “sql:update””

出现的原因:在sql:transactionsql:update标签内使用了HTML标签<!-- -->

解决办法:使用JSP注释<%-- --%>

2.7 jsp页面使用 jstl,出现 Unknown tag (…)警告

解决办法:<% page %> 中加入 isELIgnored="false"

三、数据库

3.1 Java代码中的模糊查询时字符串的拼写

针对PreparedStatement我们可以在查询的SQL命令中预留空缺,用问号代替,我们再动态地添加,但是针对模糊查询就需要拐点弯了。我们需要在模糊查询的时候,在需要动态添加的地方按照非模糊查询的写法写,再在传入的字符串时用组拼的方式将%%添入即可。

3.2 HyperSql使用file模式但并没有实现永久保存

使用file模式应该可以实现永久保存的特性,但是在测试过程中没有实现。通过搜索资料发现原来是必须关闭数据库才可以保存,就是在URL中添加;shutdown=true但是仍然没有实现永久保存的效果,最后才发现,是有个前提的,那就是必须所有连接都关闭(conn.close())后才可以。在测试过程中发现我们如果利用代码执行shutdown命令,即使有conn没有断开,也会永久保存的。

还有一种配置方式,说是可以实现,无需断开连接,当对数据进行修改后,就会被持久化得方法。就是使;hsqldb.write_delay=false,我查看了API,确实是这么回事,但是测试效果不理想,今后有待理解。

参考资料:HSQLDB(HyperSQL DataBase)在文件模式(File Mode)下数据的持久化

3.3 MySQL server5.7版出现server failed

1: Action 14:02:10: INSTALL.
1: 1: MySQL Server 5.7 2: {EC09D203-422B-4C9F-B623-230EF57EE709}
1: Action 14:02:10: FindRelatedProducts. Searching for related applications
1: Action 14:02:10: AppSearch. Searching for installed applications
1: Action 14:02:10: LaunchConditions. Evaluating launch conditions
1: This application requires Visual Studio 2013 Redistributable. Please install the Redistributable then run this installer again.
1: 1: MySQL Server 5.7 2: {EC09D203-422B-4C9F-B623-230EF57EE709} 3: 3
1: The action 'Install' for product 'MySQL Server 5.7.19' failed.

安装时,出现了这种错误,MySQL server 即数据库服务器没有安装成功。试了多次,在一个帖子里找到了解决方法。

需要升级一个插件,Visual C++ 2013 and Visual C++ Redistributable Package

https://support.microsoft.com/en-us/help/3179560/update-for-visual-c-2013-and-visual-c-redistributable-package

安装完成后即可成功安装数据库服务器。

四、java语言

4.1 检测字符串是否相等?

如果检测两个字符串的内容是否相等,我们可以使用equals方法进行检测,切忌不要使用==来比较这两个字符串的内容是否相同。原因是:==只是比较这两个字符是否都放在同一个地方,也就是比较的是存放的地址是否相同。

然而如果字符串是空的(NULL)那么使用equals会抛出空指针异常,需要切记。

如果是要比较连个字符串是否相等,最好的写法是if(null!=Str&&Str_temp.equals(Str)),这样可以避免空指针异常,同时也可以检查字符串的内容是否相等。需要注意的是,我们应当先写null!=Str来判断检测的字符串不是null

4.2 空串与null串?

  • 空串“”是长度为0的字符串。可以调用以下代码检查一个字符串是否为空:if(0==Str.length())或者if(str.equals(""))
  • null串表示目前没有任何类型与该变量关联

4.3 Java中的属性和字段?

Java中的属性和字段的区别:Java中的属性,通常可以理解为getset方法。而字段,通常叫做“类成员”。这两个概念是完全不同的。属性只局限于类中方法的声明,并不与类中其他成员相关。例如:

void setA(String s){}
String getA(){}

当一个类中拥有这样一对方法时,我们可以说,这个类中拥有一个可读写的a属性(注意是小写a)。如果去掉了set的方法,则是可读属性,反之亦然。

类成员(字段),通常是在类中定义的类成员变量,例如:

public class A{
    private String s = "123";
}

我们可以说A类中有一个成员变量叫做s

4.4 ==和equals方法的区别?

说明:Object中的equals方法是比较对象的地址值的(底层是调用的==),没有什么意义,我们常需要重写他,因为开发构成中通常比较的是对象中的属性值,我们认为相同属性是同一个对象,这样我们就需要重写equals方法。

相同点:

  • 都可以做比较,返回值都是boolean

不同点:

  • ==号是比较运算符,既可以比较基本数据类型,也可以比较引用数据类型,基本数据类型比较的是值,引用数据类型比较的是地址值。
  • Objcet类中的equals方法只能比较的是引用数据类型,equals方法在没重写之前,比较的是地址值,底层依赖的是==号,但是比较底层值时没有意义的,我们需要重写equals方法比较对象中的属性值。

注意:一般情况下equals方法进行了重写。

4.5 String s=new String(“abc”)创建了几个对象?

答案是两个;首先会在常量池中查找是否有abc,如果没有则创建,而new则是在堆中创建对象,所以拷贝常量池中的abc在堆中创建一个对象,然后将堆中的对象的地址赋给栈中的s;所以说综上所说常量池一个,堆内存中一个,总共两个。

4.6 String s1=”a”+”b”;与String s2=”ab”是否相同

JVM虚拟机有常量优化机制,也就是说在编译的时候常量会进行提前整合,也就是说“a”+"b"在编译的时候会被优化成“ab”,所以都是常量池中的同一个“ab"

4.7 String a=b+”str”误区

String a="ab";
String b="abc";
String c=a+"c";
System.out.println(b==c);//false
System.out.println(b.equals(c));//true

解析:其中c是通过变量+常量的方式进行创建,所以不会发生常量优化的现象,底层实现代码是通过StringBuilderStringBufferappend方法进行连接,最后通过toString方法转换为String。首先无论StringBuilder还是StringBuffer都是对象,所以在堆内存中进行创建,重点是在toString方法,我们看一下toString的底层代码实现:

@Override
public String toString() {
    // Create a copy, don't share the array
    return new String(value, 0, count);
}

不难发现最后转换为String的方式是通过new的方式进行创建的,所以其在堆内存中进行创建的,所以说c保存的地址是在堆内存,而b保存的地址是在常量池中,因此二者使用==进行比较的时候是不一样的。

4.8 参数传递时,值问题?

基本数据类型在传递的时候是不会改变值的,而引用数据类型在传递的时候是传递的对象的地址值,所以在方法内部改变其值,随之这个对象也就变化了。

注意:String类型虽然是引用数据类型,但是在作为参数传递时和基本数据类型是一样的,而StringBuffer则会改变。

@org.junit.Test
public void breakTest1() {
    String a="我是a";
    StringBuffer b=new StringBuffer("我是b");
    changString(a);
    changStringBuffer(b);
    System.out.println(a);//我是a
    System.out.println(b);//我是b,test
}
private void changString(String str){
    str+=",test";
}
private void changStringBuffer(StringBuffer str){
    str.append(",test");
}

4.9 自动装箱==误区

我们首先要了解其内部实现机制,如果其常量值(不为new创建的)的范围为byte类型取值范围(-127—128)的时候不会创建对象,而是从常量池中获取。

@org.junit.Test
public void breakTest1() {
    Integer a=127;
    Integer b=127;
    Integer a1=129;
    Integer b1=129;
    System.out.println(a==b);//true
    System.out.println(a1==b1);//false
}

五、Java EE

5.1 web.xml配置中的url-pattern的’/‘和’/*‘的区别?

'/'表示该项目的所有请求路径;'/*'表示只能有一级子路径,它匹配'/a.jsp'但是不匹配'/jsp/a.jsp'

5.2 Invalid location of tag (form)警告!

原因:把<form></form>写到<table></table>里面了!

解决办法就是反过来就可以了!

5.3 EL表达式与SpELl表达式的区别

首先说明一下JSTL:标准标签库JSTL的全名为 Java Server Pages Standard Tag Library。它是由JCP( Java CommnunityProcess)所指定的标准规范,它主要是给 Java Web开发者提供了一个标准的通用标签库。通过 JSTL,可以部分地取代传统 JSP程序中嵌入 Java代码的做法,可以使得 JSP页面程序的风格趋于统一,并且容易维护。

起初 EL 表达式只是为了方便存取数据所定义的一种语言。它只能使用在 JSTL标签中,而不能在JSP页面中运用。一直到了JSP2.0 版本发布后, EL 才被正式纳入为 JSP标准规范之一。这时,它才可以直接在 JSP页面程序中使用,只要安装的 Web服务器能够支持 Servlet2.4/JSP2.0

Spring表达式语言(简称为SpEL)是一种JSP2EL功能类似的表达式语言,他可以在运行时查询和操作对象图。与JSP2EL相比,SpEl功能更加强大,他甚至支持方法调用和基本字符串模板函数。SpEL可以独立于Spring容器使用【可以只是当成简单的表达式语言来使用】;也可以在AnnotationXML配置中使用SpEL,这样可以充分利用SpEL简化SpringBean配置。

通过上面的介绍我总结如下:

  • EL表达式可以在JSP中使用,EL表达式还可以很好在JavaScript中得到使用,因为表达式语言正是借用了访问结构化数据的JavaScript语法。EL可以很好的和JSTL或者自定义标签结合使用,因为EL 创建的初衷就是在 JSTL中使用。
  • SpEL可以在Java代码中直接使用,也可以在SpringXML配置文件中使用,从而简化SpringBean配置。

5.4 Spring整合Struts2时,如何将Action交由Spring进行管理?

。。。

N、其它

<1> Atom编辑器中如何预览markdown?

  1. 使用快捷键:Shift + Ctrl + M
  2. 菜单位置: Packages → Markdown Preview → Toggle Preview

<2>使用Word中提供的PDF转换功能,转换为PDF时生成目录书签?

Word转换为带目录书签的PDF,待转换Word中应该有目录或书签,可以用Word中的标题来自动生成目录。如何增加PDF和XPS的加载项,此处不再赘述,百度下Word自带转PDF就可以查到。

另存为PDF或者导出 → 创建PDF/XPS,然进行配置如下:

下面红框,默认是没有勾选的,要想生成书签需要打勾,选择“标题”就可以了:

点击保存,完成上面设置,生成的PDF文件就会有目录书签了,阅读起来就方便多了。

<3>word导出为PDF后文字无法被选中

可能你勾选了无法嵌入字体情况下显示文本位图

<4>MarkdownPad总是提示“这个文件已被其他程序修改,您是否想要重新载入?”

工具 → 选项 → 文件 → “自动检测打开的文件是否被其他程序修改或删除”,把勾去掉就好了。



 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页