目录
  1. 1. javaWeb的概念
    1. 1.1. 请求
    2. 1.2. 响应
  2. 2. web资源的分类
  3. 3. 常用的web服务器
  4. 4. tomcat安装及使用
    1. 4.1. 目录介绍
    2. 4.2. tomcat服务器启动
    3. 4.3. 修改tomcat 的端口号
    4. 4.4. 如何把web工程部署到tomcat服务器上
    5. 4.5. 手拖html页面到浏览器和通过ip访问的区别
    6. 4.6. root工程的访问
    7. 4.7. idea整合tomcat
  5. 5. Servlet
    1. 5.1. 什么是servlet
    2. 5.2. 手动实现Servlet程序
    3. 5.3. servlet访问原理
    4. 5.4. servlet生命周期
    5. 5.5. 请求的分发处理
    6. 5.6. 继承HttpServlet实现servlet程序
    7. 5.7. servlet类的继承体系
    8. 5.8. ServletConfig类
    9. 5.9. ServletContext类
    10. 5.10. HTTP协议
      1. 5.10.1. 请求
      2. 5.10.2. 响应
    11. 5.11. HttpServletRequest类
      1. 5.11.1. 这个类的常用方法
      2. 5.11.2. 获取客户端发送的请求参数
      3. 5.11.3. 请求转发
      4. 5.11.4. Base标签的作用
      5. 5.11.5. Web中的相对路径和绝对路径
      6. 5.11.6. Web中 / 斜杠的不同意义
    12. 5.12. HttpServletResponse类
      1. 5.12.1. 两个输出流的说明
      2. 5.12.2. 如何往客户端回传数据(字符流)
      3. 5.12.3. 请求重定向
  6. 6. JSP
JavaWeb

javaWeb的概念

javaWeb是指通过java 语言编写可以通过浏览器访问的程序的总称,叫javaWeb

请求

请求(Request)是指客户端给服务器发送数据

响应

响应(Response)是指服务器给客户端回传数据

请求和响应是成对出现的,有请求就有响应。

web资源的分类

web资源按实现的技术和呈现的效果的不同,又分为静态资源和动态资源两种。

静态资源:html、css、js、txt、mp4视频、jpg图片
动态资源:jsp页面、servlet程序

常用的web服务器

Tomcat:由Apache组织提供的一种web服务器。提供对jsp和servlet的支持。
Jboss:是一个遵从javaEE规范的、开放源代码的、纯java的EJB服务器

tomcat安装及使用

下载网址:https://tomcat.apache.org/

目录介绍

  • bin:专门用来存放tomcat服务器的可执行程序
  • conf:用来存放comcat服务器的配置文件
  • lib:存放tomcat服务器的jar包
  • logs:存放服务器运行时输出的日记信息

tomcat服务器启动

找到tomcat目录下的bin目录下的startup.bat文件,双击就可以了

启动失败时,可以使用vscode打开startup.bat,然后在末尾输入pause,然后再点击startup.bat启动,在cmd里查看它的报错原因

停止tomcat
把窗口关闭,tomcat就关闭了

修改tomcat 的端口号

找到conf里面的server.xml 的Connector port=”xxxx”

如何把web工程部署到tomcat服务器上

第一种方法:只需要把web工程的目录拷贝到tomcat的webapps目录下即可。

第二种方法:在tomcat下\conf\Catalina\localhost文件夹,创建一个xml文档。

1
2
3
4
5
<!-- Context 表示一个工程上下文
path表示工程的访问路径
docBase表示工程目录
-->
<Context path = "/test" docBase = ""/>

手拖html页面到浏览器和通过ip访问的区别

手拖html到浏览器,是使用的file:// 协议,告诉浏览器读取file协议后面的路径,解析展示到浏览器上

通过http://localhost:8080/工程名/资源名 所使用的协议是http协议。

root工程的访问

当我们在浏览器中输入访问地址http://ip:port/ –>没有工程名时,默认访问的是root工程。

idea整合tomcat

WEB-INF 目录是一个受服务器保护的目录,浏览器无法直接访问到此目录的内容。web.xml是整个动态web工程的配置部署描述文件可以在这些配置很多web工程的组件,比如:Servlet程序、Filter过滤器、Listener监听器、Session超时等。

Servlet

什么是servlet

  • servlet是javaEE的规范(接口)之一
  • 是javaWeb三大组件之一
  • 是一个运行在Web服务器上的java小程序,它可以接受和响应客户端的请求,通常是通过HTTP协议来传输数据

手动实现Servlet程序

  • 编写一个类去==实现==Servlet接口

  • 实现service方法,处理请求,并响应数据

  • 到web.xml中去配置servlet程序的访问地址

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <?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标签给Tomcat配置servlet程序-->
    <servlet>

    <!-- servlet-name 标签,给servlet程序起一个别名,一般是类名-->
    <servlet-name>helloServlet</servlet-name>
    <servlet-class>com.xinyu.servlet.helloServlet</servlet-class>
    </servlet>


    <!-- mapping 标签,给servlet程序配置访问地址-->
    <servlet-mapping>

    <!-- servlet-name 标签的作用是告诉服务器,我当前配置的地址给哪个servlet程序使用 -->
    <servlet-name>helloServlet</servlet-name>

    <!--
    url-pattern 标签配置访问地址
    下面 hello前的斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径
    /hello 表示 http://ip:port/工程路径/hello
    -->
    <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    </web-app>

    servlet访问原理

    浏览器通过/hello这个资源路径,找到对应的url-pattern,就可以找到对应的servlet名,然后找到servlet程序。

servlet生命周期

  • 执行servlet构造器方法
  • 执行init初始化方法
    前面两步是第一次访问,创建servlet程序时会调用
  • 执行service方法
    每次访问的时候都会调用(刷新一次,调用一次)
  • 执行destroy方法

请求的分发处理

网页请求中一般会有两种请求;Get请求和Post请求。对于不同的请求,需要service来判断,然后执行不同的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest;
String method = httpServletRequest.getMethod();
if(method.equals("GET")){
doGet();
}
else if (method.equals("POST")){
doPost();
}

}
private void doGet(){
System.out.println("get请求");
}
private void doPost(){
System.out.println("post请求");
}

继承HttpServlet实现servlet程序

一般项目开发中,都是==继承(extends)==servlet 的子类-HttpServlet来实现servlet程序。

1
2
3
4
5
6
7
8
9
10
11
public class helloServlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("h2 的doGet方法");
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("h2 的doPost方法");
}
}

servlet类的继承体系

GenericServlet类实现了Servlet接口,做了很多空实现。并持有一个ServletConfig类的引用,对ServletConfig的使用做了一些方法。

HttpServlet抽取类实现了service()方法并实现了请求的分发处理

我们只需要根据自己的业务需求,重写doGet或者doPost方法即可

ServletConfig类

Servlet程序的配置信息类
三大作用:

  • 可以获取servlet程序的别名 servlet-name 的值
    即web.xml中配置的name值
  • 获取初始化参数 init-param
  • 获取ServletContext对象

一般在初始化时,打印这些信息

Servlet程序和ServletConfig对象都是由Tomcat负责创建,我们负责使用。
Servlet程序默认是第一次访问的时候创建,每一个Servlet程序创建时,就创建一个对应的ServletConfig对象。
重写init方法之后,一定要调用super.init(config)

ServletContext类

servletContext是一个接口,它表示Serclet上下文对象。

一个Web工程,只有一个ServletContext对象实例.它在web工程部署启动的时候创建。在web工程停止的时候销毁。

它是一个域对象-可以像Map一样存取数据的对象
这里的域指的是存取数据的操作范围

存数据 取数据 删除数据
Map put() get() remove()
域对象 setAttribute() getAttribute() removeAttribute()

四个常见作用

  • 获取web.xml中配置的上下文参数context-param-它属于整个web工程
    ServletContext context = getServletConfig().getServletContext();
    String xxx = context.getInitParameter("xxx");
  • 获取当前的工程路径,格式:/工程路径
    context.getContextPath()
  • 获取工程部署后在服务器硬盘上的绝对路径
    context.getRealPath("/")
  • 像Map一样获取数据

HTTP协议

客户端和服务器之间通信时,发送的数据,需要遵守的规则,交HTTP协议,HTTP中的数据,又叫报文

客户端给服务器发送数据叫请求,服务器给客户端回传数据叫响应。

请求

请求分为两种

  • GET请求

    • 请求行
      1、请求的方式 GET
      2、请求的资源路径(+?+请求参数)
      3、请求的协议的版本号 HTTP/1.1
    • 请求头
      key:value 组成,不同的键值对,表示不同的含义
      1、Accept:告诉服务器,客户端可以接受的数据类型
      2、User-Agent:就是浏览器的信息
      3、Host:表示请求的服务器ip和端口号
  • POST请求

    • 请求行
      1、请求的方式 POST
      2、请求的资源路径(+?+请求参数)
      3、请求的协议的版本号 HTTP/1.1

    • 请求头
      key:value 组成,不同的键值对,表示不同的含义
      空行

    • 请求体—->发送给服务器的数据
      1、Referer:表示请求发起时,浏览器地址栏中的地址(从哪来)
      2、Content-Type:表示发送的数据的类型

      • application/x-www-form-urlencoded
        表示提交的数据格式是:name=value&name=vlaue,然后进行url编码-把非英文内容转码为%xx%xx
      • multipart/form-data
        表示以多段的形式提交数据给服务器(以流的形式提交,用于上传)

区分GET请求和POST请求
GET

  • form标签 method = get
  • a标签
  • link标签引入css
  • script标签引入js文件
  • img标签引入图片
  • iframe引入html页面
  • 在浏览器地址中输入地址回车

POST

  • form标签 method = post

响应

1、响应行

  • 响应的协议和版本号
  • 响应状态码
  • 响应状态描述符

2、响应头

  • key:value 不同的响应头,有所不同
    Server:表示服务器的信息
    Content-Type:表示响应体的数据类型
    Content-Length:响应体的长度
    Date:请求响应的时间(这是格林时间)
  • 空行

3、响应体 ——>回传给客户端的数据

4、常见的响应码

  • 200:表示请求成功
  • 302:请求重定向
  • 404:表示请求服务器收到了,但是你要的数据不存在(请求地址错误)
  • 500:表示服务器已经收到请求,但是服务器内部错误

5、MIME
它是HTTP协议中的数据类型,全称是Multipurpose Internet Mail Extensions 多功能Internet邮件扩充服务。MIME类型的格式是大类型/小类型,并与某一种文件的扩展名相对应。

HttpServletRequest类

每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议解析封装到Request对象中,然后传递到service方法中给我们使用。我们可以通过HttpServletRequest对象,获取到所有请求的信息。

这个类的常用方法

1、getRequestURI() 获取请求的资源路径

2、getRequestURL() 获取请求的统一资源定位符

3、getRemoteHost() 获取客服端的ip地址

4、getHeader() 获取请求头

5、getParameter() 获取请求的参数

6、getParameterValues() 多个参数时使用

7、getMethod() 获取请求的方式

8、setAttribute(key,value) 设置域数据

9、getAttribute(key) 获取域数据

10、getRequestDispatcher() 获取请求转发对象

获取客户端发送的请求参数

用户从网页上输入的账号和密码的获取方式

1
2
3
4
5
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
}

对于网页请求的字符集处理

1
2
//这使得输入中文字符,也能传到服务器进行处理
req.setCharacterEncoding("utf-8");

请求转发

指服务器收到请求后,从一个资源跳到另一个资源得操作叫做请求转发。也就是可以从servlet1跳转到servlet2进行进一步的处理。servlet1和servlet2共同完成一个完整的业务功能。

请求转发的特点:

  • 浏览器的地址栏没有变化
  • 他们是一次请求
  • 它们共享Request域中的数据
  • 可以转发到WEB-INF目录下(访问这个目录下的资源)

Base标签的作用

使得servlet跳转到此页,想返回到主页的时候,把这一页作为基地址来跳转。

1
2
3
4
5
6
7
8
9
10
11
12
//注意这里的a前面不能加/ 斜杠。应为它会被解析为http://ip:port 
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
这是web下的index首页
<a href="a/c.html">跳转到c</a>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//主页跳转到的c网页。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- 用于给servlet服务跳转到主页时,确定这个页面的地址-->
<base href="http://localhost:8080/learn01/a/c.html"/>
</head>
<body>
这是a下面的c页面
<a href="../index.html">跳回首页</a>
</body>
</html>

使用html超链接跳转和servlet请求转发跳转,去的网页地址是不一样的。
超链接跳转。访问到的是c的源地址

servlet转发地址是servlet的地址

但是,跳回首页的命令只有一个,这里若是不同的基地址,则servlet这里不能返回首页,所以需要规定它的base。这样,就会先根据base地址来跳转。

Web中的相对路径和绝对路径

相对路径

. 表示当前目录

.. 表示上一级目录

资源名 表示当前路径/资源名

绝对路径

http://ip:port/工程路径/资源路径

Web中 / 斜杠的不同意义

在web中,/ 斜杠是一种绝对路径

也就是说,在html或者jsp文件中,/ 斜杠如果被浏览器解析,得到的地址是http:ip:port/

在服务器中,/ 被解析为http:ip:port/项目名 。特殊情况 response.sendRediect(“/“) 把斜杠发送给浏览器解析。为http:ip:port/

HttpServletResponse类

和HttpServletRequest类一样,每次请求进来,Tomcat服务器,都会创建一个Response对象传递给servlet程序去使用。HttpServletResponse表示响应的信息。我们如果需要设置返回给客户端的信息,都可以通过HttpServletResponse对象来进行设置。

两个输出流的说明

  • 字节流:getOutStream() 常用于下载(传递二进制数据)
  • 字符流 :getWriter() 常用于回传字符串

两个流只能使用一个。使用了字节流,就不能使用字符流。

如何往客户端回传数据(字符流)

传给客户端数据,就是使用getWriter() 拿到PrintWriter对象。然后println() 就可以了。但是需要注意,传入的字符集和浏览器使用的字符集需要一样。而且这个字符集需要支持中文,才能正确打印中文。

1
2
3
4
5
6
7
8
9
10
11
12
13
public class ResponseIOservlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 回传的中文乱码,需要设置字符集
resp.setCharacterEncoding("utf-8");

// 设置浏览器使用utf-8
resp.setHeader("Content-type","text/html;charset=UTF-8");

PrintWriter writer = resp.getWriter();
writer.println("你好");
}
}

请求重定向

请求重定向:指客户端给服务器发请求,然后服务器告诉客户端说,我给你一些地址,你去新地址访问。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class response1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("到此一游 response1");

// 设置状态码为302 这表示这个网页没有使用了。会跳转到另外一个网页
resp.setStatus(302);

// 设置跳转到的地址
resp.setHeader("Location","http://localhost:8080/learn01/response2");
}
}
public class response2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

resp.containsHeader("text/html;charset=UTF-8");
resp.getWriter().write("response2's result");
}
}

特点:

  • 浏览器的地址栏会发生变化
  • 会有两次请求
  • 不共享Request域中的数据
  • 不能跳转到WEB-INF目录下
  • 可以访问项目外的地址。例如,可以跳转到goole、百度等:www.google.com

区分一下它与请求转发的区别

另外一种实现方法(推荐使用):

1
resp.sendRedirect("http://localhost:8080/项目名称/...")

JSP

jsp的全称是java serverpages。java 的服务器页面

jsp 的主要作用是代替servlet程序回传html页面的数据.因为servlet程序回传html页面数据是一件非常繁琐的事情。它的本质其实是是个==servlet程序==。

当我们第一次访问jsp页面的时候,Tomcat服务器会帮我们把jsp页面翻译为一个java源文件。并对它进行编译为.class字节码程序。我们打开java源文件不难发现里面的内容是:

文章作者: Dr-xinyu
文章链接: https://dr-xinyu.github.io/2020/11/13/javaWeb/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 心雨
打赏
  • 微信
  • 支付寶