当前位置: 首页 > news >正文

2022-8-30 第七小组 学习日记 (day54)JavaWeb、Servlet、HTTP-请求 响应、乱码问题

目录

现在市面上的软件架构:

资源分类

常见的web服务器:

概念:

常见的服务器软件

动态服务器

静态服务器

Tomcat

 里面的文件夹都有什么用:

IDEA整合tomcat-----非常重要;每次创建工程都需要进行整合

Servlet:

servlet是什么?

优势:

任务:

创建Servlet

Servlet的生命周期 

Servlet的配置/注册

web.xml:

 映射的匹配

通过注解来简单写: 

客户端HTTP请求:

读取HTTP头的方法:

服务器HTTP响应:

设置HTTP响应报头的方法:

Serlvet获取表单数据并向客户端回复数据的实例

实例:

乱码问题

如何接收参数

总结


现在市面上的软件架构:

C/S架构:客户端 / 服务器--------QQ,Typora,腾讯会议。
B/S架构:浏览器 / 服务器--------京东,爱奇艺,B站。目前主要学习

资源分类

什么叫资源

1.静态资源:所有用户访问后,得到的结果都是一样的。(HTML,CSS,JS,图片,音频,视频...)

2.动态资源:每个用户访问相同的资源,得到的结果可能不一样。动态资源被访问后,需要先转换为静态资源,再返回给浏览器,通过浏览器来进行解析。

我们要做的是服务端的开发 

常见的web服务器:

概念:

1.服务器:安装了服务器软件的计算机。

2.服务器软件:接收用户的请求,处理请求,给出响应。(接请求,给响应)

3.web服务器软件:接收用户的请求,处理请求,给出响应。

在web服务器软件中,可以部署web项目,让用户通过浏览器访问这些项目。

常见的服务器软件

动态服务器

——webLogic:oracle公司出品,大型的web服务器,几乎支持了所有的JavaEE规范,收费的。

——webSphere:IBM公司,大型的web服务器,几乎支持了所有的JavaEE规范,收费的。

——JBOSS:JBOSS公司,中型的JavaEE服务器,几乎支持了所有的JavaEE规范,收费的。

——Tomcat:Apache基金会,中小型的web服务器,支持了少量的JavaEE规范,开源免费。

静态服务器

Nginx(代理,反向代理,动静分离...)极高的并发

Apache

我们接下来用的就是Tomcat 

Tomcat

下载:直接搜索tomcat就行,他是开源免费的,目前推荐用9之前的版本,也不大,下载之后,解压解压的目录,不能有中文,例如:

 里面的文件夹都有什么用:

——bin:存放一些批处理脚本文件,可执行文件。

——conf:用来存放tomcat的相关配置文件。

——lib:Tomcat依赖的jar包。

——logs:存放日志。

——temp:临时文件目录。

——webapps:Tomcat默认的Web应用部署目录。

——work:Web应用JSP代码生成和遍历的临时目录。

Tomcat的启动:双击 bin/startup.bat文件

                开启之后推荐点击shutdown进行关闭,要不然有可能关不上

Tomcat的停止:双击 bin/shutdown.bat文件

访问:本地的http://127.0.0.1:8080

如果开启后访问成功是以下界面就证明你的tomcat安装成功了.

 那我们怎么进行网页和java交互呢?

IDEA整合tomcat-----非常重要;每次创建工程都需要进行整合

点击链接→IDEA整合Tomcat教程
 

Servlet:

servlet是什么?

javaservelt是运行在web服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

通过使用Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

优势:

——性能更好
——Servlet在Web服务器的地址空间内执行,这样他就没有必要再创建一个单独的进程来处理每           个客户端请求。
——Servlet独立于平台,因为它使用java编写的
——Servlet是可信的,因为服务器上的java安全管理器执行了一系列限制,为了保护服务器计算机         上的资源
——Java类库的全部功能对于Servlet来说都是可用的。它可以通过 sockets 和 RMI 机制与         applets、数据库或其他软件进行交互。

任务:

1.Servlet就是一个普通的java类
2.可用处理发来的请求,给出响应

创建Servlet

我们在开发中一般会使用第三种方法来创建Servlet。

1.实现javax.servlet.Servlet接口

2.继承javax.servlet.GenericServlet类

3.继承javax.servlet.http.HttpServlet类

Servlet的生命周期 

1.初始化后调用init()
2.调用service()来处理请求
3.Servlet销毁前调用destroy()方法
4.最后由JVM的垃圾回收器进行回收

 加载类—>实例化(为对象分配空间)—>初始化(为对象的属性赋值)—>请求处理(服务阶段)—>销毁

Servlet的配置/注册

web.xml:

<?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-name>hello</servlet-name>
        //servlet类地址
        <servlet-class>com.afternoon.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        //给hello做一个映射↑的映射
        <servlet-name>hello</servlet-name>
        //处理什么请求
        <url-pattern>/hello.do</url-pattern>
    </servlet-mapping>
 
 
</web-app>

 映射的匹配

路径匹配:

1.一个Servlet可以指定一个/多个映射路径

<servlet-mapping>
          <servlet-name>hello</servlet-name>
          <url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet-mapping>
          <servlet-name>hello</servlet-name>
          <url-pattern>/hello2</url-pattern>
</servlet-mapping>

2.Servlet多种请求方式:都能访问到login.html  

<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello.do</url-pattern>
    <url-pattern>/login.html</url-pattern>
    <url-pattern>/login/hello.do</url-pattern>
    <url-pattern>/login/add.cation</url-pattern>
</servlet-mapping>

3.Servlet无论输入的内容是什么都可以访问:

<url-pattern>/user/*</url-pattern>

扩展名匹配

<url-pattern>*.do</url-pattern>

如果用路径匹配:必须有/

如果用扩展名匹配:必须不能有/ ,两者无法同时设立

通过注解来简单写: 

在类的顶上添加注解:@WebServlet("/hello.do")

客户端HTTP请求:

当浏览器请求网页的时候,他会向web服务器发送信息,这些信息不能被直接读取,因为这些信息是作为HTTP请求的头的部分传输的。

以下是浏览器端重要头的信息,您可以在web编程中频繁使用:

头信息描述
Accept这个头信息指定浏览器或其他客户端可以处理的 MIME 类型。值 image/png 或 image/jpeg 是最常见的两种可能值。
Accept-Charset这个头信息指定浏览器可以用来显示信息的字符集。例如 ISO-8859-1。
Accept-Encoding这个头信息指定浏览器知道如何处理的编码类型。值 gzip 或 compress 是最常见的两种可能值。
Accept-Language这个头信息指定客户端的首选语言,在这种情况下,Servlet 会产生多种语言的结果。例如,en、en-us、ru 等。
Authorization这个头信息用于客户端在访问受密码保护的网页时识别自己的身份。
Connection这个头信息指示客户端是否可以处理持久 HTTP 连接。持久连接允许客户端或其他浏览器通过单个请求来检索多个文件。值 Keep-Alive 意味着使用了持续连接。
Content-Length这个头信息只适用于 POST 请求,并给出 POST 数据的大小(以字节为单位)。
Cookie这个头信息把之前发送到浏览器的 cookies 返回到服务器。
Host这个头信息指定原始的 URL 中的主机和端口。
If-Modified-Since这个头信息表示只有当页面在指定的日期后已更改时,客户端想要的页面。如果没有新的结果可以使用,服务器会发送一个 304 代码,表示 Not Modified 头信息。
If-Unmodified-Since这个头信息是 If-Modified-Since 的对立面,它指定只有当文档早于指定日期时,操作才会成功。
Referer这个头信息指示所指向的 Web 页的 URL。例如,如果您在网页 1,点击一个链接到网页 2,当浏览器请求网页 2 时,网页 1 的 URL 就会包含在 Referer 头信息中。
User-Agent这个头信息识别发出请求的浏览器或其他客户端,并可以向不同类型的浏览器返回不同的内容。

读取HTTP头的方法:

需要在Servlet程序中通过HttpServletRequest--request(请求)对象来进行相关操作

所有和请求相关的操作,都用这个对象来处理当有请求来的时候,request就被实例化。

序号方法 & 描述
1Cookie[] getCookies()
返回一个数组,包含客户端发送该请求的所有的 Cookie 对象。
2Enumeration getAttributeNames()
返回一个枚举,包含提供给该请求可用的属性名称。
3Enumeration getHeaderNames()
返回一个枚举,包含在该请求中包含的所有的头名。
4Enumeration getParameterNames()
返回一个 String 对象的枚举,包含在该请求中包含的参数的名称。
5HttpSession getSession()
返回与该请求关联的当前 session 会话,或者如果请求没有 session 会话,则创建一个。
6HttpSession getSession(boolean create)
返回与该请求关联的当前 HttpSession,或者如果没有当前会话,且创建是真的,则返回一个新的 session 会话。
7Locale getLocale()
基于 Accept-Language 头,返回客户端接受内容的首选的区域设置。
8Object getAttribute(String name)
以对象形式返回已命名属性的值,如果没有给定名称的属性存在,则返回 null。
9ServletInputStream getInputStream()
使用 ServletInputStream,以二进制数据形式检索请求的主体。
10String getAuthType()
返回用于保护 Servlet 的身份验证方案的名称,例如,"BASIC" 或 "SSL",如果JSP没有受到保护则返回 null。
11String getCharacterEncoding()
返回请求主体中使用的字符编码的名称。
12String getContentType()
返回请求主体的 MIME 类型,如果不知道类型则返回 null。
13String getContextPath()
返回指示请求上下文的请求 URI 部分。
14String getHeader(String name)
以字符串形式返回指定的请求头的值。
15String getMethod()
返回请求的 HTTP 方法的名称,例如,GET、POST 或 PUT。
16String getParameter(String name)
以字符串形式返回请求参数的值,或者如果参数不存在则返回 null。
17String getPathInfo()
当请求发出时,返回与客户端发送的 URL 相关的任何额外的路径信息。
18String getProtocol()
返回请求协议的名称和版本。
19String getQueryString()
返回包含在路径后的请求 URL 中的查询字符串。
20String getRemoteAddr()
返回发送请求的客户端的互联网协议(IP)地址。
21String getRemoteHost()
返回发送请求的客户端的完全限定名称。
22String getRemoteUser()
如果用户已通过身份验证,则返回发出请求的登录用户,或者如果用户未通过身份验证,则返回 null。
23String getRequestURI()
从协议名称直到 HTTP 请求的第一行的查询字符串中,返回该请求的 URL 的一部分。
24String getRequestedSessionId()
返回由客户端指定的 session 会话 ID。
25String getServletPath()
返回调用 JSP 的请求的 URL 的一部分。
26String[] getParameterValues(String name)
返回一个字符串对象的数组,包含所有给定的请求参数的值,如果参数不存在则返回 null。
27boolean isSecure()
返回一个布尔值,指示请求是否使用安全通道,如 HTTPS。
28int getContentLength()
以字节为单位返回请求主体的长度,并提供输入流,或者如果长度未知则返回 -1。
29int getIntHeader(String name)
返回指定的请求头的值为一个 int 值。
30int getServerPort()
返回接收到这个请求的端口号。
31int getParameterMap()
将参数封装成 Map 类型。

服务器HTTP响应:

正如客户端HTTP请求讲的那样,web服务器接收到一个HTTP请求时与之对应会产生一个响应,响应也会包括一些内容等(通常包括:一个状态行、一些响应报头、一个空行和文档。)

以下是Web服务器端返回到浏览器的一些响应报头,您可以在web编程中使用它们:

头信息描述
Allow这个头信息指定服务器支持的请求方法(GET、POST 等)。
Cache-Control这个头信息指定响应文档在何种情况下可以安全地缓存。可能的值有:public、private 或 no-cache 等。Public 意味着文档是可缓存,Private 意味着文档是单个用户私用文档,且只能存储在私有(非共享)缓存中,no-cache 意味着文档不应被缓存。
Connection这个头信息指示浏览器是否使用持久 HTTP 连接。值 close 指示浏览器不使用持久 HTTP 连接,值 keep-alive 意味着使用持久连接。
Content-Disposition这个头信息可以让您请求浏览器要求用户以给定名称的文件把响应保存到磁盘。
Content-Encoding在传输过程中,这个头信息指定页面的编码方式。
Content-Language这个头信息表示文档编写所使用的语言。例如,en、en-us、ru 等。
Content-Length这个头信息指示响应中的字节数。只有当浏览器使用持久(keep-alive)HTTP 连接时才需要这些信息。
Content-Type这个头信息提供了响应文档的 MIME(Multipurpose Internet Mail Extension)类型。
Expires这个头信息指定内容过期的时间,在这之后内容不再被缓存。
Last-Modified这个头信息指示文档的最后修改时间。然后,客户端可以缓存文件,并在以后的请求中通过 If-Modified-Since 请求头信息提供一个日期。
Location这个头信息应被包含在所有的带有状态码的响应中。在 300s 内,这会通知浏览器文档的地址。浏览器会自动重新连接到这个位置,并获取新的文档。
Refresh这个头信息指定浏览器应该如何尽快请求更新的页面。您可以指定页面刷新的秒数。
Retry-After这个头信息可以与 503(Service Unavailable 服务不可用)响应配合使用,这会告诉客户端多久就可以重复它的请求。
Set-Cookie这个头信息指定一个与页面关联的 cookie。

设置HTTP响应报头的方法:

同样的也需要在 Servlet 程序中设置 HTTP 响应报头。这些方法通过HttpServletResponse--response(响应)进行相关操作

所有和响应相关的操作,都用这个对象来处理当有请求来的时候,response就被实例化。

当你想要给出响应时,使用response。我们要给出的响应,必须要展示在客户端(浏览器)

序号方法 & 描述
1String encodeRedirectURL(String url)
为 sendRedirect 方法中使用的指定的 URL 进行编码,或者如果编码不是必需的,则返回 URL 未改变。
2String encodeURL(String url)
对包含 session 会话 ID 的指定 URL 进行编码,或者如果编码不是必需的,则返回 URL 未改变。
3boolean containsHeader(String name)
返回一个布尔值,指示是否已经设置已命名的响应报头。
4boolean isCommitted()
返回一个布尔值,指示响应是否已经提交。
5void addCookie(Cookie cookie)
把指定的 cookie 添加到响应。
6void addDateHeader(String name, long date)
添加一个带有给定的名称和日期值的响应报头。
7void addHeader(String name, String value)
添加一个带有给定的名称和值的响应报头。
8void addIntHeader(String name, int value)
添加一个带有给定的名称和整数值的响应报头。
9void flushBuffer()
强制任何在缓冲区中的内容被写入到客户端。
10void reset()
清除缓冲区中存在的任何数据,包括状态码和头。
11void resetBuffer()
清除响应中基础缓冲区的内容,不清除状态码和头。
12void sendError(int sc)
使用指定的状态码发送错误响应到客户端,并清除缓冲区。
13void sendError(int sc, String msg)
使用指定的状态发送错误响应到客户端。
14void sendRedirect(String location)
使用指定的重定向位置 URL 发送临时重定向响应到客户端。
15void setBufferSize(int size)
为响应主体设置首选的缓冲区大小。
16void setCharacterEncoding(String charset)
设置被发送到客户端的响应的字符编码(MIME 字符集)例如,UTF-8。
17void setContentLength(int len)
设置在 HTTP Servlet 响应中的内容主体的长度,该方法设置 HTTP Content-Length 头。
18void setContentType(String type)
如果响应还未被提交,设置被发送到客户端的响应的内容类型。
19void setDateHeader(String name, long date)
设置一个带有给定的名称和日期值的响应报头。
20void setHeader(String name, String value)
设置一个带有给定的名称和值的响应报头。
21void setIntHeader(String name, int value)
设置一个带有给定的名称和整数值的响应报头。
22void setLocale(Locale loc)
如果响应还未被提交,设置响应的区域。
23void setStatus(int sc)
为该响应设置状态码。

Serlvet获取表单数据并向客户端回复数据的实例

在写实例之前,我们先来介绍一下客户端的传参:

最常见的客户端传参的方式只有两种,一个是GET,一个是POST

浏览器地址栏直接输入:GET请求

超级链接:GET请求

表单:可以是GET,也可以是POST,取决于method

面试题:GET请求和POST请求的区别:

GET:1.请求的参数会在浏览器的地址栏中显示,不安全;请求的长度限制在1k之内。

           2.没有请求体,无法通过request去设置一些参数

POST:1.请求的参数不会在浏览器的地址栏中显示,相对来说安全

              2.把请求的参数封装成几个数据报文(请求体),请求参数长度没有限制。

实例:

找到tomcat下的lib里的servlet-api.jar,放到工程中web下的WEB-INF下,并右键点击add library添加,要不然没有HttpServlet类

通过继承HttpServlet重写doGet/doPost方法来获取请求等一系列操作

@WebServlet("/login.do")
public class Demo05Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //操作
    }
 
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //操作
    }
}

乱码问题

我们在idea中获取浏览器中的数据或者向浏览器发送内容会存在乱码的问题,为了解决这个问题,需要在doGet方法中添加:

//设置响应的字符集,一定要放在获取流之前,服务器处理字符串按照UTF-8处理
resp.setCharacterEncoding("utf-8");
//添加响应头,告诉浏览器以HTML的格式来解析响应字符串
resp.addHeader("content-type","text/html;charset=utf-8");
//在控制台中不乱码:
req.setCharacterEncoding("utf-8");

如何接收参数

//接收参数,处理请求
//例如:前台传过来的参数是:username:admin password:123456
String username=req.getParameter("username");
String password=req.getParameter("password");
resp.setCharacterEncoding("utf-8");
//添加响应头,告诉浏览器以HTML的格式来解析响应字符串
resp.addHeader("content-type","text/html;charset=utf-8");
PrintWriter out = resp.getWriter();、
//写在浏览器中
out.write("我已经获取到了");
//关流
out.flush();
out.close();

因为我们是流的操作,所以记得关流

总结

         JavaWeb是将前后链接起来的技术,将我们之前所学的前端HTML知识和后端servlet知识进行连接操作,学习的内容更接近生活实际

相关文章:

  • U9二次开发之BE插件开发
  • 推荐系统-Hive基础
  • 通信原理 | 基本概念:信源、信道、噪声、信宿等
  • 关于Flask高级_RequestParser中的add_argument方法参数详解
  • flume系列之:基于zookeeper部署flume agent升级guava和curator版本
  • 触摸控件——滑动调节
  • NetApp与VMware和AWS合作,帮助客户实现云端企业工作负载的现代化和扩展
  • 快来了解一下5个超实用的WPS表格操作技巧!
  • 触摸控件——增量调节
  • msf后渗透之文件交互指令、上传下载文件、屏幕截图、键盘记录、创建账户、音频录像和提权(上)
  • C++11异步操作future和aysnc 、function和bind
  • Linux下NFS共享存储安装详细步骤
  • 捷报 | 美格智能Cat.1模组SLM332中标中国电信定制版Cat.1模组产品招募
  • Vue3 从入门到放弃 (第四篇.Props使用)
  • 有趣的java面试题-基础篇(一)
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 2018一半小结一波
  • DOM的那些事
  • Git同步原始仓库到Fork仓库中
  • Javascript基础之Array数组API
  • Java编程基础24——递归练习
  • JAVA并发编程--1.基础概念
  • js学习笔记
  • k8s如何管理Pod
  • Kibana配置logstash,报表一体化
  • Laravel 实践之路: 数据库迁移与数据填充
  • leetcode讲解--894. All Possible Full Binary Trees
  • redis学习笔记(三):列表、集合、有序集合
  • Terraform入门 - 3. 变更基础设施
  • 阿里云前端周刊 - 第 26 期
  • 观察者模式实现非直接耦合
  • 猴子数据域名防封接口降低小说被封的风险
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 今年的LC3大会没了?
  • 力扣(LeetCode)22
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 找一份好的前端工作,起点很重要
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 从如何停掉 Promise 链说起
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • # Java NIO(一)FileChannel
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #1014 : Trie树
  • $.each()与$(selector).each()
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (三) diretfbrc详解
  • (四)模仿学习-完成后台管理页面查询
  • (循环依赖问题)学习spring的第九天
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)