狂神说 javaweb

时间:2022-12-14 11:37:08

javaweb

1、基本概念

web开发:

  • web
  • 静态web
  • 动态web
  • 淘宝,
  • 不断变化
  • 技术栈:Servlet/JSP ASP PHP

1.2、web应用程序

web应用程序:可以提供浏览器访问的程序


  • 能访问的任何页面都存在于世界的某个角落
  • URL
  • 这些同意的web资源会被放到同一个文件夹 Tomcat
  • 一个web 组成
  • html css js
  • jsp servlet
  • java程序
  • jar包
  • 配置文件(Properties)

外部访问需要服务器统一管理

1.3、静态web

2、web服务器

ASP:

  • 微软:
  • HTML中嵌入VB脚本

PHP

  • PHP开发速度快,功能强大,跨平台,代码简单
  • 无法承载大访问量的情况

JSP/Servlet

B/S

C/S

  • sun公司主推的B/S
  • 基于Java
  • 承载三高带来的影响
  • 语法像ASP

2.2、web服务器

一种被动的操作 处理用户强求和信息

IIS

微软的 ASP window自带

Tomcat

百度百科

手写Tomcat

3、Tomcat

狂神说 javaweb

启动关闭

狂神说 javaweb

Tomcat:8080

mysql:3306

hTTP:80

HTTPS:443

可以配置主机的名称

  • 默认主机名为:
  • 默认网站

高难度面试题

请你谈谈网站是如何进行访问的!

  1. 输入域名,回车
  2. 检查本机C:\Windows\System32\deivews\ect\hosts配置文件下有没有这个映射
  1. 有:直接返回对应的IP地址,在这个地址中,有我们需要访问的web程序 直接访问
127.0.0.1   www.mink.com
  1. 没有:去DNS服务器上找,找到的话就返回,找不到返回找不到

狂神说 javaweb

3.4、发布一个web网站

先模仿

  • 将自己写的网站,放到Tomcat的webapps(应用的文件夹)下

网站应该有的结构

--webapps:Tomcat服务器的web目录
-ROOT
-kuangstudy:网站的目录名
-WEB-INF
-calsses:Java程序
-lib.xml :网站配置文件
-index.html 默认的首页
-static
-css
-style.css
-js
-img
-.......

4、HTTP

4.1、什么是HTTP

HTTP 简单的请求响应协议,通常运行在TCP之上

  • 文本
  • 超文本

https:安全的

  • 443

4.2、两个时代

  • http1.0
  • HTTP/1.0 :客户端与服务器连接后,只能获得一个web资源,断开连接
  • http2.0
  • HTTP/1.1:客户端与服务器连接后,能获得多个web资源

4.3、HTTP请求

  • 客户端--发请求(request)--服务器

百度:

Request URL: https://www.baidu.com/  请求地址
Request Method: GET 请求方式/POST
Status Code: 200 OK 状态码:200
Remote(远程) Address: 110.242.68.3:443
Referrer Policy: strict-origin-when-cross-origin
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Connection: keep-alive
Cookie: PSTM=1642766731; BAIDUID=FF1EA490E8F8F1CE6C7FA5385721FEFE:FG=1; BD_UPN=12314753; BIDUPSID=09E509314F3EB3812F3612BCD6996E78; __yjs_duid=1_87aeb27da8e0a5310018c003dc9c8a141642819771266; BDSFRCVID_BFESS=vM4OJexroG0RE6oHNZuLhC45X-mPxN5TDYLEOwXPsp3LGJLVgaSTEG0PtfppquI-2ZlgogKKBeOTHn0F_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF_BFESS=JJkO_D_atKvDqTrP-trf5DCShUFsKnolB2Q-XPoO3KJCsDQvyMTEbfAJLN8tXIrLLTbw_xbgylRp8P3y0bb2DUA1y4vpK-ogQgTxoUJ25tJ2qt5Vqj5Ah--ebPRi3tQ9QgbXopQ7tt5W8ncFbT7l5hKpbt-q0x-jLTnhVn0MBCK0MC09j6KhDTPVKgTa54cbb4o2WbCQQ-Jd8pcN2b5oQT8wQHjyBU605G635K-ayT6VV-n8jqOUWfAkXpJvQnJjt2JxaqRC5bj6Sh5jDh3MbR8QKqoAe6jzaIvy0hvc0J5cShnkDMjrDRLbXU6BK5vPbNcZ0l8K3l02V-bIe-t2XjQhjGtOtjDttb32WnTJ25rHDbTw5tI_-P4DeUTWBxRZ56bHWh0MLqK-Dpn8MtoBMMJ3jJAL2lOOBJTnKUT1366OMCblK-RGQj-d3xJKQh343bRTLnQM-PjhOjC4W4vJhP-UyP5-Wh37aJRlMKoaMp78jR093JO4y4Ldj4oxJpOJ5JbMopCafDDbbD0xj6LBePtjMfbWetoQ265tWjrJabC3EfTJXU6qLT5X5tn8bxQqWgo0aPcS0K-hoKoOjTOTyl0njxQyWt7EtTRlanvy2DQGDbOCjMonDh8n3H7MJUntKHcAoj6O5hvvER5O3M7_DMKmDloOW-TB5bbPLUQF5l8-sq0x0bOte-bQXH_Etj-OJJutoKvt-5rDHJTg5DTjhPrM54FJWMT-MTryKKJ43CQoOhrL5fvsLT30W2cLQnvwJGnRhlRNB-3iV-OxDUvnyxAZbUQgLUQxtNRJ0tJM-45zKDoLh-JobUPULxo9LUvXtgcdot5yBbc8eIna5hjkbfJBQttjQn3hfIkj2CKLK-oj-DK6DTu53q; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BAIDUID_BFESS=FF1EA490E8F8F1CE6C7FA5385721FEFE:FG=1; BD_HOME=1; H_PS_PSSID=35839_35104_31254_34584_35491_35872_35541_35796_35315_26350_35743; BA_HECTOR=018h01808lala5855p1h0m9ok0q
Host: www.baidu.com
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="98", "Google Chrome";v="98"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36
1、请求行
  • 请求行中的请求方式:GET
  • 请求方式:GETPOST,HEAD,DELETE,PUT,TRACT...
  • get:请求能够携带的参数比较少,大小有限制,会在浏览器的URL显示内容,不安全,但高效
  • post:相反
2、消息头
Accept:告诉浏览器,他所支持的数据类型
Cache-Control:缓存控制
Connection:告诉浏览器断开还是连接

4.4、HTTP响应

  • 服务器--响应--客户端

百度

Bdqid: 0xe82971940005867b  缓存控制
Connection: keep-alive 连接:保持连接
Content-Encoding: gzip 编码
Content-Type: text/html;charset=utf-8 类型
1.响应体
Accept:告诉浏览器,它所支持的数据类型
Accept-Encoding:支持哪种编码格式 GBK UTF-8 GB2312 IS08859-1
Accept-Language:告诉浏览器,它的语言环境
Cache-Control:缓存控制
Connection:告诉浏览器,请求完成是断开还是保持连接
HOST: 主机..../.
Refresh:告诉客户端,多久刷新1次;
Location:让网页重新定位;
2、响应状态码(重点)

200:成功 200

3**:请求重定向

  • 重定向:重新到新位置去302

4**:找不到资源404

  • 资源不存在

5**:服务器代码错误 500 502:网关错误

常见面试:

当你的浏览器中地址栏输入地址并回车的一瞬间到页面展示出来,经历了什么

5、Maven

我为什么要学习这个技术?
  1. 在Javaweb中需要导入大量jar包,需要手动导入
  2. 如何能让一个东西自动帮我导入和配置jar包
    所以有了maven

5.1、Maven项目架构管理工具

就是方便导入jar包的

Maven的核心思想:约定大于配置

  • 有约束,不要去违反

Maven会规定好应该如何写Java

5.2、下载安装Maven

官网

狂神说 javaweb

下载完解压即可:

狂神建议:电脑上的所有环境都放在哟个文件夹下

5.3、环境变量配置

在我们的系统环境变量配置中配置如下配置:

  • M2_HOME maven目录下的bin目录
  • MAVEN_HOME maven的目录
  • 在系统的path中配置%MAVEN_HOME%\bin

狂神说 javaweb

5.4、阿里云镜像

  • 镜像:mirrors
  • 作用加速
  • 在setttins.xml文件中找到<mirrors></mirrors>标签对,进行修改:
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>

5.5、本地仓库

在本地的仓库,远程仓库;

建立一个本地仓库:

<localRepository>D:\Java_IDE\apache-maven-3.8.4\maven-repo</localRepository>

5.6、在IDEA中使用Maven

  1. 启动idea‘
  2. 创建一个Maven项目

狂神说 javaweb

狂神说 javaweb

狂神说 javaweb

狂神说 javaweb

狂神说 javaweb

  1. 等待初始化完毕

狂神说 javaweb

  1. 观察仓库的变化,多了什么东西?
  2. IDEA中的maven设置
  3. 注意更改默认位置

狂神说 javaweb

狂神说 javaweb

  1. over

5.7、创建一个普通的maven项目

狂神说 javaweb

这个只有在web下才有

狂神说 javaweb

5.8、在idea中标记

狂神说 javaweb

狂神说 javaweb

配置Tomcat

狂神说 javaweb

狂神说 javaweb

解决警告问题
为什么会有这个问题:我们访问一一个网站,需要指定一个文件夹名字;****

狂神说 javaweb


5.10、POM文件

狂神说 javaweb


maven由于约定大于配置,我们之后的可能遇到我们写的配置文件无法导出

<!--在build中配置resources,来防止我们资源导出失败的问题-->
<build>

<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*.properties</exclude>
<exclude>**/*.xml</exclude>
</excludes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>

5.12、IDEA操作

目录树

5.13、解决遇到的问题

  1. Maven 3.6.2
  1. 解决方法:退
  1. Tomcat闪退
  2. Idea中每次都要重复配置Maven
  1. 在IDEA的全局默认配置去配
  1. Maven项目中Tomcat中不能配置
  2. .乱码:
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
  1. .
Maven仓库的使用

官网:​​https://mvnrepository.com/​


6、什么是servlet

6.1、servlet简介

  • sun开发动态web的一门技术
  • sun在这些api中提供了一个接口叫servlet,开发的两个步骤
  • 编写一个类,实现servlet接口
  • 把开发好的java类部署到web服务器中

把实现了servlet接口的Java程序叫做 servlet

6.2、HelloServlet

servlet接口在sun公司有两个默认的的实现类:

HttpServlet,GenericServlet

  1. 构建一个普通的maven项目,删掉里面的里面的scr目录,以后就在这里面建立model,这个空的工程就是文件的主工程
  2. 关于maven父子工程的理解:
  1. 父项目中会有
<modules>
<module>servlet-01</module>
</modules>
  1. 子项目中会有
没了
<parent>
<artifactId>javaweb-02-servlet</artifactId>
<groupId>com.mink</groupId>
<version>1.0-SNAPSHOT</version>
</parent>

继承差不多

Maven环境优化
  1. 修改web.xml为最新 (与tomcat匹配)
<?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_3_1.xsd"
version="3.1">


</web-app>
  1. 将整个maven的架构搭建完整
编写一个servlet程序
  1. 编写一个普通类
  2. 实现servlet接口,这里我们直接继承HttpServlet
public class HelloServlet extends HttpServlet {
//由于get或者post知识请求的实现的不同方式,可以相互调用

public HelloServlet() {
}

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.println("你好,mink");
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
  1. 编写servlet的映射
  1. 为何什么要映射?我写的是Java,但是要通过浏览器访问,浏览器需要连接web服务器,所以我们需要在web服务器中注册我写的servlet,还需要给他一个浏览器访问的路径
<!--    注册servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.mink.servlet.HelloServlet</servlet-class>
</servlet>
<!-- servlet请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
  1. 配置tomcat
  2. 启动测试 ok

6.3、servlet原理

servlet是由web服务器调用,web服务器在收到浏览器请求之后会:

狂神说 javaweb


6.4、mapping问题

  1. 一个servlet可以指定一个映射路径
  2. 一个servlet可以指定多个映射路径
<!--    注册servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.mink.servlet.HelloServlet</servlet-class>
</servlet>
<!-- servlet请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/3</url-pattern>
</servlet-mapping>
  1. 一个servlet可以指定通用映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
  1. 请求默认路径
<!--默认请求路径    下面这个能把首页干掉-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
  1. 指定后缀或前缀等
<!--默认请求路径    下面这个能把首页干掉-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
  1. 优先级问题
    指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求;
<servlet>
<servlet-name>error</servlet-name>
<servlet-class>com.mink.servlet.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>error</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>

狂神说 javaweb

6.5、ServletContext

web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象, 它代表了当前
的web应用;

狂神说 javaweb

1、共享数据
  • 在这个servlet保存的数据可以在另一个拿到
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//this. getInitParameter() 初始化参数
//this. getServletConfig() Servlet配置
//this. getServLetContext() Servlet上下文
ServletContext context = this.getServletContext();
String name="韩明";
context.setAttribute("name",name);//将一个数据保存在context中
resp.getWriter().print("hello");

System.out.println("hello");
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
ServletContext context = this.getServletContext();
String name = (String) context.getAttribute("name");
resp.getWriter().print(("名字"+name));

}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<?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_3_1.xsd"
version="3.1">


<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.mink.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getc</servlet-name>
<servlet-class>com.mink.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getc</servlet-name>
<url-pattern>/getc</url-pattern>
</servlet-mapping>

</web-app>
2、获取初始化参数
<!--  设置一些web应用初始化参数-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql//localhost:3306/mybatis</param-value>
</context-param>
public class ServletDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
resp.getWriter().print(url);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
3、请求转发
public class ServletDemo04 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
System.out.println("进去了04");
ServletContext context = this.getServletContext();
context.getRequestDispatcher("/gp").forward(req,resp);
// RequestDispatcher gp = context.getRequestDispatcher("gp");
// gp.forward(req,resp);

}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<servlet>
<servlet-name>sd3</servlet-name>
<servlet-class>com.mink.servlet.ServletDemo03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sd3</servlet-name>
<url-pattern>/gp</url-pattern>
</servlet-mapping>

<servlet>
<servlet-name>sd4</servlet-name>
<servlet-class>com.mink.servlet.ServletDemo04</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sd4</servlet-name>
<url-pattern>/sd4</url-pattern>
</servlet-mapping>

狂神说 javaweb

4、读取资源文件

Properties

  • 在java目录下新建properties
  • 在resources下新建properties

两个都被打包到理同意路径下:classes,我们俗称这个路径为classpath

思路:需要一个文件流

public class ServletDemo05 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");

InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties prop = new Properties();
prop.load(is);
String uname = prop.getProperty("username");
String pwd = prop.getProperty("password");
resp.getWriter().print(uname+":"+pwd);


}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}

访问测试即可ok!!!

6.6、HttpResponse

web服务器接收到客户端的http请求,针对这个请求分别创建一个代表请求的request对象,代表响应的一个HttpServletResponse;

  • 我们如果要获取客户端亲求过来的参数,找
  • 如果IP要给客户端响应一些信息:找HttpServletResponse
1、简单分类

负责向浏览器发送数据的方法

ServletOutputStream getOutputStream() throws IOException;

PrintWriter getWriter() throws IOException;

负责向浏览器发送一些响应头的信息

//interface ServletResponse
void setCharacterEncoding(String var1);

void setContentLength(int var1);

void setContentType(String var1);

void setBufferSize(int var1);
//interface HttpServletResponse
void setIntHeader(String var1, int var2);

void addIntHeader(String var1, int var2);

void setStatus(int var1);

http状态码

public interface HttpServletResponse extends ServletResponse {
int SC_CONTINUE = 100;
int SC_SWITCHING_PROTOCOLS = 101;
int SC_OK = 200;
int SC_CREATED = 201;
int SC_ACCEPTED = 202;
int SC_NON_AUTHORITATIVE_INFORMATION = 203;
int SC_NO_CONTENT = 204;
int SC_RESET_CONTENT = 205;
int SC_PARTIAL_CONTENT = 206;
int SC_MULTIPLE_CHOICES = 300;
int SC_MOVED_PERMANENTLY = 301;
int SC_MOVED_TEMPORARILY = 302;
int SC_FOUND = 302;
int SC_SEE_OTHER = 303;
int SC_NOT_MODIFIED = 304;
int SC_USE_PROXY = 305;
int SC_TEMPORARY_REDIRECT = 307;
int SC_BAD_REQUEST = 400;
int SC_UNAUTHORIZED = 401;
int SC_PAYMENT_REQUIRED = 402;
int SC_FORBIDDEN = 403;
int SC_NOT_FOUND = 404;
int SC_METHOD_NOT_ALLOWED = 405;
int SC_NOT_ACCEPTABLE = 406;
int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
int SC_REQUEST_TIMEOUT = 408;
int SC_CONFLICT = 409;
int SC_GONE = 410;
int SC_LENGTH_REQUIRED = 411;
int SC_PRECONDITION_FAILED = 412;
int SC_REQUEST_ENTITY_TOO_LARGE = 413;
int SC_REQUEST_URI_TOO_LONG = 414;
int SC_UNSUPPORTED_MEDIA_TYPE = 415;
int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
int SC_EXPECTATION_FAILED = 417;
int SC_INTERNAL_SERVER_ERROR = 500;
int SC_NOT_IMPLEMENTED = 501;
int SC_BAD_GATEWAY = 502;
int SC_SERVICE_UNAVAILABLE = 503;
int SC_GATEWAY_TIMEOUT = 504;
int SC_HTTP_VERSION_NOT_SUPPORTED = 505;

void addCookie(Cookie var1);

boolean containsHeader(String var1);

String encodeURL(String var1);

String encodeRedirectURL(String var1);

/** @deprecated */
@Deprecated
String encodeUrl(String var1);

/** @deprecated */
@Deprecated
String encodeRedirectUrl(String var1);

void sendError(int var1, String var2) throws IOException;

void sendError(int var1) throws IOException;

void sendRedirect(String var1) throws IOException;

void setDateHeader(String var1, long var2);

void addDateHeader(String var1, long var2);

void setHeader(String var1, String var2);

void addHeader(String var1, String var2);

void setIntHeader(String var1, int var2);

void addIntHeader(String var1, int var2);

void setStatus(int var1);

/** @deprecated */
@Deprecated
void setStatus(int var1, String var2);

int getStatus();

String getHeader(String var1);

Collection<String> getHeaders(String var1);

Collection<String> getHeaderNames();

default void setTrailerFields(Supplier<Map<String, String>> supplier) {
}

default Supplier<Map<String, String>> getTrailerFields() {
return null;
}
}
2、常见应用
  1. 向浏览器输出消息
  2. 下载文件
  1. 要获取下载文件的路径
  2. 文件名
  3. 让浏览器支持我们下载的东西
  4. 获取下载文件的输入流
  5. 创建缓冲区
  6. 获取OutputStream对象
  7. 将FileOutputStream流写入到buffer缓冲区
  8. 使用OutputStream将缓冲区中的数据输出到客户端


下载文件
public class FileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 要获取下载文件的路径
String realPath = "D:\\git\\gitcode\\kuangstudy\\javaweb\\javaweb-02-servlet\\response\\target\\classes\\bmw.jpg";
System.out.println("下载路径为:"+realPath);
// 2. 文件名
String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
System.out.println("文件名为:"+fileName);
// 3. 让浏览器支持我们下载的东西
resp.setHeader("Content-Disposition","attachment;filename"+ URLEncoder.encode(fileName,"utf-8"));
// 4. 获取下载文件的输入流
FileInputStream is = new FileInputStream(realPath);
// 5. 创建缓冲区
int len;
byte[] buffer = new byte[1024];
// 6. 获取OutputStream对象
ServletOutputStream os = resp.getOutputStream();
// 7. 将FileOutputStream流写入到buffer缓冲区// 8. 使用OutputStream将缓冲区中的数据输出到客户端
while ((len= is.read(buffer))>0){
os.write(buffer,0,len);
}

is.close();
os.close();
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
3、验证功能验证码

验证怎么来的

  • 前端
  • 后端实现,需要java的图片类
4、实现重定向

一个web资源收到客户端请求后,通知客户端去访问另一个web资源,这就叫重定向

常见场景:

  • 用户登录

response

void sendRedirect(String var1) throws IOException;
resp.sendRedirect();
状态码:302
public class RedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// resp.setHeader("Location","/respomse_war/image");
// resp.setStatus(302);
resp.sendRedirect("/response_war/image");
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
面试题:请你聊聊请求转发和重定向的区别?
  • 相同点
  1. 都会跳转
  • 不同点
  1. 请求转发url不变,307
  2. 重定向地址栏变化为重定向地址 302
6.7、HttpServletResquest

HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会
被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息;

1、获取前端传递的参数

狂神说 javaweb

2、请求转发

重定向写 / 表示本项目; 转发不用写

转发是在服务器内部流转的

p16

7、Cookie、Session

7.1、会话

会话:用户打开浏览器,打开了很多超链接,逐个关闭这个过程就是会话

有状态会话:

你能怎么证明你是西开的学生?哈哈

你 西开

  1. 发票
  2. 学校登记

一个网站,怎么证明你来过?

客户端 服务端

  1. 服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了cookie
  2. 服务器标记你来过了,下次来的时候匹配你 session

7.2、保存回家的两种技术

cookie

  • 客户端技术(响应,请求)

session

  • 服务器技术,利用这个技术,可以保存用户的会话信息?我们可以把信息或数据保存在session中

7.3、Cookie

  1. 从请求中拿到cookie信息
  2. 服务器响应给客户端cookie
Cookie[] cookies = req.getCookies();//获得一个cookie
Cookie cookie = cookies[i];
cookie.getName();//获取key
cookie.getValue();//获得cookie的value
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");//
resp.addCookie(cookie);//响应给客户端cookie
cookie.setMaxAge(60*60*21);//设置cookie的有效期

一个网站cookie是否存在上限!

  • 一个cookie只能保存一个信息
  • 一个web站点可以给浏览器发送多个cookie,最多20个
  • cookie大小限制4kb
  • 300个cookie浏览器上限

删除Cookie

  • 不设置有效期,关闭浏览器,自动失效
  • 设置有效期时间为0
中文编码解码:

狂神说 javaweb

7.4、Session(重点)

什么是session:

  • 服务器会给每一个用户(浏览器)创建一个session对象
  • 一个session独占一个浏览器,只要浏览器没关,这个session就存在
  • 用户登陆之后,整个网站都可以访问---->保存购物车信息保存用户信息
Session和cookie的区别: .
  • Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
  • Session把用户的数据写到用户独占Session中,服务器端保存(保存重要的信息, 减少服务器资源的浪费)
  • Session对象由服务创建;

使用场景:

  • 保存一个登录用户的信息;
  • 购物车信息;
  • 在整个网站中经常会使用的数据,我们将它保存在Session中; .

使用session

会话过期,在web.xml中配置

<!--    设置session默认失效时间-->
<session-config>
<!-- 以分种为单位-->
<session-timeout>1</session-timeout>
</session-config>

狂神说 javaweb

狂神说 javaweb

8、JSP

8.1、 什么是jsp

java Server pages : Java服务器端页面,和servlet一样,用于动态web

最大特点:

  • 写jsp就像在写html
  • 区别
  • HTML只给用户静态
  • jsp可以嵌入Java 为用户提供动态

8.2、jsp原理

狂神说 javaweb

思路:jsp如何执行

  • 代码层面简单
  • 服务器内部工作
    tomcat中有一个work目录
    idea中使用tomcat的会在idea的tomcat中生产一个work

2018以后的IDEA在隐藏圓录AppData/ JetBrains里面

浏览器向服务器发送请求,不管访问什么资源,其实都是在访问servlet

jsp最终也会被转换成一个Java类

jsp本质上就是一个servlet
//初始化
public void_ public void _jspInit() {
}
//销毁
public void _jspDestroy() {
}
// jsp Service
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
  1. 判断对象
  2. 内置一些对象
final javax.servlet.jsp.PageContext pageContext;//页面上下文
final javax.servlet.ServletContext application;//applicationContext
final javax.servlet.ServletConfig config;//config
javax.servlet.jsp.JspWriter out = null;//
final java.lang.Object page = this;//page当前页
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
  1. 输出页面前增加的代码
response.setContentType("text/html; charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, false, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
out = pageContext.getOut();
_jspx_out = out;
  1. 以上的对象我们可以在jsp页面中直接使用

狂神说 javaweb

在jsp页面中,只要是Java代码就会原封不动的输出;

如果是HTML代码,就会被转换为

out.weite("<html>\r\n")

8.3、jsp基础语法

任何语言都有自己的语法,

JSP作为Java技术的一种应用,它拥有一些自己扩充的语法(了解即可),Java所有语法都支持

jsp表达式
<%--  jsp表达式
作用:用来将程序的输出,输出到客户端
<%= 变量或表达式%>
--%>
<%= new java.util.Date()%>
jsp脚本片段
<%--jsp脚本语言--%>
<%
int sum=0;
for (int i = 1; i <= 100; i++) {
sum+=i;
}
out.println("<h1>sum="+sum+"</h1>");
%>
<%--  套娃--%>
<%
for (int i = 0; i < 5; i++) {

%>
<h1>hello mink</h1>
<%
}
%>
jsp 声明
<%!
static {
System.out.println("loding servlet");
}
private int globalVar = 0;
private void mink(){
System.out.println("进入了方法MINK");
}
%>

JSP声明:会被编译到SP生成Java的类中!其他的,就会被生成到jspService方法中!

在jsp,嵌入java代码即可

几种格式

8.4、jsp指令

<%@page args.... %>
<%@include file=""%>

<body>
<%--将两个页面合二为一--%>
<%@ include file="common/header.jsp" %>
<h1>
主题内容
</h1>
<%@include file="common/footer.jsp"%>

<hr>
<%--jsp标签
拼接页面,本质还是三个
--%>
<jsp:include page="common/header.jsp"/>
<h1>
hhhhhhh
</h1>

</body>

8.5、九大内置对象

  • PageContext 存
  • Request 存
  • Response
  • Session 存
  • Application 【ServletContext】 存东西
  • config 【ServletConfig】
  • out
  • page
  • exception
<%
pageContext.setAttribute("name1","mink001");//保存的数据只在一个界面中有效
request.setAttribute("name2","mink002");//保存的数据只在一次请求中有效,请求转发会携带
session.setAttribute("name3","mink003");//保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","mink004");//只在服务器中有效,从打开服务器到关闭
%>

request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完没用的!
session:客户端向服务器发送请求,产生的数据,用户用完一会还有用, 比如:购物车;

application:客户端向服务器发送请求,产生的数据,个用户用完了, 其他用户还可能使用,比如:聊天数据;

p20
????????????????????????????

8.6、jsp标签,jstl标签,EL表达式

狂神说 javaweb

EL表达式:${}

  • 获取数据
  • 执行运算
  • 获取web开发的常用对象
jsp标签
<%--jsp: include--%>
<%--
http://localhost: 8080/jsptag. jsp?name-kuangshen&age=12
--%>
<jsp :forward page="/jsptag2.jsp">
<jsp :param
name="name"
value="kuangshen"></jsp :param>
<jsp :param name="age" value="12"></jsp :param>
</jsp : forward>
JSTL表达式

弥补html的不足

核心标签(掌握部分)
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

狂神说 javaweb

使用步骤

  • 引入队应的taglib
格式化标签
SQL标签
XML标签

9、JavaBean

实体类

实体类
JavaBean有特定的写法:
●必须要有一个无参构造
●属性必须私有化
●必须有对应的get/set方法;

一般用来和数据库的字段做映射 ORM;

ORM:对象关系映射

  • 表-->类
  • 字段-->属性
  • 行记录-->对象

id

name

age

address

1

秦将1号

3


2

秦将2号

18


3

秦将3号

100


????????????????????????

10、MVC三层框架

Model

View

Controller

10.1、早些年

狂神说 javaweb

Servlet和Jsp都可以写ava代码;为了易于维护和使用;
Servlet专注于处理请求,以及控制视图跳转
JSP专注于显示数据

用户直接访问控制层,控制层就可以直接操作数据库;

servlet--CRUD-->数据库
弊端:程序十分臃肿,不利于维护
servlet的代码中:处理请求、响应、视图跳转、处理JDBC、处理业务代码、处理逻辑代码
架构:没有什么是加一-层解决不了的!
程序猿调用
|
JDBC
|
Mysq1 Oracle Sq1Server

10.2、MVC三层架构

狂神说 javaweb

Model

  • 业务处理:业务逻辑(Service)
  • 数据持久层:CRUD(Dao)

View

  • 展示数据
  • 提供连接发送Servlet请求

Controller

  • 接受用户请求
  • 交给业务层处理响应的代码
  • 控制视图的跳转
登录--->接收用户的登录请求--->处理用户的请求(获取用户登录的参数,username, password) ---->交
给业务层处理登录业务(判断用户名密码是否正确:事务) --->Dao层查询用户名和密码是否正确-->数据库

11、Filter

Filter:过滤器,过滤网站数据

  • 处理中文乱码
  • 登录验证

狂神说 javaweb

servlet版本3.1.0

狂神说 javaweb


12、监听器

实现一个监听器的接口:(有N种)

13、过滤器、监听器常见应用

监听器:GUI种常用

用户登录后才能进入主页