write:2022-4-10
文章目录
学习Java实现的web应用之前,要先明白web应用原理相关知识,链接: web概念和web运行原理
总结一下:Web应用是运行在Web服务器端的应用,由Web服务器来发布和运行,可以完成与桌面应用类似的功能,Web应用可以处理业务逻辑,特点在于用浏览器作为统一的客户端程序,客户端界面一律用HTML语言编写的网页,浏览器端以图形化界面的方式呈现,浏览器与服务器之间用HTTP协议通信;
![在这里插入图片描述](https://img-blog.csdnimg.cn/6378b8e1635448bb84dbdb197dfd0360.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcGVydGhfc3VzdQ==,size_10,color_FFFFFF,t_70,g_se,x_16)
1. Java Web应用的概念和组成
在Sun的Java Servlet规范中,对Java Web应用作了这样定义:“JavaWeb应用由一组Servlet/JSP、HTML文件、相关Java类,以及其他可以被绑定的资源构成。它可以在由各种供应商提供的符合Servlet规范的Servlet容器中运行。”
Java Web应用中可以包含如下内容:
Servlet,JSP,实用类,静态文档如HTML、图片等,客户端类(如Applet),描述Web应用的信息(web.xml)
2. Servlet的概念
Servlet是Web应用与Web服务器进行协作的标准接口:
(1)Web服务器可以访问任意一个Web应用中所有实现Servlet接口的类。
(2)Web应用中用于被Web服务器动态调用的程序代码位于Servlet接口的实现类中。
Servlet接口的作用:
Servlet规范把能够发布和运行JavaWeb应用的Web服务器称为Servlet容器。Servlet容器最主要的特征是能够访问Servlet接口,动态执行JavaWeb应用中的Servlet实现类中的程序代码。
3. Servlet容器的概念
3.1 Servlet容器
Servlet容器也称为JavaWeb应用容器,或者Servlet/JSP容器。后文均采用Servlet容器的提法。
Servlet容器为JavaWeb应用提供运行时环境,它负责管理Servlet和JSP的生命周期,以及管理它们的共享数据。
目前最流行的Servlet容器软件包括:Tomcat,Resin,JavaEE服务器(如Weblogic)中也提供了内置的Servlet容器
3.2 Servlet容器响应客户请求的过程
当客户请求访问某个Servlet时,Servlet容器将创建一个ServletRequest对象和ServletResponse对象。
在ServletRequest对象中封装了客户请求信息,然后Servlet容器把ServletRequest对象和ServletResponse对象传给客户所请求的Servlet。
Servlet通过ServletResponse对象生成响应结果,然后由Servlet容器把响应结果传给客户。
注意: Servlet容器和Servlet由java语言编写。 Servlet,ServletRequest,ServletResponse都是对象
4. 安装和启动Tomcat服务器的过程
4.1 Tomcat简介
Tomcat是一个优秀的Servlet容器。
Tomcat本身完全用Java语言编写。
Tomcat是Apache开源软件组织的一个软件项目, 大家可以从Tomcat的官方网址(http://tomcat.apache.org)来获取关于
Tomcat的最新信息。
将创建的java web应用发布到Tomcat的webapps目录下,由Tomcat来负责运行
4.2 Tomcat服务器的结构
Tomcat服务器是由一系列可配置的组件构成,其中核心组件是Catalina Servlet容器,它是所有其它Tomcat组件的顶层容器。Tomcat的组件可以在<CATALINA_HOME>/conf/server.xml文件中进行配置:
<Server>
<Service>
<Connector />
<Engine>
<Host>
<Context>
</Context>
</Host>
</Engine>
</Service>
</Server>
四类元素:
1.顶层类元素
顶层类元素包括Server元素和Service元素,它们位于整个配置文件的顶层。
2.连接器类元素
连接器类元素Connector代表了介于客户与服务之间的通信接口,负责将客户的请求发送给服务器,并将服务器的响应结果传递给客户。
3.容器类元素
容器类元素代表处理客户请求并生成响应结果的组件,有三种容器类元素,它们是Engine、Host和Context。 Engine组件为特定的 Service组件处理所有客户请求, Host 组件为特定的虚拟主机处理所有客户请求, Context组件为特定的Web应用处理所有客户请求。
4.嵌套类元素
嵌套类元素代表了可以加入到容器中的组件,如Valve元素和Realm元素。
4.3 Tomcat各个组件之间的协作关系
HTTPS协议:建立在HTTP协议基础上,并采用了安全加密技术的通信协议
Connector负责接收客户的请求并向客户返回响应结果,在同一个Service中,多个Connector共享同一个Engine。同一个Engine中可以有多个Host,同一个Host中包含多个Context
4.4 安装并运行Tomcat服务器
互联网上有很多教程的,例如:下载安装运行Tomcat
Tomcat的下载地址: http://tomcat.apache.org
安装步骤:
首先安装JDK。
接下来,解压Tomcat压缩文件apache-tomcat-6.x.zip。解压Tomcat的压缩文件的过程就相当于安装的过程。
然后设定两个环境变量:JAVA_HOME,它是JDK的安装目录;CATALINA_HOME,它是Tomcat的安装目录(也可不设置)。
启动命令:<CATALINA_HOME>\bin\startup.bat
关闭命令:<CATALINA_HOME>\bin\shutdown.bat
访问主页:http://localhost:8080/
5. 创建第一个简单的JavaWeb应用
5.1 helloapp应用的目录结构
Servlet规范对JavaWeb应用的目录结构也进行了规定,因为所有web应用都发布到Servlet容器,对目录结构进行规范,才能正确找到web应用的各个组件;
eg:helloapp应用
/helloapp:Web应用的根目录,所有的JSP和HTML文件存放于此目录
/helloapp/WEB-INF:存放Web应用的发布描述文件web.xml
/helloapp/WEB-INF/classes:存放各种class文件,servlet类文件也放于此目录
/helloapp/WEB-INF/lib:存放Web应用所需的各种JAR文件。例如,在这个目录下,你可以存放JDBC驱动程序的JAR文件
Web应用发布到Tomcat中的目录为:<CATALINA_HOME>\webapps
5.2 创建Web.xml文件
创建一个默认的web.xml文件,并把这个文件放到WEB-INF目录中。
<?xml version="1.0" encoding="ISO-8859-1"?> //xml语言版本 本文件所使用的字符编码
<!DOCTYPE web-app PUBLIC
'-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN'
'http://java.sun.com/j2ee/dtds/web-app_2_3.dtd'>
<web-app> //根元素
</web-app>
5.3 创建helloapp应用的web组件
在helloapp应用中创建如下组件:
HTML组件 - login.html
JSP组件 - hello.jsp
Servlet组件 - DispatcherServlet
5.3.1 创建login.html
它显示登录页面,要求输入用户名和口令,这个页面链接到一个名为DispatcherServlet的Servlet。
<form name="loginForm" method="post" action="dispatcher"> //action:请求访问的web组件
<table>
<tr>
<td><div align="right">User Name:</div></td>
<td> <input type="text" name="username"></td></tr>
<tr>
<td><div align="right">Password:</div></td>
<td><input type="password" name="password"></td></tr>
<tr>
<td></td>
<td><input type="Submit" name="Submit" value="Submit"></td>
</tr>
</table></form>
5.3.2 创建hello.jsp
hello.jsp被DispatcherServlet调用,显示Hello页面。
<html>
<head>
<title>helloapp</title>
</head>
<body>
<b>
Hello: <%= request.getAttribute("USER") %> //jsp中的表达式标记
</b>
</body>
</html>
5.3.3 创建DispatcherServlet.java
public class DispatcherServlet extends GenericServlet {
private String target = "/hello.jsp";
/** 响应客户请求*/
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
//读取表单中的用户名,对应login.htm:<input type="text" name="username">
String username = request.getParameter("username");
//读取表单中的口令,对应login.htm:<input type="password" name="password">
String password = request.getParameter("password");
//在request对象中添加USER属性,对应hello.jsp: <%= request.getAttribute("USER") %>
request.setAttribute("USER", username);
//在request对象中添加PASSWORD属性
request.setAttribute("PASSWORD", password);
/*把请求转发给hello.jsp */
ServletContext context = getServletContext();
RequestDispatcher dispatcher =context.getRequestDispatcher(target);
dispatcher.forward(request, response);
}
}
5.4 编译并配置DispatcherServlet
- 编译DispatcherServlet.java。编译时,需要将Java Servlet API的JAR文件(servlet-api.jar)设置为classpath,servlet-api.jar文件位于<CATALINA_HOME>/lib目录下。
- 把编译出来的class文件拷贝到/helloapp/WEB_INF/classes目录下。
DispatcherServlet.class的具体存放位置为/helloapp/WEB_INF/classes/mypack/DispatcherServlet.class - 参考编译批处理文件complie.bat
set catalina_home=C:\tomcat //本地机器上Tomcat的安装目录
set path=%path%;C:\jdk\bin //本地机器上jdk的bin目录
set currpath=.
if “%OS%” == “Windows_NT” set currpath=%~dp0%
set src=%currpath%src
set dest=%currpath%WEB-INF\classes
set classpath=%catalina_home%\lib\servlet-api.jar;%catalina_home%\lib\jsp-api.jar
javac -sourcepath %src% -d %dest% %src%\mypack\DispatcherServlet.java
- 在web.xml中为DispatcherServlet类加上servlet和servlet-mapping元素:
<web-app>
<servlet>
<servlet-name>dispatcher</servlet-name> //定义servlet的名字
<servlet-class>mypack.DispatcherServlet</servlet-class> //具体类名:加包名
</servlet>
<servlet-mapping> //为servlet映射一个url
<servlet-name>dispatcher</servlet-name> //等待映射的servlet的名字
<url-pattern>/dispatcher</url-pattern> //访问servlet的相对url路径
</servlet-mapping>
</web-app>
5.5 配置Context元素
在Tomcat中发布java web应用,可直接将创建的java web应用发布到Tomcat的webapps目录下,但想要更灵活的发布web应用,可为web应用配置Context元素,但为web应用配置Context元素并不是必需的,如果不进行配置,Tomcat会以默认的方式运行web应用,Tomcat会提供一个默认的Context配置;
Context元素代表了运行在Host上的单个Web应用。一个Host中可以有多个Context元素。每个Web应用必须有唯一的URL路径,这个URL路径在Context元素的path属性中设定。
在helloapp目录下新建一个META-INF子目录,然后在其中创建一个context.xml文件,它的内容如下:
<Context path="/helloapp" docBase="helloapp" reloadable="true"/>
Context元素的属性
在开发阶段,将reloadable属性设为true,有助于调试Servlet和其它的class文件。但是由于这一功能会加重服务器的运行负荷,因此建议在Web应用的产品发布阶段,将这个属性设为false.
5.6 创建并发布WAR文件
(1)进入helloapp应用的根目录<CATALINA_HOME>/webapps/helloapp
(2)把整个Web应用打包为helloapp.war文件,命令如下: jar cvf helloapp.war *.*
(3)把helloapp.war文件拷贝到<CATALINA_HOME>/webapps目录下。
(4)删除原先的helloapp目录。
(5)启动Tomcat服务器。自动发布web应用
eg:
打开命令行窗口,进入到你的Tomcat安装目录下,再输入命令如下: jar cvf helloapp.war *.*
然后,再Tomcat/webapps/helloapp中会有helloapp.war文件,再将WAR文件移出来到Tomcat/webapps下,此时:
命令行窗口再输入exit结束程序,再删除helloapp文件夹
重新启动Tomcat(即点击Tomcat/bin/startup.bat程序),此时你会发现Tomcat/webapps又有helloapp文件夹,这是由Tomcat启动时自动对helloapp.war解压展开的,再浏览器输入http://localhost:8080/helloapp/login.htm
提交后是转到/dispatcher处理,但dispatcher又会跳转到hello.jsp页面
6. 总结
7. 练习
- 问题:假设在helloapp应用中有一个hello.jsp,它的文件路径如下: <CATALINA_HOME>/webapps/helloapp/hello/hello.jsp
那么在浏览器端访问hello.jsp的URL是什么?选项:
(A) http://localhost:8080/hello.jsp
(B) http://localhost:8080/helloapp/hello.jsp
© http://localhost:8080/helloapp/hello/hello.jsp
答案:C - 问题:假设在helloapp应用中有一个HelloServlet类,它位于org.javathinker包下,那么这个类的class文件应该放在什么目录下?选项:
(A) helloapp/HelloServlet.class
(B) helloapp/WEB-INF/HelloServlet.class
© helloapp/WEB-INF/classes/HelloServlet.class
(D)helloapp/WEB-INF/classes/org/javathinker/HelloServlet.class
答案:D 所有类都放在WEB-INF/classes目录下,再加上其有的包名 - 问题:假设在helloapp应用中有一个HelloServlet类,它在web.xml文件中的配置如下:
<servlet>
<servlet-name> HelloServlet </servlet-name>
<servlet-class>org.javathinker.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name> HelloServlet </servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
那么在浏览器端访问HelloServlet的URL是什么?选项:
(A) http://localhost:8080/HelloServlet
(B) http://localhost:8080/helloapp/HelloServlet
© http://localhost:8080/helloapp/org/javathinker/hello
(D) http://localhost:8080/helloapp/hello
答案:D
<servlet-mapping>
<servlet-name> HelloServlet </servlet-name>
<url-pattern>/hello</url-pattern> //访问Servlet的相对url
</servlet-mapping>
对于html,jsp文件,文件存放位置与url对应,而Servlet需要在web.xml中配置url-pattern才是url
- 问题:客户请求访问Web服务器端的静态HTML文档与请求访问Servlet有什么异同?选项:
(A)相同:都使用HTTP协议
(B)区别:前者Web服务器直接返回HTML文档,后者Web服务器调用Servlet的服务方法,由Servlet动态生成HTML文档
©相同:前者Web服务器直接返回HTML文档,后者Web服务器直接返回Servlet类的源代码。
(D)区别:后者需要在web.xml中配置URL路径。
(E)区别:前者使用HTTP协议,后者使用RMI协议。
答案:A,B,D - 问题:关于Servlet规范,以下哪些说法是正确的(多选)?选项:
(A)Servlet规范属于HTTP协议的一部分。
(B)Servlet规范由SUN公司制定。
(C)Servlet规范制定了标准Servlet接口。
(D)Servlet规范规定Servlet容器的配置文件为conf子目录下的server.xml文件。
(E)Tomcat是符合Servlet规范的优秀Servlet容器。
(F)Tomcat的组成结构(包括Server、Service、Engine和Connector等组件)是由自身的实现决定的,与Servlet规范无关。
(G)Servlet规范规定Servlet实例运行在Servlet容器中。
答案:B,C,E,F,G
注意:(D)Servlet规范规定Servlet容器的配置文件为conf子目录下的server.xml文件。(Servlet规范仅仅规定Servlet容器需要具备哪些功能,Servlet规范并没有为Servlet容器提供具体实现细则) - 问题:以下哪些选项属于Servlet容器的功能?(多选)选项:
(A)接收并解析客户要求访问特定Servlet的请求。
(B)创建一个包含客户请求信息的ServletRequest对象。
(C)创建一个ServletResponse对象,Servlet用它来生成响应结果。
(D)创建Servlet对象。
(E)调用Servlet对象的service()服务方法。
(F)把Servlet对象生成的响应结果发送给客户。
答案:A,B,C,D,E,F - 问题:关于Servlet,以下哪些说法是正确的?(多选)选项:
(A)Servlet是运行在服务器端的小插件。
(B)当客户请求访问某个Servlet时,服务器就把特定Servlet类的源代码发送给浏览器,由浏览器来编译并运行Servlet。
(C)Tomcat是目前惟一能运行Servlet的服务器。其他服务器如果希望运行Servlet,就必须与Tomcat集成。
(D)Servlet规范规定,标准Servlet接口有个service(),它有两个参数,分别为ServletRequest和ServletResponse类型。
答案:A,D
注意:(B)当客户请求访问某个Servlet时,服务器就把特定Servlet类的源代码发送给浏览器,由浏览器来编译并运行Servlet。 (Servlet在服务器端运行的,而服务器端收到的是有Servlet生成的响应结果)
(C)Tomcat是目前惟一能运行Servlet的服务器。其他服务器如果希望运行Servlet,就必须与Tomcat集成。(所有实现了Servlet规范的容器都能运行Servlet) - 问题:一个用户安装了Tomcat,但无法启动Tomcat,可能是由于哪些原因引起的?(多选)选项:
(A)没有安装JDK。
(B)Tomcat与JDK的版本不匹配,例如Tomcat6.x要求使用JDK1.5或者以上版本。
(C)没有设置JAVA_HOME系统环境变量。
(D)没有设置CATALINA_HOME系统环境变量。
(E)没有安装浏览器。
答案:A,B,C,D - 问题:关于本节课提到的web.xml、context.xml和server.xml 文件,以下哪些说法正确?(多选)选项:
(A)web.xml文件的根元素为Context元素。
(B)Servlet规范规定JavaWeb应用的配置文件为web.xml文件。
(C)Servlet规范规定Servlet容器的配置文件为server.xml文件。
(D)web.xml文件和server.xml文件都是XML格式的配置文件。
(E)Servlet规范规定JavaWeb应用的的配置文件为context.xml文件。
答案:B,D
注意:(A)web.xml文件的根元素为Context元素。 (webapp元素)
(C)Servlet规范规定Servlet容器的配置文件为server.xml文件。 (Servlet规范仅仅规定Servlet容器需要具备哪些功能,Servlet规范并没有为Servlet容器提供具体实现细则)
(D)web.xml文件和server.xml文件都是XML格式的配置文件。 (web.xml是java web的配置文件,server.xml是Tomcat特有的配置文件) - 问题:关于JavaWeb应用的目录结构,以下哪些说法正确?(多选)选项:
(A)JavaWeb应用的目录结构完全由开发人员自行决定。
(B)JavaWeb应用中的JSP文件只能存放在Web应用的根目录下。
(C)web.xml文件存放在WEB-INF目录下。
(D)JavaWeb应用中的.class文件存放在WEB-INF/classes目录或其子目录下。
答案:C,D
注意:(A)JavaWeb应用的目录结构完全由开发人员自行决定。 (SUN公司规定,这样本证任何java web应用都能发布到Servlet容器中)
(B)JavaWeb应用中的JSP文件只能存放在Web应用的根目录下。 (根目录下自创的子目录也可以存放)