01【WEB开发、Servlet】
一、WEB开发简介
1.1 什么是WEB开发
- WEB(World Wide Web):即全球广域网,也称为万维网,它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。我们通过浏览器访问的网站简称为Web网站;
很多的编程语言都可以开发Web网站,而JavaWeb就是采用Java技术栈来开发的Web网站,而我们接下来的时间都是学习JavaWeb中的技术栈;
1.2 软件的架构
1.2.1 BS和CS概述
- BS:Browser Server 浏览器-服务器模式。客户端使用浏览器来访问服务器。
- CS:Client Server 客户端-服务器模式。用户需要在本地电脑上安装客户端软件,再来访问服务器。
CS的特点:
-
必须在本地电脑安装客户端软件
-
如果服务器升级,客户端一般来说要伴随着要升级。客户端还会经常进行升级并且安装。
BS的特点:
- 客户端使用的是浏览器,只要有浏览器就可以执行我们程序。
- 服务器升级,客户端可以无缝升级,就可以直接使用最新的功能。
1.2.2 WEB资源的类别
分类:静态资源(网站)和动态资源(网站)
1)静态网站的特点:
静态网页是相对于动态网页而言,是指没有后台数据库、不含程序和一些不可交互的网页。你编的是什么它显示的就是什么、不会有任何改变。
使用的技术有:HTML,CSS,JS等
2)动态网站的特点:
-
动态网页以数据库技术为基础,可以大大减少降低网站维护的工作量;
-
采用动态网页技术的网站可以实现更多的功能,如用户注册、用户登录、在线调查、用户管理、订单管理等等;
-
动态网页实际上并不是独立存在于服务器上的网页文件,只有当用户请求时服务器才返回一个完整的网页;(网页是程序在运行过程中动态生成的)
使用的技术:JSP、Servlet,C#,PHP,Python
如果要学习动态网页的技术首先要用静态网页的基础
1.3 Web服务器
当我们在浏览器(客户端)通过互联网访问到一个Web网站时,那么Web网站将会把我们需要的资源响应给我们。所以这些Web网站需要提前将程序运行起来,而且由于用户访问时间的不确定性,因此Web网站一般不会关闭(永久运行下去);
我们使用JavaWeb技术栈编写好的程序(能够处理来自浏览器的访问的程序)需要部署到服务器上才能运行;
服务器一般指两个层面,一个是硬件层面,另一个是软件层面;
1.3.1 什么是服务器(硬件)
一般来说,我们平常所说的服务器其实就是一台计算机,只不过由于服务器需要处理大量的客户端请求,因此一般服务器的配置都比较好,性能高;
服务器上装的软件都是可以处理客户端请求的一些服务器软件,也叫Web服务器、Web容器;
1.3.2 什么是Web服务器(软件)
有了硬件层面的服务器,只是能确保这台电脑在互联网中能被其他的设备访问到(前提是大家都连接了互联网);
例如在浏览器的地址栏输入:http://12.19.128.177:881
上述的一个地址,可以使一台设备在互联网中通过IP寻找到这台服务器,并且通过881端口找到这台服务器上对应的应用程序。
但是,如何解析浏览器携带过来的数据呢?应用程序该如何响应数据到对方呢?数据格式应该为什么样子才能被浏览器所解析呢?这一系列的问题都比较麻烦;
因此,我们将上述这些不属于业务核心的功能交给其他工具做,这个工具就是Web服务器(软件层面),也叫Web容器;也就是说我们以后使用JavaWeb编写好的软件,需要部署到Web服务器中;
我们程序员写的Java程序运行在Web容器中,也称为Web服务器。JavaEE中Web容器也是用Java语言写的,由第三方厂商来写,Web容器运行Java虚拟机上。
1)JavaEE的规范
在Java中所有的服务器要实现一组Oracle公司规定的接口,这些接口称为JavaEE规范。不同厂商的JavaWeb服务器都实现了这些接口。在JavaEE中一共有13种规范。
常见的JavaEE规范有: JSP、Servlet、JDBC、XML、EJB、JMS、JTA、JavaMail、JNDI等
2)常见的Web服务器
1)WebLogic:WebLogic是Oracle公司的产品,收费;是目前应用最广泛的Web服务器,支持J2EE规范。WebLogic最早由WebLogic Inc. 开发,后并入BEA 公司,最终BEA公司又并入 Oracle公司。BEA WebLogic是用于开发、集成、集群、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。
2)WebSphere:
另一个常用的Web服务器是IBM公司的WebSphere,支持JavaEE规范。
3)其它:
名称 | 种类 | 公司 | 是否开源 |
---|---|---|---|
Glass Fish | 中型服务器 | Oracle | 开源 |
JBoss | 中型服务器 | JBoss | 开源 |
Resin | 小型服务器 | Caucho公司 | 开源 |
Jetty | 内置式服务器 | Jetty/eclipse | 开源 |
4)Tomcat服务器
在小型的应用系统或者有特殊需要的系统中,可以使用一个免费的Web服务器:Tomcat
支持的规范:该服务器支持全部JSP以及Servlet规范
二、Tomcat的使用
2.1 Tomcat的入门
2.1.1 下载
-
apache官网:www.apache.org
-
tomcat的产品页面: http://tomcat.apache.org/
2.1.2 Tomcat环境变量配置
- 设置环境变量
新建CATALINA_HOME
- 设置访问路径,可以在命令行的任何一个目录下访问bin目录下的可执行文件。
Tips:一定要配置JAVA_HOME环境变量
2.2 Tomcat目录结构
目录名 | 作用 |
---|---|
bin | 启动和关闭tomcat可执行文件 |
conf | 配置文件夹,有些重要配置文件在这下面。如:server.xml, web.xml等 不建议乱修改,可能导致tomcat不能启动 |
lib | tomcat使用时依赖的一些第三方jar包 |
logs | 日志记录文件,记录服务器运行过程中一些事件。包括运行过程中出现异常 |
temp | 临时文件夹,保存服务器运行过程中生成的一些垃圾文件 |
webapps | 我们做好的项目发布的目录,可以通过浏览器来直接访问 |
ROOT目录:在浏览器上看到的欢迎页面,在这个目录下 | |
work | tomcat工作目录,所有已经发布项目,在这里生成中间文件执行 |
2.3 启动与关闭
在浏览器上访问:http://localhost:8080
2.4 Tomcat项目的发布方式
2.4.1 方式1:webapps
在webapps目录下创建一个文件夹demo,在文本夹下面有一个hello.html
重启服务器
访问:http://localhost:8080/demo/hello.html
2.4.2 方式2:虚拟目录
在conf/server.xml文件的host元素中配置Context(上下文)标签 | |
---|---|
path属性 | 虚拟访问目录的名称 |
docBase属性 | Web应用所在目录 |
好处:项目不需要发布在webapps下,因为webapps项目越多,导致tomcat启动越慢。
案例:发布项目到d:/000
目录下
找到server.xml文件中143行,host元素,写下面的代码:
<Context path="abc" docBase="d:/000"/>
如图所示:
在浏览器上测试:
2.5 修改Tomcat端口
默认情况下,Tomcat端口为8080,如果想要修改Tomcat的访问端口,可以打开Tomcat的配置文件:conf/server.xml
如图所示:
打开浏览器,访问:http://localhost:9090/abc/hello.html
三、Servlet快速入门
3.1 什么是Servlet
是一个Java写的小应用程序,运行在Web容器中,用于处理用户的请求,并且做出响应。
- Servlet与普通的Java程序的区别:
- 1)普通的Java程序由main函数调用,而Servlet由Web容器,Tomcat来调用。
- 2)Servlet是运行在Web容器中
- 3)对浏览器发送过来的请求做出响应
3.2 Servlet基于xml配置
- 1)创建web工程/模块
- 2)创建好的Web结构如下:
- 3)为项目添加tomcat库
查看模块依赖:
- 4)创建一个类HelloServlet继承于HttpServlet类,并重写doGet()方法。在浏览器上使用打印流输出Hello Servlet!
package com.dfbz.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 编写一个类继承HttpServlet
*/
public class HelloServlet extends HttpServlet {
/**
* 重写service方法
*
* @param request: 对请求数据进行封装
* @param response: 对响应数据进行封装
* @throws ServletException
* @throws IOException
*/
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//得到一个打印流对象
PrintWriter out = response.getWriter();
//打印到浏览器上
out.print("<h1>Hello Tomcat</h1>");
}
}
- 5)编辑web.xml中配置servlet,设置访问地址为/hello
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--servlet基本配置-->
<servlet>
<!--servlet名字(随意)-->
<servlet-name>helloServlet</servlet-name>
<!--Java类全名-->
<servlet-class>com.dfbz.servlet.HelloServlet</servlet-class>
</servlet>
<!--访问地址配置-->
<servlet-mapping>
<!--servlet的名字,与上面的名字相同-->
<servlet-name>helloServlet</servlet-name>
<!--浏览器访问地址,要以/开头 -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
3.3 在idea中运行Servlet
3.3.1 idea中配置tomcat
我们要将idea和tomcat集成到一起,可以通过idea就控制tomcat的启动和关闭:
- 1)编辑运行配置
- 2)添加Tomcat的配置服务器信息
- 3)配置服务器的详细信息
- 4)发布项目
3.3.2 在idea中启动服务器
点右上角的启动图标,启动Tomcat服务器
开发时发布的工程在这个目录
浏览器测试访问:http://localhost:8080//hello
3.4 Servlet基于注解配置
使用注解@WebServlet,指定name和urlPatterns属性
@WebServlet注解属性 | 说明 |
---|---|
name = “HelloServlet” | Servlet名字,类似于<servlet-name>one</servlet-name> |
urlPatterns = “/hello” | 访问地址,可以指定多个地址<url-pattern>/hello</url-pattern> |
value=“/hello” | 如果其它属性都不写,可以省略urlPatterns,只写访问地址即可。不能与urlPatterns同时指定 |
- 注解开发servlet代码,继承于HttpServlet,重写service方法:
package com.dfbz.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @author lscl
* @version 1.0
* @intro:
*/
@WebServlet(name = "hello02Servlet",urlPatterns = "/hello")
public class Hello02Servlet extends HttpServlet {
/**
* 重写service方法
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应类型
response.setContentType("text/html;charset=utf-8");
//得到打印流
PrintWriter out = response.getWriter();
//在浏览器打印输出
out.print("<h2>Hello02Servlet</h2>");
}
}
重启Tomcat,访问浏览器:http://localhost:8080/hello02
四、Servlet的学习
4.1 Servlet 生命周期
4.1.1 Servlet 接口中生命周期方法
什么时候创建:默认第一次请求创建
什么时候销毁:服务器关闭销毁
方法 | 作用 | 运行次数 |
---|---|---|
构造方法 | 在对象实例化的时候执行 | 1次 |
void init(ServletConfig config) | 在初始化的时候执行 | 1次 |
void service(ServletRequest req, ServletResponse res) | 每次请求都会执行 | n次 |
void destroy() | 在服务器关闭的时候 | 1次 |
4.1.2 Servlet的运行过程
4.1.3 案例:
package com.dfbz.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/**
* 实现Servlet接口
*/
@WebServlet("/demo01")
public class Demo01Servlet implements Servlet {
//构造方法
public Demo01Servlet() {
System.out.println("Demo01被实例化");
}
//初始化的方法
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init方法被执行");
}
//得到一个配置对象,不属于生命周期的方法
@Override
public ServletConfig getServletConfig() {
return null;
}
//请求处理方法,每次请求都会调用
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service方法被调用");
}
//不属于生命周期的方法,得到一个字符串
@Override
public String getServletInfo() {
return null;
}
//销毁方法:服务器关闭时候执行一次
@Override
public void destroy() {
System.out.println("destroy方法被执行");
}
}
- 问:一个Servlet在Tomcat中会生成几个对象?
一个Servlet类在Tomcat中只会生成一个对象,不同的浏览器是不同的用户,每个用户是一个线程。
- 问:在service方法中输出request和response对象,这两个对象从哪里来的?
这两个对象是tomcat创建,并且通过service方法传递进来,我们可以直接使用这两个对象。
4.2 Servlet的执行过程
-
浏览器发送请求,tomcat接收到请求的地址。通过请求地址找到访问哪个项目,通过最后/hello,找项目中所有的Servlet
-
通过反射读取每个Servlet中的注解值,匹配到/hello,找到了需要访问的servlet。
-
通过反射实例化这个Servlet对象
-
创建request和response对象
-
并且调用service方法,将request和response对象传递进来。
-
执行servlet中的代码
-
将响应的信息封装成response对象返回到浏览器,在浏览器上显示出来。
4.2.2 Servlet继承体系
- Servlet对象由Tomcat通过反射创建
- request与response对象由tomcat创建,并且传递给servlet中service方法。
- request对象封装所有浏览器发送的对象
- response对象封装所有的服务器响应返回给浏览器
- Servlet的实现类
Servlet继承结构:
4.2.3 GenericServlet类的概述
默认实现了Servlet和ServletConfig这两个接口,并且有默认的实现,它的子类是HttpServlet,为了简化HttpServlet编写。如果我们写的Servlet使用的是Http协议,建议继承于HttpServlet。现在所有的浏览器都是使用http协议,所以我们以后都是继承于HttpServelt类就可以了。
- 源代码:
package com.dfbz.servlet;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 通过继承于GenericServlet来写一个Servlet
*/
@WebServlet("/demo4")
public class Demo4Servlet extends GenericServlet {
//只需要重写service方法即可
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
//设置响应的类型:为html,编码:utf-8
response.setContentType("text/html;charset=utf-8");
//得到打印流
PrintWriter out = response.getWriter();
out.print("我是GenericServlet的子类");
}
}
4.2.4 分析HttpServlet的功能
- 查看HttpServlet类的部分源码:
public abstract class HttpServlet extends GenericServlet {
//定义了一些常量
private static final String METHOD_GET = "GET";
private static final String METHOD_POST = "POST";
public HttpServlet() {
}
//自己的doGet方法
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
//自己的doPost方法
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
//自己的service方法
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//得到请求的方法:返回GET或POST
String method = req.getMethod();
//如果是GET请求,调用doGet
if (method.equals("GET")) {
this.doGet(req, resp);
//如果是POST请求,调用POST方法
} else if (method.equals("POST")) {
this.doPost(req, resp);
} else {
//如果所有的都不匹配,发送一个错误
resp.sendError(501, errMsg); //发送一个错误信息
}
}
//Servlet接口中定义的方法
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
HttpServletRequest request; //请求子接口
HttpServletResponse response; //响应子接口
try {
request = (HttpServletRequest)req;
response = (HttpServletResponse)res;
} catch (ClassCastException var6) {
throw new ServletException("non-HTTP request or response");
}
//调用自己的service
this.service(request, response);
}
}
在Servlet规范中,只有有请求达到了Servlet,那么必将执行Servlet的service方法,而在HttpServlet的service方法中做了如下功能:
- 1)对原有的ServletRequest、ServletResponse进行了增强,替换为了HttpServletRequest、HttpServletRequest
- 2)调用了HttpServlet自己的service方法(重载),并且能够根据前端的提交方式不同来选择执行不同的方法
- 如前端提交方式为get,那么则执行doGet方法,如提交方式为post,则执行doPost方法
需要注意的是:如果表单form method=”post”提交使用的是post方法,我们servlet中就要重写doPost方法,除此之外全部使用doGet方法。
我们在前端提交时经常会发现如下提交类型:
Query String Parameters
:当发起一次GET请求时,参数会以url string的形式进行传递。即?
后的字符串则为其请求参数,并以&
作为分隔符。Form Data
:当发起一次POST请求时,若未指定content-type,则默认content-type为application/x-www-form-urlencoded。即参数会以Form Data的形式进行传递,不会显式出现在请求url中。Request Payload
:当发起一次POST请求时,若content-type为application/json,则参数会以Request Payload的形式进行传递(显然的,数据格式为JSON),不会显式出现在请求url中。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/131644.html