在ASP流行的那个时代,人们都习惯于把业务脚本和各种网页元素混在一起写。所以很多人对于从ASP切换到JSP都觉得很自然。
反倒是,对于Java Web容器中定义的servlet,很多人觉得这个东西画蛇添足,不知道为什么要搞个这么啰嗦的东西出来。
我们来体验一下。还是进到前几节课所使用的root目录。新建一个Java文件,叫做DemoServlet.java:
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.annotation.WebServlet;
public class DemoServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType(“text/html;charset=GB2312”);
PrintWriter out = response.getWriter();
out.println("");
out.println(" “);
out.println(”
out.println(” “);
out.println(” “);
out.println(”
Hello World");
out.println("
“);
out.println(” “);
out.println(”");
out.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
然后,使用以下命令进行编译:
javac -cp …\lib\servlet-api-3.1.jar DemoServlet.java
一定要使用 -cp 把 Jetty lib目录下的servlet-api 这个 jar 包加入到 ClassPath 中去。这个包是在Java EE的版本里定义的。在Java SE中是没有的。插一句,所有的 web 相关的标准都是在 EE 中定义的。
好了,我们看到,在root目录下生成了一个DemoServlet.class的文件,我们想让这个class文件起作用还要两个步骤。
第二步,新建一个文件夹名为WEB-INF,然后在WEB-INF里,创建一个classes目录,把class文件放到这个目录下面。
WEB-INF里面的内容,其权限是受限的,服务端容器不会把这里面的内容暴露给客户端访问。这里的内容只有容器有权访问和执行。
第三步,在WEB-INF下,新建一个文件,名为web.xml,其内容如下:
<?xml version="1.0" encoding="UTF-8"?>
index.jsp
<servlet>
<servlet-name>demo</servlet-name>
<servlet-class>DemoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>/servlettest</url-pattern>
</servlet-mapping>
可以了,我们像往常一样,启动jetty:
java -jar start.jar
然后在浏览器里访问:
看到了,我们实现的这个servlet打印出了Hello World,从这个小例子,可以看出一点,Servlet在表达上好像比JSP那种直观的做法要麻烦不少(参见,我们为了输出一个网页,使用out.println一行一行地输出)。
那为什么还要使用这个技术呢?
Servlet最大的特点就是打通了系统开发和Web开发之间的那堵墙,它可以让程序员以真正的Java编程的方式去处理web逻辑。
比如说,访问数据库,在JSP中,访问数据库的逻辑要和网页掺在一起,从数据库里读出信息来,再展示在网页上,就会显得逻辑很混乱,然后使用servlet的方法,我们可以使用面向对象的种种手段对此加以封装,让特定的模块和类去处理数据库连接,这样就使得代码更容易理解和维护。
实际上,后来的事实证明,servlet 这种设计对于Java Web技术栈是至关重要的,甚至可以说是决定了Java Web的生死存亡。很多时候,技术的进步就是这样,想当初Java诞生的目标是为了做为嵌入式设备的编程语言,但没想到最终会变成一种系统开发,Web 开发的语言。回顾整个过程,很多技术的兴起和消亡,真的是十分出乎意料。
关于Servlet 的全部细节,我的课程不打算覆盖,只想讲一些原理性的东西。这会是接下来几节课的重点。在此之前,我还想向大家展示一下,在JSP这个思想下所衍生出来的技术。这些技术都没有脱离逻辑与展示(我们通常会使用view这个单词来代表与展示有关的东西,中文常常译成视图,我觉得不太好,但又没想起有什么更好的翻译)混编在一起思路。
比如说 jstl,我们先看一个实际的例子,在root下面创建一个jstl.jsp,内容是这样:
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
<c:set var=“sum” value=“0” />
<c:forEach var=“i” begin=“1” end=“10”>
<c:set var=“sum” value="${sum + i}" />
</c:forEach>
<c:out value=“sum =
s
u
m
"
/
>
<
c
:
s
e
t
v
a
r
=
"
s
u
m
"
v
a
l
u
e
=
"
0
"
/
>
<
c
:
f
o
r
E
a
c
h
v
a
r
=
"
i
"
b
e
g
i
n
=
"
1
"
e
n
d
=
"
10
"
s
t
e
p
=
"
2
"
>
<
c
:
s
e
t
v
a
r
=
"
s
u
m
"
v
a
l
u
e
=
"
{sum}"/> <c:set var="sum" value="0" /> <c:forEach var="i" begin="1" end="10" step ="2"> <c:set var="sum" value="
sum"/><c:setvar="sum"value="0"/><c:forEachvar="i"begin="1"end="10"step="2"><c:setvar="sum"value="{sum + i}” />
</c:forEach>
<c:out value=“sum = ${sum}”/>
然后我们从客户端访问:
这个代码看上去要比 jsp 简洁一些,但说真的,我觉得可读性挺差的。结构化的标签用于描述流程性的代码,很别扭。
JSTL 的思想就是使用标签代替 Java 代码。实际上,JSTL是允许自己去开发标签的。但是好像除了把jsp中的脚本代码抽象到标签,就没有其他特别的地方了。这个显示还是与各种逻辑混在一起。
还有就是这我总结出了一些架构视频资料和互联网公司java程序员面试涉及到的绝大部分面试题和答案做成了文档和架构视频资料还有完整高清的java进阶架构学习思维导图免费分享给大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术资料),希望能帮助到您面试前的复习且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。
料领取方式:加群:374308445填写【CSDN 资料】即可免费获取!!!
如果您喜欢本文章,可以点击关注,每天将有更多精彩文章与您分享!