Posted in Working Skills, 技术

Eclipse我常用快捷键

ctrl+shift+r:打开资源

这可能是所有快捷键组合中最省时间的了。节约查找文件的时间,比如你看到报错是 某DAO层报错了,这样就方便。

Control-Shift-T: 打开类型(Open type)。如果你不是有意磨洋工,还是忘记通过源码树(source tree)打开的方式吧。用eclipse很容易打开接口的实现类的,按ctrl+t会列出接口的实现类列表

ctrl+o:快速outline

如果想要查看当前类的方法或某个特定方法,但又不想把代码拉上拉下,也不想使用查找功能的话,就用ctrl+o吧。它可以列出当前类中的所有方法及属性,你只需输入你想要查询的方法名,点击enter就能够直接跳转至你想去的位置。

ctrl+e:快速转换编辑器

这组快捷键将帮助你在打开的编辑器之间浏览。使用ctrl+page downctrl+page up可以浏览前后的选项卡,但是在很多文件打开的状态下,ctrl+e会更加有效率。

shift+enter及ctrl+shift+enter

Shift+enter当前行之下创建一个空白行,与光标是否在行末无关。ctrl+shift+enter则在当前行之前插入空白行。

Alt+方向键

这也是个节省时间的法宝。这个组合将当前行的内容往上或下移动。在try/catch部分,这个快捷方式尤其好使。

ctrl+m

大显示屏幕能够提高工作效率是大家都知道的。Ctrl+m是编辑器窗口最大化的快捷键。

ctrl+.及ctrl+1:下一个错误及快速修改

ctrl+.将光标移动至当前文件中的下一个报错处或警告处。这组快捷键我一般与ctrl+1一并使用,即修改建议的快捷键。新版Eclipse的 修改建议做的很不错,可以帮你解决很多问题,如方法中的缺失参数,throw/catch exception,未执行的方法等等。

Posted in 清文

读书随笔:《人性的弱点》第一章

我常常有一种感觉,总是想着一些没有完成,或者没有头绪的事情。仿佛夸了海口,仿佛熬了这一夜,我就能成功一样。

— 其实呢?

常常是深夜还没睡着,或者是没有熟睡吧。第二天迷糊醒来,还是那个普通的自己。嘲笑一番昨天的想法,起床依旧洗脸睡觉。是自己这阶段缺少看书了,是,我就看起了kindle里面师傅的一本,小小正能量的的书 — 《人性的弱点》

第一章,卡耐基是说了— Fundamental techniques in handling people(与人相处的基本技巧) ,我就纳闷了,这和人性的弱点有什么关系呢?

读完了这一章,我隐约记着

“不要批评 背地说别人” “赞美,恰到好处 别太过”“知道对方需求,需要的东西”

“对自己,学会欣赏别人” “可能现在笑人家太装逼,以后不一定他不成功” “对于自己不喜欢的,止住批评,冷静想想”

一、“如欲采蜜,勿蹴蜂房”

1、批评总是错误的,最错误的事情。恰是当时最能将情绪释放,但请克制

2、了解一个人,比批评好

刚刚看了一则新闻,由于火锅店员与顾客加汤事情出现争执,店员将汤倒向顾客头上。这事显然,店员有错。可是顾客没错吗,有的。肯定有的。这里抛开店员服务态度,我想说,那时候顾客肯定发火了。因为今天晚上我在永和吃饭,店员服务真差,把我的外卖送出去了。其实我在店里吃的,我也当时火了。找他们经理了。

但是我现在想,我也不应该这样。我毕竟点的是外卖,况且车站旁边的永和人实在是多。真多。

里面列举了形形色色的例子,为了就是说明确实 批评不顶用。例如,林肯最喜欢的一句名言“我不论断他人,他人就不会论断你。”是的,在各种战争中,林肯设身处地为犯错的军官们想,如果自己身处那环境会怎么做。而在书信中,也是十分保守委婉的表达批评。

这时候我想到了我的母亲,母亲在我这一生中。总是给我讲故事,让我明白很多道理。她从来没批评过我。总是说,人活着肯干吃苦,啥都能养活自己的。而这辈子也没有多少要求我,记得那次中考失利,一直到高考大学的我,明白了,母亲伟大。同样我那沉默不爱说的老爸也在去年退休了。

伟大的你们,我爱你们~

这辈子,就那么短。没必要花一些时间,去批评,去责怪,去抱怨他人。

做自己该做的事,想自己该想的事。走自己该走的路,路上的批评声很多,但鼓励也不会少的。

松风竹影,它们是一份清香。热血男儿,确实一腔热血。没有什么畏惧,只是我们年轻~

二、真诚的赞赏他人

书上没有规避什么东西,只是把最真实的说给我们听。

大部分人都想要的是:

        健康的身体

        食物

        睡眠

        金钱和金钱可以买来的东西

        未来生活的保障

        性满足

        儿女的幸福

        被人重视的感觉

最后一点,最重要的一点:渴望伟大

在我看来,现实教会我们是现实。没有现实基础在大部分人看来是愚昧。这块确实确实没人从中抛弃几点。最后一点是全部的人都不想抛弃的。因为这是,仿佛来到这个世界莫名的使命。讲讲小孩子的时候,曾经的我。

爱攀比,啥都爱

无论是 练字 体育 跑步 外貌 

无论是 别人体型 身高 力量(爱打架)

现在看来,都是好笑的回忆。那确实我小时候真正的自己。

每个小孩子都一样,我也不例外的爱被夸。我相信以前教育让我,觉得自己成绩好就是最强的人。但现实让我自己现在觉得,强在哪里都可以。

师弟,师弟是我一直在外称呼自己的另一个笔名。因为我觉得三人行,必有我师。我学习的只是人家的好处,那个我很吸收到的好处。同样,我首先得教下这个朋友,交朋友的秘密招数就是

真诚地赞美别人

三、激发他人的强烈需求

2015-8-26号早上写。。。

Posted in Java, 技术

图解 & 深入浅出 JavaWeb:Servlet必会必知

Writer      :BYSocket(泥沙砖瓦浆木匠)

微         博:BYSocket

豆         瓣:BYSocket

FaceBook:BYSocket

Twitter    :BYSocket

“眨眼间,离上一篇写技术博文时隔1个月。怕自己真的生疏了,都是备案太慢惹得。哈哈,继续high~ ”

[JavaEE 要懂的小事] Http相关 ,一直想写点Web开发相关的。最近项目接口开发紧,还有准备新的九月份战斗。JDK IO源码就隔一段落,温故知新看看Servlet & JSP 相关。把自己基础累积回顾一遍,并和大家分享分享一些心得和代码。这里应该涉及到一部分源码,开发思想和一些手工做出的图。喜欢java,或者有一定Java开发经验的多提宝贵意见。

一、Web服务器

从事web开发的人,会很清楚一个东西叫 Web服务器,比如J2EE开发—TomcatJetty,.NET开发—IIS等。HTTP服务器是使用 HTTP(超文本传输协议) 与客户机浏览器进行信息交流。下面就是HTTP服务器简单交互图:(来自[JavaEE 要懂的小事] Http相关 博客)

1_thumb3

HTTP服务器Web服务器的一种,也是开发最常见的,自然还有其他方式进行信息交互,比如FTP文件服务器

Web服务器是可以向发出请求的浏览器提供文档的程序。其核心过程为

连接过程 — 请求过程 — 应答过程 — 关闭连接

这让我想到了Tomcat架构的一张图:

image001

二、Tomcat 简单说几句

如图,Tomcat 包含了核心服务模块:Connector连接模块 和 Container 容器。Tomcat Server 核心是一个 Servlet/JSP Container。对每一个HTTP请求,过程如下

获取连接

Servlet来分析请求HttpServletRequest

— 调用其service方法,进行业务处理

— 产生相应的响应HttpServletResponse

关闭连接

如图:

Tomcat相关

蓝色线指向过程是请求,绿色线指向过程是响应过程。也就是上面Web服务器核心过程:“连接过程 — 请求过程 — 应答过程 — 关闭连接

三、我第一个Servlet

什么是Servlet?(每次都会不停的问自己,这是什么“What”?紧接着应该是什么用“How”吧)

JavaEE 6文档中,介绍如下

Servlet 是运行在Web服务器的Java小程序。Servlet可以获取并针对Web客户端的请求作出响应。一般情况下,通过HTTP,即超文本传输协议,进行传输通信。”

A servlet is a small Java program that runs within a Web server. Servlets receive and respond to requests from Web clients, usually across HTTP, the HyperText Transfer Protocol.

所以,Servlet 是Web服务器核心工作的抽象。它不单单只是实现HttpServlet,可能实现有FtpServlet(这个我猜的)等。相对较多的Web开发,知道的肯定是HttpServlet。

补充,在Servlet规范是这样写道的:

Serlvet是基于Java技术的Web组件,容器托管的,用于生产动态内容。它也是基于平台无关的Java类格式,被编译为平台无关的字节码,可以被基于Java技术的web server动态加载并运行。这里容器,有时候也称为servlet 引擎。

JavaEE 6文档中,是这样介绍HttpServlet

“HttpServlet 提供了一个能被继承后创建一个适应Web网站的Http Servlet的抽象类。”

Provides an abstract class to be subclassed to create an HTTP servlet suitable for a Web site.

光说不练假把式,练一个“Hello,Servlet/JSP World!”:

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
 * Copyright [2015] [Jeff Lee]
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @author Jeff Lee
 * @since 2015-6-25 19:46:45
 * 	HelloWrold案例
 */
@WebServlet(urlPatterns = "/helloWorld.html")
public class HelloWorldServletT extends HttpServlet{
	
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException{
		// 获取输出打印对象
		PrintWriter out = resp.getWriter();
		out.println("Hello,Servlet/JSP World!");
	}
}

右键该HelloWorldServletT.java文件 — Run As — Run On Server — 选择Tomcat服务器 — Finish即可

image

image

等待片刻,你可看到网页上如下输出。这就是客户端从HttpServlet获取到的响应:

image

休息一下吧~ 看看小广告:

开源代码都在我的gitHub上哦 — https://github.com/JeffLi1993

三、分析源码

 

@WebServlet(urlPatterns = "/helloWorld.html")

@WebServlet 注解用于声明一个HttpServlet的配置。其中,urlPatters = “/helloWorld.html”,urlPatterns复数形式,说明至少一个URL必须被申明。它和另一个value必须存在一个,但不能同时存在。如果要匹配多个URL路径的话,如下:

@WebServlet(urlPatterns = { "/helloWorld01.html", "/helloWorld02.html" }

下面有个@Override,重写了父类HttpServletdoGet方法。我们先看看父类HttpServlet。HttpServlet是一个抽象类,它提供了以下方法:

— doGet  , 服务于 HTPP GET 请求

— doPost , 服务于 HTTP POST 请求

— doPut  , 服务于 HTTP PUT 请求

— doDelete,服务于 HTTP DELETE 请求

如图:

image

对于不同请求,HttpServlet的子类必须相应的实现至少一个方法,通常来说,会是其中一个,这样代码比较清晰。那父类的doGet方法做了什么工作呢?

protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException
    {
        String protocol = req.getProtocol();
        String msg = lStrings.getString("http.method_get_not_supported");
        if (protocol.endsWith("1.1")) {
            resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
        } else {
            resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
        }
    }

这里就简单的获取了下HTTP协议及Http Local信息,然后可以协议是否是1.1,做出分别是405或者400HTTP状态码的响应。

回到HelloWorldServletT.java 这里:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws ServletException, IOException {
	// 获取输出打印对象
	PrintWriter out = resp.getWriter();
	out.println("Hello,Servlet/JSP World!");
}

表示该HelloWorldServletT会接受Http GET请求,并OOM到HttpServletRequest,并执行里面的逻辑代码和返回响应。 这里从HttpServletResponse对象中获取到输出打印对象PrintWriter,然后输出了“Hello,Servlet/JSP World!”。

完毕!哦还有一点补充补充补充:

print,这里还好一句话。如果打印个table会很麻烦,因此有一个JSP的东西出现了,是Servlet的HTML化身。

五、深入Servlet 具体过程

又回到这个简单的 Get Servlet代码:

public class HelloWorldServletT extends HttpServlet{
	
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException{
		// 获取输出打印对象
		PrintWriter out = resp.getWriter();
		out.println("Hello,Servlet/JSP World!");
	}
}

这过程总结如下:

— 从浏览器(Client)获取连接”/helloWorld.html”

Tomcat Connector模块将请求(Request)传递给 Container模块

Container 模块会做以下事情

—— 分析HTPP请求信息,组装成HttpServletRequest对象

—— 创建新的HttpServletResponse对象

—— 根据路由配置,搜索相应的Servlet,并创建一个线程用于处理本次请求。此时线程会将上面RequestResponse对象的索引传递给Servlet

— 新线程中的Servlet处理逻辑

线程结束后,通过HttpServletResponse对象的PrintWriter,返回浏览器一个信息

过程图如下:

Tomcat相关

蓝色线指向过程是请求,绿色线指向过程是响应过程,橙色线指向过程是内部处理过程。

有些面试题会这样问:

Servlet是线程安全的吗?

不是,一个servlet实现类只会有一个实例对象,多个线程是可能会访问同一个servlet实例对象的,线程安全问题都是由全局变量静态变量引起的。

因此,Servlet对象实例化是在以第一次请求此Servlet时,如果访问后,实例对象存在内存中,只会在服务器停止时,它才会消失。它不会随着各个线程结束而结束。因此下次访问Servlet时,Servlet Container会搜索相应的Servlet,如果不存在Container新建相应的Servlet。这也是我们想要的结果。

再来个恶心的面试题:

Servlet是单例吗?

不一定是,在一个ServeltName情况下是的。在多个ServletName匹配到一个Servlet类时,该Servlet不是单例。

六、小结

下一篇:图解 & 深入浅出 JavaWeb:Servlet 再说几句

发现这一博客写的太多,回头一看。可以写成三个文章了。言归正传本文要点如下

1、简单介绍Web服务器 及 Tomcat容器

2、第一个Sevlet的开发及使用

3、深入源码及api介绍使用

4、总结一次请求及响应的真实过程

5、欢迎点击我的博客及GitHub — 博客提供RSS订阅哦

———- http://www.bysocket.com/ ————- https://github.com/JeffLi1993 ———-