JavaWeb学习笔记

目录

什么是JavaWeb

web服务器

Tomcat:

        配置:

网站应该有的结构:

HTTP

什么是http

http请求:

http响应

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

Maven(项目架构管理工具)

下载安装maven:

1环境变量配置

2阿里云镜像

3本地仓库

IDEA中使用MAVEN 

Maven创建一个普通的maven项目 

 在idea中标记文件夹功能

在idea中配置Tomcat

pom文件

idea操作:

Servlet 

1.构建一个新Maven项目

Servlet原理

 Mapping问题

ServletContext

请求转发

        

 读取资源文件

HttpServletResponse(响应)

简单分类:

 常见应用:

 请求重定向

重定向和转发的区别

 HttpServletRequest(请求)

请求转发:

session(会话)

Session,cookie区别

JSP

JSP基础语法

EL表达式

定制错误页面:

9大内置对象

JSP标签、JSTL标签、EL表达式

JavaBean

MVC三层架构

Filter(过滤器)

监听器



什么是JavaWeb

web开发:

        web:网页的意思

静态web

        heml,css

        提供给所有人看的数据,不会发生变化

动态web

        提供给每个人的数据可能不一样

        相关技术:Servlet/JSP,ASP,PHP

WEB应用程序

        指可以提供浏览器访问的程序;

        如 a.html 。。。。多个web资源,可以被外界访问。对外界提供服务  

 静态web

        *.html是网页后缀,如果服务器上一直存在,就可以进行访问

        请求(Request)

        相应(Response)

 静态web的缺点:

        无法动态更新

        无法和数据库交互

动态web

        可以与数据库交互

web服务器

       ASP:

        微软:国内最早流行;

        PHP

        开发速度很快,功能很强大,跨平台,代码很简单

        无法承载大访问量的情况(高并发)

        JSP/SERVLET:

        sun公司主推的B/S架构

                B/S:浏览器-服务器

                C/S:客户端-服务器

        基于JAVA,

        可以承载高并发,高可用,高性能(三高问题)

服务器类:        

        服务器是一种被动的操作,用来处理用户的一些请求和给用户一些信息响应

        IIS

        微软的;Windows自带

Tomcat:

                轻量级应用服务器

        下载tomcat,

                1.安装解压

                2.了解配置文件及目录结构

                3.这个东西的作用

        bin包:启动关闭的脚本文件

        config:配置文件

        lib:插件,依赖的jar包

        logs:日志,输出

        webapps:放网站

        启动:bin/startup.bat

        访问:默认端口:http://localhost:8080

        http:80

        https:443

        配置:

        服务器核心配置文件:

        

 默认端口修改

配置主机名称:(若修改,则windows的配置文件也要修改才能正常访问)

修改windows配置文件

 网站是如何进行访问的?

        先检查本机hosts里有没有域名映射,

                有的话直接返回对应的ip地址,直接访问本机资源

                没有,则去访问DNS服务器,找到就返回,找不到就提示404

网站应该有的结构:

        -root

        -songyi:网站目录名

                -web-INF

                        -classes:java程序

                        -lib:web应用所依赖的jar包

                        -web.xml:网站配置文件

                -index.html:默认的首页

                -static

                        -css        

                                -style.css

                        -js

                        -img

                -.....

HTTP

什么是http

        超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。

        默认端口:80

http请求:

        客户端---->服务器

百度:

Request URL:https://www.baidu.com       : 请求地址

Request Method:GET              GET/POST

Status Code:200 OK                 状态码

Remote Address:39.156.66.18:443     访问的真实地址

  1. Accept:text/html

  2. Accept-Encoding:gzip, deflate, br

  3. Accept-Language:zh-CN,zh;q=0.9  语言

  4. Cache-Control:max-age=0

  5. Connection:keep-alive

1.请求行

        请求方式:GET

        GET/POST

        get:一次请求能够携带的参数比较少,有大小限制,会在浏览器url地址栏显示数据,不安                      全,但高效

        post:请求携带的参数没有限制,大小没有限制,不会在浏览器url显示内容,安全,不高效

2.消息头        

        Accept:告诉浏览器,他所支持的数据类型

        Accept-Encoding:支持那种编码格式  GBK utf8 GB2312  ISO8859-1

        Cache-Control:缓存控制

        Connection:告诉浏览器,完成请求后是断开还是保持链接

        Host:主机

http响应

        服务器---->客户端

百度:

  1. Bdpagetype:

    2

  2. Bdqid:

    0xb019be350036babc

  3. Cache-Control:private   缓存控制

  4. Connection:keep-alive   连接:保持

  5. Content-Encoding:gzip   编码

  6. Content-Type:text/html;charset=utf-8  类型

  7. Date:Thu, 12 Aug 2021 02:25:14 GMT  当前时间

  8. Expires:Thu, 12 Aug 2021 02:25:14 GMT 当前时间

1.响应体

        Accept:告诉浏览器,他所支持的数据类型

        Accept-Encoding:支持那种编码格式  GBK utf8 GB2312  ISO8859-1

        Cache-Control:缓存控制

        Connection:告诉浏览器,完成请求后是断开还是保持链接

        Host:主机

        Refrush:告诉客户端,多久刷新一次网站

        Location:让网页重新定位;

2.响应状态码

200:响应成功

3XX:请求重定向

404:未找到资源

5XX:服务器代码错误

        500:

        502:网关错误

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

Maven(项目架构管理工具)

        不需要手动导入jar包

        自动导入和配置

        目前用它来就是方便导入jar包的

核心思想:约定大于配置

        有约束不要去违反

maven会规定好你该如何去编写java代码,必须要按照这个规范来;

下载安装maven:

        

 解压即可

1环境变量配置

M2_HOME bin目录(如:D:\apache-maven-3.8.1-bin\apache-maven-3.8.1\bin)

MAVEN_HOME maven的目录如(D:\apache-maven-3.8.1-bin\apache-maven-3.8.1)

PATH: %MAVEN_HOME%\bin

测试:cmd    mvn -version

2阿里云镜像

镜像:mirrors

 加速国内下载

在conf文件夹的setting内的<mirrors></mirrors>标签内加入

 <mirror>
    <id>aliyunmaven</id>
    <mirrorOf>central</mirrorOf>
    <name>aliyun maven</name>
    <url>https://maven.aliyun.com/repository/public </url>
   </mirror>

3本地仓库

        建立本地仓库,远程仓库;

建立一个仓库(本地):

        

在setting中添加

IDEA中使用MAVEN 

1启动idea

2创建一个mavenWeb项目

 

3.等待项目搭建

4.观察maven仓库中多了什么东西

5.idea中的maven设置

        创建成功后,看一眼配置

 

6.Maven在IDEA中的配置和使用就OK了

Maven创建一个普通的maven项目 

不使用maven的模板,

最简单的maven项目

 在idea中标记文件夹功能

或者

在idea中配置Tomcat

 

 

解决警告问题 (必须需要指定一个文件夹名字,)

 

pom文件

pom.xml是maven的核心配置文件

 内容

加入jar包例子

 <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
 </dependencies>

 maven由于约定大于配置,就会出现问题

idea操作:

生成目录树,代表了maven中jar包的联系体系

 

 

Servlet 

Servlet在SUN公司有两个默认的实现类(HttpServlet和 )

开发动态web的技术

        1.编写一个类实现servlet接口

        2.部署到web服务器中

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

1.构建一个新Maven项目

        删掉src目录,这个空的工程就是maven主工程

        关于maven父子工程的理解

                父项目中会有一个module

                

                子项目中有

                

 父项目的java子项目可以直接使用

 3.Maven环境优化

        1.修改web.xml为最新的

        2.将maven的结构搭建完整

4.编写servlet程序

        1.编写一个普通类

        2.实现Servlet接口(直接继承HttpServlet)

package com.kuang.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet extends HttpServlet {
    @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 {
        super.doPost(req, resp);





    }
}

5.编写Servlet的映射

        

 <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.kuang.servlet.HelloServlet</servlet-class>
  </servlet>
  <!--servlet的请求路径-->
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>

6.配置tomcat

7.启动测试

Servlet原理

 Mapping问题

一个servlet可以指定多个请求路径

也可以指定通用路径

 可以自定义后缀实现请求映射

*号前边不能加映射路径

优先级问题:

        指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求

ServletContext

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

作用:

  • 共享数据:Servlet间的数据传递

放数据

 取数据

请求转发

        

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
        ServletContext sc=this.getServletContext();
        RequestDispatcher rd=sc.getRequestDispatcher("转发请求路径");
        rd.forward(req,resp);//请求转发
    }

 读取资源文件

 使用Properties对象

         在java目录下新建properties

         在resurces目录下新建properties

发现 :两个文件都被打包到了同一个路径下:classes,我们俗称这个路径为classpath:

需要一个文件流

HttpServletResponse(响应)

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

简单分类

负责发送数据的方法

ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;//发送中文一般用这个

负责向浏览器发送响应头的方法:

 常见应用:

        1.向浏览器输出消息

        2.下载文件

                1获取下载文件的路径

                2下载的文件名

                3让浏览器支持我们下载

                4获取下载文件的输入流

                5.创建缓冲区

                6获取OutputStream对象,

                7.将FileOutoutStream流写入到buffer缓冲区

                8.使用OutputStream将缓冲区中的数据输出到客户端

验证码实现:

生成随机数方法

主业务

 请求重定向

//请求重定向
        resp.sendRedirect("index.html");
JSP中定位到本项目路径    ${pageContext.request.contextPath}

重定向和转发的区别

        相同点:实现跳转页面

        不同点:

                转发:url不发生变化 307

                重定向:url发生变化   302

 HttpServletRequest(请求)

http请求中的所有信息,会被封装到HttpServletRequest对象中

        req.getContextPath();//获取上下文路径
        req.getHeader("头属性名");//获取头信息
        req.getParameter("参数名");//获取传递的参数值

请求转发:

        //请求转发
req.getRequestDispatcher("转发地址").forward(req,resp);

例子:

请求:

转发地址中的   /    代表当前web应用

 页面:

可长久保留的用户访问web资源的信息,留在用户端

例子:

 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //服务器告诉你你来的时间,把这个时间封装成一个信件,下次带来,就知道你来了

        //解决乱码
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html");
        PrintWriter out=resp.getWriter();
        //Cookie,服务器端从客户端获取
        Cookie[] cookies =req.getCookies();//返回数组,说明cookie存在多个
        //判断cookie是否存在
        if(cookies!=null){
            //存在
            out.write("上一次访问的时间是:");
            for (int i = 0; i <cookies.length ; i++) {
                Cookie cookie =cookies[i];
                //获取Cookie名字
                if (cookie.getName().equals("lastLoginTime")){
                    //获取值

                    long time =Long.parseLong(cookie.getValue());
                    Date date =new Date(time);
                    out.write(date.toLocaleString());
                }
            }
        }else {
            out.write("这是你第一次访问本站");
        }
        //服务器给客户端响应一个cookie
        Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
        //设置cookie有效期(单位:秒)
        cookie.setMaxAge(24*60*60);

        resp.addCookie(cookie);

    }

cookie保存在用户目录的appdata下

session(会话)

        服务器技术,保存用户的会话信息。可以吧信息或者数据放在session中

        用户:打开浏览器----访问web资源---关闭浏览器

                这个过程即为会话

什么是session

        服务器给每一个用户(浏览器)创建一个session对象,

        一个Seesion独占一个浏览器,只要浏览器没有关闭,session就存在

        作用:保存用户信息,购物车信息

例子:

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html");
        PrintWriter out=resp.getWriter();

        //得到session
        HttpSession session = req.getSession();

        //在session中存东西
        session.setAttribute("name","宋燚");
        //获取sessionID
        String id = session.getId();
        //判断session是不是新创建
        if(session.isNew()){
            resp.getWriter().write("创建成功id:"+id);
        }else {
            resp.getWriter().write("已经存在id:"+id);
        }
        //创建session时做的事情
        Cookie cookie =new Cookie("JSSESSION",id);
        resp.addCookie(cookie);
        //取消sesison
        session.removeAttribute("名");
        //手动注销Session
        session.invalidate();
    }

Session的销毁:

        自动销毁:设置自动销毁时间

        手动销毁:重启服务器

        设置session自动失效时间,在web.xml内

单位为分钟(下例为15分钟)

  <session-config>
    <session-timeout>15</session-timeout>
  </session-config>

Session,cookie区别

Cookie:把用户的数据写给浏览器,浏览器保存可以保存多个

session:把用户数据写到用户独占session中,服务器保存

session由服务器创建

使用场景        

        保存一个登录用户的信息;

        购物车信息;

        网站中经常使用的数据,我们将它保存在session中

JSP

JavaServerPags(java服务器端页面)

内置对象

3.输出页面前增加的代码

4. 这些对象在JSP中可以直接使用

JSP基础语法

 <%%>  代码

<%=%> 显示数据

<%!%> 编译在类中的代码

<%----%>注释

<%-- JSP表达式
    作用:将程序的输出,输出到客户端
        <%=变量或表达式%>
   --%>
   <%=new java.util.Date()%>

 JSP声明(会被编译到JSP生成的java类的类中,其他的就会被生成到jspService方法中)

<%!

static {
    System.out.println("loaging Servlet!");
}

%>

EL表达式

${  }

<form action="500.jsp" method="get">
    EL表达式获取表单中的数据
    ${param.参数名}
    <input type="text" name="username" value="${param.username}">
</form>

 

定制错误页面:

声明这是一个错误页面

//显式地声明这是一个错误页面
<%@page isErrorPage="true" %>

在JSP中

<%@page errorPage="500.jsp" %>

在web.xml中

<error-page>
    <error-code>500</error-code>
    <location>/500.jsp</location>
  </error-page>

在一个SJP页面中加入另一个页面(比如独立写一个网站头和尾,在所有的网页中直接调用,就不用重复打多余的代码)


<%@include file="index.jsp"%>
//这两种效果一样,但是下面这面这一种的路径前需要加  /   即在当前项目目录下
<jsp:include page="/index.jsp">

9大内置对象

PageContext  存东西

Request  存东西

Response

Session  存东西

Application【ServletContext】存东西

config

out

page

exception

数据存取

<%
  //设置值
    pageContext.setAttribute("name1","sy1");//保存的数据只在一个页面中有效
    request.setAttribute("name2","sy2");//数据在一次请求总有效
    session.setAttribute("name3","sy3");//数据在一次会话中有效
    application.setAttribute("name4","sy4");//数据在服务器中有效,从打开服务器到关闭服务器
    
%>
<%
    //从pageContext通过寻找的方式取出
    String  a=(String)pageContext.findAttribute("name1");
    String  b=(String)pageContext.findAttribute("name2");
    String  c=(String) pageContext.findAttribute("name3");
    String  d=(String) pageContext.findAttribute("name4");
%>
取出值
使用EL表达式取值时,若没有找到该值则不显示,若使用<%=%>显示,未找到时显示null
<a>${name1}</a>
<a>${name2}</a>
<a>${name3}</a>
<a>${name4}</a>

JSP标签、JSTL标签、EL表达式

需要的包:

<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/taglibs/standard -->
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>

EL表达式  ${ }

  • 获取数据
  • 执行运算
  • 获取web开发的常用对象
  • 在TOMcat中也要有JSTL包,否则会报错

JSP标签

JSTL表达式:

        JSTL的标签库的使用就是为了弥补HTML标签的不足

        标签的功能和java代码一样

引用标签:引入之后才可以使用JSTL

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

核心标签

使用教程:https://www.runoob.com/jsp/jsp-jstl.html

JavaBean

实体类

JavaBean有特定的写法

  • 必须要有一个无参构造
  • 必须有对应的get、set方法
  • 属性必须私有化

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

ORM:对象关系映射

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

MVC三层架构

        Model(模型)

        view(视图)

        controller(控制器)

Model

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

View

        展示数据

        提供链接发起Servlet请求(a,from,img)

Controller

        接受用户的请求:(request,Session)

        交给业务层处理对应的代码

        控制视图的跳转

        登录--->接受用户登录请求---》处理用户的请求(获取用户登录的参数,账号密码)——》交给业务层处理登录业务(判断用户名密码是否正确)——》Dao层查询用户名和密码是否正确

Filter(过滤器)

用来过滤网站的数据,减少程序员的代码量,

开发步骤:

        1.编写Filter类(继承Servlet的Filter接口)

2.重写方法

package com.kuang.servlet.Filter;

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

public class CharacterEncodingFilter implements Filter {
    //初始化
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化");
    }
//Chain链
//所有代码在过滤特定请求时都会执行
//必须让过滤器继续通行
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charst=utf-8");
        System.out.println("执行前");
        //链,让请求继续走,否则程序到这里就停止了
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("执行后");
    }
    //销毁
    public void destroy() {
        System.out.println("销毁");
    }
}

 配置web.xml

<filter>
  <filter-name>CharacterEncodingFilter</filter-name>
  <filter-class>com.kuang.servlet.Filter.CharacterEncodingFilter</filter-class>
</filter>
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <!--只要是servlet下的任何请求都会经过这个过滤器-->
    <url-pattern>/servlet/*</url-pattern>
  </filter-mapping>

监听器

实现一个监听器的接口:很多种接口

        

package com.kuang.servlet.Filter;

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

public class CharacterEncodingFilter implements Filter {
    //初始化
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化");
    }
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charst=utf-8");
        System.out.println("执行前");
        //链,让请求继续走,否则程序到这里就停止了
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("执行后");
    }
    //销毁
    public void destroy() {
        System.out.println("销毁");
    }
}

配置XML

  <listener>
    <listener-class>com.kuang.servlet.Filter.Lintencer</listener-class>
  </listener>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值