查询端口占用的方法

假设“8080”端口被某个该死的程序占用…(该死的程序:怪我咯~)

那么我们可以通过下面的方法找出那个程序:

1、打开cmd黑框(风标键+R,输入“cmd”回车)

2、输入: netstat -ano | findstr “8080”

回车,这个时候可以看到一个列表,最后一列就是占用8080端口的程序的进程的PID号,假设是“2468”

3、输入: tasklist | findstr “2468”
回车,这时又会有一个列表,第一列就是这个程序的进程的“映像名称”了,假设是“TNSLSNR.EXE”

4、打开任务管理器,打开“进程”栏,在“映像名称”列查找“TNSLSNR.EXE”(如果没有,那么点击下方的“显示所有用户的进程”),然后就可以在“描述”中看到这是个什么进程,如果不重要那就直接KILL掉

这样就解决问题了!

PS:TNSLSNR.EXE是Oracle数据库的进程,它占了我的8080,好吧,我惹不起,我总躲得起吧……话说应该能改吧,以后再研究了…

setContentType(“text/html;charset=utf8”)后页面依然乱码

写了段servlet返回浏览器中文的代码,设置了返回编码为“utf-8”,但是在浏览器端看到的仍是乱码,代码如下:

public class ServletTest extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {
		PrintWriter pw = res.getWriter();
		res.setContentType("text/html;charset=utf8");
		pw.write("尼美的");
		pw.close();
	}
}

后来发现,setContentType应该写在getWriter前面,所以啊,顺序还是很重要的!!!

res要先设定,才能保证通过res获得的流是utf8的格式。正确代码如下:

public class ServletTest extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {
		res.setContentType("text/html;charset=utf8");
		PrintWriter pw = res.getWriter();
		pw.write("尼美的");
		pw.close();
	}
}

“java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory”异常解决办法

访问Tomcat搭建的Servlet时报错:

java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory
at org.apache.catalina.startup.Bootstrap.(Bootstrap.java:60)
Caused by: java.lang.ClassNotFoundException: org.apache.juli.logging.LogFactory
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
… 1 more
Exception in thread “main”

问题出在tomcat上,配置tomcat时选择的是6.x,但是实际上是使用的tomcat 7.0,这个时候就少了一个包,叫做tomcat-juli.jar,这个问题貌似只发生在MyEclipse上,因为Eclipse不能这么选择tomcat。

怎么导入jar包呢?给个比较简单的方法:

Window – Preference – 左上角搜索tomcat – Tomcat 6.x展开 – Paths – Prepend to classpath右方点击“Add JAR/ZIP” – 找到tomcat/bin/tomcat-juli.jar – OK即可。

这个时候就完成了配置,问题就解决了!

Eclipse/MyEclipse查看源码出现“Source not found”的解决方法

使用Eclipse/MyEclipse查看Java源码出现“Source not found”,查看不到源码…

解决方法是,点击“Change Attached Source…”,会弹出Source选择框:

Eclipse选择“External location”,然后选择“External File…”

MyEclipse直接选择“External File…”,

然后找到jdk安装目录下的“src.zip”,点击“OK”即可。

另外,在Preferences中找到上述设置的方法如下:

WIndow – Preferences – Installed JREs – 点击框中的jre – Edit – JRE system libraries中找到rt.jar – Source Attachment

MyBatis运行时报错“前言中不允许有内容”的解决办法

使用MyBatis写的程序报错:

org.apache.ibatis.exceptions.PersistenceException:
### Error building SqlSession.
### Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause:
org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 前言中不允许有内容。
at …

看到报错信息中有句中文给高兴得…“前言中不允许有内容”,但是然并卵啊,不明白什么意思…

由于当时没有网,所以没查,不过估计是配置文件的错误(当时使用MyBatis提供的读取文件流的方法Resources.getResourceAsReader()),接着就将配置文件检查了一遍又一遍,还是没有找到错误,就在要放弃的时候,莫名其妙的发现主配置文件的开头有三个问号(“???”),可是Eclipse中却看不到这3个问号!!!

然后突然就想到了UTF-8+BOM,查看文件编码,果然是UTF-8+BOM,我去,怪不得会提示“前言中不允许有内容”…原来就是那个坑爹的BOM!!! 继续阅读

Java缓冲字节流复制文件的代码

对于机械硬盘来说,复制文件时,如果每次复制的数据比较小(比如几个字节),而量又特别大就会是个非常蛋疼的事情,效率非常非常的低,如果能够使用缓存一次性复制较大的数据(8~10K),那么就可以大大提高效率了。

而Java提供了带缓存的读写字节流BufferedInputstream和BufferedOutputsteam,那么通过这两个流复制文件可以提高文件复制的效率,因为通过缓存的方式可以一次性读取更多的字节数,然后再一次性写入更多的字节数,这样可以大大的降低硬盘的IO压力,从而提高复制效率。

Java中BufferedInputstream和BufferedOutputsteam默认的缓冲buff是8K,当然,我们也可以自定义buff,而经过测试(不严谨),发现自定义一个8K的buff比Java使用默认的8K的buff速度要快…而自定义buff的代码也不多,所以建议优先使用自定义buff的代码,那么代码如下: 继续阅读

Java Socket设置连接超时的代码

Java的Socket如果连接不到指定IP和Port的主机,就会抛出IOException异常,而通常情况下,从连接到出现IOException会有一段不定的时长,就是所谓的超时时长,如果超时时长过长,在开发时会影响测试,如果代码成了产品,又会非常的影响用户体验,那么要怎么设置这个时长呢?

Socket的类提供了一个方法:

public void connect(SocketAddress endpoint, int timeout) 
				throws IOException

参数:
endpoint – SocketAddress 提供主机IP和Port
timeout – 要使用的超时值(以毫秒为单位)。

该方法用于将Socket连接到指定的服务器,并设定一个超时值。超时值设定为大于0时,当超时后,就会抛出异常,停止连接,而超时值设为0将无限超时。

因此,使用上述方法就可以设置Socket连接的超时时长了,代码如下: 继续阅读

JSP EL表达式的属性名中不能出现的字符

写Servlet返回JSP的值时,是这样写的:

req.setAttribute("login-error", "登录失败");

JSP中是这样写的:

${login-error}

运行后,页面显示了一个“0”…

这是什么鬼,后台也报错了(我提取出了关键错误信息):

org.apache.el.parser.ParseException: Encountered ” “error “” at line 1, column, Was expecting one,
“}”, “.”, “[“, “>”, “gt”, “<“, “lt”, “>=”, “ge”, “<=”, “le”, “==”, “eq”, “!=”, “ne”, “&&”, “and”, “||”, “or”, “*”, “+”, “-“, “/”, “div”, “%”, “mod” 继续阅读

Spring报配置文件错误(莫名其妙)

状态

今天用Spring写东西,运行时报配置文件写错了,还是调了一会儿,把报错的地方看了,没找到,又把所有配置都看了一遍,还是没找到……

把所有bean删了,<beans>标签中间就剩下几行空白换行,还是报错……报错的地方都是空白的……无语了,最后突然想到,会不会就是那几行空白出的错……

于是把空白删了,就不报错了……原来是不知道为什么手抖了吧,那几行空白中夹了个全角的空格,这太坑了……

所以,小伙伴们找不到错误可以考虑下这个问题!