一、web相关的核心概念

1、软件的基本架构

cs(client server):qq、微信、原神

                缺点:安装、硬件有要求、升级

bs(broswer server):京东、csdn、qq空间

                优点:不安装、硬件无要求、不升级

2、tomcat

1)为什么要用tomcat?

broswer--->tomcat[servlet]--->jdbc--->mysql

2)tomcat是什么?

tomcat是apache和sun共同开发的一个免费开源的web应用服务器

3)tomcat的安装

            官网:https://tomcat.apache.org/
            安装:解压即安装

4)tomcat的目录结构

 bin:脚本

  • startup.bat , shutdown.bat 用于在windows下启动和停止脚本;

  • startup.sh, shutdown.sh 用于在linux下启动和停止脚本;

  conf:配置文件

  • logging.properties Tomcat 的日志配置文件, 可以通过该文件修改Tomcat 的日志级别及日志路径等

  • server.xml该文件用于配置server相关的信息,比如tomcat启动的端口号,配置主机(Host)。

  lib:jar包
   logs:日志
 webapps:存放war包
  work:???

5)启动和关闭

启动:双击bin/starup.bat
关闭:双击bin/shutdown.bat
 测试:http://127.0.0.1:8080 或 http://localhost:8080       localhost本机地址和127.0.0.1等同

6)war包

WEB-INF
                |-classes
                |-lib
                |-web.xml
            index.jsp

war 包是 Sun 提出的一种 web 应用程序格式,它与 jar 类似是一个特殊的压缩包。

3、http协议

          1)  请求行(Request Line):

url、请求方式、状态码

  • 格式:方法 URI 协议版本(如 GET /index.html HTTP/1.1)

  • 包含HTTP方法(GET/POST等)、请求资源路径和HTTP协议版本

          2)  请求头(Request Headers):

浏览器的信息、参数的格式

  • 格式:键值对(如 Host: example.com)

  • 包含客户端环境信息、缓存策略、内容协商等元数据

  • 常见字段:

    • Host:目标服务器域名

    • User-Agent:客户端信息

    • Accept:可接收的响应类型

    • Content-Type:请求体的数据格式


           3)  请求体(Request body):

POST请求携带的参数

  • 格式:

    • form-data:name=value&age=20

    • JSON:{"name":"value"}

    • 二进制数据(如图片上传)

  • 包含POST/PUT等方法时携带的实际数据

            4)响应头(Response Header):

服务器的信息、返回值的格式


          5)  响应体(Response Body):

返回值

  • 格式

    • 网页请求:HTML代码

    • API请求:JSON/XML格式数据

    • 文件下载:二进制流(如图片、PDF)‌

  • 包含服务器返回的实际数据,如HTML页面、JSON或二进制文件‌

二、servlet入门

1、什么是servlet?

        servlet(server applet)是Java语言编写的运行在tomcat上的程序
        servelt提供了一个接口(servlet),该接口规定了tomcat和servlet实例的契约,即所有servlet实例都必须直接或间接实现该接口

2、创建web工程

2.1创建maven工程

2.2添加webapp项目

 2.2.1右击项目,选择Add Frameworks Support

2.2.2选择Web Application,再点击OK

2.3将web目录拖拽到main目录下,并改名为webapp

  • webapp:静态资源比如 html css js jsp可以定义在web下面

  • WEB-INF:里面的资源不能直接被外界访问 web.xml 是web项目的核心配置文件

  • index.jsp:web项目的访问首页,在默认情况我们访问的首页就是index.jsp

2.3.添加依赖

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
</dependency>

2.4.创建servlet实例

package com.hg.servlet;

import javax.servlet.*;
import java.io.IOException;
public class HelloServlet implements Servlet {

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest req, ServletResponse servletResponse) 
        									throws ServletException, IOException {
        servletResponse.setContentType("text/html;charset=utf-8");
        servletResponse.getWriter().write("<h1>hello<h1>");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

2.5.配置servlet

  • web.xml中配置

<!--
   配置Servlet
   servlet-name:servlet的名称
   servlet-class:servlet的全类名
   url-pattern: 访问servlet的url
 -->
<servlet>
    <servlet-name>hello</servlet-name>
    <!--     servlet-name要和servlet-mapping所对应,映射的关系-->
    <servlet-class>com.hg.servlet.HelloServlet</servlet-class>
</servlet>

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

2.6.设置打包方式

  • 修改pom.xml

<!--打包方式-->
<packaging>war</packaging>

注意:先添加webapp目录,再设置打包方式

2.7.部署web项目

7.1点击“Edit Configurations”

7.2点击"+"

7.3点击Tomcat Server中的Local
7.4配置Tomcat路径
7.5部署web项目

7.6启动tomcat

7.7查看是否部署成功

7.8测试

浏览器访问:http://localhost:8080/01_servlet_HelloWorld_war/hello   

3、创建servlet实例

①pom.xml
			<dependency>
			    <groupId>javax.servlet</groupId>
			    <artifactId>servlet-api</artifactId>
			    <version>2.5</version>
			</dependency>
		②servlet
			public class HelloServlet implements Servlet {
				......
			}
		③web.xml
			<servlet>
				<servet-name>helloServlet</servlet-name>
				<servlet-class>com.hg.servlet.HelloServlet</servlet-class>
			</servlet>
			<servlet-mapping>
				<servet-name>helloServlet</servlet-name>
				<url-pattern>/hello</url-pattern>
			</servlet-mapping>

4、servlet的声明周期

构造方法:第一次请求,tomcat通过反射创建servlet时调用,只调用一次
init():servlet实例创建之后调用,只调用一次
service():每次请求都调用
destroy():关闭tomcat时调用

三、servlet的三种创建方式

1、实现servlet接口

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

@WebServlet("/test1")
public class Servlet1 implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        //s使用ServletConfig对象初始化我们的Servlet
        //执行了,从这个地方可以说明一个问题 Servlet已经被实例化了
        System.out.println("init方法执行");
    }

    @Override
    public ServletConfig getServletConfig() {
        //获取servlet配置信息对象
        //没有执行
        System.out.println("getServletConfig方法执行");
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        //解决中文乱码问题
        servletResponse.setContentType("text/html;charset=utf-8");
        servletResponse.getWriter().append("我是Servlet接口创建的Servlet");
    }

    @Override
    public String getServletInfo() {
        //获取Servlet的详细信息
        //没有执行
        System.out.println("getServletInfo方法执行");
        return null;
    }

    @Override
    public void destroy() {
        //当tomcat关闭的时候,执行销毁这个servlet的方法
        System.out.println("destroy方法执行");
        //只有当tomcat关闭的时候,才会执行这个方法
        
    }
}


        缺点:必须实现所有方法


    2、继承GenericServlet抽象类

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;
/*
* 第二种方式:继承GenericServlet
*
* */
@WebServlet("/test2")
public class Servlet2 extends GenericServlet {
    //只有一个方法是必须重写的,抽象方法
    //为什么?service是核心方法,因为请求和响应就是执行这个方法
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        //解决中文乱码问题
        servletResponse.setContentType("text/html;charset=utf-8");
        servletResponse.getWriter().append("我是GenericServlet抽象类创建的Servlet");

    }
}


        优点:无须实现所有方法


    3、继承HttpServlet抽象类

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;

@WebServlet("/test3")
public class Servlet3 extends HttpServlet {
    //因为在前端的时候,有两种请求方式get和post
    //doGet和doPost方法写在了Service方法中了
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        resp.getWriter().println("我是HttpServlet创建的Servlet");
    }
}


        优点:①把请求分门别类 ②强化request和response

建议:使用HttpServlet方法最好

四、接收前台提交的参数

request.getParameter("get请求时参数的key|post请求时input标签的name属性")

  • login.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>$Title$</title>
      </head>
      <body>
      <form action="login" method="post">
        <input type="text" name="username"/><br>
        <input type="text" name="password"/><br>
        <input type="submit" value="提交">
      </form>
      </body>
    </html>
  • servlet实例

    public class LoginServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            request.setCharacterEncoding("utf-8");
    		//html页面中  input标签发送的数据,都会存到HttpServlet这个对象里面
    		//通过前端input标签name的属性值获取前端发送的数据
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            System.out.println("username: " + username+"===password"+password);
            
            //Servlet响应数据到客户端的时候,如果是中文的话,会乱码
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().write("username: " + username+"===password"+password);
        }
    }
  • web.xml

    <servlet>
            <servlet-name>login</servlet-name>
            <servlet-class>com.hg.servlet.LoginServlet</servlet-class>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>login</servlet-name>
            <url-pattern>/login</url-pattern>
        </servlet-mapping>

    五、中文乱码的解决方案

  • 请求时候的乱码问题:

post:request.setCharacterEncoding("UTF-8");
        get:new String(str.getByte(), "UTF-8");

响应时候中文乱码的问题:

response.setContentType("text/html;charset=utf-8");

六、请求转发和重定向(了解)

请求转发:

本质:servlet的内部行为(servlet1------------>servlet2)

特点:

        一次请求
        request不变,属性不丢失

request.getRequestDispatcher(“main.jsp”).forward(request,response);
//这一行代码就表示进行了转发,url没有变,但是响应的结果却是一次请求干了两个活

重定向

本质:浏览器发送两次请求(status:302 Location:target.jsp)

特点:

    两次请求
    创建新的request,属性丢失

response.sendRedirect("main.jsp"); //就这一行代码,但是这一行代码必须写在doGet或者doPost方法中        

七、servlet的自动加载(了解)

<servlet>
        <servlet-name>loadOnStartupServlet</servlet-name>
        <servlet-class>com.hg.servlet.LoadOnStartupServlet</servlet-class>
        <!--tomcat启动时就创建该servlet实例,数字越小优先级越高-->
        <load-on-startup>1</load-on-startup>
    </servlet>

八、三大作用域(重点)

作用域范围失效
request(请求域)一次请求响应时失效
session(会话域)浏览器(跨request)浏览器关闭  或 session失效
servletContext(应用域)整个web应用(跨session)关闭tomact

九、cookie和session

1、cookie

1)是什么?

是保存在浏览器中的一块存储区域

2)特点

①以键值对方式保存

②可设置失效时间

③可禁用

④最多存4096byte

常用方法

//1.cookie的构造方法,目的是实例化出来cookie对象
Cookie(String name,String value)
//2.设置cookie的方法
setValue(String value) //修改cookie的值
getValue(String value) //获得cookie的值    
getName(String value) //获得cookie的键    
setMaxAge(int time) //设置cookie的有效时间
//3.要将cookie发送到浏览器
response.addCookie(Cookie cookie);
//4.获得所有cookie
request.getCookies();

2、session

1)是什么?

是保存在tomact中的一块存储区域

2)特点

①键值对
②可设置失效时间

常用方法

request.getSession(); //返回HttpSession
setAttribute(key,value); //设置属性 key ,value
getAttribute(key); //获取key的值
removeAttribute(String key)	//通过key值删除数据
invalidate(); //将session中的变量全部清空
setMaxInactiveInterval(int interval); //设置session失效时间,单位为秒
getMaxInactiveInterval();//获取session失效时间
getId(); //获取sessionID

十、配置对象(了解)

1、servletConfig对象

1)是什么?

是servlet的一个配置对象,由tomcat创建并通过init()方法传给servlet,可通过getServletConfig()获得该对象

2)怎么用?

①配置参数

                <servlet>
                    <servlet-name>servletConfigServlet</servlet-name>
                    <servlet-class>com.hg.servlet.ServletConfigServlet</servlet-class>
                    <!--给ServletConfigServlet配置参数-->
                    <init-param>
                        <param-name>msg</param-name>
                        <param-value>fuck you!!!</param-value>
                    </init-param>
                </servlet>

②获取参数

ServletConfig servletConfig = getServletConfig();
servletConfig.getInitParameter("msg");

2、servletContext对象

1)是什么?

是整个web应用的一个配置对象,由tomcat创建,可通过getServletContext()获得该对象

2)怎么用?

①配置参数

                <context-param>
                    <param-name>msg</param-name>
                    <param-value>fuck tony!!!</param-value>
                </context-param>

②获取参数

ServletContext servletContext = getServletContext();
                servletContext.getInitParameter("msg");

十一、过滤器Filter(重点)

执行器执行流程

1、是什么?

filter(过滤器):是一个特殊的servlet,能过滤所有请求

2、在哪用?

        设置编码格式
        登录校验
        记录日志

3、怎么用?

①创建filter

            public class LogFilter implements Filter {
                ... ...
            }

②配置filter

            <filter>
                <filter-name>logFilter</filter-name>
                <filter-class>com.hg.servlet.LogFilter</filter-class>
            </filter>
            <filter-mapping>
                <filter-name>logFilter</filter-name>
                <url-pattern>/*</url-pattern>
            </filter-mapping>

十二、监听器(了解)

1.是什么

监听器是监听servletContext、session的创建和销毁、以及其属性添加、删除的组件

2.怎么用

①创建filter
            public class MyListener implements HttpSessionListener,ServletContextListener {
                ... ...
            }
        ②配置filter
            <listener>
                <listener-class>com.hg.servlet.MyListener</listener-class>
            </listener>

十三、三层架构

    1.好处

    规范代码,各司其职

    2.什么是三层架构

             web层:控制层
                    com.hg.servlet/web/controller  servlet包,作用:接受请求、调用service、控制跳转
             service层:业务层
                    com.hg.service  service接口包
                    com.hg.service.impl  service实现类包,作用:业务
             dao层:数据访问层
                    com.hg.dao  dao接口包
                    com.hg.dao.impl  dao实现类包,作用:访问数据

    3.三层架构的调用关系

    web--------------->service-------------------->dao

    原则:
        1、一次只写一层
        2、复杂的业务先写注释

    常见错误:

    一、404错误

    原因:请求的URL路径与服务器路由不匹配,或资源(如HTML/JS/CSS文件)未正确部署。

    即未配置web.xml

    二、405错误

    原因:使用的HTTP方法(如GET、POST、PUT等)不被服务器支持或禁止用于目标资源

    get方法和post方法不对应

    三、500错误

    原因:表现层未正确处理业务逻辑层返回的异常,直接抛出未捕获的错误。

    更多推荐