您的位置:首页 > 其它

开发过程中的疑问及解析

2016-12-29 21:26 253 查看
前言:针对在开发过程中的一些疑问进行整理,并对这些疑问进行有针对性的解析。

当前正在学习阶段,如果发现有什么错误或疑问请请在此博文中留言,我会尽快的解决!


一、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
。主要还是在于
Eclipse
Maven
的集成方式起到了关键作用,
它会从
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>

参考:
官网资料
为什么Maven会更改Eclipse JDK设置


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:transaction
sql: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中的属性,通常可以理解为
get
set
方法。而字段,通常叫做
“类成员”
。这两个概念是完全不同的。属性只局限于类中方法的声明,并不与类中其他成员相关。例如:
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
是通过变量+常量的方式进行创建,所以不会发生常量优化的现象,底层实现代码是通过
StringBuilder
StringBuffer
append
方法进行连接,最后通过
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)是一种
JSP2
EL
功能类似的表达式语言,他可以在运行时查询和操作对象图。与
JSP2
EL
相比,
SpEl
功能更加强大,他甚至支持方法调用和基本字符串模板函数。
SpEL
可以独立于Spring容器使用【可以只是当成简单的表达式语言来使用】;也可以在
Annotation
XML
配置中使用
SpEL
,这样可以充分利用
SpEL
简化
Spring
Bean
配置。
通过上面的介绍我总结如下:
EL表达式
可以在
JSP
中使用,
EL表达式
还可以很好在
JavaScript
中得到使用,因为表达式语言正是借用了访问结构化数据的
JavaScript
语法。
EL
可以很好的和
JSTL
或者自定义标签结合使用,因为
EL

创建的初衷就是在
JSTL
中使用。
SpEL
可以在
Java
代码中直接使用,也可以在
Spring
XML
配置文件中使用,从而简化
Spring
Bean
配置。


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

。。。


N、其它


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

使用快捷键:Shift + Ctrl + M
菜单位置: 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总是提示“这个文件已被其他程序修改,您是否想要重新载入?”

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

在我写过的博客中有两篇博客是对资源的整理,可能对大家都有帮助,大家有兴趣的话可以看看!!
资源大放送 - 图书与视频教程!
常用软件 — 整理





博文编号:20161229212628

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: