当前位置 : 主页 > 编程语言 > java >

狂神说 javaweb

来源:互联网 收集:自由互联 发布时间:2023-02-04
javaweb 1、基本概念 web开发: web 静态web 动态web 淘宝, 不断变化 技术栈:Servlet/JSP ASP PHP 1.2、web应用程序 web应用程序:可以提供浏览器访问的程序 能访问的任何页面都存在于世界的某

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_xml

启动关闭

狂神说 javaweb_java_02

Tomcat:8080

mysql:3306

hTTP:80

HTTPS:443

可以配置主机的名称

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

高难度面试题

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

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

    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 请求方式/POSTStatus Code: 200 OK 状态码:200Remote(远程) Address: 110.242.68.3:443Referrer Policy: strict-origin-when-cross-originAccept: 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.9Accept-Encoding: gzip, deflate, brAccept-Language: zh-CN,zh;q=0.9Cache-Control: max-age=0Connection: keep-aliveCookie: 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=018h01808lala5855p1h0m9ok0qHost: www.baidu.comsec-ch-ua: " Not A;Brand";v="99", "Chromium";v="98", "Google Chrome";v="98"sec-ch-ua-mobile: ?0sec-ch-ua-platform: "Windows"Sec-Fetch-Dest: documentSec-Fetch-Mode: navigateSec-Fetch-Site: noneSec-Fetch-User: ?1Upgrade-Insecure-Requests: 1User-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
    • 请求方式:GET,POST,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-1Accept-Language:告诉浏览器,它的语言环境Cache-Control:缓存控制Connection:告诉浏览器,请求完成是断开还是保持连接HOST: 主机..../.Refresh:告诉客户端,多久刷新1次;Location:让网页重新定位;
    2、响应状态码(重点)

    200:成功 200

    3**:请求重定向

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

    4**:找不到资源404

    • 资源不存在

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

    常见面试:

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

    5、Maven

    我为什么要学习这个技术?
  • 在Javaweb中需要导入大量jar包,需要手动导入
  • 如何能让一个东西自动帮我导入和配置jar包所以有了maven
  • 5.1、Maven项目架构管理工具

    就是方便导入jar包的

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

    • 有约束,不要去违反

    Maven会规定好应该如何写Java

    5.2、下载安装Maven

    官网

    狂神说 javaweb_客户端_04

    下载完解压即可:

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

    5.3、环境变量配置

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

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

    狂神说 javaweb_客户端_05

    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

  • 启动idea‘
  • 创建一个Maven项目
  • 狂神说 javaweb_java_06

  • 狂神说 javaweb_客户端_07

  • 狂神说 javaweb_xml_08

  • 狂神说 javaweb_java_09

  • 狂神说 javaweb_xml_10

  • 等待初始化完毕
  • 狂神说 javaweb_java_11

  • 观察仓库的变化,多了什么东西?
  • IDEA中的maven设置
  • 注意更改默认位置
  • 狂神说 javaweb_xml_12

  • 狂神说 javaweb_xml_13

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

    狂神说 javaweb_xml_14

    这个只有在web下才有

    狂神说 javaweb_客户端_15

    5.8、在idea中标记

    狂神说 javaweb_客户端_16

    狂神说 javaweb_客户端_17

    配置Tomcat

    狂神说 javaweb_客户端_18

    狂神说 javaweb_java_19

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

    狂神说 javaweb_java_20

    5.10、POM文件

    狂神说 javaweb_客户端_21

    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、解决遇到的问题

  • Maven 3.6.2
  • 解决方法:退
  • Tomcat闪退
  • Idea中每次都要重复配置Maven
  • 在IDEA的全局默认配置去配
  • Maven项目中Tomcat中不能配置
  • .乱码:
  • resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8");
  • .
  • 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

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

    继承差不多

    Maven环境优化
  • 修改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>
  • 将整个maven的架构搭建完整
  • 编写一个servlet程序
  • 编写一个普通类
  • 实现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); }}
  • 编写servlet的映射
  • 为何什么要映射?我写的是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>
  • 配置tomcat
  • 启动测试 ok
  • 6.3、servlet原理

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

    狂神说 javaweb_java_22

    6.4、mapping问题

  • 一个servlet可以指定一个映射路径
  • 一个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>
  • 一个servlet可以指定通用映射路径
  • <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello/*</url-pattern> </servlet-mapping>
  • 请求默认路径
  • <!--默认请求路径 下面这个能把首页干掉--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
  • 指定后缀或前缀等
  • <!--默认请求路径 下面这个能把首页干掉--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
  • 优先级问题 指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求;
  • <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_客户端_23

    6.5、ServletContext

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

    狂神说 javaweb_xml_24

    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_java_25

    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 ServletResponsevoid 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、常见应用
  • 向浏览器输出消息
  • 下载文件
  • 要获取下载文件的路径
  • 文件名
  • 让浏览器支持我们下载的东西
  • 获取下载文件的输入流
  • 创建缓冲区
  • 获取OutputStream对象
  • 将FileOutputStream流写入到buffer缓冲区
  • 使用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();状态码:302public 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); }}
    面试题:请你聊聊请求转发和重定向的区别?
    • 相同点
  • 都会跳转
    • 不同点
  • 请求转发url不变,307
  • 重定向地址栏变化为重定向地址 302
  • 6.7、HttpServletResquest

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

    1、获取前端传递的参数

    狂神说 javaweb_java_26

    2、请求转发

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

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

    p16

    7、Cookie、Session

    7.1、会话

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

    有状态会话:

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

    你 西开

  • 发票
  • 学校登记
  • 一个网站,怎么证明你来过?

    客户端 服务端

  • 服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了cookie
  • 服务器标记你来过了,下次来的时候匹配你 session
  • 7.2、保存回家的两种技术

    cookie

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

    session

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

    7.3、Cookie

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

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

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

    删除Cookie

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

    狂神说 javaweb_xml_27

    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_java_28

    狂神说 javaweb_xml_29

    8、JSP

    8.1、 什么是jsp

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

    最大特点:

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

    8.2、jsp原理

    狂神说 javaweb_java_30

    思路: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 {
  • 判断对象
  • 内置一些对象
  • 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;
  • 输出页面前增加的代码
  • 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;
  • 以上的对象我们可以在jsp页面中直接使用
  • 狂神说 javaweb_xml_31

    在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_客户端_32

    EL表达式:${}

    • 获取数据
    • 执行运算
    • 获取web开发的常用对象
    jsp标签
    <%--jsp: include--%><%--http://localhost: 8080/jsptag. jsp?name-kuangshen&age=12--%><jsp :forward page="/jsptag2.jsp"><jsp :paramname="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_客户端_33

    使用步骤

    • 引入队应的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_xml_34

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

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

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

    10.2、MVC三层架构

    狂神说 javaweb_java_35

    Model

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

    View

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

    Controller

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

    11、Filter

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

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

    狂神说 javaweb_xml_36

    servlet版本3.1.0

    狂神说 javaweb_客户端_37

    12、监听器

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

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

    监听器:GUI种常用

    用户登录后才能进入主页

    网友评论