本系列的学习的资料主要来自衷水木先生的博客。
在上篇文章中我们已经配好了JDK但是还没有装开发环境,在这里补上。这次直接找一个JavaEE版本的Eclipse解压到我们想安装的目录下即可,用过 Eclipse+ADT 开发 Android 的同学都知道 Eclipse 是免安装的,在 /eclipse 下直接打开 eclipse.exe 即可。到此我们只是简单安装了一个服务器的运行环境,现在我们开始写自己的服务器程序。
一、Servlet简介
摘自书上的一小段解释——“Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页”。服务器接收来自不同用户的不同的请求(当然是以该服务器作为请求目标的那些请求),分析不同的请求,控制模块将各自的请求分送至对应的 Servlet (如登陆请求,则将登陆数据送至LoginServlet),然后 Servlet 根据请求内容处理业务逻辑(如登陆请求则解析用户名密码,并和数据库中保存的用户名密码进行对比,得出是否是合法用户的结论),完成响应数据的封装返回给控制模块,控制模块再将该响应返回给对应的请求用户,这样即完成一次网络交互。如下图所示:
二、开始使用Servlet
在 JavaEE 版的 Eclipse 中创建 Dynamic Web Project
勾选创建web.xml文件,接下来的步骤都默认,Next 直到下图:
到此,工程创建成功,我们来简单了解一下目录结构:
这里需要说明一下:在创建工程时我们的 Dynamic web module version 选项默认选择的3.0,就会出现后面要勾选 Generate web.xml deployment descriptor 才能创建 web.xml 文件的情况,若是3.0之前的版本是没有这个勾选选项的,而web.xml文件是默认创建的。
看一看都重写了哪些方法,最后 finish,我们第一个Servlet就创建好了。
打开刚创建的 FirstServlet.java 看看——Oh!Shit!你会惊讶的发现“祖国江山一片红”,各种类未定义、各种包找不见!不要惊讶,这就是刚开始我们以一个全新的 WorkSpace 为例的原因。
还记得我们一开始创建 Dynamic Web Project 的时候并没有指定 Target runtime 吗?这就是指定运行时环境,就是我们比较外行的说法-环境问题。没关系,现在我们再来做这件事:
在 Project Explorer 空白区域 > 右键 > New > Other > 选择Server:
NEXT > 选择Tomcat Server(由于在上篇文章中 Tomcat 装的是8.0.32,所以这里选 v8.0,各位要根据自己的 Tomcat 选择相应的版本):
NEXT > 设置 Tomcat 安装路径(JRE可以workspace默认的JRE,也可以选择一个特定的JRE,如JRE1.7),之后 finish完成:
(也可以Next > 将之前创建的 工程Add到服务器中,再finish,这一步是可选的):
发现之前各种错误一片红还是没有解决?不要着急,再一步就搞定了——
刚刚创建的工程"右键" > properties > Targeted Runtimes,勾选刚创建好的Server,OK,看看工程,正常了吧?当然,这些创建或选择 Target Runtime 也可以在创建工程的时候就做,只是我这里单独拿出来走一遍而已,让我们都印象深刻一点。好了,这个问题解决了。继续回到我们的主线。
用事实说话,修改在上边我们创建的 FirstServlet中的 doget 方法中如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
/* 先设置请求、响应报文的编码格式 */
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String account = request.getParameter("account"); // 从 request 中获取名为 account 的参数的值
String password = request.getParameter("password"); // 从 request 中获取名为 password 的参数的值
System.out.println("account:" + account + "\npassword:" + password); // 打印出来看一看
String result = "";
if("abc".equals(account)
&& "123".equals(password)){ // 模拟登陆账号、密码验证
result = "Login Success!";
}else {
result = "Sorry! Account or password error.";
}
/* 这里我们只是模拟了一个最简单的业务逻辑,当然,你的实际业务可以相当复杂 */
PrintWriter pw = response.getWriter(); // 获取 response 的输出流
pw.println(result); // 通过输出流把业务逻辑的结果输出
pw.flush();
}
Server选择之前创建的,Add该工程到服务器配置,finish。出现
即说明运行成功了!
在浏览器地址栏输入http://localhost:8080/ServletTest/Home/FirstServlet?account=abc&password=123回车,会看到:
终端记录:
其中
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/* 先设置请求、响应报文的编码格式 */
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
// .....再进行我们的逻辑处理
}
可解决中文乱码。