最近工作上效力比较低,各种需求更改耗费了大量的时间本钱(不吐槽,你懂的,已无力),高的身心俱疲。... ... 每次空话都比较多,我也是服了自己了,就当我是来凑字数的吧!不空话了,开始正题:
翻了1下上1篇文章,发现没有装开发环境,这里补上——在【1步1个脚印】Tomcat+MySQL为自己的APP打造服务器(1)服务器环境搭建中已配好了JDK,这次直接找1个JavaEE版本的Eclipse解压到我们想安装的目录下便可,用过
Eclipse+ADT 开发 Android 的同学都知道 Eclipse 是免安装的,在 /eclipse 下直接打开 eclipse.exe 便可。
到此我们只是简单安装了1个服务器的运行环境,现在我们开始写自己的服务器程序。 不管你是学Java的,还是 Android 的,肯定都学过 Core-Java 课程,那末你肯定学过 Servlet ,也许你忘了,但这无所谓,我们重新开始。
1、Servlet简介
摘自书上的1小段解释——“Java Servlet 是运行在 Web 服务器或利用服务器上的程序,它是作为来自 Web 阅读器或其他 HTTP 客户真个要求和 HTTP 服务器上的数据库或利用程序之间的中间层。使用 Servlet,您可以搜集来自网页表单的用户输入,显现来自数据库或其他源的记录,还可以动态创建网页”。Servlet 是 sun 公司提供的1门用于开发动态
web 资源的技术。其实,"Servlet"本来是指 Java语言实现的1个接口(狭义的Servlet),但更多的也更普遍的情况是:我们把任何实现了 Servlet 接口的类都叫作 "Servlet"。Servlet 的作用主要是对 Request 的要求数据进行解析、依照业务逻辑处理并将结果封装成 Response 返回我的理解就是“读-计算-写”,像数学计算器1样,输入操作数、操作符按"等于"就显示出结果;也像人的脑神经元1样“接受刺激-信号处理-作出响应”。为了便于理解,我们来渐渐拆解:
2、Servlet在服务器中的位置
在普通用户看来,我们平时使用互联网就像下图这样:
普通用户只关心自己作为1个客户端,是和1个叫服务器的东西在进行数据交互,具体服务器在哪里、做甚么、怎样实现、数据库用哪一种... ...这些都不重要。
而作为开发者的我们,用户不关心的问题我们却应当视如家珍(这是我们吃饭的家伙啊)——我们将服务器部份放大,从1个入门级的服务器开发者的角度来看看服务器的构造(这里仅以 Servlet 为例):
服务器接收来自不同用户的不同的要求(固然是以该服务器作为要求目标的那些要求),分析不同的要求,控制模块将各自的要求分送至对应的 Servlet (如登陆要求,则将登陆数据送至LoginServlet),然后 Servlet 根据要求内容处理业务逻辑(如登陆要求则解析用户名密码,并和数据库中保存的用户名密码进行对照,得出是不是是合法用户的结论),完成响应数据的封装返回给控制模块,控制模块再将该响应返回给对应的要求用户,这样即完成1次网络交互。
3、从小白开始使用Servlet
下面,我们来1步1步开始使用 Servlet 创建1个利用服务器:
在 JavaEE 版的 Eclipse 中创建 Dynamic Web Project (我们这里以1个全新的 workspace 为例,为何用1个新的workspace?后边会触及到):
接下来的步骤都默许,Next 直到下图:
到此,工程创建成功,我们来简单了解1下目录结构:
这里需要说明1下:在创建工程时我们的 Dynamic web module version 选项默许选择的3.0,就会出现后面要勾选 Generate web.xml deployment descriptor 才能创建 web.xml 文件的情况,若是3.0之前的版本是没有这个勾选选项的,而web.xml文件是默许创建的。这是由于Servlet3.0
的新注解机制的结果。
新建 Servlet 类:
不知道是甚么就先Add1下,待会看看是甚么。
URL mappings,我更改成 /Home/FirstServlet:
NEXT:
看1看都重写了哪些方法,最后 finish,我们第1个Servlet就创建好了。
打开刚创建的 FirstServlet.java 看看——Oh!Shit!你会惊讶的发现“祖国江山1片红”,各种类未定义、各种包找不见!不要惊讶,这就是刚开始我们以1个全新的 WorkSpace 为例的缘由。
发现问题解决问题,我们是天不怕地不怕的程序猿!
还记得我在创建 Servlet 时指定名字的下1个选项吗?就是这个:
,可以看到Servlet的父类是 java.servlet.http.HttpServlet,而在这里找不到,说明还缺东西,不是
.jar 就是环境。——这就是问题所在。
问题本源找到就容易解决了——还记得我们1开始创建 Dynamic Web Project 的时候并没有指定 Target runtime 吗?这就是指定运行时环境,就是我们比较外行的说法-环境问题。没关系,现在我们再来做这件事:
在 Project Explorer 空白区域 > 右键 > New > Other > 选择Server:
NEXT > 选择Tomcat Server(由于我的 Tomcat 装的是8.0.32,我在【1步1个脚印】Tomcat+MySQL为自己的APP打造服务器(1)服务器环境搭建中给的也是这个版本,所以这里选
v8.0,各位要根据自己的 Tomcat 选择相应的版本):
NEXT > 设置 Tomcat 安装路径(JRE可以workspace默许的JRE,也能够选择1个特定的JRE,如JRE1.7),以后 finish完成:
(也能够Next > 将之前创建的 工程Add到服务器中,再finish,这1步是可选的):
发现之前各种毛病1片红还是没有解决?不要着急,再1步就弄定了——
刚刚创建的工程"右键" > properties > Targeted Runtimes,勾选刚创建好的Server,OK,看看工程,正常了吧?固然,这些创建或选择 Target Runtime 也能够在创建工程的时候就做,只是我这里单独拿出来走1遍而已,让我们都印象深入1点。好了,这个问题解决了。继续回到我们的主线。
我们再来看之前留下的那个问题——Initialization parameters、URL mappings 是甚么,字面意思就是初始化参数、URL 映照。结合上下文,我们是在创建 Servlet 的时候编辑的这些内容,所以初始化参数肯定是这个 Servlet 的参数,URL 映照也肯定是这个 Servlet 的路径映照。
为了比较,我们再创建1个 PreferenceServlet ,在创建进程中可以不填的选项都不填,对照1下代码,会发现不同的地只有有以下:
FirstServlet中有:
@WebServlet(description = "学习Servlet创建的", urlPatterns = { "/Home/FirstServlet" }, initParams = {
@WebInitParam(name = "userName", value = "abc", description = "用户姓名") })
PreferenceServlet中为:@WebServlet("/Home/PreferenceServlet")
可以发现,之前添加的这些选项都是以注解的方式出现的1些说明、初始化参数。为了理解这1点,我找出了Servlet3.0之前版本的 web.xml文件中对Servlet的配置文件内容进行说明: <servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>servlet.FirstServlet</servlet-class>
<init-param>
<param-name>userName</param-name>
<param-value>abc</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/Home/FirstServlet</url-pattern>
</servlet-mapping>
这两种写法的功能是1样的,只是Servlet3.0以后支持注解的方式进行配置更方便、更高效而已。<servlet>标签和<servlet-mapping>标签相互对应,servlet-name
必须1致(可以有多个mapping对应1个Servlet,即多个地址对应1个目标),当1个要求到达后,
服务器先在<servlet-mapping>中寻觅匹配的地址,然后用对应的 servlet-name 在<servlet>标签中匹配该要求 Servlet 对应的Java类,然后将要求发送至该类;初始化参数可用 getInitParameter("parameterName") 来获得。
用事实说话,在上边我们创建的 FirstServlet中的 doget 方法中以下: protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getWriter().append("\n初始化参数userName = " + getInitParameter("userName"));
}
然后工程上右键>Run As:
Server选择之前创建的,Add该工程到服务器配置,finish。出现
即说明运行成功了!
在阅读器地址栏输入http://localhost:8080/ServletTest/Home/FirstServlet
回车,会看到:
好了,初步成功了。如果你是个新手,肯定还有很多地方不知道为何,比如要求地址为何这样写?Servlet 的响应怎样返回的?为何显示的中文成了乱码?没关系,万事都不是一挥而就的,我们就像标题1样,1步1个脚印,仔仔细细来。限于篇幅,本以为1篇就可以说完,没想到还是留下了很多的内容,我们下篇继续。
由于本人水平有限,如有问题请不吝赐教。若对我的文章比较满意,请静待下1篇的到来,_程序猿大人_在此谢过。